Version 1.23.0-dev.3.0

Merge commit ff89087641dc0d5a3d1e1621f869b67b132654a7 into dev
diff --git a/BUILD.gn b/BUILD.gn
index c592d73..38fd398 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -53,7 +53,7 @@
   deps = [
     ":runtime",
 
-    # TODO(rmacnak): Link this into 'dart'
+    # TODO(rmacnak): Link this into 'dart'.
     "utils/kernel-service:kernel-service",
   ]
 }
@@ -237,8 +237,20 @@
         "runtime/bin:run_vm_tests",
       ]
 
+      # Compute path to magenta bootdata.bin
+      if (current_cpu == "arm64") {
+        magenta_bootdata =
+            "//out/build-magenta/build-magenta-qemu-arm64/bootdata.bin"
+      } else if (current_cpu == "x64") {
+        magenta_bootdata =
+            "//out/build-magenta/build-magenta-pc-x86-64/bootdata.bin"
+      } else {
+        assert(false, "unable to determine path to magenta's bootdata.bin")
+      }
+
       input = "$target_gen_dir/dart_test_tree.manifest"
       inputs = [
+        magenta_bootdata,
         input,
       ]
 
@@ -256,6 +268,8 @@
         "--build-id-map",
         rebase_path("$target_gen_dir/build_id_map"),
         "--compress",
+        "--pre-binaries",
+        rebase_path(magenta_bootdata),
       ]
     }
   }
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c434aa0..dee30bf 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -17,6 +17,25 @@
   characters to the console on Windows. Calls to `Stdout.add*()` behave as
   before.
 
+### Tool changes
+
+* Analysis
+
+  * 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 
+      [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` 
+      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`) 
+      takes precedence over any corresponding value specified in the analysis options file.
+
+
 ## 1.22.0 - 2017-02-14
 
 ### Language
diff --git a/docs/language/dart.sty b/docs/language/dart.sty
index 125c771..b331d80 100644
--- a/docs/language/dart.sty
+++ b/docs/language/dart.sty
@@ -11,6 +11,7 @@
 
 \def\ABSTRACT{\builtinId{abstract}}
 \def\AS{\builtinId{as}}
+\def\COVARIANT{\builtinId{covariant}}
 \def\DEFERRED{\builtinId{deferred}}
 \def\DYNAMIC{\builtinId{dynamic}}
 \def\EXPORT{\builtinId{export}}
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index d60e3de..62dba69 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -394,22 +394,22 @@
 \begin{grammar}
 {\bf variableDeclaration:}
       declaredIdentifier (`,' identifier)*
-      .
+    .
 
 {\bf declaredIdentifier:}
       metadata finalConstVarOrType identifier
     .
 
 {\bf finalConstVarOrType:}\FINAL{} type?;
-           \CONST{} type?;
-	varOrType
+      \CONST{} type?;
+      varOrType
     .
 
- {\bf varOrType:}\VAR{};
-	type
+{\bf varOrType:}\VAR{};
+      type
     .
 
- {\bf initializedVariableDeclaration:}
+{\bf initializedVariableDeclaration:}
       declaredIdentifier (`=' expression)? (`,' initializedIdentifier)* % could do top level here
     .
 
@@ -420,11 +420,7 @@
 {\bf initializedIdentifierList:}
       initializedIdentifier (`,' initializedIdentifier)*
     .
-
-
-
-
-  \end{grammar}
+\end{grammar}
 
 \LMHash{}
 A variable that has not been initialized has the initial value \NULL{} (\ref{null}).
@@ -764,13 +760,17 @@
 \end{itemize}
 
 \begin{grammar}
-{\bf normalFormalParameter:}functionSignature;
+{\bf normalFormalParameter:}functionFormalParameter;
       fieldFormalParameter;
       simpleFormalParameter
- .
+    .
 
-{\bf simpleFormalParameter:}declaredIdentifier;
-      metadata identifier
+{\bf functionFormalParameter:}
+      metadata \COVARIANT{}? returnType? identifier formalParameterList
+    .
+
+{\bf simpleFormalParameter:}
+      metadata \COVARIANT{}? finalConstVarOrType? identifier;
     .
 
 {\bf fieldFormalParameter:}
@@ -778,6 +778,18 @@
    .
 \end{grammar}
 
+\LMHash{}
+It is possible to include the modifier \COVARIANT{} in some forms of parameter declarations.
+This modifier has no effect.
+
+\rationale{
+The modifier \COVARIANT{} is used in strong mode.
+The modifier is allowed here even though it has no effect, such that source code can be used in both contexts.
+}
+
+\LMHash{}
+It is a compile-time error if the modifier \COVARIANT{} occurs on a parameter of a function which is not an instance method, instance setter, or instance operator.
+
 %\subsubsection{Rest Formals}
 %\LMLabel{restFormals}
 
@@ -908,14 +920,14 @@
       constructorSignature (redirection $|$ initializers)?;
       \EXTERNAL{} constantConstructorSignature;
       \EXTERNAL{} constructorSignature;
-      ((\EXTERNAL{} \STATIC{} ?))? getterSignature;
+      ((\EXTERNAL{} \STATIC{}?))? getterSignature;
       ((\EXTERNAL{} \STATIC{}?))? setterSignature;
       \EXTERNAL{}? operatorSignature;
-       ((\EXTERNAL{} \STATIC{}?))? functionSignature;
+      ((\EXTERNAL{} \STATIC{}?))? functionSignature;
       \STATIC{} (\FINAL{} $|$ \CONST{}) type? staticFinalDeclarationList;
 %      \CONST{} type? staticFinalDeclarationList;
       \FINAL{} type? initializedIdentifierList;
-      \STATIC{}? (\VAR{} $|$ type) initializedIdentifierList
+      (\STATIC{} $|$ \COVARIANT{})? (\VAR{} $|$ type) initializedIdentifierList
     .
 
 {\bf staticFinalDeclarationList:}
@@ -929,6 +941,15 @@
 \end{grammar}
 
 \LMHash{}
+It is possible to include the modifier \COVARIANT{} in some forms of declarations.
+This modifier has no effect.
+
+\rationale{
+The modifier \COVARIANT{} is used in strong mode.
+The modifier is allowed here even though it has no effect, such that source code can be used in both contexts.
+}
+
+\LMHash{}
 A class has constructors,  instance members and static members. The instance members of a class are its instance methods, getters, setters and instance variables. The static members of a class are its static methods, getters, setters and static variables. The members of a class are its static and instance members.
 
 \LMHash{}
@@ -5347,11 +5368,10 @@
 
 \begin{grammar}
 {\bf identifier:}
-     IDENTIFIER
-     .
+      IDENTIFIER
+    .
 
-
- {\bf IDENTIFIER\_NO\_DOLLAR:}
+{\bf IDENTIFIER\_NO\_DOLLAR:}
       IDENTIFIER\_START\_NO\_DOLLAR IDENTIFIER\_PART\_NO\_DOLLAR*
     .
 
@@ -5359,22 +5379,23 @@
       IDENTIFIER\_START IDENTIFIER\_PART*
     .
 
-{\bf BUILT\_IN\_IDENTIFIER:} \ABSTRACT{};
-     \AS{};
-     \DEFERRED{};
-     \DYNAMIC{};
-     \EXPORT{};
-     \EXTERNAL{};
-     \FACTORY{};
-     \GET{};
-     \IMPLEMENTS{};
-     \IMPORT{};
-     \LIBRARY{};
-     \OPERATOR{};
-     \PART{};
+{\bf BUILT\_IN\_IDENTIFIER:}\ABSTRACT{};
+      \AS{};
+      \COVARIANT{};
+      \DEFERRED{};
+      \DYNAMIC{};
+      \EXPORT{};
+      \EXTERNAL{};
+      \FACTORY{};
+      \GET{};
+      \IMPLEMENTS{};
+      \IMPORT{};
+      \LIBRARY{};
+      \OPERATOR{};
+      \PART{};
       \SET{};
       \STATIC{};
-     \TYPEDEF{}
+      \TYPEDEF{}
     .
 
  {\bf IDENTIFIER\_START:}IDENTIFIER\_START\_NO\_DOLLAR;
@@ -5389,16 +5410,13 @@
       DIGIT
     .
 
-
 {\bf IDENTIFIER\_PART:}IDENTIFIER\_START;
       DIGIT
     .
 
-
-
 {\bf qualified:}
       identifier (`{\escapegrammar .}' identifier)?
-      .
+    .
 \end{grammar}
 
 \LMHash{}
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 31588d1..6c6e96d 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -2804,6 +2804,17 @@
               A default String for use in generating argument list
               source contents on the client side.
             </p>
+          </dd><dt class="field"><b>defaultArgumentListTextRanges (<span style="color:#999999">optional</span> List&lt;int&gt;)</b></dt><dd>
+            
+            <p>
+              Pairs of offsets and lengths describing 'defaultArgumentListString'
+              text ranges suitable for use by clients to set up linked edits of
+              default argument source contents. For example, given an argument
+              list string 'x, y', the corresponding text range [0, 1, 3, 1],
+              indicates two text ranges of length 1, starting at offsets 0 and 3.
+              Clients can use these ranges to treat the 'x' and 'y' values
+              specially for linked edits.
+            </p>
           </dd><dt class="field"><b>element (<span style="color:#999999">optional</span> <a href="#type_Element">Element</a>)</b></dt><dd>
             
             <p>
diff --git a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
index 5fafc98..c946e9a 100644
--- a/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/generated_protocol.dart
@@ -8971,6 +8971,7 @@
  *   "docComplete": optional String
  *   "declaringType": optional String
  *   "defaultArgumentListString": optional String
+ *   "defaultArgumentListTextRanges": optional List<int>
  *   "element": optional Element
  *   "returnType": optional String
  *   "parameterNames": optional List<String>
@@ -9007,6 +9008,8 @@
 
   String _defaultArgumentListString;
 
+  List<int> _defaultArgumentListTextRanges;
+
   Element _element;
 
   String _returnType;
@@ -9187,6 +9190,28 @@
   }
 
   /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  List<int> get defaultArgumentListTextRanges => _defaultArgumentListTextRanges;
+
+  /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text
+   * ranges suitable for use by clients to set up linked edits of default
+   * argument source contents. For example, given an argument list string 'x,
+   * y', the corresponding text range [0, 1, 3, 1], indicates two text ranges
+   * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
+   * treat the 'x' and 'y' values specially for linked edits.
+   */
+  void set defaultArgumentListTextRanges(List<int> value) {
+    this._defaultArgumentListTextRanges = value;
+  }
+
+  /**
    * Information about the element reference being suggested.
    */
   Element get element => _element;
@@ -9316,7 +9341,7 @@
     this._importUri = value;
   }
 
-  CompletionSuggestion(CompletionSuggestionKind kind, int relevance, String completion, int selectionOffset, int selectionLength, bool isDeprecated, bool isPotential, {String docSummary, String docComplete, String declaringType, String defaultArgumentListString, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, int requiredParameterCount, bool hasNamedParameters, String parameterName, String parameterType, String importUri}) {
+  CompletionSuggestion(CompletionSuggestionKind kind, int relevance, String completion, int selectionOffset, int selectionLength, bool isDeprecated, bool isPotential, {String docSummary, String docComplete, String declaringType, String defaultArgumentListString, List<int> defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, int requiredParameterCount, bool hasNamedParameters, String parameterName, String parameterType, String importUri}) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
@@ -9328,6 +9353,7 @@
     this.docComplete = docComplete;
     this.declaringType = declaringType;
     this.defaultArgumentListString = defaultArgumentListString;
+    this.defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     this.element = element;
     this.returnType = returnType;
     this.parameterNames = parameterNames;
@@ -9402,6 +9428,10 @@
       if (json.containsKey("defaultArgumentListString")) {
         defaultArgumentListString = jsonDecoder.decodeString(jsonPath + ".defaultArgumentListString", json["defaultArgumentListString"]);
       }
+      List<int> defaultArgumentListTextRanges;
+      if (json.containsKey("defaultArgumentListTextRanges")) {
+        defaultArgumentListTextRanges = jsonDecoder.decodeList(jsonPath + ".defaultArgumentListTextRanges", json["defaultArgumentListTextRanges"], jsonDecoder.decodeInt);
+      }
       Element element;
       if (json.containsKey("element")) {
         element = new Element.fromJson(jsonDecoder, jsonPath + ".element", json["element"]);
@@ -9438,7 +9468,7 @@
       if (json.containsKey("importUri")) {
         importUri = jsonDecoder.decodeString(jsonPath + ".importUri", json["importUri"]);
       }
-      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, defaultArgumentListString: defaultArgumentListString, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, hasNamedParameters: hasNamedParameters, parameterName: parameterName, parameterType: parameterType, importUri: importUri);
+      return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary: docSummary, docComplete: docComplete, declaringType: declaringType, defaultArgumentListString: defaultArgumentListString, defaultArgumentListTextRanges: defaultArgumentListTextRanges, element: element, returnType: returnType, parameterNames: parameterNames, parameterTypes: parameterTypes, requiredParameterCount: requiredParameterCount, hasNamedParameters: hasNamedParameters, parameterName: parameterName, parameterType: parameterType, importUri: importUri);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "CompletionSuggestion", json);
     }
@@ -9465,6 +9495,9 @@
     if (defaultArgumentListString != null) {
       result["defaultArgumentListString"] = defaultArgumentListString;
     }
+    if (defaultArgumentListTextRanges != null) {
+      result["defaultArgumentListTextRanges"] = defaultArgumentListTextRanges;
+    }
     if (element != null) {
       result["element"] = element.toJson();
     }
@@ -9512,6 +9545,7 @@
           docComplete == other.docComplete &&
           declaringType == other.declaringType &&
           defaultArgumentListString == other.defaultArgumentListString &&
+          listEqual(defaultArgumentListTextRanges, other.defaultArgumentListTextRanges, (int a, int b) => a == b) &&
           element == other.element &&
           returnType == other.returnType &&
           listEqual(parameterNames, other.parameterNames, (String a, String b) => a == b) &&
@@ -9539,6 +9573,7 @@
     hash = JenkinsSmiHash.combine(hash, docComplete.hashCode);
     hash = JenkinsSmiHash.combine(hash, declaringType.hashCode);
     hash = JenkinsSmiHash.combine(hash, defaultArgumentListString.hashCode);
+    hash = JenkinsSmiHash.combine(hash, defaultArgumentListTextRanges.hashCode);
     hash = JenkinsSmiHash.combine(hash, element.hashCode);
     hash = JenkinsSmiHash.combine(hash, returnType.hashCode);
     hash = JenkinsSmiHash.combine(hash, parameterNames.hashCode);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index ae66900..1dba712 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -470,11 +470,18 @@
       // TODO(brianwilkerson) Support function types.
       return 'dynamic';
     }).toList();
-    suggestion.requiredParameterCount = paramList
-        .where((FormalParameter param) => param is! DefaultFormalParameter)
-        .length;
-    suggestion.hasNamedParameters = paramList
-        .any((FormalParameter param) => param.kind == ParameterKind.NAMED);
+
+    Iterable<ParameterElement> requiredParameters = paramList
+        .where((FormalParameter param) => param.kind == ParameterKind.REQUIRED)
+        .map((p) => p.element);
+    suggestion.requiredParameterCount = requiredParameters.length;
+
+    Iterable<ParameterElement> namedParameters = paramList
+        .where((FormalParameter param) => param.kind == ParameterKind.NAMED)
+        .map((p) => p.element);
+    suggestion.hasNamedParameters = namedParameters.isNotEmpty;
+
+    addDefaultArgDetails(suggestion, requiredParameters, namedParameters);
   }
 
   bool _isVoid(TypeAnnotation returnType) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index a57319a..a00a87d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -8,6 +8,7 @@
 import 'package:analysis_server/src/protocol_server.dart'
     hide Element, ElementKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/utilities.dart';
 import 'package:analysis_server/src/utilities/documentation.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
@@ -70,13 +71,17 @@
       // Gracefully degrade if type not resolved yet
       return paramType != null ? paramType.displayName : 'var';
     }).toList();
-    suggestion.requiredParameterCount = element.parameters
-        .where((ParameterElement parameter) =>
-            parameter.parameterKind == ParameterKind.REQUIRED)
-        .length;
-    suggestion.hasNamedParameters = element.parameters.any(
-        (ParameterElement parameter) =>
-            parameter.parameterKind == ParameterKind.NAMED);
+
+    Iterable<ParameterElement> requiredParameters = element.parameters.where(
+        (ParameterElement param) =>
+            param.parameterKind == ParameterKind.REQUIRED);
+    suggestion.requiredParameterCount = requiredParameters.length;
+
+    Iterable<ParameterElement> namedParameters = element.parameters.where(
+        (ParameterElement param) => param.parameterKind == ParameterKind.NAMED);
+    suggestion.hasNamedParameters = namedParameters.isNotEmpty;
+
+    addDefaultArgDetails(suggestion, requiredParameters, namedParameters);
   }
   if (importForSource != null) {
     String srcPath = path.dirname(importForSource.fullName);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index a3ec936..8000253 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/ast/standard_ast_factory.dart';
 import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -29,6 +30,47 @@
     null);
 
 /**
+ * Add default argument list text and ranges based on the given [requiredParams]
+ * and [namedParams].
+ */
+void addDefaultArgDetails(
+    CompletionSuggestion suggestion,
+    Iterable<ParameterElement> requiredParams,
+    Iterable<ParameterElement> namedParams) {
+  StringBuffer sb = new StringBuffer();
+  List<int> ranges = <int>[];
+
+  int offset;
+
+  for (ParameterElement param in requiredParams) {
+    if (sb.isNotEmpty) {
+      sb.write(', ');
+    }
+    offset = sb.length;
+    String name = param.name;
+    sb.write(name);
+    ranges.addAll([offset, name.length]);
+  }
+
+  for (ParameterElement param in namedParams) {
+    if (param.isRequired) {
+      if (sb.isNotEmpty) {
+        sb.write(', ');
+      }
+      String name = param.name;
+      sb.write('$name: ');
+      offset = sb.length;
+      String defaultValue = _getDefaultValue(param);
+      sb.write(defaultValue);
+      ranges.addAll([offset, defaultValue.length]);
+    }
+  }
+
+  suggestion.defaultArgumentListString = sb.isNotEmpty ? sb.toString() : null;
+  suggestion.defaultArgumentListTextRanges = ranges.isNotEmpty ? ranges : null;
+}
+
+/**
  * Create a new protocol Element for inclusion in a completion suggestion.
  */
 protocol.Element createLocalElement(
@@ -155,3 +197,5 @@
   }
   return DYNAMIC;
 }
+
+String _getDefaultValue(ParameterElement param) => 'null';
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index e3c4b93..e139528 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -76,6 +76,20 @@
    */
   bool get enableNewAnalysisDriver => false;
 
+  Source addMetaPackageSource() => addPackageSource(
+      'meta',
+      'meta.dart',
+      r'''
+library meta;
+
+const Required required = const Required();
+
+class Required {
+  final String reason;
+  const Required([this.reason]);
+}
+''');
+
   Source addPackageSource(String packageName, String filePath, String content) {
     packageMap[packageName] = [(newFolder('/pubcache/$packageName'))];
     File file = newFile('/pubcache/$packageName/$filePath', content);
diff --git a/pkg/analysis_server/test/integration/protocol_matchers.dart b/pkg/analysis_server/test/integration/protocol_matchers.dart
index 2246d1e..1ad51bf 100644
--- a/pkg/analysis_server/test/integration/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/protocol_matchers.dart
@@ -1264,6 +1264,7 @@
  *   "docComplete": optional String
  *   "declaringType": optional String
  *   "defaultArgumentListString": optional String
+ *   "defaultArgumentListTextRanges": optional List<int>
  *   "element": optional Element
  *   "returnType": optional String
  *   "parameterNames": optional List<String>
@@ -1289,6 +1290,7 @@
     "docComplete": isString,
     "declaringType": isString,
     "defaultArgumentListString": isString,
+    "defaultArgumentListTextRanges": isListOf(isInt),
     "element": isElement,
     "returnType": isString,
     "parameterNames": isListOf(isString),
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 2a0bd25..f9c6a45 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -114,7 +114,9 @@
       String elemFile,
       int elemOffset,
       String paramName,
-      String paramType}) {
+      String paramType,
+      String defaultArgListString,
+      List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs =
         getSuggest(completion: completion, csKind: csKind, elemKind: elemKind);
     if (cs == null) {
@@ -151,6 +153,12 @@
     if (paramType != null) {
       expect(cs.parameterType, paramType);
     }
+    if (defaultArgListString != null) {
+      expect(cs.defaultArgumentListString, defaultArgListString);
+    }
+    if (defaultArgumentListTextRanges != null) {
+      expect(cs.defaultArgumentListTextRanges, defaultArgumentListTextRanges);
+    }
     return cs;
   }
 
@@ -197,9 +205,13 @@
   CompletionSuggestion assertSuggestConstructor(String name,
       {int relevance: DART_RELEVANCE_DEFAULT,
       String importUri,
-      int elemOffset}) {
+      int elemOffset,
+      String defaultArgListString}) {
     CompletionSuggestion cs = assertSuggest(name,
-        relevance: relevance, importUri: importUri, elemOffset: elemOffset);
+        relevance: relevance,
+        importUri: importUri,
+        elemOffset: elemOffset,
+        defaultArgListString: defaultArgListString);
     protocol.Element element = cs.element;
     expect(element, isNotNull);
     expect(element.kind, equals(protocol.ElementKind.CONSTRUCTOR));
@@ -255,12 +267,16 @@
       {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
       bool isDeprecated: false,
       int relevance: DART_RELEVANCE_DEFAULT,
-      String importUri}) {
+      String importUri,
+      String defaultArgListString,
+      List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
         importUri: importUri,
-        isDeprecated: isDeprecated);
+        isDeprecated: isDeprecated,
+        defaultArgListString: defaultArgListString,
+        defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     if (returnType != null) {
       expect(cs.returnType, returnType);
     } else if (isNullExpectedReturnTypeConsideredDynamic) {
@@ -347,12 +363,16 @@
       {int relevance: DART_RELEVANCE_DEFAULT,
       String importUri,
       CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false}) {
+      bool isDeprecated: false,
+      String defaultArgListString,
+      List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
         importUri: importUri,
-        isDeprecated: isDeprecated);
+        isDeprecated: isDeprecated,
+        defaultArgListString: defaultArgListString,
+        defaultArgumentListTextRanges: defaultArgumentListTextRanges);
     expect(cs.declaringType, equals(declaringType));
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
     protocol.Element element = cs.element;
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index 7c91fe8..94a5c56 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -4521,4 +4521,27 @@
   test_enum_deprecated() {
     // TODO(scheglov) remove it?
   }
+
+  /// Sanity check.  Permutations tested in local_ref_contributor.
+  test_ArgDefaults_function_with_required_named() async {
+    addMetaPackageSource();
+
+    resolveSource(
+        '/testB.dart',
+        '''
+lib B;
+import 'package:meta/meta.dart';
+
+bool foo(int bar, {bool boo, @required int baz}) => false;
+''');
+
+    addTestSource('''
+import "/testB.dart";
+
+void main() {f^}''');
+    await computeSuggestions();
+
+    assertSuggestFunction('foo', 'bool',
+        defaultArgListString: 'bar, baz: null');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
index 8e564c7..834cda6 100644
--- a/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/inherited_reference_contributor_test.dart
@@ -623,4 +623,28 @@
 class InheritedContributorTest_Driver extends InheritedContributorTest {
   @override
   bool get enableNewAnalysisDriver => true;
+
+  /// Sanity check.  Permutations tested in local_ref_contributor.
+  test_ArgDefaults_inherited_method_with_required_named() async {
+    addMetaPackageSource();
+    resolveSource(
+        '/testB.dart',
+        '''
+import 'package:meta/meta.dart';
+
+lib libB;
+class A {
+   bool foo(int bar, {bool boo, @required int baz}) => false;
+}''');
+    addTestSource('''
+import "/testB.dart";
+class B extends A {
+  b() => f^
+}
+''');
+    await computeSuggestions();
+
+    assertSuggestMethod('foo', 'A', 'bool',
+        defaultArgListString: 'bar, baz: null');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
index 7ee4457..ddaa6a5 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
@@ -4153,4 +4153,22 @@
     extends LocalConstructorContributorTest {
   @override
   bool get enableNewAnalysisDriver => true;
+
+  /// Sanity check.  Permutations tested in local_ref_contributor.
+  test_ArgDefaults_cons_with_required_named() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+class A {
+  A(int bar, {bool boo, @required int baz});
+  baz() {
+    new A^
+  }
+}''');
+    await computeSuggestions();
+
+    assertSuggestConstructor('A',
+        defaultArgListString: 'bar, baz: null');
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index 45624f2..31e96f7 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -4597,4 +4597,77 @@
     extends LocalReferenceContributorTest {
   @override
   bool get enableNewAnalysisDriver => true;
+
+  test_ArgDefaults_function() async {
+    addTestSource('''
+bool hasLength(int a, bool b) => false;
+void main() {h^}''');
+    await computeSuggestions();
+
+    assertSuggestFunction('hasLength', 'bool',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
+        defaultArgListString: 'a, b',
+        defaultArgumentListTextRanges: [0, 1, 3, 1]);
+  }
+
+  test_ArgDefaults_function_none() async {
+    addTestSource('''
+bool hasLength() => false;
+void main() {h^}''');
+    await computeSuggestions();
+
+    assertSuggestFunction('hasLength', 'bool',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
+        defaultArgListString: null,
+        defaultArgumentListTextRanges: null);
+  }
+
+  test_ArgDefaults_function_with_optional_positional() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+bool foo(int bar, [bool boo, int baz]) => false;
+void main() {h^}''');
+    await computeSuggestions();
+
+    assertSuggestFunction('foo', 'bool',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
+        defaultArgListString: 'bar',
+        defaultArgumentListTextRanges: [0, 3]);
+  }
+
+  test_ArgDefaults_function_with_required_named() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+bool foo(int bar, {bool boo, @required int baz}) => false;
+void main() {h^}''');
+    await computeSuggestions();
+
+    assertSuggestFunction('foo', 'bool',
+        relevance: DART_RELEVANCE_LOCAL_FUNCTION,
+        defaultArgListString: 'bar, baz: null',
+        defaultArgumentListTextRanges: [0, 3, 10, 4]);
+  }
+
+  test_ArgDefaults_method_with_required_named() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+class A {
+  bool foo(int bar, {bool boo, @required int baz}) => false;
+  baz() {
+    f^
+  }
+}''');
+    await computeSuggestions();
+
+    assertSuggestMethod('foo', 'A', 'bool',
+        relevance: DART_RELEVANCE_LOCAL_METHOD,
+        defaultArgListString: 'bar, baz: null',
+        defaultArgumentListTextRanges: [0, 3, 10, 4]);
+  }
 }
diff --git a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
index 9801e82..2dbbc05 100644
--- a/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/type_member_contributor_test.dart
@@ -4163,4 +4163,59 @@
 class TypeMemberContributorTest_Driver extends TypeMemberContributorTest {
   @override
   bool get enableNewAnalysisDriver => true;
+
+  test_ArgDefaults_method() async {
+    addTestSource('''
+class A {
+  bool a(int b, bool c) => false;
+}
+
+void main() {new A().a^}''');
+    await computeSuggestions();
+
+    assertSuggestMethod('a', 'A', 'bool', defaultArgListString: 'b, c');
+  }
+
+  test_ArgDefaults_method_none() async {
+    addTestSource('''
+class A {
+  bool a() => false;
+}
+
+void main() {new A().a^}''');
+    await computeSuggestions();
+
+    assertSuggestMethod('a', 'A', 'bool', defaultArgListString: null);
+  }
+
+  test_ArgDefaults_method_with_optional_positional() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+class A {
+  bool foo(int bar, [bool boo, int baz]) => false;
+}
+
+void main() {new A().f^}''');
+    await computeSuggestions();
+
+    assertSuggestMethod('foo', 'A', 'bool', defaultArgListString: 'bar');
+  }
+
+  test_ArgDefaults_method_with_required_named() async {
+    addMetaPackageSource();
+    addTestSource('''
+import 'package:meta/meta.dart';
+
+class A {
+  bool foo(int bar, {bool boo, @required int baz}) => false;
+}
+
+void main() {new A().f^}''');
+    await computeSuggestions();
+
+    assertSuggestMethod('foo', 'A', 'bool',
+        defaultArgListString: 'bar, baz: null');
+  }
 }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
index 71a4bb9..f20a098 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/CompletionSuggestion.java
@@ -107,6 +107,15 @@
   private final String defaultArgumentListString;
 
   /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text ranges suitable for use
+   * by clients to set up linked edits of default argument source contents. For example, given an
+   * argument list string 'x, y', the corresponding text range [0, 1, 3, 1], indicates two text
+   * ranges of length 1, starting at offsets 0 and 3. Clients can use these ranges to treat the 'x'
+   * and 'y' values specially for linked edits.
+   */
+  private final int[] defaultArgumentListTextRanges;
+
+  /**
    * Information about the element reference being suggested.
    */
   private final Element element;
@@ -162,7 +171,7 @@
   /**
    * Constructor for {@link CompletionSuggestion}.
    */
-  public CompletionSuggestion(String kind, int relevance, String completion, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
+  public CompletionSuggestion(String kind, int relevance, String completion, int selectionOffset, int selectionLength, boolean isDeprecated, boolean isPotential, String docSummary, String docComplete, String declaringType, String defaultArgumentListString, int[] defaultArgumentListTextRanges, Element element, String returnType, List<String> parameterNames, List<String> parameterTypes, Integer requiredParameterCount, Boolean hasNamedParameters, String parameterName, String parameterType, String importUri) {
     this.kind = kind;
     this.relevance = relevance;
     this.completion = completion;
@@ -174,6 +183,7 @@
     this.docComplete = docComplete;
     this.declaringType = declaringType;
     this.defaultArgumentListString = defaultArgumentListString;
+    this.defaultArgumentListTextRanges = defaultArgumentListTextRanges;
     this.element = element;
     this.returnType = returnType;
     this.parameterNames = parameterNames;
@@ -201,6 +211,7 @@
         ObjectUtilities.equals(other.docComplete, docComplete) &&
         ObjectUtilities.equals(other.declaringType, declaringType) &&
         ObjectUtilities.equals(other.defaultArgumentListString, defaultArgumentListString) &&
+        Arrays.equals(other.defaultArgumentListTextRanges, defaultArgumentListTextRanges) &&
         ObjectUtilities.equals(other.element, element) &&
         ObjectUtilities.equals(other.returnType, returnType) &&
         ObjectUtilities.equals(other.parameterNames, parameterNames) &&
@@ -226,6 +237,7 @@
     String docComplete = jsonObject.get("docComplete") == null ? null : jsonObject.get("docComplete").getAsString();
     String declaringType = jsonObject.get("declaringType") == null ? null : jsonObject.get("declaringType").getAsString();
     String defaultArgumentListString = jsonObject.get("defaultArgumentListString") == null ? null : jsonObject.get("defaultArgumentListString").getAsString();
+    int[] defaultArgumentListTextRanges = jsonObject.get("defaultArgumentListTextRanges") == null ? null : JsonUtilities.decodeIntArray(jsonObject.get("defaultArgumentListTextRanges").getAsJsonArray());
     Element element = jsonObject.get("element") == null ? null : Element.fromJson(jsonObject.get("element").getAsJsonObject());
     String returnType = jsonObject.get("returnType") == null ? null : jsonObject.get("returnType").getAsString();
     List<String> parameterNames = jsonObject.get("parameterNames") == null ? null : JsonUtilities.decodeStringList(jsonObject.get("parameterNames").getAsJsonArray());
@@ -235,7 +247,7 @@
     String parameterName = jsonObject.get("parameterName") == null ? null : jsonObject.get("parameterName").getAsString();
     String parameterType = jsonObject.get("parameterType") == null ? null : jsonObject.get("parameterType").getAsString();
     String importUri = jsonObject.get("importUri") == null ? null : jsonObject.get("importUri").getAsString();
-    return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
+    return new CompletionSuggestion(kind, relevance, completion, selectionOffset, selectionLength, isDeprecated, isPotential, docSummary, docComplete, declaringType, defaultArgumentListString, defaultArgumentListTextRanges, element, returnType, parameterNames, parameterTypes, requiredParameterCount, hasNamedParameters, parameterName, parameterType, importUri);
   }
 
   public static List<CompletionSuggestion> fromJsonArray(JsonArray jsonArray) {
@@ -275,6 +287,17 @@
   }
 
   /**
+   * Pairs of offsets and lengths describing 'defaultArgumentListString' text ranges suitable for use
+   * by clients to set up linked edits of default argument source contents. For example, given an
+   * argument list string 'x, y', the corresponding text range [0, 1, 3, 1], indicates two text
+   * ranges of length 1, starting at offsets 0 and 3. Clients can use these ranges to treat the 'x'
+   * and 'y' values specially for linked edits.
+   */
+  public int[] getDefaultArgumentListTextRanges() {
+    return defaultArgumentListTextRanges;
+  }
+
+  /**
    * The Dartdoc associated with the element being suggested, This field is omitted if there is no
    * Dartdoc associated with the element.
    */
@@ -419,6 +442,7 @@
     builder.append(docComplete);
     builder.append(declaringType);
     builder.append(defaultArgumentListString);
+    builder.append(defaultArgumentListTextRanges);
     builder.append(element);
     builder.append(returnType);
     builder.append(parameterNames);
@@ -452,6 +476,13 @@
     if (defaultArgumentListString != null) {
       jsonObject.addProperty("defaultArgumentListString", defaultArgumentListString);
     }
+    if (defaultArgumentListTextRanges != null) {
+      JsonArray jsonArrayDefaultArgumentListTextRanges = new JsonArray();
+      for (int elt : defaultArgumentListTextRanges) {
+        jsonArrayDefaultArgumentListTextRanges.add(new JsonPrimitive(elt));
+      }
+      jsonObject.add("defaultArgumentListTextRanges", jsonArrayDefaultArgumentListTextRanges);
+    }
     if (element != null) {
       jsonObject.add("element", element.toJson());
     }
@@ -516,6 +547,8 @@
     builder.append(declaringType + ", ");
     builder.append("defaultArgumentListString=");
     builder.append(defaultArgumentListString + ", ");
+    builder.append("defaultArgumentListTextRanges=");
+    builder.append(StringUtils.join(defaultArgumentListTextRanges, ", ") + ", ");
     builder.append("element=");
     builder.append(element + ", ");
     builder.append("returnType=");
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 24bbf48..e2a4c15 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -2439,6 +2439,18 @@
               source contents on the client side.
             </p>
           </field>
+          <field name="defaultArgumentListTextRanges" optional="true">
+            <list><ref>int</ref></list>
+            <p>
+              Pairs of offsets and lengths describing 'defaultArgumentListString'
+              text ranges suitable for use by clients to set up linked edits of
+              default argument source contents. For example, given an argument
+              list string 'x, y', the corresponding text range [0, 1, 3, 1],
+              indicates two text ranges of length 1, starting at offsets 0 and 3.
+              Clients can use these ranges to treat the 'x' and 'y' values
+              specially for linked edits.
+            </p>
+          </field>
           <field name="element" optional="true">
             <ref>Element</ref>
             <p>
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 624f840..0c65f34 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2765,6 +2765,11 @@
   Token get covariantKeyword;
 
   /**
+   * Set the token for the 'covariant' keyword to the given [token].
+   */
+  void set covariantKeyword(Token token);
+
+  /**
    * Return the fields being declared.
    */
   VariableDeclarationList get fields;
diff --git a/pkg/analyzer/lib/dart/ast/ast_factory.dart b/pkg/analyzer/lib/dart/ast/ast_factory.dart
index 3e5c448..40a5830 100644
--- a/pkg/analyzer/lib/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/dart/ast/ast_factory.dart
@@ -83,6 +83,7 @@
    */
   BinaryExpression binaryExpression(
       Expression leftOperand, Token operator, Expression rightOperand);
+
   /**
    * Returns a newly created block of code.
    */
@@ -407,11 +408,28 @@
    * [comment] and [metadata] can be `null` if the declaration does not have the
    * corresponding attribute. The [staticKeyword] can be `null` if the field is
    * not a static field.
+   *
+   * Use [fieldDeclaration2] instead.
    */
+  @deprecated
   FieldDeclaration fieldDeclaration(Comment comment, List<Annotation> metadata,
       Token staticKeyword, VariableDeclarationList fieldList, Token semicolon);
 
   /**
+   * Returns a newly created field declaration. Either or both of the
+   * [comment] and [metadata] can be `null` if the declaration does not have the
+   * corresponding attribute. The [staticKeyword] can be `null` if the field is
+   * not a static field.
+   */
+  FieldDeclaration fieldDeclaration2(
+      {Comment comment,
+      List<Annotation> metadata,
+      Token covariantKeyword,
+      Token staticKeyword,
+      @required VariableDeclarationList fieldList,
+      @required Token semicolon});
+
+  /**
    * Returns a newly created formal parameter. Either or both of the
    * [comment] and [metadata] can be `null` if the parameter does not have the
    * corresponding attribute. The [keyword] can be `null` if there is a type.
@@ -419,7 +437,10 @@
    * [period] can be `null` if the keyword 'this' was not provided.  The
    * [parameters] can be `null` if this is not a function-typed field formal
    * parameter.
+   *
+   * Use [fieldFormalParameter2] instead.
    */
+  @deprecated
   FieldFormalParameter fieldFormalParameter(
       Comment comment,
       List<Annotation> metadata,
@@ -569,7 +590,10 @@
    * [comment] and [metadata] can be `null` if the parameter does not have the
    * corresponding attribute. The [returnType] can be `null` if no return type
    * was specified.
+   *
+   * Use [functionTypedFormalParameter2] instead.
    */
+  @deprecated
   FunctionTypedFormalParameter functionTypedFormalParameter(
       Comment comment,
       List<Annotation> metadata,
@@ -907,7 +931,10 @@
    * [comment] and [metadata] can be `null` if the parameter does not have the
    * corresponding attribute. The [keyword] can be `null` if a type was
    * specified. The [type] must be `null` if the keyword is 'var'.
+   *
+   * Use [simpleFormalParameter2] instead.
    */
+  @deprecated
   SimpleFormalParameter simpleFormalParameter(
       Comment comment,
       List<Annotation> metadata,
diff --git a/pkg/analyzer/lib/src/command_line/arguments.dart b/pkg/analyzer/lib/src/command_line/arguments.dart
index e0ab676..5579005 100644
--- a/pkg/analyzer/lib/src/command_line/arguments.dart
+++ b/pkg/analyzer/lib/src/command_line/arguments.dart
@@ -32,25 +32,38 @@
 /**
  * Update [options] with the value of each analysis option command line flag.
  */
-void applyAnalysisOptionFlags(AnalysisOptionsImpl options, ArgResults args) {
+void applyAnalysisOptionFlags(AnalysisOptionsImpl options, ArgResults args,
+    {void verbosePrint(String text)}) {
+  void verbose(String text) {
+    if (verbosePrint != null) {
+      verbosePrint('Analysis options: $text');
+    }
+  }
+
   if (args.wasParsed(enableStrictCallChecksFlag)) {
     options.enableStrictCallChecks = args[enableStrictCallChecksFlag];
+    verbose('$enableStrictCallChecksFlag = ${options.enableStrictCallChecks}');
   }
   if (args.wasParsed(enableSuperMixinFlag)) {
     options.enableSuperMixins = args[enableSuperMixinFlag];
+    verbose('$enableSuperMixinFlag = ${options.enableSuperMixins}');
   }
   if (args.wasParsed(noImplicitCastsFlag)) {
     options.implicitCasts = !args[noImplicitCastsFlag];
+    verbose('$noImplicitCastsFlag = ${options.implicitCasts}');
   }
   if (args.wasParsed(noImplicitDynamicFlag)) {
     options.implicitDynamic = !args[noImplicitDynamicFlag];
+    verbose('$noImplicitDynamicFlag = ${options.implicitDynamic}');
   }
   if (args.wasParsed(strongModeFlag)) {
     options.strongMode = args[strongModeFlag];
+    verbose('$strongModeFlag = ${options.strongMode}');
   }
   try {
     if (args.wasParsed(lintsFlag)) {
       options.lint = args[lintsFlag];
+      verbose('$lintsFlag = ${options.lint}');
     }
   } on ArgumentError {
     // lints were not defined - ignore and fall through
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index ea35756..0bd531e 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -366,9 +366,17 @@
 
   /**
    * Return the analysis options that should be used to analyze code in the
-   * directory with the given [path].
+   * directory with the given [path]. Use [verbosePrint] to echo verbose
+   * information about the analysis options selection process.
    */
-  AnalysisOptions getAnalysisOptions(String path) {
+  AnalysisOptions getAnalysisOptions(String path,
+      {void verbosePrint(String text)}) {
+    void verbose(String text) {
+      if (verbosePrint != null) {
+        verbosePrint(text);
+      }
+    }
+
     // TODO(danrubel) restructure so that we don't create a workspace
     // both here and in createSourceFactory
     Workspace workspace = createWorkspace(path);
@@ -383,8 +391,10 @@
     if (optionsFile != null) {
       try {
         optionMap = optionsProvider.getOptionsFromFile(optionsFile);
-      } catch (_) {
+        verbose('Loaded analysis options from ${optionsFile.path}');
+      } catch (e) {
         // Ignore exceptions thrown while trying to load the options file.
+        verbose('Exception: $e\n  when loading ${optionsFile.path}');
       }
     } else {
       // Search for the default analysis options
@@ -401,8 +411,10 @@
       if (source.exists()) {
         try {
           optionMap = optionsProvider.getOptionsFromSource(source);
-        } catch (_) {
+          verbose('Loaded analysis options from ${source.fullName}');
+        } catch (e) {
           // Ignore exceptions thrown while trying to load the options file.
+          verbose('Exception: $e\n  when loading ${source.fullName}');
         }
       }
     }
@@ -410,12 +422,16 @@
     if (optionMap != null) {
       applyToAnalysisOptions(options, optionMap);
       if (builderOptions.argResults != null) {
-        applyAnalysisOptionFlags(options, builderOptions.argResults);
+        applyAnalysisOptionFlags(options, builderOptions.argResults,
+            verbosePrint: verbosePrint);
         // If lints turned on but none specified, then enable default lints
         if (options.lint && options.lintRules.isEmpty) {
           options.lintRules = Registry.ruleRegistry.defaultRules;
+          verbose('Using default lint rules');
         }
       }
+    } else {
+      verbose('Using default analysis options');
     }
     return options;
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index c4a3177..0a364cf 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -4325,6 +4325,7 @@
   /**
    * The 'covariant' keyword, or `null` if the keyword was not used.
    */
+  @override
   Token covariantKeyword;
 
   /**
@@ -4351,8 +4352,13 @@
    * corresponding attribute. The [staticKeyword] can be `null` if the field is
    * not a static field.
    */
-  FieldDeclarationImpl(CommentImpl comment, List<Annotation> metadata,
-      this.staticKeyword, VariableDeclarationListImpl fieldList, this.semicolon)
+  FieldDeclarationImpl(
+      CommentImpl comment,
+      List<Annotation> metadata,
+      this.covariantKeyword,
+      this.staticKeyword,
+      VariableDeclarationListImpl fieldList,
+      this.semicolon)
       : super(comment, metadata) {
     _fieldList = _becomeParentOf(fieldList);
   }
diff --git a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
index f7e92be..a3a09ee9 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast_factory.dart
@@ -361,7 +361,18 @@
           VariableDeclarationList fieldList,
           Token semicolon) =>
       new FieldDeclarationImpl(
-          comment, metadata, staticKeyword, fieldList, semicolon);
+          comment, metadata, null, staticKeyword, fieldList, semicolon);
+
+  @override
+  FieldDeclaration fieldDeclaration2(
+          {Comment comment,
+          List<Annotation> metadata,
+          Token covariantKeyword,
+          Token staticKeyword,
+          @required VariableDeclarationList fieldList,
+          @required Token semicolon}) =>
+      new FieldDeclarationImpl(comment, metadata, covariantKeyword,
+          staticKeyword, fieldList, semicolon);
 
   @override
   FieldFormalParameter fieldFormalParameter(
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index 9e370a1..920e585 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -432,12 +432,13 @@
 
   @override
   FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
-      astFactory.fieldDeclaration(
-          cloneNode(node.documentationComment),
-          cloneNodeList(node.metadata),
-          cloneToken(node.staticKeyword),
-          cloneNode(node.fields),
-          cloneToken(node.semicolon));
+      astFactory.fieldDeclaration2(
+          comment: cloneNode(node.documentationComment),
+          metadata: cloneNodeList(node.metadata),
+          covariantKeyword: cloneToken(node.covariantKeyword),
+          staticKeyword: cloneToken(node.staticKeyword),
+          fieldList: cloneNode(node.fields),
+          semicolon: cloneToken(node.semicolon));
 
   @override
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
@@ -3171,12 +3172,13 @@
 
   @override
   FieldDeclaration visitFieldDeclaration(FieldDeclaration node) =>
-      astFactory.fieldDeclaration(
-          _cloneNode(node.documentationComment),
-          _cloneNodeList(node.metadata),
-          _mapToken(node.staticKeyword),
-          _cloneNode(node.fields),
-          _mapToken(node.semicolon));
+      astFactory.fieldDeclaration2(
+          comment: _cloneNode(node.documentationComment),
+          metadata: _cloneNodeList(node.metadata),
+          covariantKeyword: _mapToken(node.covariantKeyword),
+          staticKeyword: _mapToken(node.staticKeyword),
+          fieldList: _cloneNode(node.fields),
+          semicolon: _mapToken(node.semicolon));
 
   @override
   FieldFormalParameter visitFieldFormalParameter(FieldFormalParameter node) =>
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index c785abe..1ccc89f 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1338,15 +1338,13 @@
         VariableDeclaration variable = astFactory.variableDeclaration(
             createSyntheticIdentifier(), null, null);
         List<VariableDeclaration> variables = <VariableDeclaration>[variable];
-        FieldDeclarationImpl field = astFactory.fieldDeclaration(
-            commentAndMetadata.comment,
-            commentAndMetadata.metadata,
-            null,
-            astFactory.variableDeclarationList(
+        return astFactory.fieldDeclaration2(
+            comment: commentAndMetadata.comment,
+            metadata: commentAndMetadata.metadata,
+            covariantKeyword: modifiers.covariantKeyword,
+            fieldList: astFactory.variableDeclarationList(
                 null, null, keyword, null, variables),
-            _expect(TokenType.SEMICOLON));
-        field.covariantKeyword = modifiers.covariantKeyword;
-        return field;
+            semicolon: _expect(TokenType.SEMICOLON));
       }
       _reportErrorForToken(
           ParserErrorCode.EXPECTED_CLASS_MEMBER, _currentToken);
@@ -3584,14 +3582,13 @@
       TypeAnnotation type) {
     VariableDeclarationList fieldList =
         parseVariableDeclarationListAfterType(null, keyword, type);
-    FieldDeclarationImpl field = astFactory.fieldDeclaration(
-        commentAndMetadata.comment,
-        commentAndMetadata.metadata,
-        staticKeyword,
-        fieldList,
-        _expect(TokenType.SEMICOLON));
-    field.covariantKeyword = covariantKeyword;
-    return field;
+    return astFactory.fieldDeclaration2(
+        comment: commentAndMetadata.comment,
+        metadata: commentAndMetadata.metadata,
+        covariantKeyword: covariantKeyword,
+        staticKeyword: staticKeyword,
+        fieldList: fieldList,
+        semicolon: _expect(TokenType.SEMICOLON));
   }
 
   /**
@@ -6360,11 +6357,6 @@
       Expression selectorExpression = parseAssignableSelector(
           expression, isOptional || (expression is PrefixedIdentifier));
       if (identical(selectorExpression, expression)) {
-        if (!isOptional && (expression is PrefixedIdentifier)) {
-          PrefixedIdentifier identifier = expression as PrefixedIdentifier;
-          expression = astFactory.propertyAccess(
-              identifier.prefix, identifier.period, identifier.identifier);
-        }
         return expression;
       }
       expression = selectorExpression;
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 2139d38..115bad5 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -471,12 +471,11 @@
 
   static FieldDeclaration fieldDeclaration(bool isStatic, Keyword keyword,
           TypeAnnotation type, List<VariableDeclaration> variables) =>
-      astFactory.fieldDeclaration(
-          null,
-          null,
-          isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
-          variableDeclarationList(keyword, type, variables),
-          TokenFactory.tokenFromType(TokenType.SEMICOLON));
+      astFactory.fieldDeclaration2(
+          staticKeyword:
+              isStatic ? TokenFactory.tokenFromKeyword(Keyword.STATIC) : null,
+          fieldList: variableDeclarationList(keyword, type, variables),
+          semicolon: TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static FieldDeclaration fieldDeclaration2(bool isStatic, Keyword keyword,
           List<VariableDeclaration> variables) =>
@@ -485,16 +484,14 @@
   static FieldFormalParameter fieldFormalParameter(
           Keyword keyword, TypeAnnotation type, String identifier,
           [FormalParameterList parameterList]) =>
-      astFactory.fieldFormalParameter(
-          null,
-          null,
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          type,
-          TokenFactory.tokenFromKeyword(Keyword.THIS),
-          TokenFactory.tokenFromType(TokenType.PERIOD),
-          identifier3(identifier),
-          null,
-          parameterList);
+      astFactory.fieldFormalParameter2(
+          keyword:
+              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type: type,
+          thisKeyword: TokenFactory.tokenFromKeyword(Keyword.THIS),
+          period: TokenFactory.tokenFromType(TokenType.PERIOD),
+          identifier: identifier3(identifier),
+          parameters: parameterList);
 
   static FieldFormalParameter fieldFormalParameter2(String identifier) =>
       fieldFormalParameter(null, null, identifier);
@@ -610,8 +607,10 @@
   static FunctionTypedFormalParameter functionTypedFormalParameter(
           TypeAnnotation returnType, String identifier,
           [List<FormalParameter> parameters]) =>
-      astFactory.functionTypedFormalParameter(null, null, returnType,
-          identifier3(identifier), null, formalParameterList(parameters));
+      astFactory.functionTypedFormalParameter2(
+          returnType: returnType,
+          identifier: identifier3(identifier),
+          parameters: formalParameterList(parameters));
 
   static HideCombinator hideCombinator(List<SimpleIdentifier> identifiers) =>
       astFactory.hideCombinator(
@@ -1066,12 +1065,11 @@
 
   static SimpleFormalParameter simpleFormalParameter2(
           Keyword keyword, TypeAnnotation type, String parameterName) =>
-      astFactory.simpleFormalParameter(
-          null,
-          null,
-          keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
-          type,
-          identifier3(parameterName));
+      astFactory.simpleFormalParameter2(
+          keyword:
+              keyword == null ? null : TokenFactory.tokenFromKeyword(keyword),
+          type: type,
+          identifier: identifier3(parameterName));
 
   static SimpleFormalParameter simpleFormalParameter3(String parameterName) =>
       simpleFormalParameter2(null, null, parameterName);
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index 0c99a09..eb8b5f9 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart' as analyzer;
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/generated/parser.dart' as analyzer;
@@ -25,6 +26,7 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(ClassMemberParserTest_Fasta);
     defineReflectiveTests(ComplexParserTest_Fasta);
+    defineReflectiveTests(ExpressionParserTest_Fasta);
     defineReflectiveTests(FormalParameterParserTest_Fasta);
     defineReflectiveTests(TopLevelParserTest_Fasta);
   });
@@ -57,20 +59,6 @@
 
   @override
   @failingTest
-  void test_parseAwaitExpression_asStatement_inAsync() {
-    // TODO(paulberry): Add support for async
-    super.test_parseAwaitExpression_asStatement_inAsync();
-  }
-
-  @override
-  @failingTest
-  void test_parseAwaitExpression_asStatement_inSync() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseAwaitExpression_asStatement_inSync();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_constructor_withInitializers() {
     // TODO(paulberry): 'this' can't be used here.
     super.test_parseClassMember_constructor_withInitializers();
@@ -78,55 +66,6 @@
 
   @override
   @failingTest
-  void test_parseClassMember_field_covariant() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_covariant();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_instance_prefixedType() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_instance_prefixedType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_namedGet() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_namedGet();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_namedOperator() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_namedOperator();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_namedOperator_withAssignment() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_namedOperator_withAssignment();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_namedSet() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_namedSet();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_field_static() {
-    // TODO(paulberry): Unhandled event: Fields
-    super.test_parseClassMember_field_static();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_getter_functionType() {
     // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: get}
     super.test_parseClassMember_getter_functionType();
@@ -134,27 +73,6 @@
 
   @override
   @failingTest
-  void test_parseClassMember_getter_void() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_getter_void();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_external() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_external();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_external_withTypeAndArgs() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_external_withTypeAndArgs();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_method_generic_comment_noReturnType() {
     // TODO(paulberry): Fasta doesn't support generic comment syntax
     super.test_parseClassMember_method_generic_comment_noReturnType();
@@ -183,69 +101,6 @@
 
   @override
   @failingTest
-  void test_parseClassMember_method_generic_noReturnType() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_generic_noReturnType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_generic_returnType() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_generic_returnType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_generic_void() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_generic_void();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_get_noType() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_get_noType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_get_type() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_get_type();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_get_void() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_get_void();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_operator_noType() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_operator_noType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_operator_type() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_operator_type();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_operator_void() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_operator_void();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_method_returnType_functionType() {
     // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: m}
     super.test_parseClassMember_method_returnType_functionType();
@@ -253,41 +108,6 @@
 
   @override
   @failingTest
-  void test_parseClassMember_method_returnType_parameterized() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_returnType_parameterized();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_set_noType() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_set_noType();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_set_type() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_set_type();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_set_void() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_set_void();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_method_trailing_commas() {
-    // TODO(paulberry): Add support for method declarations
-    super.test_parseClassMember_method_trailing_commas();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_operator_functionType() {
     // TODO(paulberry): InputError: ErrorKind.ExpectedFunctionBody {actual: operator}
     super.test_parseClassMember_operator_functionType();
@@ -295,20 +115,6 @@
 
   @override
   @failingTest
-  void test_parseClassMember_operator_index() {
-    // TODO(paulberry): Unhandled event: OperatorName
-    super.test_parseClassMember_operator_index();
-  }
-
-  @override
-  @failingTest
-  void test_parseClassMember_operator_indexAssign() {
-    // TODO(paulberry): Unhandled event: OperatorName
-    super.test_parseClassMember_operator_indexAssign();
-  }
-
-  @override
-  @failingTest
   void test_parseClassMember_redirectingFactory_const() {
     // TODO(paulberry): Unhandled event: ConstructorReference
     super.test_parseClassMember_redirectingFactory_const();
@@ -352,7 +158,7 @@
   @override
   @failingTest
   void test_parseGetter_nonStatic() {
-    // TODO(paulberry): Add support for method declarations
+    // TODO(paulberry): handle doc comments
     super.test_parseGetter_nonStatic();
   }
 
@@ -366,28 +172,28 @@
   @override
   @failingTest
   void test_parseInitializedIdentifierList_type() {
-    // TODO(paulberry): Unhandled event: Fields
+    // TODO(paulberry): handle doc comments
     super.test_parseInitializedIdentifierList_type();
   }
 
   @override
   @failingTest
   void test_parseInitializedIdentifierList_var() {
-    // TODO(paulberry): Unhandled event: Fields
+    // TODO(paulberry): handle doc comments
     super.test_parseInitializedIdentifierList_var();
   }
 
   @override
   @failingTest
   void test_parseOperator() {
-    // TODO(paulberry): Unhandled event: OperatorName
+    // TODO(paulberry): handle doc comments
     super.test_parseOperator();
   }
 
   @override
   @failingTest
   void test_parseSetter_nonStatic() {
-    // TODO(paulberry): Add support for method declarations
+    // TODO(paulberry): handle doc comments
     super.test_parseSetter_nonStatic();
   }
 
@@ -407,30 +213,6 @@
     with ComplexParserTestMixin {
   @override
   @failingTest
-  void test_additiveExpression_precedence_multiplicative_left_withSuper() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_additiveExpression_precedence_multiplicative_left_withSuper();
-  }
-
-  @override
-  @failingTest
-  void test_additiveExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_additiveExpression_super();
-  }
-
-  @override
-  @failingTest
-  void test_assignableExpression_arguments_normal_chain() {
-    // TODO(paulberry,ahe): AstBuilder.doInvocation doesn't handle receiver
-    // other than SimpleIdentifier.
-    super.test_assignableExpression_arguments_normal_chain();
-  }
-
-  @override
-  @failingTest
   void test_assignableExpression_arguments_normal_chain_typeArgumentComments() {
     // TODO(paulberry,ahe): Fasta doesn't support generic method comment syntax.
     super
@@ -447,46 +229,6 @@
 
   @override
   @failingTest
-  void test_assignmentExpression_prefixedIdentifier() {
-    // TODO(paulberry,ahe): Analyzer expects "x.y" to be parsed as a
-    // PrefixedIdentifier, even if x is not a prefix.
-    super.test_assignmentExpression_prefixedIdentifier();
-  }
-
-  @override
-  @failingTest
-  void test_assignmentExpression_propertyAccess() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_assignmentExpression_propertyAccess();
-  }
-
-  @override
-  @failingTest
-  void test_bitwiseAndExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_bitwiseAndExpression_super();
-  }
-
-  @override
-  @failingTest
-  void test_bitwiseOrExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_bitwiseOrExpression_super();
-  }
-
-  @override
-  @failingTest
-  void test_bitwiseXorExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_bitwiseXorExpression_super();
-  }
-
-  @override
-  @failingTest
   void test_cascade_withAssignment() {
     // TODO(paulberry,ahe): AstBuilder doesn't implement
     // endConstructorReference().
@@ -509,13 +251,6 @@
 
   @override
   @failingTest
-  void test_constructor_initializer_withParenthesizedExpression() {
-    // TODO(paulberry): Implement parseCompilationUnitWithOptions
-    super.test_constructor_initializer_withParenthesizedExpression();
-  }
-
-  @override
-  @failingTest
   void test_equalityExpression_normal() {
     // TODO(paulberry,ahe): bad error recovery
     super.test_equalityExpression_normal();
@@ -552,22 +287,6 @@
 
   @override
   @failingTest
-  void test_multiplicativeExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_multiplicativeExpression_super();
-  }
-
-  @override
-  @failingTest
-  void test_shiftExpression_super() {
-    // TODO(paulberry,ahe): AstBuilder doesn't implement
-    // handleSuperExpression().
-    super.test_shiftExpression_super();
-  }
-
-  @override
-  @failingTest
   void test_topLevelFunction_nestedGenericFunction() {
     // TODO(paulberry): Implement parseCompilationUnitWithOptions
     super.test_topLevelFunction_nestedGenericFunction();
@@ -604,6 +323,376 @@
 }
 
 /**
+ * Tests of the fasta parser based on [ExpressionParserTestMixin].
+ */
+@reflectiveTest
+class ExpressionParserTest_Fasta extends FastaParserTestCase
+    with ExpressionParserTestMixin {
+  @override
+  @failingTest
+  void
+      test_parseAssignableExpression_expression_args_dot_typeParameterComments() {
+    super
+        .test_parseAssignableExpression_expression_args_dot_typeParameterComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseAssignableExpression_expression_args_dot_typeParameters() {
+    super.test_parseAssignableExpression_expression_args_dot_typeParameters();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseAssignableExpression_identifier_args_dot_typeParameterComments() {
+    super
+        .test_parseAssignableExpression_identifier_args_dot_typeParameterComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseAwaitExpression() {
+    super.test_parseAwaitExpression();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_ia_typeArgumentComments() {
+    super.test_parseCascadeSection_ia_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_ia_typeArguments() {
+    super.test_parseCascadeSection_ia_typeArguments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_ii_typeArgumentComments() {
+    super.test_parseCascadeSection_ii_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade() {
+    super.test_parseCascadeSection_p_assign_withCascade();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
+    super.test_parseCascadeSection_p_assign_withCascade_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
+    super.test_parseCascadeSection_p_assign_withCascade_typeArguments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_pa_typeArgumentComments() {
+    super.test_parseCascadeSection_pa_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_paa_typeArgumentComments() {
+    super.test_parseCascadeSection_paa_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_paa_typeArguments() {
+    super.test_parseCascadeSection_paa_typeArguments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_paapaa_typeArgumentComments() {
+    super.test_parseCascadeSection_paapaa_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_paapaa_typeArguments() {
+    super.test_parseCascadeSection_paapaa_typeArguments();
+  }
+
+  @override
+  @failingTest
+  void test_parseCascadeSection_pap_typeArgumentComments() {
+    super.test_parseCascadeSection_pap_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseConstExpression_instanceCreation() {
+    super.test_parseConstExpression_instanceCreation();
+  }
+
+  @override
+  @failingTest
+  void test_parseConstExpression_listLiteral_typed_genericComment() {
+    super.test_parseConstExpression_listLiteral_typed_genericComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseConstExpression_mapLiteral_typed_genericComment() {
+    super.test_parseConstExpression_mapLiteral_typed_genericComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseExpression_assign_compound() {
+    super.test_parseExpression_assign_compound();
+  }
+
+  @override
+  @failingTest
+  void test_parseExpression_superMethodInvocation_typeArgumentComments() {
+    super.test_parseExpression_superMethodInvocation_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
+    super
+        .test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parseFunctionExpression_typeParameterComments() {
+    super.test_parseFunctionExpression_typeParameterComments();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment() {
+    super
+        .test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parseInstanceCreationExpression_qualifiedType_typeParameterComment() {
+    super
+        .test_parseInstanceCreationExpression_qualifiedType_typeParameterComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseInstanceCreationExpression_type_named_typeParameterComment() {
+    super
+        .test_parseInstanceCreationExpression_type_named_typeParameterComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseInstanceCreationExpression_type_typeParameterComment() {
+    super.test_parseInstanceCreationExpression_type_typeParameterComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseInstanceCreationExpression_type_typeParameters_nullable() {
+    super.test_parseInstanceCreationExpression_type_typeParameters_nullable();
+  }
+
+  @override
+  @failingTest
+  void test_parseListLiteral_empty_oneToken() {
+    super.test_parseListLiteral_empty_oneToken();
+  }
+
+  @override
+  @failingTest
+  void test_parseListLiteral_empty_oneToken_withComment() {
+    super.test_parseListLiteral_empty_oneToken_withComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseListLiteral_empty_twoTokens() {
+    super.test_parseListLiteral_empty_twoTokens();
+  }
+
+  @override
+  @failingTest
+  void test_parseListOrMapLiteral_list_noType() {
+    super.test_parseListOrMapLiteral_list_noType();
+  }
+
+  @override
+  @failingTest
+  void test_parseListOrMapLiteral_list_type() {
+    super.test_parseListOrMapLiteral_list_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseListOrMapLiteral_map_noType() {
+    super.test_parseListOrMapLiteral_map_noType();
+  }
+
+  @override
+  @failingTest
+  void test_parseListOrMapLiteral_map_type() {
+    super.test_parseListOrMapLiteral_map_type();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteral_empty() {
+    super.test_parseMapLiteral_empty();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteral_multiple() {
+    super.test_parseMapLiteral_multiple();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteral_single() {
+    super.test_parseMapLiteral_single();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteralEntry_complex() {
+    super.test_parseMapLiteralEntry_complex();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteralEntry_int() {
+    super.test_parseMapLiteralEntry_int();
+  }
+
+  @override
+  @failingTest
+  void test_parseMapLiteralEntry_string() {
+    super.test_parseMapLiteralEntry_string();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
+    super
+        .test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void
+      test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
+    super
+        .test_parsePostfixExpression_none_methodInvocation_typeArgumentComments();
+  }
+
+  @override
+  @failingTest
+  void test_parsePrimaryExpression_const() {
+    super.test_parsePrimaryExpression_const();
+  }
+
+  @override
+  @failingTest
+  void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
+    super.test_parsePrimaryExpression_listLiteral_typed_genericComment();
+  }
+
+  @override
+  @failingTest
+  void test_parsePrimaryExpression_mapLiteral() {
+    super.test_parsePrimaryExpression_mapLiteral();
+  }
+
+  @override
+  @failingTest
+  void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
+    super.test_parsePrimaryExpression_mapLiteral_typed_genericComment();
+  }
+
+  @override
+  @failingTest
+  void test_parseRelationalExpression_as_functionType_noReturnType() {
+    super.test_parseRelationalExpression_as_functionType_noReturnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseRelationalExpression_as_functionType_returnType() {
+    super.test_parseRelationalExpression_as_functionType_returnType();
+  }
+
+  @override
+  @failingTest
+  void test_parseRelationalExpression_as_nullable() {
+    super.test_parseRelationalExpression_as_nullable();
+  }
+
+  @override
+  @failingTest
+  void test_parseRelationalExpression_is_nullable() {
+    super.test_parseRelationalExpression_is_nullable();
+  }
+
+  @override
+  @failingTest
+  void test_parseRethrowExpression() {
+    super.test_parseRethrowExpression();
+  }
+
+  @override
+  @failingTest
+  void test_parseSuperConstructorInvocation_named() {
+    super.test_parseSuperConstructorInvocation_named();
+  }
+
+  @override
+  @failingTest
+  void test_parseSuperConstructorInvocation_unnamed() {
+    super.test_parseSuperConstructorInvocation_unnamed();
+  }
+
+  @override
+  @failingTest
+  void test_parseSymbolLiteral_operator() {
+    super.test_parseSymbolLiteral_operator();
+  }
+
+  @override
+  @failingTest
+  void test_parseSymbolLiteral_void() {
+    super.test_parseSymbolLiteral_void();
+  }
+
+  @override
+  @failingTest
+  void test_parseUnaryExpression_decrement_super() {
+    super.test_parseUnaryExpression_decrement_super();
+  }
+
+  @override
+  @failingTest
+  void test_parseUnaryExpression_decrement_super_withComment() {
+    super.test_parseUnaryExpression_decrement_super_withComment();
+  }
+}
+
+/**
  * Implementation of [AbstractParserTestCase] specialized for testing the
  * Fasta parser.
  */
@@ -677,6 +766,54 @@
   }
 
   @override
+  Expression parseAdditiveExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseAssignableExpression(String code, bool primaryAllowed) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseAssignableSelector(String code, bool optional,
+      {bool allowConditional: true}) {
+    if (optional) {
+      if (code.isEmpty) {
+        return _parseExpression('foo');
+      }
+      return _parseExpression('(foo)$code');
+    }
+    return _parseExpression('foo$code');
+  }
+
+  @override
+  AwaitExpression parseAwaitExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseAndExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseOrExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseBitwiseXorExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseCascadeSection(String code) {
+    var cascadeExpression = _parseExpression('null$code') as CascadeExpression;
+    return cascadeExpression.cascadeSections.single;
+  }
+
+  @override
   CompilationUnit parseCompilationUnit(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     return _runParser(source, (parser) => parser.parseUnit, errorCodes)
@@ -691,12 +828,27 @@
   }
 
   @override
+  ConditionalExpression parseConditionalExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseConstExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
   CompilationUnit parseDirectives(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     return _runParser(source, (parser) => parser.parseUnit, errorCodes);
   }
 
   @override
+  BinaryExpression parseEqualityExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
   Expression parseExpression(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     return _runParser(source, (parser) => parser.parseExpression, errorCodes)
@@ -704,6 +856,16 @@
   }
 
   @override
+  List<Expression> parseExpressionList(String code) {
+    return (_parseExpression('[$code]') as ListLiteral).elements.toList();
+  }
+
+  @override
+  Expression parseExpressionWithoutCascade(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
   FormalParameter parseFormalParameter(String code, ParameterKind kind,
       {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
     String parametersCode;
@@ -743,6 +905,75 @@
   }
 
   @override
+  FunctionExpression parseFunctionExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  InstanceCreationExpression parseInstanceCreationExpression(
+      String code, analyzer.Token newToken) {
+    return _parseExpression('$newToken $code');
+  }
+
+  @override
+  ListLiteral parseListLiteral(
+      analyzer.Token token, String typeArgumentsCode, String code) {
+    String sc = '';
+    if (token != null) {
+      sc += token.lexeme + ' ';
+    }
+    if (typeArgumentsCode != null) {
+      sc += typeArgumentsCode;
+    }
+    sc += code;
+    return _parseExpression(sc);
+  }
+
+  @override
+  TypedLiteral parseListOrMapLiteral(analyzer.Token modifier, String code) {
+    return _parseExpression('$modifier $code');
+  }
+
+  @override
+  Expression parseLogicalAndExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseLogicalOrExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  MapLiteral parseMapLiteral(
+      analyzer.Token token, String typeArgumentsCode, String code) {
+    String sc = '';
+    if (token != null) {
+      sc += token.lexeme + ' ';
+    }
+    if (typeArgumentsCode != null) {
+      sc += typeArgumentsCode;
+    }
+    sc += code;
+    return _parseExpression(sc);
+  }
+
+  @override
+  MapLiteralEntry parseMapLiteralEntry(String code) {
+    return (_parseExpression('{$code}') as MapLiteral).entries.single;
+  }
+
+  @override
+  Expression parseMultiplicativeExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  InstanceCreationExpression parseNewExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
   NormalFormalParameter parseNormalFormalParameter(String code,
       {bool inFunctionType: false,
       List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
@@ -752,6 +983,41 @@
   }
 
   @override
+  Expression parsePostfixExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Identifier parsePrefixedIdentifier(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parsePrimaryExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseRelationalExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  RethrowExpression parseRethrowExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  BinaryExpression parseShiftExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  SimpleIdentifier parseSimpleIdentifier(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
   Statement parseStatement(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[],
       bool enableLazyAssignmentOperators]) {
@@ -759,6 +1025,42 @@
         as Statement;
   }
 
+  @override
+  Expression parseStringLiteral(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  SuperConstructorInvocation parseSuperConstructorInvocation(String code) {
+    // TODO(scheglov): implement parseSuperConstructorInvocation
+    throw new UnimplementedError();
+  }
+
+  @override
+  SymbolLiteral parseSymbolLiteral(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseThrowExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  Expression parseThrowExpressionWithoutCascade(String code) {
+    return _parseExpression(code);
+  }
+
+  @override
+  PrefixExpression parseUnaryExpression(String code) {
+    return _parseExpression(code);
+  }
+
+  Expression _parseExpression(String code) {
+    var statement = parseStatement('$code;') as ExpressionStatement;
+    return statement.expression;
+  }
+
   Object _runParser(
       String source, ParseFunction getParseFunction(fasta.Parser parser),
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
@@ -1030,13 +1332,6 @@
 
   @override
   @failingTest
-  void test_parseClassDeclaration_nonEmpty() {
-    // TODO(paulberry): Unhandled event: NoFieldInitializer
-    super.test_parseClassDeclaration_nonEmpty();
-  }
-
-  @override
-  @failingTest
   void test_parseClassDeclaration_typeAlias_withB() {
     // TODO(paulberry,ahe): capture `with` token.
     super.test_parseClassDeclaration_typeAlias_withB();
@@ -1044,13 +1339,6 @@
 
   @override
   @failingTest
-  void test_parseCompilationUnit_abstractAsPrefix_parameterized() {
-    // TODO(paulberry): Unhandled event: ConstructorReference
-    super.test_parseCompilationUnit_abstractAsPrefix_parameterized();
-  }
-
-  @override
-  @failingTest
   void test_parseCompilationUnit_builtIn_asFunctionName() {
     // TODO(paulberry,ahe): Fasta's parser is confused when one of the built-in
     // identifiers `export`, `import`, `library`, `part`, or `typedef` appears
@@ -1081,13 +1369,6 @@
 
   @override
   @failingTest
-  void test_parseCompilationUnit_operatorAsPrefix_parameterized() {
-    // TODO(paulberry): Unhandled event: ConstructorReference
-    super.test_parseCompilationUnit_operatorAsPrefix_parameterized();
-  }
-
-  @override
-  @failingTest
   void test_parseCompilationUnit_script() {
     // TODO(paulberry): No objects placed on stack
     super.test_parseCompilationUnit_script();
@@ -1102,13 +1383,6 @@
 
   @override
   @failingTest
-  void test_parseCompilationUnitMember_abstractAsPrefix() {
-    // TODO(paulberry): Unhandled event: ConstructorReference
-    super.test_parseCompilationUnitMember_abstractAsPrefix();
-  }
-
-  @override
-  @failingTest
   void
       test_parseCompilationUnitMember_function_generic_noReturnType_annotated() {
     // TODO(paulberry,ahe): Fasta doesn't appear to support annotated type
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index ea1386c..dc25481 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/parser.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:test/test.dart';
@@ -79,6 +78,24 @@
    */
   void createParser(String content);
 
+  Expression parseAdditiveExpression(String code);
+
+  Expression parseAssignableExpression(String code, bool primaryAllowed);
+
+  Expression parseAssignableSelector(
+      String code, bool optional,
+      {bool allowConditional: true});
+
+  AwaitExpression parseAwaitExpression(String code);
+
+  Expression parseBitwiseAndExpression(String code);
+
+  Expression parseBitwiseOrExpression(String code);
+
+  Expression parseBitwiseXorExpression(String code);
+
+  Expression parseCascadeSection(String code);
+
   CompilationUnit parseCompilationUnit(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
@@ -86,6 +103,10 @@
   CompilationUnit parseCompilationUnitWithOptions(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
+  ConditionalExpression parseConditionalExpression(String code);
+
+  Expression parseConstExpression(String code);
+
   /**
    * Parse the given source as a compilation unit.
    *
@@ -98,9 +119,15 @@
   CompilationUnit parseDirectives(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
+  BinaryExpression parseEqualityExpression(String code);
+
   Expression parseExpression(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]);
 
+  List<Expression> parseExpressionList(String code);
+
+  Expression parseExpressionWithoutCascade(String code);
+
   FormalParameter parseFormalParameter(String code, ParameterKind kind,
       {List<ErrorCode> errorCodes: const <ErrorCode>[]});
 
@@ -120,12 +147,61 @@
    */
   Directive parseFullDirective();
 
+  FunctionExpression parseFunctionExpression(String code);
+
+  InstanceCreationExpression parseInstanceCreationExpression(
+      String code, Token newToken);
+
+  ListLiteral parseListLiteral(
+      Token token, String typeArgumentsCode, String code);
+
+  TypedLiteral parseListOrMapLiteral(Token modifier, String code);
+
+  Expression parseLogicalAndExpression(String code);
+
+  Expression parseLogicalOrExpression(String code);
+
+  MapLiteral parseMapLiteral(
+      Token token, String typeArgumentsCode, String code);
+
+  MapLiteralEntry parseMapLiteralEntry(String code);
+
+  Expression parseMultiplicativeExpression(String code);
+
+  InstanceCreationExpression parseNewExpression(String code);
+
   NormalFormalParameter parseNormalFormalParameter(String code,
       {bool inFunctionType: false});
 
+  Expression parsePostfixExpression(String code);
+
+  Identifier parsePrefixedIdentifier(String code);
+
+  Expression parsePrimaryExpression(String code);
+
+  Expression parseRelationalExpression(String code);
+
+  RethrowExpression parseRethrowExpression(String code);
+
+  BinaryExpression parseShiftExpression(String code);
+
+  SimpleIdentifier parseSimpleIdentifier(String code);
+
   Statement parseStatement(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[],
       bool enableLazyAssignmentOperators]);
+
+  Expression parseStringLiteral(String code);
+
+  SuperConstructorInvocation parseSuperConstructorInvocation(String code);
+
+  SymbolLiteral parseSymbolLiteral(String code);
+
+  Expression parseThrowExpression(String code);
+
+  Expression parseThrowExpressionWithoutCascade(String code);
+
+  PrefixExpression parseUnaryExpression(String code);
 }
 
 /**
@@ -2194,8 +2270,7 @@
     // literals that are being created are not always zero length (because they
     // could have type parameters), which violates the contract of
     // isSynthetic().
-    createParser('1');
-    TypedLiteral literal = parser.parseListOrMapLiteral(null);
+    TypedLiteral literal = parseListOrMapLiteral(null, '1');
     expectNotNullIfNoErrors(literal);
     listener
         .assertErrorsWithCodes([ParserErrorCode.EXPECTED_LIST_OR_MAP_LITERAL]);
@@ -2693,16 +2768,14 @@
   }
 
   void test_invalidOperatorAfterSuper_assignableExpression() {
-    createParser('super?.v');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('super?.v', false);
     expectNotNullIfNoErrors(expression);
     listener
         .assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
   }
 
   void test_invalidOperatorAfterSuper_primaryExpression() {
-    createParser('super?.v');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('super?.v');
     expectNotNullIfNoErrors(expression);
     listener
         .assertErrorsWithCodes([ParserErrorCode.INVALID_OPERATOR_FOR_SUPER]);
@@ -2731,43 +2804,37 @@
   }
 
   void test_invalidUnicodeEscape_incomplete_noDigits() {
-    createParser("'\\u{'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u{'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
 
   void test_invalidUnicodeEscape_incomplete_someDigits() {
-    createParser("'\\u{0A'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u{0A'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
 
   void test_invalidUnicodeEscape_invalidDigit() {
-    createParser("'\\u0 a'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u0 a'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
 
   void test_invalidUnicodeEscape_tooFewDigits_fixed() {
-    createParser("'\\u04'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u04'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
 
   void test_invalidUnicodeEscape_tooFewDigits_variable() {
-    createParser("'\\u{}'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u{}'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.INVALID_UNICODE_ESCAPE]);
   }
 
   void test_invalidUnicodeEscape_tooManyDigits_variable() {
-    createParser("'\\u{12345678}'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'\\u{12345678}'");
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([
       ParserErrorCode.INVALID_UNICODE_ESCAPE,
@@ -3072,15 +3139,13 @@
   }
 
   void test_missingIdentifier_inSymbol_afterPeriod() {
-    createParser('#a.');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#a.');
     expectNotNullIfNoErrors(literal);
     listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
   }
 
   void test_missingIdentifier_inSymbol_first() {
-    createParser('#');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#');
     expectNotNullIfNoErrors(literal);
     listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
   }
@@ -3316,8 +3381,7 @@
 
   @failingTest
   void test_namedFunctionExpression() {
-    createParser('f() {}');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('f() {}');
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.NAMED_FUNCTION_EXPRESSION]);
     expect(expression, new isInstanceOf<FunctionExpression>());
@@ -3802,8 +3866,7 @@
     Expression expression = parser.parseUnaryExpression();
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.MISSING_IDENTIFIER]);
-    expect(expression, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier identifier = expression;
+    var identifier = expression as SimpleIdentifier;
     expect(identifier.isSynthetic, isTrue);
   }
 
@@ -3956,12 +4019,10 @@
 
 abstract class ExpressionParserTestMixin implements AbstractParserTestCase {
   void test_parseAdditiveExpression_normal() {
-    createParser('x + y');
-    Expression expression = parser.parseAdditiveExpression();
+    Expression expression = parseAdditiveExpression('x + y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.PLUS);
@@ -3969,12 +4030,10 @@
   }
 
   void test_parseAdditiveExpression_super() {
-    createParser('super + y');
-    Expression expression = parser.parseAdditiveExpression();
+    Expression expression = parseAdditiveExpression('super + y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.PLUS);
@@ -3982,12 +4041,10 @@
   }
 
   void test_parseAssignableExpression_expression_args_dot() {
-    createParser('(x)(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x)(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     FunctionExpressionInvocation invocation =
         propertyAccess.target as FunctionExpressionInvocation;
     expect(invocation.function, isNotNull);
@@ -4002,12 +4059,10 @@
   void
       test_parseAssignableExpression_expression_args_dot_typeParameterComments() {
     enableGenericMethodComments = true;
-    createParser('(x)/*<F>*/(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x)/*<F>*/(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     FunctionExpressionInvocation invocation =
         propertyAccess.target as FunctionExpressionInvocation;
     expect(invocation.function, isNotNull);
@@ -4020,12 +4075,10 @@
   }
 
   void test_parseAssignableExpression_expression_args_dot_typeParameters() {
-    createParser('(x)<F>(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x)<F>(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     FunctionExpressionInvocation invocation =
         propertyAccess.target as FunctionExpressionInvocation;
     expect(invocation.function, isNotNull);
@@ -4038,24 +4091,20 @@
   }
 
   void test_parseAssignableExpression_expression_dot() {
-    createParser('(x).y');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x).y', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.target, isNotNull);
     expect(propertyAccess.operator.type, TokenType.PERIOD);
     expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_expression_index() {
-    createParser('(x)[y]');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x)[y]', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression indexExpression = expression;
+    var indexExpression = expression as IndexExpression;
     expect(indexExpression.target, isNotNull);
     expect(indexExpression.leftBracket, isNotNull);
     expect(indexExpression.index, isNotNull);
@@ -4063,34 +4112,28 @@
   }
 
   void test_parseAssignableExpression_expression_question_dot() {
-    createParser('(x)?.y');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('(x)?.y', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.target, isNotNull);
     expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
     expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier() {
-    createParser('x');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier identifier = expression;
+    var identifier = expression as SimpleIdentifier;
     expect(identifier, isNotNull);
   }
 
   void test_parseAssignableExpression_identifier_args_dot() {
-    createParser('x(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     MethodInvocation invocation = propertyAccess.target as MethodInvocation;
     expect(invocation.methodName.name, "x");
     expect(invocation.typeArguments, isNull);
@@ -4104,12 +4147,10 @@
   void
       test_parseAssignableExpression_identifier_args_dot_typeParameterComments() {
     enableGenericMethodComments = true;
-    createParser('x/*<E>*/(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x/*<E>*/(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     MethodInvocation invocation = propertyAccess.target as MethodInvocation;
     expect(invocation.methodName.name, "x");
     expect(invocation.typeArguments, isNotNull);
@@ -4121,12 +4162,10 @@
   }
 
   void test_parseAssignableExpression_identifier_args_dot_typeParameters() {
-    createParser('x<E>(y).z');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x<E>(y).z', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     MethodInvocation invocation = propertyAccess.target as MethodInvocation;
     expect(invocation.methodName.name, "x");
     expect(invocation.typeArguments, isNotNull);
@@ -4138,25 +4177,21 @@
   }
 
   void test_parseAssignableExpression_identifier_dot() {
-    createParser('x.y');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x.y', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
-    expect(propertyAccess.target, isNotNull);
-    expect(propertyAccess.operator, isNotNull);
-    expect(propertyAccess.operator.type, TokenType.PERIOD);
-    expect(propertyAccess.propertyName, isNotNull);
+    var identifier = expression as PrefixedIdentifier;
+    expect(identifier.prefix.name, 'x');
+    expect(identifier.period, isNotNull);
+    expect(identifier.period.type, TokenType.PERIOD);
+    expect(identifier.identifier.name, 'y');
   }
 
   void test_parseAssignableExpression_identifier_index() {
-    createParser('x[y]');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x[y]', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression indexExpression = expression;
+    var indexExpression = expression as IndexExpression;
     expect(indexExpression.target, isNotNull);
     expect(indexExpression.leftBracket, isNotNull);
     expect(indexExpression.index, isNotNull);
@@ -4164,24 +4199,20 @@
   }
 
   void test_parseAssignableExpression_identifier_question_dot() {
-    createParser('x?.y');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('x?.y', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.target, isNotNull);
     expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
     expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableExpression_super_dot() {
-    createParser('super.y');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('super.y', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     EngineTestCase.assertInstanceOf((obj) => obj is SuperExpression,
         SuperExpression, propertyAccess.target);
     expect(propertyAccess.operator, isNotNull);
@@ -4189,12 +4220,10 @@
   }
 
   void test_parseAssignableExpression_super_index() {
-    createParser('super[y]');
-    Expression expression = parser.parseAssignableExpression(false);
+    Expression expression = parseAssignableExpression('super[y]', false);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression indexExpression = expression;
+    var indexExpression = expression as IndexExpression;
     expect(indexExpression.target, new isInstanceOf<SuperExpression>());
     expect(indexExpression.leftBracket, isNotNull);
     expect(indexExpression.index, isNotNull);
@@ -4202,53 +4231,43 @@
   }
 
   void test_parseAssignableSelector_dot() {
-    createParser('.x');
-    Expression expression = parser.parseAssignableSelector(null, true);
+    Expression expression = parseAssignableSelector('.x', true);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.operator.type, TokenType.PERIOD);
     expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAssignableSelector_index() {
-    createParser('[x]');
-    Expression expression = parser.parseAssignableSelector(null, true);
+    Expression expression = parseAssignableSelector('[x]', true);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression indexExpression = expression;
+    var indexExpression = expression as IndexExpression;
     expect(indexExpression.leftBracket, isNotNull);
     expect(indexExpression.index, isNotNull);
     expect(indexExpression.rightBracket, isNotNull);
   }
 
   void test_parseAssignableSelector_none() {
-    createParser(';');
-    Expression expression =
-        parser.parseAssignableSelector(astFactory.simpleIdentifier(null), true);
+    Expression expression = parseAssignableSelector('', true);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier identifier = expression;
+    var identifier = expression as SimpleIdentifier;
     expect(identifier, isNotNull);
   }
 
   void test_parseAssignableSelector_question_dot() {
-    createParser('?.x');
-    Expression expression = parser.parseAssignableSelector(null, true);
+    Expression expression = parseAssignableSelector('?.x', true);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.operator.type, TokenType.QUESTION_PERIOD);
     expect(propertyAccess.propertyName, isNotNull);
   }
 
   void test_parseAwaitExpression() {
-    createParser('await x;');
-    AwaitExpression expression = parser.parseAwaitExpression();
+    AwaitExpression expression = parseAwaitExpression('await x;');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.awaitKeyword, isNotNull);
@@ -4256,12 +4275,10 @@
   }
 
   void test_parseBitwiseAndExpression_normal() {
-    createParser('x & y');
-    Expression expression = parser.parseBitwiseAndExpression();
+    Expression expression = parseBitwiseAndExpression('x & y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.AMPERSAND);
@@ -4269,12 +4286,10 @@
   }
 
   void test_parseBitwiseAndExpression_super() {
-    createParser('super & y');
-    Expression expression = parser.parseBitwiseAndExpression();
+    Expression expression = parseBitwiseAndExpression('super & y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.AMPERSAND);
@@ -4282,12 +4297,10 @@
   }
 
   void test_parseBitwiseOrExpression_normal() {
-    createParser('x | y');
-    Expression expression = parser.parseBitwiseOrExpression();
+    Expression expression = parseBitwiseOrExpression('x | y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.BAR);
@@ -4295,12 +4308,10 @@
   }
 
   void test_parseBitwiseOrExpression_super() {
-    createParser('super | y');
-    Expression expression = parser.parseBitwiseOrExpression();
+    Expression expression = parseBitwiseOrExpression('super | y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.BAR);
@@ -4308,12 +4319,10 @@
   }
 
   void test_parseBitwiseXorExpression_normal() {
-    createParser('x ^ y');
-    Expression expression = parser.parseBitwiseXorExpression();
+    Expression expression = parseBitwiseXorExpression('x ^ y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.CARET);
@@ -4321,12 +4330,10 @@
   }
 
   void test_parseBitwiseXorExpression_super() {
-    createParser('super ^ y');
-    Expression expression = parser.parseBitwiseXorExpression();
+    Expression expression = parseBitwiseXorExpression('super ^ y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.CARET);
@@ -4334,12 +4341,10 @@
   }
 
   void test_parseCascadeSection_i() {
-    createParser('..[i]');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..[i]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression section = expression;
+    var section = expression as IndexExpression;
     expect(section.target, isNull);
     expect(section.leftBracket, isNotNull);
     expect(section.index, isNotNull);
@@ -4347,12 +4352,10 @@
   }
 
   void test_parseCascadeSection_ia() {
-    createParser('..[i](b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..[i](b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<IndexExpression>());
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
@@ -4360,36 +4363,30 @@
 
   void test_parseCascadeSection_ia_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..[i]/*<E>*/(b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..[i]/*<E>*/(b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<IndexExpression>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
   }
 
   void test_parseCascadeSection_ia_typeArguments() {
-    createParser('..[i]<E>(b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..[i]<E>(b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<IndexExpression>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
   }
 
   void test_parseCascadeSection_ii() {
-    createParser('..a(b).c(d)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a(b).c(d)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, new isInstanceOf<MethodInvocation>());
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4400,12 +4397,10 @@
 
   void test_parseCascadeSection_ii_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a/*<E>*/(b).c/*<F>*/(d)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a/*<E>*/(b).c/*<F>*/(d)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, new isInstanceOf<MethodInvocation>());
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4415,12 +4410,10 @@
   }
 
   void test_parseCascadeSection_ii_typeArguments() {
-    createParser('..a<E>(b).c<F>(d)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a<E>(b).c<F>(d)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, new isInstanceOf<MethodInvocation>());
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4430,24 +4423,20 @@
   }
 
   void test_parseCascadeSection_p() {
-    createParser('..a');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess section = expression;
+    var section = expression as PropertyAccess;
     expect(section.target, isNull);
     expect(section.operator, isNotNull);
     expect(section.propertyName, isNotNull);
   }
 
   void test_parseCascadeSection_p_assign() {
-    createParser('..a = 3');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a = 3');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression section = expression;
+    var section = expression as AssignmentExpression;
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
@@ -4455,12 +4444,10 @@
   }
 
   void test_parseCascadeSection_p_assign_withCascade() {
-    createParser('..a = 3..m()');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a = 3..m()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression section = expression;
+    var section = expression as AssignmentExpression;
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
@@ -4470,12 +4457,10 @@
 
   void test_parseCascadeSection_p_assign_withCascade_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a = 3..m/*<E>*/()');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a = 3..m/*<E>*/()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression section = expression;
+    var section = expression as AssignmentExpression;
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
@@ -4484,12 +4469,10 @@
   }
 
   void test_parseCascadeSection_p_assign_withCascade_typeArguments() {
-    createParser('..a = 3..m<E>()');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a = 3..m<E>()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression section = expression;
+    var section = expression as AssignmentExpression;
     expect(section.leftHandSide, isNotNull);
     expect(section.operator, isNotNull);
     Expression rhs = section.rightHandSide;
@@ -4498,24 +4481,20 @@
   }
 
   void test_parseCascadeSection_p_builtIn() {
-    createParser('..as');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..as');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess section = expression;
+    var section = expression as PropertyAccess;
     expect(section.target, isNull);
     expect(section.operator, isNotNull);
     expect(section.propertyName, isNotNull);
   }
 
   void test_parseCascadeSection_pa() {
-    createParser('..a(b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a(b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, isNull);
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4526,12 +4505,10 @@
 
   void test_parseCascadeSection_pa_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a/*<E>*/(b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a/*<E>*/(b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, isNull);
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4541,12 +4518,10 @@
   }
 
   void test_parseCascadeSection_pa_typeArguments() {
-    createParser('..a<E>(b)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a<E>(b)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation section = expression;
+    var section = expression as MethodInvocation;
     expect(section.target, isNull);
     expect(section.operator, isNotNull);
     expect(section.methodName, isNotNull);
@@ -4556,12 +4531,10 @@
   }
 
   void test_parseCascadeSection_paa() {
-    createParser('..a(b)(c)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a(b)(c)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
@@ -4570,12 +4543,10 @@
 
   void test_parseCascadeSection_paa_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a/*<E>*/(b)/*<F>*/(c)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a/*<E>*/(b)/*<F>*/(c)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
@@ -4583,12 +4554,10 @@
   }
 
   void test_parseCascadeSection_paa_typeArguments() {
-    createParser('..a<E>(b)<F>(c)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a<E>(b)<F>(c)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
@@ -4596,12 +4565,10 @@
   }
 
   void test_parseCascadeSection_paapaa() {
-    createParser('..a(b)(c).d(e)(f)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a(b)(c).d(e)(f)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNull);
     expect(section.argumentList, isNotNull);
@@ -4610,12 +4577,11 @@
 
   void test_parseCascadeSection_paapaa_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a/*<E>*/(b)/*<F>*/(c).d/*<G>*/(e)/*<H>*/(f)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression =
+        parseCascadeSection('..a/*<E>*/(b)/*<F>*/(c).d/*<G>*/(e)/*<H>*/(f)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
@@ -4623,12 +4589,11 @@
   }
 
   void test_parseCascadeSection_paapaa_typeArguments() {
-    createParser('..a<E>(b)<F>(c).d<G>(e)<H>(f)');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression =
+        parseCascadeSection('..a<E>(b)<F>(c).d<G>(e)<H>(f)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation section = expression;
+    var section = expression as FunctionExpressionInvocation;
     expect(section.function, new isInstanceOf<MethodInvocation>());
     expect(section.typeArguments, isNotNull);
     expect(section.argumentList, isNotNull);
@@ -4636,12 +4601,10 @@
   }
 
   void test_parseCascadeSection_pap() {
-    createParser('..a(b).c');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a(b).c');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess section = expression;
+    var section = expression as PropertyAccess;
     expect(section.target, isNotNull);
     expect(section.operator, isNotNull);
     expect(section.propertyName, isNotNull);
@@ -4649,32 +4612,27 @@
 
   void test_parseCascadeSection_pap_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('..a/*<E>*/(b).c');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a/*<E>*/(b).c');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess section = expression;
+    var section = expression as PropertyAccess;
     expect(section.target, isNotNull);
     expect(section.operator, isNotNull);
     expect(section.propertyName, isNotNull);
   }
 
   void test_parseCascadeSection_pap_typeArguments() {
-    createParser('..a<E>(b).c');
-    Expression expression = parser.parseCascadeSection();
+    Expression expression = parseCascadeSection('..a<E>(b).c');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess section = expression;
+    var section = expression as PropertyAccess;
     expect(section.target, isNotNull);
     expect(section.operator, isNotNull);
     expect(section.propertyName, isNotNull);
   }
 
   void test_parseConditionalExpression() {
-    createParser('x ? y : z');
-    ConditionalExpression expression = parser.parseConditionalExpression();
+    ConditionalExpression expression = parseConditionalExpression('x ? y : z');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.condition, isNotNull);
@@ -4685,8 +4643,7 @@
   }
 
   void test_parseConstExpression_instanceCreation() {
-    createParser('const A()');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const A()');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, new isInstanceOf<InstanceCreationExpression>());
@@ -4701,12 +4658,10 @@
   }
 
   void test_parseConstExpression_listLiteral_typed() {
-    createParser('const <A> []');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const <A> []');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal.constKeyword, isNotNull);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
@@ -4716,12 +4671,10 @@
 
   void test_parseConstExpression_listLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
-    createParser('const /*<A>*/ []');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const /*<A>*/ []');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal.constKeyword, isNotNull);
     expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
@@ -4730,12 +4683,10 @@
   }
 
   void test_parseConstExpression_listLiteral_untyped() {
-    createParser('const []');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const []');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal.constKeyword, isNotNull);
     expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
@@ -4744,12 +4695,10 @@
   }
 
   void test_parseConstExpression_mapLiteral_typed() {
-    createParser('const <A, B> {}');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const <A, B> {}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.leftBracket, isNotNull);
     expect(literal.entries, hasLength(0));
     expect(literal.rightBracket, isNotNull);
@@ -4758,12 +4707,10 @@
 
   void test_parseConstExpression_mapLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
-    createParser('const /*<A, B>*/ {}');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const /*<A, B>*/ {}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.leftBracket, isNotNull);
     expect(literal.entries, hasLength(0));
     expect(literal.rightBracket, isNotNull);
@@ -4771,12 +4718,10 @@
   }
 
   void test_parseConstExpression_mapLiteral_untyped() {
-    createParser('const {}');
-    Expression expression = parser.parseConstExpression();
+    Expression expression = parseConstExpression('const {}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.leftBracket, isNotNull);
     expect(literal.entries, hasLength(0));
     expect(literal.rightBracket, isNotNull);
@@ -4784,8 +4729,7 @@
   }
 
   void test_parseEqualityExpression_normal() {
-    createParser('x == y');
-    BinaryExpression expression = parser.parseEqualityExpression();
+    BinaryExpression expression = parseEqualityExpression('x == y');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.leftOperand, isNotNull);
@@ -4795,8 +4739,7 @@
   }
 
   void test_parseEqualityExpression_super() {
-    createParser('super == y');
-    BinaryExpression expression = parser.parseEqualityExpression();
+    BinaryExpression expression = parseEqualityExpression('super == y');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.leftOperand, new isInstanceOf<SuperExpression>());
@@ -4808,8 +4751,7 @@
   void test_parseExpression_assign() {
     // TODO(brianwilkerson) Implement more tests for this method.
     Expression expression = parseExpression('x = y');
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression assignmentExpression = expression;
+    var assignmentExpression = expression as AssignmentExpression;
     expect(assignmentExpression.leftHandSide, isNotNull);
     expect(assignmentExpression.operator, isNotNull);
     expect(assignmentExpression.operator.type, TokenType.EQ);
@@ -4819,8 +4761,7 @@
   void test_parseExpression_assign_compound() {
     enableLazyAssignmentOperators = true;
     Expression expression = parseExpression('x ||= y');
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression assignmentExpression = expression;
+    var assignmentExpression = expression as AssignmentExpression;
     expect(assignmentExpression.leftHandSide, isNotNull);
     expect(assignmentExpression.operator, isNotNull);
     expect(assignmentExpression.operator.type, TokenType.BAR_BAR_EQ);
@@ -4829,8 +4770,7 @@
 
   void test_parseExpression_comparison() {
     Expression expression = parseExpression('--a.b == c');
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.EQ_EQ);
@@ -4839,8 +4779,7 @@
 
   void test_parseExpression_function_async() {
     Expression expression = parseExpression('() async {}');
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
     expect(functionExpression.body.isAsynchronous, isTrue);
     expect(functionExpression.body.isGenerator, isFalse);
@@ -4849,8 +4788,7 @@
 
   void test_parseExpression_function_asyncStar() {
     Expression expression = parseExpression('() async* {}');
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
     expect(functionExpression.body.isAsynchronous, isTrue);
     expect(functionExpression.body.isGenerator, isTrue);
@@ -4859,8 +4797,7 @@
 
   void test_parseExpression_function_sync() {
     Expression expression = parseExpression('() {}');
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
     expect(functionExpression.body.isAsynchronous, isFalse);
     expect(functionExpression.body.isGenerator, isFalse);
@@ -4869,8 +4806,7 @@
 
   void test_parseExpression_function_syncStar() {
     Expression expression = parseExpression('() sync* {}');
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.body, isNotNull);
     expect(functionExpression.body.isAsynchronous, isFalse);
     expect(functionExpression.body.isGenerator, isTrue);
@@ -4879,8 +4815,7 @@
 
   void test_parseExpression_invokeFunctionExpression() {
     Expression expression = parseExpression('(a) {return a + a;} (3)');
-    expect(expression, new isInstanceOf<FunctionExpressionInvocation>());
-    FunctionExpressionInvocation invocation = expression;
+    var invocation = expression as FunctionExpressionInvocation;
     expect(invocation.function, new isInstanceOf<FunctionExpression>());
     FunctionExpression functionExpression =
         invocation.function as FunctionExpression;
@@ -4894,8 +4829,7 @@
 
   void test_parseExpression_nonAwait() {
     Expression expression = parseExpression('await()');
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.methodName.name, 'await');
     expect(invocation.typeArguments, isNull);
     expect(invocation.argumentList, isNotNull);
@@ -4903,8 +4837,7 @@
 
   void test_parseExpression_superMethodInvocation() {
     Expression expression = parseExpression('super.m()');
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNull);
@@ -4914,8 +4847,7 @@
   void test_parseExpression_superMethodInvocation_typeArgumentComments() {
     enableGenericMethodComments = true;
     Expression expression = parseExpression('super.m/*<E>*/()');
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNotNull);
@@ -4924,8 +4856,7 @@
 
   void test_parseExpression_superMethodInvocation_typeArguments() {
     Expression expression = parseExpression('super.m<E>()');
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNotNull);
@@ -4933,16 +4864,14 @@
   }
 
   void test_parseExpressionList_multiple() {
-    createParser('1, 2, 3');
-    List<Expression> result = parser.parseExpressionList();
+    List<Expression> result = parseExpressionList('1, 2, 3');
     expect(result, isNotNull);
     assertNoErrors();
     expect(result, hasLength(3));
   }
 
   void test_parseExpressionList_single() {
-    createParser('1');
-    List<Expression> result = parser.parseExpressionList();
+    List<Expression> result = parseExpressionList('1');
     expect(result, isNotNull);
     assertNoErrors();
     expect(result, hasLength(1));
@@ -4950,12 +4879,10 @@
 
   void test_parseExpressionWithoutCascade_assign() {
     // TODO(brianwilkerson) Implement more tests for this method.
-    createParser('x = y');
-    Expression expression = parser.parseExpressionWithoutCascade();
+    Expression expression = parseExpressionWithoutCascade('x = y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AssignmentExpression>());
-    AssignmentExpression assignmentExpression = expression;
+    var assignmentExpression = expression as AssignmentExpression;
     expect(assignmentExpression.leftHandSide, isNotNull);
     expect(assignmentExpression.operator, isNotNull);
     expect(assignmentExpression.operator.type, TokenType.EQ);
@@ -4963,12 +4890,10 @@
   }
 
   void test_parseExpressionWithoutCascade_comparison() {
-    createParser('--a.b == c');
-    Expression expression = parser.parseExpressionWithoutCascade();
+    Expression expression = parseExpressionWithoutCascade('--a.b == c');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.EQ_EQ);
@@ -4976,12 +4901,10 @@
   }
 
   void test_parseExpressionWithoutCascade_superMethodInvocation() {
-    createParser('super.m()');
-    Expression expression = parser.parseExpressionWithoutCascade();
+    Expression expression = parseExpressionWithoutCascade('super.m()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNull);
@@ -4991,12 +4914,10 @@
   void
       test_parseExpressionWithoutCascade_superMethodInvocation_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('super.m/*<E>*/()');
-    Expression expression = parser.parseExpressionWithoutCascade();
+    Expression expression = parseExpressionWithoutCascade('super.m/*<E>*/()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNotNull);
@@ -5005,12 +4926,10 @@
 
   void
       test_parseExpressionWithoutCascade_superMethodInvocation_typeArguments() {
-    createParser('super.m<E>()');
-    Expression expression = parser.parseExpressionWithoutCascade();
+    Expression expression = parseExpressionWithoutCascade('super.m<E>()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation invocation = expression;
+    var invocation = expression as MethodInvocation;
     expect(invocation.target, isNotNull);
     expect(invocation.methodName, isNotNull);
     expect(invocation.typeArguments, isNotNull);
@@ -5018,8 +4937,7 @@
   }
 
   void test_parseFunctionExpression_body_inExpression() {
-    createParser('(int i) => i++');
-    FunctionExpression expression = parser.parseFunctionExpression();
+    FunctionExpression expression = parseFunctionExpression('(int i) => i++');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.body, isNotNull);
@@ -5030,8 +4948,8 @@
 
   void test_parseFunctionExpression_typeParameterComments() {
     enableGenericMethodComments = true;
-    createParser('/*<E>*/(/*=E*/ i) => i++');
-    FunctionExpression expression = parser.parseFunctionExpression();
+    FunctionExpression expression =
+        parseFunctionExpression('/*<E>*/(/*=E*/ i) => i++');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.body, isNotNull);
@@ -5043,8 +4961,7 @@
   }
 
   void test_parseFunctionExpression_typeParameters() {
-    createParser('<E>(E i) => i++');
-    FunctionExpression expression = parser.parseFunctionExpression();
+    FunctionExpression expression = parseFunctionExpression('<E>(E i) => i++');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.body, isNotNull);
@@ -5055,16 +4972,15 @@
 
   void test_parseInstanceCreationExpression_qualifiedType() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
-    expect(type, isNotNull);
+    expect(type.name.name, 'A.B');
     expect(type.typeArguments, isNull);
     expect(name.period, isNull);
     expect(name.name, isNull);
@@ -5073,12 +4989,11 @@
 
   void test_parseInstanceCreationExpression_qualifiedType_named() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5093,12 +5008,11 @@
       test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment() {
     enableGenericMethodComments = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B/*<E>*/.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B/*<E>*/.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5112,12 +5026,11 @@
   void
       test_parseInstanceCreationExpression_qualifiedType_named_typeParameters() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B<E>.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B<E>.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5132,12 +5045,11 @@
       test_parseInstanceCreationExpression_qualifiedType_typeParameterComment() {
     enableGenericMethodComments = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B/*<E>*/()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B/*<E>*/()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5150,12 +5062,11 @@
 
   void test_parseInstanceCreationExpression_qualifiedType_typeParameters() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.B<E>()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.B<E>()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5168,12 +5079,11 @@
 
   void test_parseInstanceCreationExpression_type() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5185,14 +5095,12 @@
   }
 
   void test_parseInstanceCreationExpression_type_named() {
-    enableGenericMethodComments = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5206,12 +5114,11 @@
   void test_parseInstanceCreationExpression_type_named_typeParameterComment() {
     enableGenericMethodComments = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A/*<B>*/.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A/*<B>*/.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5224,12 +5131,11 @@
 
   void test_parseInstanceCreationExpression_type_named_typeParameters() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A<B>.c()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A<B>.c()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5243,12 +5149,11 @@
   void test_parseInstanceCreationExpression_type_typeParameterComment() {
     enableGenericMethodComments = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A/*<B>*/()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A/*<B>*/()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5261,12 +5166,11 @@
 
   void test_parseInstanceCreationExpression_type_typeParameters() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A<B>()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A<B>()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5280,12 +5184,11 @@
   void test_parseInstanceCreationExpression_type_typeParameters_nullable() {
     enableNnbd = true;
     Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
-    createParser('A<B?>()');
     InstanceCreationExpression expression =
-        parser.parseInstanceCreationExpression(token);
+        parseInstanceCreationExpression('A<B?>()', token);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression.keyword, token);
+    expect(expression.keyword.keyword, Keyword.NEW);
     ConstructorName name = expression.constructorName;
     expect(name, isNotNull);
     TypeName type = name.type;
@@ -5300,27 +5203,22 @@
 
   void test_parseListLiteral_empty_oneToken() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
-    TypeArgumentList typeArguments = null;
-    createParser('[]');
-    ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+    ListLiteral literal = parseListLiteral(token, null, '[]');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword, token);
-    expect(literal.typeArguments, typeArguments);
+    expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.elements, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListLiteral_empty_oneToken_withComment() {
-    Token token = null;
-    TypeArgumentList typeArguments = null;
-    createParser('/* 0 */ []');
-    ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+    ListLiteral literal = parseListLiteral(null, null, '/* 0 */ []');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal.constKeyword, token);
-    expect(literal.typeArguments, typeArguments);
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNull);
     Token leftBracket = literal.leftBracket;
     expect(leftBracket, isNotNull);
     expect(leftBracket.precedingComments, isNotNull);
@@ -5330,21 +5228,18 @@
 
   void test_parseListLiteral_empty_twoTokens() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
-    TypeArgumentList typeArguments = null;
-    createParser('[ ]');
-    ListLiteral literal = parser.parseListLiteral(token, typeArguments);
+    ListLiteral literal = parseListLiteral(token, null, '[ ]');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword, token);
-    expect(literal.typeArguments, typeArguments);
+    expect(literal.typeArguments, isNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.elements, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseListLiteral_multiple() {
-    createParser('[1, 2, 3]');
-    ListLiteral literal = parser.parseListLiteral(null, null);
+    ListLiteral literal = parseListLiteral(null, null, '[1, 2, 3]');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword, isNull);
@@ -5355,8 +5250,7 @@
   }
 
   void test_parseListLiteral_single() {
-    createParser('[1]');
-    ListLiteral literal = parser.parseListLiteral(null, null);
+    ListLiteral literal = parseListLiteral(null, null, '[1]');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword, isNull);
@@ -5366,13 +5260,22 @@
     expect(literal.rightBracket, isNotNull);
   }
 
-  void test_parseListOrMapLiteral_list_noType() {
-    createParser('[1]');
-    TypedLiteral literal = parser.parseListOrMapLiteral(null);
+  void test_parseListLiteral_single_withTypeArgument() {
+    ListLiteral literal = parseListLiteral(null, '<int>', '[1]');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal, new isInstanceOf<ListLiteral>());
-    ListLiteral listLiteral = literal;
+    expect(literal.constKeyword, isNull);
+    expect(literal.typeArguments, isNotNull);
+    expect(literal.leftBracket, isNotNull);
+    expect(literal.elements, hasLength(1));
+    expect(literal.rightBracket, isNotNull);
+  }
+
+  void test_parseListOrMapLiteral_list_noType() {
+    TypedLiteral literal = parseListOrMapLiteral(null, '[1]');
+    expect(literal, isNotNull);
+    assertNoErrors();
+    var listLiteral = literal as ListLiteral;
     expect(listLiteral.constKeyword, isNull);
     expect(listLiteral.typeArguments, isNull);
     expect(listLiteral.leftBracket, isNotNull);
@@ -5381,12 +5284,10 @@
   }
 
   void test_parseListOrMapLiteral_list_type() {
-    createParser('<int> [1]');
-    TypedLiteral literal = parser.parseListOrMapLiteral(null);
+    TypedLiteral literal = parseListOrMapLiteral(null, '<int> [1]');
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal, new isInstanceOf<ListLiteral>());
-    ListLiteral listLiteral = literal;
+    var listLiteral = literal as ListLiteral;
     expect(listLiteral.constKeyword, isNull);
     expect(listLiteral.typeArguments, isNotNull);
     expect(listLiteral.leftBracket, isNotNull);
@@ -5395,12 +5296,10 @@
   }
 
   void test_parseListOrMapLiteral_map_noType() {
-    createParser("{'1' : 1}");
-    TypedLiteral literal = parser.parseListOrMapLiteral(null);
+    TypedLiteral literal = parseListOrMapLiteral(null, "{'1' : 1}");
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal, new isInstanceOf<MapLiteral>());
-    MapLiteral mapLiteral = literal;
+    var mapLiteral = literal as MapLiteral;
     expect(mapLiteral.constKeyword, isNull);
     expect(mapLiteral.typeArguments, isNull);
     expect(mapLiteral.leftBracket, isNotNull);
@@ -5409,12 +5308,11 @@
   }
 
   void test_parseListOrMapLiteral_map_type() {
-    createParser("<String, int> {'1' : 1}");
-    TypedLiteral literal = parser.parseListOrMapLiteral(null);
+    TypedLiteral literal =
+        parseListOrMapLiteral(null, "<String, int> {'1' : 1}");
     expect(literal, isNotNull);
     assertNoErrors();
-    expect(literal, new isInstanceOf<MapLiteral>());
-    MapLiteral mapLiteral = literal;
+    var mapLiteral = literal as MapLiteral;
     expect(mapLiteral.constKeyword, isNull);
     expect(mapLiteral.typeArguments, isNotNull);
     expect(mapLiteral.leftBracket, isNotNull);
@@ -5423,12 +5321,10 @@
   }
 
   void test_parseLogicalAndExpression() {
-    createParser('x && y');
-    Expression expression = parser.parseLogicalAndExpression();
+    Expression expression = parseLogicalAndExpression('x && y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.AMPERSAND_AMPERSAND);
@@ -5436,12 +5332,10 @@
   }
 
   void test_parseLogicalOrExpression() {
-    createParser('x || y');
-    Expression expression = parser.parseLogicalOrExpression();
+    Expression expression = parseLogicalOrExpression('x || y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.BAR_BAR);
@@ -5450,22 +5344,18 @@
 
   void test_parseMapLiteral_empty() {
     Token token = TokenFactory.tokenFromKeyword(Keyword.CONST);
-    TypeArgumentList typeArguments = AstTestFactory.typeArgumentList(
-        [AstTestFactory.typeName4("String"), AstTestFactory.typeName4("int")]);
-    createParser('{}');
-    MapLiteral literal = parser.parseMapLiteral(token, typeArguments);
+    MapLiteral literal = parseMapLiteral(token, '<String, int>', '{}');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.constKeyword, token);
-    expect(literal.typeArguments, typeArguments);
+    expect(literal.typeArguments, isNotNull);
     expect(literal.leftBracket, isNotNull);
     expect(literal.entries, hasLength(0));
     expect(literal.rightBracket, isNotNull);
   }
 
   void test_parseMapLiteral_multiple() {
-    createParser("{'a' : b, 'x' : y}");
-    MapLiteral literal = parser.parseMapLiteral(null, null);
+    MapLiteral literal = parseMapLiteral(null, null, "{'a' : b, 'x' : y}");
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.leftBracket, isNotNull);
@@ -5474,8 +5364,7 @@
   }
 
   void test_parseMapLiteral_single() {
-    createParser("{'x' : y}");
-    MapLiteral literal = parser.parseMapLiteral(null, null);
+    MapLiteral literal = parseMapLiteral(null, null, "{'x' : y}");
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.leftBracket, isNotNull);
@@ -5484,8 +5373,7 @@
   }
 
   void test_parseMapLiteralEntry_complex() {
-    createParser('2 + 2 : y');
-    MapLiteralEntry entry = parser.parseMapLiteralEntry();
+    MapLiteralEntry entry = parseMapLiteralEntry('2 + 2 : y');
     expect(entry, isNotNull);
     assertNoErrors();
     expect(entry.key, isNotNull);
@@ -5494,8 +5382,7 @@
   }
 
   void test_parseMapLiteralEntry_int() {
-    createParser('0 : y');
-    MapLiteralEntry entry = parser.parseMapLiteralEntry();
+    MapLiteralEntry entry = parseMapLiteralEntry('0 : y');
     expect(entry, isNotNull);
     assertNoErrors();
     expect(entry.key, isNotNull);
@@ -5504,8 +5391,7 @@
   }
 
   void test_parseMapLiteralEntry_string() {
-    createParser("'x' : y");
-    MapLiteralEntry entry = parser.parseMapLiteralEntry();
+    MapLiteralEntry entry = parseMapLiteralEntry("'x' : y");
     expect(entry, isNotNull);
     assertNoErrors();
     expect(entry.key, isNotNull);
@@ -5514,12 +5400,10 @@
   }
 
   void test_parseMultiplicativeExpression_normal() {
-    createParser('x * y');
-    Expression expression = parser.parseMultiplicativeExpression();
+    Expression expression = parseMultiplicativeExpression('x * y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.STAR);
@@ -5527,12 +5411,10 @@
   }
 
   void test_parseMultiplicativeExpression_super() {
-    createParser('super * y');
-    Expression expression = parser.parseMultiplicativeExpression();
+    Expression expression = parseMultiplicativeExpression('super * y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, new isInstanceOf<SuperExpression>());
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.STAR);
@@ -5540,8 +5422,7 @@
   }
 
   void test_parseNewExpression() {
-    createParser('new A()');
-    InstanceCreationExpression expression = parser.parseNewExpression();
+    InstanceCreationExpression expression = parseNewExpression('new A()');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.keyword, isNotNull);
@@ -5554,47 +5435,39 @@
   }
 
   void test_parsePostfixExpression_decrement() {
-    createParser('i--');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('i--');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PostfixExpression>());
-    PostfixExpression postfixExpression = expression;
+    var postfixExpression = expression as PostfixExpression;
     expect(postfixExpression.operand, isNotNull);
     expect(postfixExpression.operator, isNotNull);
     expect(postfixExpression.operator.type, TokenType.MINUS_MINUS);
   }
 
   void test_parsePostfixExpression_increment() {
-    createParser('i++');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('i++');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PostfixExpression>());
-    PostfixExpression postfixExpression = expression;
+    var postfixExpression = expression as PostfixExpression;
     expect(postfixExpression.operand, isNotNull);
     expect(postfixExpression.operator, isNotNull);
     expect(postfixExpression.operator.type, TokenType.PLUS_PLUS);
   }
 
   void test_parsePostfixExpression_none_indexExpression() {
-    createParser('a[0]');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a[0]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IndexExpression>());
-    IndexExpression indexExpression = expression;
+    var indexExpression = expression as IndexExpression;
     expect(indexExpression.target, isNotNull);
     expect(indexExpression.index, isNotNull);
   }
 
   void test_parsePostfixExpression_none_methodInvocation() {
-    createParser('a.m()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a.m()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5603,12 +5476,10 @@
   }
 
   void test_parsePostfixExpression_none_methodInvocation_question_dot() {
-    createParser('a?.m()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a?.m()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5619,12 +5490,10 @@
   void
       test_parsePostfixExpression_none_methodInvocation_question_dot_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('a?.m/*<E>*/()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a?.m/*<E>*/()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5634,12 +5503,10 @@
 
   void
       test_parsePostfixExpression_none_methodInvocation_question_dot_typeArguments() {
-    createParser('a?.m<E>()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a?.m<E>()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.QUESTION_PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5650,12 +5517,10 @@
   void
       test_parsePostfixExpression_none_methodInvocation_typeArgumentComments() {
     enableGenericMethodComments = true;
-    createParser('a.m/*<E>*/()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a.m/*<E>*/()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5664,12 +5529,10 @@
   }
 
   void test_parsePostfixExpression_none_methodInvocation_typeArguments() {
-    createParser('a.m<E>()');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a.m<E>()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MethodInvocation>());
-    MethodInvocation methodInvocation = expression;
+    var methodInvocation = expression as MethodInvocation;
     expect(methodInvocation.target, isNotNull);
     expect(methodInvocation.operator.type, TokenType.PERIOD);
     expect(methodInvocation.methodName, isNotNull);
@@ -5678,44 +5541,37 @@
   }
 
   void test_parsePostfixExpression_none_propertyAccess() {
-    createParser('a.b');
-    Expression expression = parser.parsePostfixExpression();
+    Expression expression = parsePostfixExpression('a.b');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PrefixedIdentifier>());
-    PrefixedIdentifier identifier = expression;
+    var identifier = expression as PrefixedIdentifier;
     expect(identifier.prefix, isNotNull);
     expect(identifier.identifier, isNotNull);
   }
 
   void test_parsePrefixedIdentifier_noPrefix() {
     String lexeme = "bar";
-    createParser(lexeme);
-    Identifier identifier = parser.parsePrefixedIdentifier();
+    Identifier identifier = parsePrefixedIdentifier(lexeme);
     expect(identifier, isNotNull);
     assertNoErrors();
-    expect(identifier, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier simpleIdentifier = identifier;
+    var simpleIdentifier = identifier as SimpleIdentifier;
     expect(simpleIdentifier.token, isNotNull);
     expect(simpleIdentifier.name, lexeme);
   }
 
   void test_parsePrefixedIdentifier_prefix() {
     String lexeme = "foo.bar";
-    createParser(lexeme);
-    Identifier identifier = parser.parsePrefixedIdentifier();
+    Identifier identifier = parsePrefixedIdentifier(lexeme);
     expect(identifier, isNotNull);
     assertNoErrors();
-    expect(identifier, new isInstanceOf<PrefixedIdentifier>());
-    PrefixedIdentifier prefixedIdentifier = identifier;
+    var prefixedIdentifier = identifier as PrefixedIdentifier;
     expect(prefixedIdentifier.prefix.name, "foo");
     expect(prefixedIdentifier.period, isNotNull);
     expect(prefixedIdentifier.identifier.name, "bar");
   }
 
   void test_parsePrimaryExpression_const() {
-    createParser('const A()');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('const A()');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, isNotNull);
@@ -5723,183 +5579,151 @@
 
   void test_parsePrimaryExpression_double() {
     String doubleLiteral = "3.2e4";
-    createParser(doubleLiteral);
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression(doubleLiteral);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<DoubleLiteral>());
-    DoubleLiteral literal = expression;
+    var literal = expression as DoubleLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, double.parse(doubleLiteral));
   }
 
   void test_parsePrimaryExpression_false() {
-    createParser('false');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('false');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BooleanLiteral>());
-    BooleanLiteral literal = expression;
+    var literal = expression as BooleanLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, isFalse);
   }
 
   void test_parsePrimaryExpression_function_arguments() {
-    createParser('(int i) => i + 1');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('(int i) => i + 1');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.parameters, isNotNull);
     expect(functionExpression.body, isNotNull);
   }
 
   void test_parsePrimaryExpression_function_noArguments() {
-    createParser('() => 42');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('() => 42');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression functionExpression = expression;
+    var functionExpression = expression as FunctionExpression;
     expect(functionExpression.parameters, isNotNull);
     expect(functionExpression.body, isNotNull);
   }
 
   void test_parsePrimaryExpression_genericFunctionExpression() {
-    createParser('<X, Y>(Map<X, Y> m, X x) => m[x]');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression =
+        parsePrimaryExpression('<X, Y>(Map<X, Y> m, X x) => m[x]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<FunctionExpression>());
-    FunctionExpression function = expression;
-    expect(function.typeParameters, isNotNull);
+    var functionExpression = expression as FunctionExpression;
+    expect(functionExpression.typeParameters, isNotNull);
   }
 
   void test_parsePrimaryExpression_hex() {
     String hexLiteral = "3F";
-    createParser('0x$hexLiteral');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('0x$hexLiteral');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IntegerLiteral>());
-    IntegerLiteral literal = expression;
+    var literal = expression as IntegerLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, int.parse(hexLiteral, radix: 16));
   }
 
   void test_parsePrimaryExpression_identifier() {
-    createParser('a');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('a');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier identifier = expression;
+    var identifier = expression as SimpleIdentifier;
     expect(identifier, isNotNull);
   }
 
   void test_parsePrimaryExpression_int() {
     String intLiteral = "472";
-    createParser(intLiteral);
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression(intLiteral);
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IntegerLiteral>());
-    IntegerLiteral literal = expression;
+    var literal = expression as IntegerLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, int.parse(intLiteral));
   }
 
   void test_parsePrimaryExpression_listLiteral() {
-    createParser('[ ]');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('[ ]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_listLiteral_index() {
-    createParser('[]');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('[]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_listLiteral_typed() {
-    createParser('<A>[ ]');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('<A>[ ]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal.typeArguments, isNotNull);
     expect(literal.typeArguments.arguments, hasLength(1));
   }
 
   void test_parsePrimaryExpression_listLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
-    createParser('/*<A>*/[ ]');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('/*<A>*/[ ]');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ListLiteral>());
-    ListLiteral literal = expression;
+    var literal = expression as ListLiteral;
     expect(literal.typeArguments, isNotNull);
     expect(literal.typeArguments.arguments, hasLength(1));
   }
 
   void test_parsePrimaryExpression_mapLiteral() {
-    createParser('{}');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('{}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.typeArguments, isNull);
     expect(literal, isNotNull);
   }
 
   void test_parsePrimaryExpression_mapLiteral_typed() {
-    createParser('<A, B>{}');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('<A, B>{}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.typeArguments, isNotNull);
     expect(literal.typeArguments.arguments, hasLength(2));
   }
 
   void test_parsePrimaryExpression_mapLiteral_typed_genericComment() {
     enableGenericMethodComments = true;
-    createParser('/*<A, B>*/{}');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('/*<A, B>*/{}');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<MapLiteral>());
-    MapLiteral literal = expression;
+    var literal = expression as MapLiteral;
     expect(literal.typeArguments, isNotNull);
     expect(literal.typeArguments.arguments, hasLength(2));
   }
 
   void test_parsePrimaryExpression_new() {
-    createParser('new A()');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('new A()');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<InstanceCreationExpression>());
-    InstanceCreationExpression creation = expression;
+    var creation = expression as InstanceCreationExpression;
     expect(creation, isNotNull);
   }
 
   void test_parsePrimaryExpression_null() {
-    createParser('null');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('null');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, new isInstanceOf<NullLiteral>());
@@ -5908,58 +5732,48 @@
   }
 
   void test_parsePrimaryExpression_parenthesized() {
-    createParser('(x)');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('(x)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ParenthesizedExpression>());
-    ParenthesizedExpression parens = expression;
+    var parens = expression as ParenthesizedExpression;
     expect(parens, isNotNull);
   }
 
   void test_parsePrimaryExpression_string() {
-    createParser('"string"');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('"string"');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.isMultiline, isFalse);
     expect(literal.isRaw, isFalse);
     expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_string_multiline() {
-    createParser("'''string'''");
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression("'''string'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.isMultiline, isTrue);
     expect(literal.isRaw, isFalse);
     expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_string_raw() {
-    createParser("r'string'");
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression("r'string'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.isMultiline, isFalse);
     expect(literal.isRaw, isTrue);
     expect(literal.value, "string");
   }
 
   void test_parsePrimaryExpression_super() {
-    createParser('super.x');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('super.x');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<PropertyAccess>());
-    PropertyAccess propertyAccess = expression;
+    var propertyAccess = expression as PropertyAccess;
     expect(propertyAccess.target is SuperExpression, isTrue);
     expect(propertyAccess.operator, isNotNull);
     expect(propertyAccess.operator.type, TokenType.PERIOD);
@@ -5967,57 +5781,48 @@
   }
 
   void test_parsePrimaryExpression_this() {
-    createParser('this');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('this');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ThisExpression>());
-    ThisExpression thisExpression = expression;
+    var thisExpression = expression as ThisExpression;
     expect(thisExpression.thisKeyword, isNotNull);
   }
 
   void test_parsePrimaryExpression_true() {
-    createParser('true');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('true');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BooleanLiteral>());
-    BooleanLiteral literal = expression;
+    var literal = expression as BooleanLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, isTrue);
   }
 
   void test_parseRelationalExpression_as_functionType_noReturnType() {
-    createParser('x as Function(int)');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x as Function(int)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
   }
 
   void test_parseRelationalExpression_as_functionType_returnType() {
-    createParser('x as String Function(int)');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression =
+        parseRelationalExpression('x as String Function(int)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<GenericFunctionType>());
   }
 
   void test_parseRelationalExpression_as_generic() {
-    createParser('x as C<D>');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x as C<D>');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<TypeName>());
@@ -6025,48 +5830,40 @@
 
   void test_parseRelationalExpression_as_nullable() {
     enableNnbd = true;
-    createParser('x as Y?)');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x as Y?)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<TypeName>());
   }
 
   void test_parseRelationalExpression_as_simple() {
-    createParser('x as Y');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x as Y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<TypeName>());
   }
 
   void test_parseRelationalExpression_as_simple_function() {
-    createParser('x as Function');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x as Function');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AsExpression>());
-    AsExpression asExpression = expression;
+    var asExpression = expression as AsExpression;
     expect(asExpression.expression, isNotNull);
     expect(asExpression.asOperator, isNotNull);
     expect(asExpression.type, new isInstanceOf<TypeName>());
   }
 
   void test_parseRelationalExpression_is() {
-    createParser('x is y');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x is y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IsExpression>());
-    IsExpression isExpression = expression;
+    var isExpression = expression as IsExpression;
     expect(isExpression.expression, isNotNull);
     expect(isExpression.isOperator, isNotNull);
     expect(isExpression.notOperator, isNull);
@@ -6075,12 +5872,10 @@
 
   void test_parseRelationalExpression_is_nullable() {
     enableNnbd = true;
-    createParser('x is y?)');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x is y?)');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IsExpression>());
-    IsExpression isExpression = expression;
+    var isExpression = expression as IsExpression;
     expect(isExpression.expression, isNotNull);
     expect(isExpression.isOperator, isNotNull);
     expect(isExpression.notOperator, isNull);
@@ -6088,12 +5883,10 @@
   }
 
   void test_parseRelationalExpression_isNot() {
-    createParser('x is! y');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x is! y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<IsExpression>());
-    IsExpression isExpression = expression;
+    var isExpression = expression as IsExpression;
     expect(isExpression.expression, isNotNull);
     expect(isExpression.isOperator, isNotNull);
     expect(isExpression.notOperator, isNotNull);
@@ -6101,12 +5894,10 @@
   }
 
   void test_parseRelationalExpression_normal() {
-    createParser('x < y');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('x < y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.LT);
@@ -6114,12 +5905,10 @@
   }
 
   void test_parseRelationalExpression_super() {
-    createParser('super < y');
-    Expression expression = parser.parseRelationalExpression();
+    Expression expression = parseRelationalExpression('super < y');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<BinaryExpression>());
-    BinaryExpression binaryExpression = expression;
+    var binaryExpression = expression as BinaryExpression;
     expect(binaryExpression.leftOperand, isNotNull);
     expect(binaryExpression.operator, isNotNull);
     expect(binaryExpression.operator.type, TokenType.LT);
@@ -6127,16 +5916,14 @@
   }
 
   void test_parseRethrowExpression() {
-    createParser('rethrow;');
-    RethrowExpression expression = parser.parseRethrowExpression();
+    RethrowExpression expression = parseRethrowExpression('rethrow');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.rethrowKeyword, isNotNull);
   }
 
   void test_parseShiftExpression_normal() {
-    createParser('x << y');
-    BinaryExpression expression = parser.parseShiftExpression();
+    BinaryExpression expression = parseShiftExpression('x << y');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.leftOperand, isNotNull);
@@ -6146,8 +5933,7 @@
   }
 
   void test_parseShiftExpression_super() {
-    createParser('super << y');
-    BinaryExpression expression = parser.parseShiftExpression();
+    BinaryExpression expression = parseShiftExpression('super << y');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.leftOperand, isNotNull);
@@ -6162,8 +5948,7 @@
 
   void test_parseSimpleIdentifier_builtInIdentifier() {
     String lexeme = "as";
-    createParser(lexeme);
-    SimpleIdentifier identifier = parser.parseSimpleIdentifier();
+    SimpleIdentifier identifier = parseSimpleIdentifier(lexeme);
     expect(identifier, isNotNull);
     assertNoErrors();
     expect(identifier.token, isNotNull);
@@ -6172,8 +5957,7 @@
 
   void test_parseSimpleIdentifier_normalIdentifier() {
     String lexeme = "foo";
-    createParser(lexeme);
-    SimpleIdentifier identifier = parser.parseSimpleIdentifier();
+    SimpleIdentifier identifier = parseSimpleIdentifier(lexeme);
     expect(identifier, isNotNull);
     assertNoErrors();
     expect(identifier.token, isNotNull);
@@ -6181,12 +5965,10 @@
   }
 
   void test_parseStringLiteral_adjacent() {
-    createParser("'a' 'b'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'a' 'b'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<AdjacentStrings>());
-    AdjacentStrings literal = expression;
+    var literal = expression as AdjacentStrings;
     NodeList<StringLiteral> strings = literal.strings;
     expect(strings, hasLength(2));
     StringLiteral firstString = strings[0];
@@ -6196,12 +5978,10 @@
   }
 
   void test_parseStringLiteral_endsWithInterpolation() {
-    createParser(r"'x$y'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"'x$y'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6216,8 +5996,7 @@
   }
 
   void test_parseStringLiteral_interpolated() {
-    createParser("'a \${b} c \$this d'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'a \${b} c \$this d'");
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression, new isInstanceOf<StringInterpolation>());
@@ -6232,23 +6011,19 @@
   }
 
   void test_parseStringLiteral_multiline_encodedSpace() {
-    createParser("'''\\x20\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''\\x20\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, " \na");
   }
 
   void test_parseStringLiteral_multiline_endsWithInterpolation() {
-    createParser(r"'''x$y'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"'''x$y'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6263,100 +6038,82 @@
   }
 
   void test_parseStringLiteral_multiline_escapedBackslash() {
-    createParser("'''\\\\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''\\\\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "\\\na");
   }
 
   void test_parseStringLiteral_multiline_escapedBackslash_raw() {
-    createParser("r'''\\\\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("r'''\\\\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "\\\\\na");
   }
 
   void test_parseStringLiteral_multiline_escapedEolMarker() {
-    createParser("'''\\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''\\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_escapedEolMarker_raw() {
-    createParser("r'''\\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("r'''\\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker() {
-    createParser("'''\\ \\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''\\ \\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_escapedSpaceAndEolMarker_raw() {
-    createParser("r'''\\ \\\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("r'''\\ \\\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_escapedTab() {
-    createParser("'''\\t\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''\\t\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "\t\na");
   }
 
   void test_parseStringLiteral_multiline_escapedTab_raw() {
-    createParser("r'''\\t\na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("r'''\\t\na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "\\t\na");
   }
 
   void test_parseStringLiteral_multiline_quoteAfterInterpolation() {
-    createParser(r"""'''$x'y'''""");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"""'''$x'y'''""");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6371,12 +6128,10 @@
   }
 
   void test_parseStringLiteral_multiline_startsWithInterpolation() {
-    createParser(r"'''${x}y'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"'''${x}y'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6391,45 +6146,37 @@
   }
 
   void test_parseStringLiteral_multiline_twoSpaces() {
-    createParser("'''  \na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'''  \na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_twoSpaces_raw() {
-    createParser("r'''  \na'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("r'''  \na'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_multiline_untrimmed() {
-    createParser("''' a\nb'''");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("''' a\nb'''");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, " a\nb");
   }
 
   void test_parseStringLiteral_quoteAfterInterpolation() {
-    createParser(r"""'$x"'""");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"""'$x"'""");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6444,23 +6191,19 @@
   }
 
   void test_parseStringLiteral_single() {
-    createParser("'a'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral("'a'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleStringLiteral>());
-    SimpleStringLiteral literal = expression;
+    var literal = expression as SimpleStringLiteral;
     expect(literal.literal, isNotNull);
     expect(literal.value, "a");
   }
 
   void test_parseStringLiteral_startsWithInterpolation() {
-    createParser(r"'${x}y'");
-    Expression expression = parser.parseStringLiteral();
+    Expression expression = parseStringLiteral(r"'${x}y'");
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<StringInterpolation>());
-    StringInterpolation interpolation = expression;
+    var interpolation = expression as StringInterpolation;
     expect(interpolation.elements, hasLength(3));
     expect(interpolation.elements[0], new isInstanceOf<InterpolationString>());
     InterpolationString element0 = interpolation.elements[0];
@@ -6475,9 +6218,8 @@
   }
 
   void test_parseSuperConstructorInvocation_named() {
-    createParser('super.a()');
     SuperConstructorInvocation invocation =
-        parser.parseSuperConstructorInvocation();
+        parseSuperConstructorInvocation('super.a()');
     expect(invocation, isNotNull);
     assertNoErrors();
     expect(invocation.argumentList, isNotNull);
@@ -6487,9 +6229,8 @@
   }
 
   void test_parseSuperConstructorInvocation_unnamed() {
-    createParser('super()');
     SuperConstructorInvocation invocation =
-        parser.parseSuperConstructorInvocation();
+        parseSuperConstructorInvocation('super()');
     expect(invocation, isNotNull);
     assertNoErrors();
     expect(invocation.argumentList, isNotNull);
@@ -6499,8 +6240,7 @@
   }
 
   void test_parseSymbolLiteral_builtInIdentifier() {
-    createParser('#dynamic.static.abstract');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#dynamic.static.abstract');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.poundSign, isNotNull);
@@ -6512,8 +6252,7 @@
   }
 
   void test_parseSymbolLiteral_multiple() {
-    createParser('#a.b.c');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#a.b.c');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.poundSign, isNotNull);
@@ -6525,8 +6264,7 @@
   }
 
   void test_parseSymbolLiteral_operator() {
-    createParser('#==');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#==');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.poundSign, isNotNull);
@@ -6536,8 +6274,7 @@
   }
 
   void test_parseSymbolLiteral_single() {
-    createParser('#a');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#a');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.poundSign, isNotNull);
@@ -6547,8 +6284,7 @@
   }
 
   void test_parseSymbolLiteral_void() {
-    createParser('#void');
-    SymbolLiteral literal = parser.parseSymbolLiteral();
+    SymbolLiteral literal = parseSymbolLiteral('#void');
     expect(literal, isNotNull);
     assertNoErrors();
     expect(literal.poundSign, isNotNull);
@@ -6558,30 +6294,25 @@
   }
 
   void test_parseThrowExpression() {
-    createParser('throw x;');
-    Expression expression = parser.parseThrowExpression();
+    Expression expression = parseThrowExpression('throw x');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ThrowExpression>());
-    ThrowExpression throwExpression = expression;
+    var throwExpression = expression as ThrowExpression;
     expect(throwExpression.throwKeyword, isNotNull);
     expect(throwExpression.expression, isNotNull);
   }
 
   void test_parseThrowExpressionWithoutCascade() {
-    createParser('throw x;');
-    Expression expression = parser.parseThrowExpressionWithoutCascade();
+    Expression expression = parseThrowExpressionWithoutCascade('throw x');
     expect(expression, isNotNull);
     assertNoErrors();
-    expect(expression, new isInstanceOf<ThrowExpression>());
-    ThrowExpression throwExpression = expression;
+    var throwExpression = expression as ThrowExpression;
     expect(throwExpression.throwKeyword, isNotNull);
     expect(throwExpression.expression, isNotNull);
   }
 
   void test_parseUnaryExpression_decrement_normal() {
-    createParser('--x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('--x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6590,8 +6321,7 @@
   }
 
   void test_parseUnaryExpression_decrement_super() {
-    createParser('--super');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('--super');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6606,8 +6336,7 @@
   }
 
   void test_parseUnaryExpression_decrement_super_propertyAccess() {
-    createParser('--super.x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('--super.x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6619,8 +6348,7 @@
   }
 
   void test_parseUnaryExpression_decrement_super_withComment() {
-    createParser('/* 0 */ --super');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('/* 0 */ --super');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6636,8 +6364,7 @@
   }
 
   void test_parseUnaryExpression_increment_normal() {
-    createParser('++x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('++x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6646,8 +6373,7 @@
   }
 
   void test_parseUnaryExpression_increment_super_index() {
-    createParser('++super[0]');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('++super[0]');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6659,8 +6385,7 @@
   }
 
   void test_parseUnaryExpression_increment_super_propertyAccess() {
-    createParser('++super.x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('++super.x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6672,8 +6397,7 @@
   }
 
   void test_parseUnaryExpression_minus_normal() {
-    createParser('-x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('-x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6682,8 +6406,7 @@
   }
 
   void test_parseUnaryExpression_minus_super() {
-    createParser('-super');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('-super');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6692,8 +6415,7 @@
   }
 
   void test_parseUnaryExpression_not_normal() {
-    createParser('!x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('!x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6702,8 +6424,7 @@
   }
 
   void test_parseUnaryExpression_not_super() {
-    createParser('!super');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('!super');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6712,8 +6433,7 @@
   }
 
   void test_parseUnaryExpression_tilda_normal() {
-    createParser('~x');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('~x');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -6722,8 +6442,7 @@
   }
 
   void test_parseUnaryExpression_tilda_super() {
-    createParser('~super');
-    PrefixExpression expression = parser.parseUnaryExpression();
+    PrefixExpression expression = parseUnaryExpression('~super');
     expect(expression, isNotNull);
     assertNoErrors();
     expect(expression.operator, isNotNull);
@@ -7985,6 +7704,59 @@
     }
   }
 
+  @override
+  Expression parseAdditiveExpression(String code) {
+    createParser(code);
+    return parser.parseAdditiveExpression();
+  }
+
+  @override
+  Expression parseAssignableExpression(String code, bool primaryAllowed) {
+    createParser(code);
+    return parser.parseAssignableExpression(primaryAllowed);
+  }
+
+  @override
+  Expression parseAssignableSelector(
+      String code, bool optional,
+      {bool allowConditional: true}) {
+    Expression prefix =
+        astFactory.simpleIdentifier(new StringToken(TokenType.STRING, 'foo', 0));
+    createParser(code);
+    return parser.parseAssignableSelector(prefix, optional,
+        allowConditional: allowConditional);
+  }
+
+  @override
+  AwaitExpression parseAwaitExpression(String code) {
+    createParser(code);
+    return parser.parseAwaitExpression();
+  }
+
+  @override
+  Expression parseBitwiseAndExpression(String code) {
+    createParser(code);
+    return parser.parseBitwiseAndExpression();
+  }
+
+  @override
+  Expression parseBitwiseOrExpression(String code) {
+    createParser(code);
+    return parser.parseBitwiseOrExpression();
+  }
+
+  @override
+  Expression parseBitwiseXorExpression(String code) {
+    createParser(code);
+    return parser.parseBitwiseXorExpression();
+  }
+
+  @override
+  Expression parseCascadeSection(String code) {
+    createParser(code);
+    return parser.parseCascadeSection();
+  }
+
   /**
    * Parse the given source as a compilation unit.
    *
@@ -8037,6 +7809,18 @@
   }
 
   @override
+  ConditionalExpression parseConditionalExpression(String code) {
+    createParser(code);
+    return parser.parseConditionalExpression();
+  }
+
+  @override
+  Expression parseConstExpression(String code) {
+    createParser(code);
+    return parser.parseConstExpression();
+  }
+
+  @override
   CompilationUnit parseDirectives(String source,
       [List<ErrorCode> errorCodes = const <ErrorCode>[]]) {
     createParser(source);
@@ -8047,6 +7831,12 @@
     return unit;
   }
 
+  @override
+  BinaryExpression parseEqualityExpression(String code) {
+    createParser(code);
+    return parser.parseEqualityExpression();
+  }
+
   /**
    * Parse the given source as an expression.
    *
@@ -8066,6 +7856,18 @@
   }
 
   @override
+  List<Expression> parseExpressionList(String code) {
+    createParser(code);
+    return parser.parseExpressionList();
+  }
+
+  @override
+  Expression parseExpressionWithoutCascade(String code) {
+    createParser(code);
+    return parser.parseExpressionWithoutCascade();
+  }
+
+  @override
   FormalParameter parseFormalParameter(String code, ParameterKind kind,
       {List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
     createParser(code);
@@ -8105,6 +7907,79 @@
           parser.parseCommentAndMetadata());
 
   @override
+  FunctionExpression parseFunctionExpression(String code) {
+    createParser(code);
+    return parser.parseFunctionExpression();
+  }
+
+  @override
+  InstanceCreationExpression parseInstanceCreationExpression(
+      String code, Token newToken) {
+    createParser(code);
+    return parser.parseInstanceCreationExpression(newToken);
+  }
+
+  @override
+  ListLiteral parseListLiteral(
+      Token token, String typeArgumentsCode, String code) {
+    TypeArgumentList typeArguments;
+    if (typeArgumentsCode != null) {
+      createParser(typeArgumentsCode);
+      typeArguments = parser.parseTypeArgumentList();
+    }
+    createParser(code);
+    return parser.parseListLiteral(token, typeArguments);
+  }
+
+  @override
+  TypedLiteral parseListOrMapLiteral(Token modifier, String code) {
+    createParser(code);
+    return parser.parseListOrMapLiteral(modifier);
+  }
+
+  @override
+  Expression parseLogicalAndExpression(String code) {
+    createParser(code);
+    return parser.parseLogicalAndExpression();
+  }
+
+  @override
+  Expression parseLogicalOrExpression(String code) {
+    createParser(code);
+    return parser.parseLogicalOrExpression();
+  }
+
+  @override
+  MapLiteral parseMapLiteral(
+      Token token, String typeArgumentsCode, String code) {
+    TypeArgumentList typeArguments;
+    if (typeArgumentsCode != null) {
+      createParser(typeArgumentsCode);
+      typeArguments = parser.parseTypeArgumentList();
+    }
+    createParser(code);
+    return parser.parseMapLiteral(token, typeArguments);
+  }
+
+  @override
+  MapLiteralEntry parseMapLiteralEntry(String code) {
+    createParser(code);
+    return parser.parseMapLiteralEntry();
+  }
+
+  @override
+  Expression parseMultiplicativeExpression(String code) {
+    createParser(code);
+    return parser.parseMultiplicativeExpression();
+  }
+
+  @override
+  InstanceCreationExpression parseNewExpression(String code) {
+    createParser(code);
+    return parser.parseNewExpression();
+  }
+
+  @override
   NormalFormalParameter parseNormalFormalParameter(String code,
       {bool inFunctionType: false,
       List<ErrorCode> errorCodes: const <ErrorCode>[]}) {
@@ -8115,6 +7990,48 @@
     return parameter;
   }
 
+  @override
+  Expression parsePostfixExpression(String code) {
+    createParser(code);
+    return parser.parsePostfixExpression();
+  }
+
+  @override
+  Identifier parsePrefixedIdentifier(String code) {
+    createParser(code);
+    return parser.parsePrefixedIdentifier();
+  }
+
+  @override
+  Expression parsePrimaryExpression(String code) {
+    createParser(code);
+    return parser.parsePrimaryExpression();
+  }
+
+  @override
+  Expression parseRelationalExpression(String code) {
+    createParser(code);
+    return parser.parseRelationalExpression();
+  }
+
+  @override
+  RethrowExpression parseRethrowExpression(String code) {
+    createParser(code);
+    return parser.parseRethrowExpression();
+  }
+
+  @override
+  BinaryExpression parseShiftExpression(String code) {
+    createParser(code);
+    return parser.parseShiftExpression();
+  }
+
+  @override
+  SimpleIdentifier parseSimpleIdentifier(String code) {
+    createParser(code);
+    return parser.parseSimpleIdentifier();
+  }
+
   /**
    * Parse the given [source] as a statement. The [errorCodes] are the error
    * codes of the errors that are expected to be found. If
@@ -8163,6 +8080,42 @@
   }
 
   @override
+  Expression parseStringLiteral(String code) {
+    createParser(code);
+    return parser.parseStringLiteral();
+  }
+
+  @override
+  SuperConstructorInvocation parseSuperConstructorInvocation(String code) {
+    createParser(code);
+    return parser.parseSuperConstructorInvocation();
+  }
+
+  @override
+  SymbolLiteral parseSymbolLiteral(String code) {
+    createParser(code);
+    return parser.parseSymbolLiteral();
+  }
+
+  @override
+  Expression parseThrowExpression(String code) {
+    createParser(code);
+    return parser.parseThrowExpression();
+  }
+
+  @override
+  Expression parseThrowExpressionWithoutCascade(String code) {
+    createParser(code);
+    return parser.parseThrowExpressionWithoutCascade();
+  }
+
+  @override
+  PrefixExpression parseUnaryExpression(String code) {
+    createParser(code);
+    return parser.parseUnaryExpression();
+  }
+
+  @override
   void setUp() {
     super.setUp();
     parseFunctionBodies = true;
@@ -9269,8 +9222,7 @@
   }
 
   void test_primaryExpression_argumentDefinitionTest() {
-    createParser('?a');
-    Expression expression = parser.parsePrimaryExpression();
+    Expression expression = parsePrimaryExpression('?a');
     expectNotNullIfNoErrors(expression);
     listener.assertErrorsWithCodes([ParserErrorCode.UNEXPECTED_TOKEN]);
     expect(expression, new isInstanceOf<SimpleIdentifier>());
@@ -9787,8 +9739,7 @@
     Expression expression = parser.parseArgument();
     expectNotNullIfNoErrors(expression);
     listener.assertNoErrors();
-    expect(expression, new isInstanceOf<SimpleIdentifier>());
-    SimpleIdentifier identifier = expression;
+    var identifier = expression as SimpleIdentifier;
     expect(identifier.name, lexeme);
   }
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index f6d67ec..464bcda 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -748,10 +748,16 @@
         contextRoot = path.absolute(contextRoot);
       }
     }
+
+    void verbosePrint(String text) {
+      outSink.writeln(text);
+    }
+
     AnalysisOptionsImpl contextOptions = new ContextBuilder(
             resourceProvider, null, null,
             options: options.contextBuilderOptions)
-        .getAnalysisOptions(contextRoot);
+        .getAnalysisOptions(contextRoot,
+            verbosePrint: options.verbose ? verbosePrint : null);
 
     contextOptions.trackCacheDependencies = false;
     contextOptions.disableCacheFlushing = options.disableCacheFlushing;
diff --git a/pkg/compiler/lib/src/js_backend/backend_helpers.dart b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
index 088c4de..66251fc 100644
--- a/pkg/compiler/lib/src/js_backend/backend_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
@@ -612,6 +612,9 @@
 
   FunctionEntity get subtypeCast => _findHelperFunction('subtypeCast');
 
+  FunctionEntity get functionTypeTest =>
+      _findHelperFunction('functionTypeTest');
+
   FunctionEntity get checkSubtypeOfRuntimeType =>
       _findHelperFunction('checkSubtypeOfRuntimeType');
 
@@ -710,45 +713,6 @@
 
   ClassEntity get VoidRuntimeType => _findHelperClass('VoidRuntimeType');
 
-  ClassEntity get RuntimeType => _findHelperClass('RuntimeType');
-
-  ClassEntity get RuntimeFunctionType =>
-      _findHelperClass('RuntimeFunctionType');
-
-  ClassEntity get RuntimeTypePlain => _findHelperClass('RuntimeTypePlain');
-
-  ClassEntity get RuntimeTypeGeneric => _findHelperClass('RuntimeTypeGeneric');
-
-  ClassEntity get DynamicRuntimeType => _findHelperClass('DynamicRuntimeType');
-
-  FunctionEntity get getDynamicRuntimeType {
-    // TODO(johnniwinther): Support this in mocks.
-    return _env.lookupLibraryMember(jsHelperLibrary, 'getDynamicRuntimeType');
-  }
-
-  FunctionEntity get getVoidRuntimeType {
-    // TODO(johnniwinther): Support this in mocks.
-    return _env.lookupLibraryMember(jsHelperLibrary, 'getVoidRuntimeType');
-  }
-
-  FunctionEntity get buildInterfaceType {
-    // TODO(johnniwinther): Support this in mocks.
-    return _env.lookupLibraryMember(jsHelperLibrary, 'buildInterfaceType');
-  }
-
-  FunctionEntity get buildFunctionType {
-    // TODO(johnniwinther): Support this in mocks.
-    return _env.lookupLibraryMember(jsHelperLibrary, 'buildFunctionType');
-  }
-
-  FunctionEntity get buildNamedFunctionType {
-    // TODO(johnniwinther): Support this in mocks.
-    return _env.lookupLibraryMember(jsHelperLibrary, 'buildNamedFunctionType');
-  }
-
-  FunctionEntity get functionTypeTestMetaHelper =>
-      _findHelperFunction('functionTypeTestMetaHelper');
-
   FunctionEntity get defineProperty => _findHelperFunction('defineProperty');
 
   FunctionEntity get startRootIsolate =>
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index 0ba422f..892c946 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -503,7 +503,7 @@
 
   BackendImpact get functionTypeCheck {
     return _functionTypeCheck ??=
-        new BackendImpact(staticUses: [helpers.functionTypeTestMetaHelper]);
+        new BackendImpact(staticUses: [/*helpers.functionTypeTestMetaHelper*/]);
   }
 
   BackendImpact _nativeTypeCheck;
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
index ab44766..be9011f 100644
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
@@ -89,6 +89,19 @@
   }
 }
 
+class FunctionTypeRepresentationCheckedModeHelper extends CheckedModeHelper {
+  const FunctionTypeRepresentationCheckedModeHelper(String name) : super(name);
+
+  CallStructure get callStructure => CallStructure.TWO_ARGS;
+
+  void generateAdditionalArguments(SsaCodeGenerator codegen,
+      HTypeConversion node, List<jsAst.Expression> arguments) {
+    assert(node.typeExpression.isFunctionType);
+    codegen.use(node.typeRepresentation);
+    arguments.add(codegen.pop());
+  }
+}
+
 class SubtypeCheckedModeHelper extends CheckedModeHelper {
   const SubtypeCheckedModeHelper(String name) : super(name);
 
@@ -96,6 +109,8 @@
 
   void generateAdditionalArguments(SsaCodeGenerator codegen,
       HTypeConversion node, List<jsAst.Expression> arguments) {
+    // TODO(sra): Move these calls into the SSA graph so that the arguments can
+    // be optimized, e,g, GVNed.
     InterfaceType type = node.typeExpression;
     ClassEntity element = type.element;
     jsAst.Name isField = codegen.backend.namer.operatorIs(element);
@@ -149,6 +164,8 @@
     const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'),
     const PropertyCheckedModeHelper('propertyTypeCast'),
     const PropertyCheckedModeHelper('propertyTypeCheck'),
+    const FunctionTypeRepresentationCheckedModeHelper('functionTypeCast'),
+    const FunctionTypeRepresentationCheckedModeHelper('functionTypeCheck'),
   ];
 
   // Checked mode helpers indexed by name.
@@ -212,7 +229,9 @@
           : 'assertSubtypeOfRuntimeType';
     }
 
-    if (type.isFunctionType) return null;
+    if (type.isFunctionType) {
+      return typeCast ? 'functionTypeCast' : 'functionTypeCheck';
+    }
 
     assert(invariant(NO_LOCATION_SPANNABLE, type.isInterfaceType,
         message: "Unexpected type: $type"));
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c41e2b9..a1e17a7a 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -906,14 +906,6 @@
   }
 
   /**
-   * Returns name of the JavaScript property used to store the
-   * `readTypeVariable` function for the given type variable.
-   */
-  jsAst.Name nameForReadTypeVariable(TypeVariableElement element) {
-    return _disambiguateInternalMember(element, () => element.name);
-  }
-
-  /**
    * Returns a JavaScript property name used to store [element] on one
    * of the global objects.
    *
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 430f1de..cb69608 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -40,10 +40,6 @@
   Emitter _emitter;
   final Compiler compiler;
 
-  /// Records if a type variable is read dynamically for type tests.
-  final Set<TypeVariableEntity> readTypeVariables =
-      new Set<TypeVariableEntity>();
-
   JavaScriptBackend get backend => compiler.backend;
 
   @deprecated
@@ -151,10 +147,6 @@
     return emitter.templateForBuiltin(builtin);
   }
 
-  void registerReadTypeVariable(TypeVariableEntity element) {
-    readTypeVariables.add(element);
-  }
-
   Set<ClassEntity> _finalizeRti() {
     // Compute the required type checks to know which classes need a
     // 'is$' method.
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
index 2be2636..5e341d4 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
@@ -63,7 +63,6 @@
     emitClassGettersSettersForCSP(cls, builder);
     emitInstanceMembers(cls, builder);
     emitStubs(cls.callStubs, builder);
-    emitStubs(cls.typeVariableReaderStubs, builder);
     emitRuntimeTypeInformation(cls, builder);
     emitNativeInfo(cls, builder);
 
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
index 6744c1e..ca11591f 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
@@ -715,14 +715,12 @@
     Iterable<Method> methods = cls.methods;
     Iterable<Method> isChecks = cls.isChecks;
     Iterable<Method> callStubs = cls.callStubs;
-    Iterable<Method> typeVariableReaderStubs = cls.typeVariableReaderStubs;
     Iterable<Method> noSuchMethodStubs = cls.noSuchMethodStubs;
     Iterable<Method> gettersSetters = _generateGettersSetters(cls);
     Iterable<Method> allMethods = [
       methods,
       isChecks,
       callStubs,
-      typeVariableReaderStubs,
       noSuchMethodStubs,
       gettersSetters
     ].expand((x) => x);
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index b4473a6..593798a 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -223,9 +223,6 @@
   /// Stub methods for this class that are call stubs for getters.
   final List<StubMethod> callStubs;
 
-  /// Stub methods for this class handling reads to type variables.
-  final List<StubMethod> typeVariableReaderStubs;
-
   /// noSuchMethod stubs in the special case that the class is Object.
   final List<StubMethod> noSuchMethodStubs;
   final List<Field> staticFieldsForReflection;
@@ -258,7 +255,6 @@
       this.fields,
       this.staticFieldsForReflection,
       this.callStubs,
-      this.typeVariableReaderStubs,
       this.noSuchMethodStubs,
       this.checkedSetters,
       this.isChecks,
@@ -295,7 +291,6 @@
       List<Field> instanceFields,
       List<Field> staticFieldsForReflection,
       List<StubMethod> callStubs,
-      List<StubMethod> typeVariableReaderStubs,
       List<StubMethod> checkedSetters,
       List<StubMethod> isChecks,
       js.Expression functionTypeIndex,
@@ -310,7 +305,6 @@
             instanceFields,
             staticFieldsForReflection,
             callStubs,
-            typeVariableReaderStubs,
             const <StubMethod>[],
             checkedSetters,
             isChecks,
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 08e2ee3..0d7f2b5 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -531,9 +531,6 @@
       }
     }
 
-    List<StubMethod> typeVariableReaderStubs =
-        runtimeTypeGenerator.generateTypeVariableReaderStubs(element);
-
     List<StubMethod> noSuchMethodStubs = <StubMethod>[];
 
     if (backend.enabledNoSuchMethod && element.isObject) {
@@ -620,7 +617,6 @@
           instanceFields,
           staticFieldsForReflection,
           callStubs,
-          typeVariableReaderStubs,
           checkedSetters,
           isChecks,
           typeTests.functionTypeIndex,
@@ -636,7 +632,6 @@
           instanceFields,
           staticFieldsForReflection,
           callStubs,
-          typeVariableReaderStubs,
           noSuchMethodStubs,
           checkedSetters,
           isChecks,
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index 0791151..09fe5ba 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -329,48 +329,4 @@
           superclass, generateIsTest, generateSubstitution, alreadyGenerated);
     }
   }
-
-  List<StubMethod> generateTypeVariableReaderStubs(ClassElement classElement) {
-    List<StubMethod> stubs = <StubMethod>[];
-    ClassElement superclass = classElement;
-    while (superclass != null) {
-      for (ResolutionTypeVariableType parameter in superclass.typeVariables) {
-        if (backend.emitter.readTypeVariables.contains(parameter.element)) {
-          stubs.add(
-              _generateTypeVariableReader(classElement, parameter.element));
-        }
-      }
-      superclass = superclass.superclass;
-    }
-
-    return stubs;
-  }
-
-  StubMethod _generateTypeVariableReader(
-      ClassElement cls, TypeVariableElement element) {
-    jsAst.Name name = namer.nameForReadTypeVariable(element);
-    int index = element.index;
-    jsAst.Expression computeTypeVariable;
-
-    Substitution substitution =
-        backend.rti.getSubstitution(cls, element.typeDeclaration);
-    jsAst.Name rtiFieldName = backend.namer.rtiFieldJsName;
-    if (substitution != null) {
-      computeTypeVariable = js(r'#.apply(null, this.#)', [
-        backend.rtiEncoder.getSubstitutionCodeForVariable(substitution, index),
-        rtiFieldName
-      ]);
-    } else {
-      // TODO(ahe): These can be generated dynamically.
-      computeTypeVariable = js(r'this.# && this.#[#]',
-          [rtiFieldName, rtiFieldName, js.number(index)]);
-    }
-    jsAst.Expression convertRtiToRuntimeType = backend.emitter
-        .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType);
-
-    return new StubMethod(
-        name,
-        js('function () { return #(#) }',
-            [convertRtiToRuntimeType, computeTypeVariable]));
-  }
 }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 3335c4a..a0eb6fe 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -702,7 +702,6 @@
     Iterable<Method> checkedSetters = cls.checkedSetters;
     Iterable<Method> isChecks = cls.isChecks;
     Iterable<Method> callStubs = cls.callStubs;
-    Iterable<Method> typeVariableReaderStubs = cls.typeVariableReaderStubs;
     Iterable<Method> noSuchMethodStubs = cls.noSuchMethodStubs;
     Iterable<Method> gettersSetters = generateGettersSetters(cls);
     Iterable<Method> allMethods = [
@@ -710,7 +709,6 @@
       checkedSetters,
       isChecks,
       callStubs,
-      typeVariableReaderStubs,
       noSuchMethodStubs,
       gettersSetters
     ].expand((x) => x);
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index de5445f..1c50d01 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -410,6 +410,10 @@
   }
 
   @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+  }
+
+  @override
   void handleNoType(Token token) {
     pushNode(null);
   }
diff --git a/pkg/compiler/lib/src/parser/member_listener.dart b/pkg/compiler/lib/src/parser/member_listener.dart
index 4697d5b..b1684cb 100644
--- a/pkg/compiler/lib/src/parser/member_listener.dart
+++ b/pkg/compiler/lib/src/parser/member_listener.dart
@@ -115,9 +115,10 @@
   }
 
   @override
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantKeyword, Token beginToken, Token endToken) {
     bool hasParseError = memberErrors.head;
-    super.endFields(count, beginToken, endToken);
+    super.endFields(count, covariantKeyword, beginToken, endToken);
     VariableDefinitions variableDefinitions = popNode();
     Modifiers modifiers = variableDefinitions.modifiers;
     pushNode(null);
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart
index 4317efc..09483b2 100644
--- a/pkg/compiler/lib/src/parser/node_listener.dart
+++ b/pkg/compiler/lib/src/parser/node_listener.dart
@@ -164,15 +164,8 @@
       typeParameters = functionType.typeParameters;
       formals = functionType.formals;
     }
-    pushNode(new Typedef(
-        isGeneralizedTypeAlias,
-        templateParameters,
-        returnType,
-        name,
-        typeParameters,
-        formals,
-        typedefKeyword,
-        endToken));
+    pushNode(new Typedef(isGeneralizedTypeAlias, templateParameters, returnType,
+        name, typeParameters, formals, typedefKeyword, endToken));
   }
 
   void handleNoName(Token token) {
@@ -234,8 +227,8 @@
   }
 
   @override
-  void endFormalParameter(Token covariantKeyword, Token thisKeyword,
-      FormalParameterType kind) {
+  void endFormalParameter(
+      Token covariantKeyword, Token thisKeyword, FormalParameterType kind) {
     Expression name = popNode();
     if (thisKeyword != null) {
       Identifier thisIdentifier = new Identifier(thisKeyword);
@@ -309,6 +302,10 @@
     pushNode(new RedirectingFactoryBody(beginToken, endToken, popNode()));
   }
 
+  void endExpressionFunctionBody(Token arrowToken, Token endToken) {
+    endReturnStatement(true, arrowToken, endToken);
+  }
+
   @override
   void endReturnStatement(
       bool hasExpression, Token beginToken, Token endToken) {
@@ -664,7 +661,8 @@
   }
 
   @override
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantKeyword, Token beginToken, Token endToken) {
     NodeList variables = makeNodeList(count, null, endToken, ",");
     TypeAnnotation type = popNode();
     Modifiers modifiers = popNode();
@@ -757,8 +755,8 @@
   }
 
   @override
-  void endFunctionTypedFormalParameter(Token covariantKeyword,
-      Token thisKeyword, FormalParameterType kind) {
+  void endFunctionTypedFormalParameter(
+      Token covariantKeyword, Token thisKeyword, FormalParameterType kind) {
     NodeList formals = popNode();
     NodeList typeVariables = popNode();
     Identifier name = popNode();
@@ -777,8 +775,7 @@
   }
 
   @override
-  void handleFormalParameterWithoutValue(Token token) {
-  }
+  void handleFormalParameterWithoutValue(Token token) {}
 
   @override
   void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
@@ -865,6 +862,7 @@
     AsyncModifier asyncModifier = popNode();
     NodeList formals = popNode();
     Node name = popNode();
+    popNode(); // Discard modifiers. They're recomputed below.
 
     // TODO(ahe): Move this parsing to the parser.
     int modifierCount = 0;
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index 1b44c1d..e6ae55e 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -301,13 +301,6 @@
     add(attachPosition(instruction, node));
   }
 
-  HTypeConversion buildFunctionTypeConversion(
-      HInstruction original, ResolutionDartType type, int kind) {
-    HInstruction reifiedType = buildFunctionType(type);
-    return new HTypeConversion.viaMethodOnType(
-        type, kind, original.instructionType, reifiedType, original);
-  }
-
   /**
    * Returns a complete argument list for a call of [function].
    */
@@ -2414,14 +2407,16 @@
       HInstruction call = pop();
       return new HIs.compound(type, expression, call, commonMasks.boolType);
     } else if (type.isFunctionType) {
-      List arguments = [buildFunctionType(type), expression];
-      pushInvokeDynamic(
-          node,
-          new Selector.call(new PrivateName('_isTest', helpers.jsHelperLibrary),
-              CallStructure.ONE_ARG),
-          null,
-          arguments);
-      return new HIs.compound(type, expression, pop(), commonMasks.boolType);
+      HInstruction representation =
+          typeBuilder.analyzeTypeArgument(type, sourceElement);
+      List<HInstruction> inputs = <HInstruction>[
+        expression,
+        representation,
+      ];
+      pushInvokeStatic(node, helpers.functionTypeTest, inputs,
+          typeMask: commonMasks.boolType);
+      HInstruction call = pop();
+      return new HIs.compound(type, expression, call, commonMasks.boolType);
     } else if (type.isTypeVariable) {
       HInstruction runtimeType =
           typeBuilder.addTypeVariableReference(type, sourceElement);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 66888f4..1d89901 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -476,13 +476,6 @@
     _buildInitializers(constructor, constructorChain, fieldValues);
   }
 
-  HTypeConversion buildFunctionTypeConversion(
-      HInstruction original, ResolutionDartType type, int kind) {
-    HInstruction reifiedType = buildFunctionType(type);
-    return new HTypeConversion.viaMethodOnType(
-        type, kind, original.instructionType, reifiedType, original);
-  }
-
   /// Builds generative constructor body.
   void buildConstructorBody(ir.Constructor constructor) {
     openFunction();
@@ -2856,14 +2849,18 @@
 
     ResolutionDartType typeValue =
         localsHandler.substInContext(astAdapter.getDartType(type));
+
     if (type is ir.FunctionType) {
-      List arguments = [buildFunctionType(typeValue), expression];
-      _pushDynamicInvocation(node, null, arguments,
-          selector: new Selector.call(
-              new PrivateName('_isTest', backend.helpers.jsHelperLibrary),
-              CallStructure.ONE_ARG));
-      push(
-          new HIs.compound(typeValue, expression, pop(), commonMasks.boolType));
+      HInstruction representation =
+          typeBuilder.analyzeTypeArgument(typeValue, sourceElement);
+      List<HInstruction> inputs = <HInstruction>[
+        expression,
+        representation,
+      ];
+      _pushStaticInvocation(
+          astAdapter.functionTypeTest, inputs, commonMasks.boolType);
+      HInstruction call = pop();
+      push(new HIs.compound(typeValue, expression, call, commonMasks.boolType));
       return;
     }
 
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 5cd48da..c53de93 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2893,26 +2893,7 @@
           .getCheckedModeHelper(type, typeCast: node.isCastTypeCheck);
     }
 
-    if (helper == null) {
-      assert(type.isFunctionType);
-      assert(node.usesMethodOnType);
-
-      String name = node.isCastTypeCheck ? '_asCheck' : '_assertCheck';
-      HInstruction reifiedType = node.inputs[0];
-      HInstruction checkedInput = node.inputs[1];
-      use(reifiedType);
-      js.Expression receiver = pop();
-      use(checkedInput);
-      Selector selector = new Selector.call(
-          new Name(name, helpers.jsHelperLibrary), CallStructure.ONE_ARG);
-      registry.registerDynamicUse(
-          new DynamicUse(selector, reifiedType.instructionType));
-      js.Name methodLiteral = backend.namer.invocationName(selector);
-      push(js.js('#.#(#)', [receiver, methodLiteral, pop()]));
-    } else {
-      assert(!node.usesMethodOnType);
-      push(helper.generateCall(this, node));
-    }
+    push(helper.generateCall(this, node));
   }
 
   void visitTypeKnown(HTypeKnown node) {
@@ -2920,52 +2901,6 @@
     assert(false);
   }
 
-  void visitFunctionType(HFunctionType node) {
-    FunctionType type = node.dartType;
-    int inputCount = 0;
-    use(node.inputs[inputCount++]);
-    js.Expression returnType = pop();
-
-    List<js.Expression> parameterTypes = <js.Expression>[];
-    for (var _ in type.parameterTypes) {
-      use(node.inputs[inputCount++]);
-      parameterTypes.add(pop());
-    }
-
-    List<js.Expression> optionalParameterTypes = <js.Expression>[];
-    for (var _ in type.optionalParameterTypes) {
-      use(node.inputs[inputCount++]);
-      optionalParameterTypes.add(pop());
-    }
-
-    List<js.Property> namedParameters = <js.Property>[];
-    for (var _ in type.namedParameters) {
-      use(node.inputs[inputCount++]);
-      js.Expression name = pop();
-      use(node.inputs[inputCount++]);
-      namedParameters.add(new js.Property(name, pop()));
-    }
-
-    if (namedParameters.isEmpty) {
-      var arguments = [returnType];
-      if (!parameterTypes.isEmpty || !optionalParameterTypes.isEmpty) {
-        arguments.add(new js.ArrayInitializer(parameterTypes));
-      }
-      if (!optionalParameterTypes.isEmpty) {
-        arguments.add(new js.ArrayInitializer(optionalParameterTypes));
-      }
-      push(js.js('#(#)', [accessHelper(helpers.buildFunctionType), arguments]));
-    } else {
-      var arguments = [
-        returnType,
-        new js.ArrayInitializer(parameterTypes),
-        new js.ObjectInitializer(namedParameters)
-      ];
-      push(js.js(
-          '#(#)', [accessHelper(helpers.buildNamedFunctionType), arguments]));
-    }
-  }
-
   void visitTypeInfoReadRaw(HTypeInfoReadRaw node) {
     use(node.inputs[0]);
     js.Expression receiver = pop();
@@ -3048,76 +2983,6 @@
     });
   }
 
-  void visitReadTypeVariable(HReadTypeVariable node) {
-    TypeVariableEntity element = node.dartType.element;
-    FunctionEntity helperElement = helpers.convertRtiToRuntimeType;
-    registry.registerStaticUse(
-        new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG));
-
-    use(node.inputs[0]);
-    if (node.hasReceiver) {
-      if (backend.interceptorData.isInterceptorClass(element.typeDeclaration)) {
-        int index = element.index;
-        js.Expression receiver = pop();
-        js.Expression helper =
-            backend.emitter.staticFunctionAccess(helperElement);
-        js.Expression rtiFieldName = backend.namer.rtiFieldJsName;
-        push(js.js(r'#(#.# && #.#[#])', [
-          helper,
-          receiver,
-          rtiFieldName,
-          receiver,
-          rtiFieldName,
-          js.js.number(index)
-        ]));
-      } else {
-        backend.emitter.registerReadTypeVariable(element);
-        push(js.js(
-            '#.#()', [pop(), backend.namer.nameForReadTypeVariable(element)]));
-      }
-    } else {
-      push(js.js('#(#)',
-          [backend.emitter.staticFunctionAccess(helperElement), pop()]));
-    }
-  }
-
-  void visitInterfaceType(HInterfaceType node) {
-    List<js.Expression> typeArguments = <js.Expression>[];
-    for (HInstruction type in node.inputs) {
-      use(type);
-      typeArguments.add(pop());
-    }
-    InterfaceType type = node.dartType;
-    ClassEntity cls = type.element;
-    var arguments = [backend.emitter.typeAccess(cls)];
-    if (!typeArguments.isEmpty) {
-      arguments.add(new js.ArrayInitializer(typeArguments));
-    }
-    push(js.js('#(#)', [
-      accessHelper(helpers.buildInterfaceType, arguments.length),
-      arguments
-    ]));
-  }
-
-  void visitVoidType(HVoidType node) {
-    push(js.js('#()', accessHelper(helpers.getVoidRuntimeType)));
-  }
-
-  void visitDynamicType(HDynamicType node) {
-    push(js.js('#()', accessHelper(helpers.getDynamicRuntimeType)));
-  }
-
-  js.PropertyAccess accessHelper(FunctionEntity helper,
-      [int argumentCount = 0]) {
-    if (helper == null) {
-      // For mocked-up tests.
-      return js.js('(void 0).dummy');
-    }
-    registry.registerStaticUse(new StaticUse.staticInvoke(
-        helper, new CallStructure.unnamed(argumentCount)));
-    return backend.emitter.staticFunctionAccess(helper);
-  }
-
   @override
   void visitRef(HRef node) {
     visit(node.value);
diff --git a/pkg/compiler/lib/src/ssa/graph_builder.dart b/pkg/compiler/lib/src/ssa/graph_builder.dart
index 0af3064..ac49027 100644
--- a/pkg/compiler/lib/src/ssa/graph_builder.dart
+++ b/pkg/compiler/lib/src/ssa/graph_builder.dart
@@ -189,14 +189,6 @@
     return new HSubExpressionBlockInformation(expression);
   }
 
-  HInstruction buildFunctionType(ResolutionFunctionType type) {
-    type.accept(new ReifiedTypeRepresentationBuilder(closedWorld), this);
-    return pop();
-  }
-
-  HInstruction buildFunctionTypeConversion(
-      HInstruction original, ResolutionDartType type, int kind);
-
   /// Returns the current source element.
   ///
   /// The returned element is a declaration element.
@@ -242,105 +234,3 @@
   Element get targetElement;
   TypeBuilder get typeBuilder;
 }
-
-class ReifiedTypeRepresentationBuilder
-    implements DartTypeVisitor<dynamic, GraphBuilder> {
-  final ClosedWorld closedWorld;
-
-  ReifiedTypeRepresentationBuilder(this.closedWorld);
-
-  void visit(ResolutionDartType type, GraphBuilder builder) =>
-      type.accept(this, builder);
-
-  void visitVoidType(ResolutionVoidType type, GraphBuilder builder) {
-    ClassElement cls = builder.backend.helpers.VoidRuntimeType;
-    builder.push(new HVoidType(type, new TypeMask.exact(cls, closedWorld)));
-  }
-
-  void visitTypeVariableType(
-      ResolutionTypeVariableType type, GraphBuilder builder) {
-    ClassElement cls = builder.backend.helpers.RuntimeType;
-    TypeMask instructionType = new TypeMask.subclass(cls, closedWorld);
-
-    // TODO(floitsch): this hack maps type variables of generic function
-    // typedefs to dynamic. For example: `typedef F = Function<T>(T)`.
-    if (type is MethodTypeVariableType) {
-      visitDynamicType(const ResolutionDynamicType(), builder);
-      return;
-    }
-
-    if (!builder.sourceElement.enclosingElement.isClosure &&
-        builder.sourceElement.isInstanceMember) {
-      HInstruction receiver = builder.localsHandler.readThis();
-      builder.push(new HReadTypeVariable(type, receiver, instructionType));
-    } else {
-      builder.push(new HReadTypeVariable.noReceiver(
-          type,
-          builder.typeBuilder
-              .addTypeVariableReference(type, builder.sourceElement),
-          instructionType));
-    }
-  }
-
-  void visitFunctionType(ResolutionFunctionType type, GraphBuilder builder) {
-    type.returnType.accept(this, builder);
-    HInstruction returnType = builder.pop();
-    List<HInstruction> inputs = <HInstruction>[returnType];
-
-    for (ResolutionDartType parameter in type.parameterTypes) {
-      parameter.accept(this, builder);
-      inputs.add(builder.pop());
-    }
-
-    for (ResolutionDartType parameter in type.optionalParameterTypes) {
-      parameter.accept(this, builder);
-      inputs.add(builder.pop());
-    }
-
-    List<ResolutionDartType> namedParameterTypes = type.namedParameterTypes;
-    List<String> names = type.namedParameters;
-    for (int index = 0; index < names.length; index++) {
-      ast.DartString dartString = new ast.DartString.literal(names[index]);
-      inputs.add(
-          builder.graph.addConstantString(dartString, builder.closedWorld));
-      namedParameterTypes[index].accept(this, builder);
-      inputs.add(builder.pop());
-    }
-
-    ClassElement cls = builder.backend.helpers.RuntimeFunctionType;
-    builder.push(
-        new HFunctionType(inputs, type, new TypeMask.exact(cls, closedWorld)));
-  }
-
-  void visitMalformedType(MalformedType type, GraphBuilder builder) {
-    visitDynamicType(const ResolutionDynamicType(), builder);
-  }
-
-  void visitInterfaceType(ResolutionInterfaceType type, GraphBuilder builder) {
-    List<HInstruction> inputs = <HInstruction>[];
-    for (ResolutionDartType typeArgument in type.typeArguments) {
-      typeArgument.accept(this, builder);
-      inputs.add(builder.pop());
-    }
-    ClassElement cls;
-    if (type.typeArguments.isEmpty) {
-      cls = builder.backend.helpers.RuntimeTypePlain;
-    } else {
-      cls = builder.backend.helpers.RuntimeTypeGeneric;
-    }
-    builder.push(
-        new HInterfaceType(inputs, type, new TypeMask.exact(cls, closedWorld)));
-  }
-
-  void visitTypedefType(ResolutionTypedefType type, GraphBuilder builder) {
-    ResolutionDartType unaliased = type.unaliased;
-    if (unaliased is ResolutionTypedefType) throw 'unable to unalias $type';
-    unaliased.accept(this, builder);
-  }
-
-  void visitDynamicType(ResolutionDynamicType type, GraphBuilder builder) {
-    JavaScriptBackend backend = builder.compiler.backend;
-    ClassElement cls = backend.helpers.DynamicRuntimeType;
-    builder.push(new HDynamicType(type, new TypeMask.exact(cls, closedWorld)));
-  }
-}
diff --git a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
index 56c69ee..9bc078b 100644
--- a/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
+++ b/pkg/compiler/lib/src/ssa/kernel_ast_adapter.dart
@@ -423,6 +423,9 @@
   ir.Procedure get checkSubtypeOfRuntimeType =>
       kernel.functions[_backend.helpers.checkSubtypeOfRuntimeType];
 
+  ir.Procedure get functionTypeTest =>
+      kernel.functions[_backend.helpers.functionTypeTest];
+
   ir.Procedure get throwTypeError =>
       kernel.functions[_backend.helpers.throwTypeError];
 
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index df84deb..86be86b 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -97,11 +97,6 @@
   R visitTypeConversion(HTypeConversion node);
   R visitTypeKnown(HTypeKnown node);
   R visitYield(HYield node);
-  R visitReadTypeVariable(HReadTypeVariable node);
-  R visitFunctionType(HFunctionType node);
-  R visitVoidType(HVoidType node);
-  R visitInterfaceType(HInterfaceType node);
-  R visitDynamicType(HDynamicType node);
 
   R visitTypeInfoReadRaw(HTypeInfoReadRaw node);
   R visitTypeInfoReadVariable(HTypeInfoReadVariable node);
@@ -416,11 +411,6 @@
   visitIsViaInterceptor(HIsViaInterceptor node) => visitInstruction(node);
   visitTypeConversion(HTypeConversion node) => visitCheck(node);
   visitTypeKnown(HTypeKnown node) => visitCheck(node);
-  visitReadTypeVariable(HReadTypeVariable node) => visitInstruction(node);
-  visitFunctionType(HFunctionType node) => visitInstruction(node);
-  visitVoidType(HVoidType node) => visitInstruction(node);
-  visitInterfaceType(HInterfaceType node) => visitInstruction(node);
-  visitDynamicType(HDynamicType node) => visitInstruction(node);
   visitAwait(HAwait node) => visitInstruction(node);
   visitYield(HYield node) => visitInstruction(node);
 
@@ -880,11 +870,7 @@
   static const int IS_TYPECODE = 28;
   static const int INVOKE_DYNAMIC_TYPECODE = 29;
   static const int SHIFT_RIGHT_TYPECODE = 30;
-  static const int READ_TYPE_VARIABLE_TYPECODE = 31;
-  static const int FUNCTION_TYPE_TYPECODE = 32;
-  static const int VOID_TYPE_TYPECODE = 33;
-  static const int INTERFACE_TYPE_TYPECODE = 34;
-  static const int DYNAMIC_TYPE_TYPECODE = 35;
+
   static const int TRUNCATING_DIVIDE_TYPECODE = 36;
   static const int IS_VIA_INTERCEPTOR_TYPECODE = 37;
 
@@ -2877,11 +2863,7 @@
 
   HInstruction get typeRepresentation => inputs[1];
 
-  bool get usesMethodOnType =>
-      typeExpression != null && typeExpression.isFunctionType;
-
-  HInstruction get checkedInput =>
-      usesMethodOnType ? inputs[1] : super.checkedInput;
+  HInstruction get checkedInput => super.checkedInput;
 
   HInstruction convertType(ClosedWorld closedWorld, DartType type, int kind) {
     if (typeExpression == type) {
@@ -3405,105 +3387,3 @@
     }
   }
 }
-
-class HReadTypeVariable extends HInstruction {
-  /// The type variable being read.
-  final TypeVariableType dartType;
-
-  final bool hasReceiver;
-
-  HReadTypeVariable(
-      this.dartType, HInstruction receiver, TypeMask instructionType)
-      : hasReceiver = true,
-        super(<HInstruction>[receiver], instructionType) {
-    setUseGvn();
-  }
-
-  HReadTypeVariable.noReceiver(
-      this.dartType, HInstruction typeArgument, TypeMask instructionType)
-      : hasReceiver = false,
-        super(<HInstruction>[typeArgument], instructionType) {
-    setUseGvn();
-  }
-
-  accept(HVisitor visitor) => visitor.visitReadTypeVariable(this);
-
-  bool canThrow() => false;
-
-  int typeCode() => HInstruction.READ_TYPE_VARIABLE_TYPECODE;
-  bool typeEquals(HInstruction other) => other is HReadTypeVariable;
-
-  bool dataEquals(HReadTypeVariable other) {
-    return dartType == other.dartType && hasReceiver == other.hasReceiver;
-  }
-}
-
-abstract class HRuntimeType extends HInstruction {
-  final DartType dartType;
-
-  HRuntimeType(
-      List<HInstruction> inputs, this.dartType, TypeMask instructionType)
-      : super(inputs, instructionType) {
-    setUseGvn();
-  }
-
-  bool canThrow() => false;
-
-  int typeCode() {
-    throw 'abstract method';
-  }
-
-  bool typeEquals(HInstruction other) {
-    throw 'abstract method';
-  }
-
-  bool dataEquals(HRuntimeType other) {
-    return dartType == other.dartType;
-  }
-}
-
-class HFunctionType extends HRuntimeType {
-  HFunctionType(List<HInstruction> inputs, FunctionType dartType,
-      TypeMask instructionType)
-      : super(inputs, dartType, instructionType);
-
-  accept(HVisitor visitor) => visitor.visitFunctionType(this);
-
-  int typeCode() => HInstruction.FUNCTION_TYPE_TYPECODE;
-
-  bool typeEquals(HInstruction other) => other is HFunctionType;
-}
-
-class HVoidType extends HRuntimeType {
-  HVoidType(VoidType dartType, TypeMask instructionType)
-      : super(const <HInstruction>[], dartType, instructionType);
-
-  accept(HVisitor visitor) => visitor.visitVoidType(this);
-
-  int typeCode() => HInstruction.VOID_TYPE_TYPECODE;
-
-  bool typeEquals(HInstruction other) => other is HVoidType;
-}
-
-class HInterfaceType extends HRuntimeType {
-  HInterfaceType(List<HInstruction> inputs, InterfaceType dartType,
-      TypeMask instructionType)
-      : super(inputs, dartType, instructionType);
-
-  accept(HVisitor visitor) => visitor.visitInterfaceType(this);
-
-  int typeCode() => HInstruction.INTERFACE_TYPE_TYPECODE;
-
-  bool typeEquals(HInstruction other) => other is HInterfaceType;
-}
-
-class HDynamicType extends HRuntimeType {
-  HDynamicType(DynamicType dartType, TypeMask instructionType)
-      : super(const <HInstruction>[], dartType, instructionType);
-
-  accept(HVisitor visitor) => visitor.visitDynamicType(this);
-
-  int typeCode() => HInstruction.DYNAMIC_TYPE_TYPECODE;
-
-  bool typeEquals(HInstruction other) => other is HDynamicType;
-}
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 8e7dcbb..d4ac68c 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -493,11 +493,7 @@
   String visitTypeConversion(HTypeConversion node) {
     String checkedInput = temporaryId(node.checkedInput);
     String rest;
-    if (node.usesMethodOnType) {
-      assert(node.inputs.length == 2);
-      assert(identical(node.checkedInput, node.inputs.last));
-      rest = " ${temporaryId(node.inputs.first)}";
-    } else if (node.inputs.length == 2) {
+    if (node.inputs.length == 2) {
       rest = " ${temporaryId(node.inputs.last)}";
     } else {
       assert(node.inputs.length == 1);
@@ -536,28 +532,6 @@
         " ($inputs)";
   }
 
-  String visitReadTypeVariable(HReadTypeVariable node) {
-    var inputs = node.inputs.map(temporaryId).join(', ');
-    return "ReadTypeVariable: ${node.dartType} ${node.hasReceiver} $inputs";
-  }
-
-  String visitFunctionType(HFunctionType node) {
-    var inputs = node.inputs.map(temporaryId).join(', ');
-    return "FunctionType: ${node.dartType} $inputs";
-  }
-
-  String visitVoidType(HVoidType node) {
-    return "VoidType";
-  }
-
-  String visitInterfaceType(HInterfaceType node) {
-    return "InterfaceType: ${node.dartType}";
-  }
-
-  String visitDynamicType(HDynamicType node) {
-    return "DynamicType";
-  }
-
   String visitAwait(HAwait node) {
     return "Await: ${temporaryId(node.inputs[0])}";
   }
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 44eb5bc..5724e10 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -250,7 +250,12 @@
       return new HTypeConversion.withTypeRepresentation(
           type, kind, subtype, original, typeVariable);
     } else if (type.isFunctionType) {
-      return builder.buildFunctionTypeConversion(original, type, kind);
+      HInstruction reifiedType =
+          analyzeTypeArgument(type, builder.sourceElement);
+      // TypeMasks don't encode function types.
+      TypeMask refinedMask = original.instructionType;
+      return new HTypeConversion.withTypeRepresentation(
+          type, kind, refinedMask, original, reifiedType);
     } else {
       return original.convertType(builder.closedWorld, type, kind);
     }
diff --git a/pkg/dev_compiler/lib/js/amd/dart_sdk.js b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
index c9b5bda..89fc660 100644
--- a/pkg/dev_compiler/lib/js/amd/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/amd/dart_sdk.js
@@ -19,7 +19,7 @@
   const core = Object.create(null);
   const developer = Object.create(null);
   const io = Object.create(null);
-  const isolate = Object.create(null);
+  const isolate$ = Object.create(null);
   const js = Object.create(null);
   const js_util = Object.create(null);
   const math = Object.create(null);
@@ -39,16 +39,14 @@
   let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
   let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
   let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
+  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
+  let IterableOfNameValuePair = () => (IterableOfNameValuePair = dart.constFn(core.Iterable$(_debugger.NameValuePair)))();
   let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
   let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
   let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
   let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
   let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
-  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
   let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
-  let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
-  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
-  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
   let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
   let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
   let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
@@ -57,6 +55,7 @@
   let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
   let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
   let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
+  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
   let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
   let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
   let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
@@ -70,6 +69,7 @@
   let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
   let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
   let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
+  let EfficientLengthIterable = () => (EfficientLengthIterable = dart.constFn(_internal.EfficientLengthIterable$()))();
   let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
   let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
   let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
@@ -106,8 +106,8 @@
   let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
   let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
   let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
-  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
-  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
+  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate$.Capability)))();
+  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate$.SendPort)))();
   let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
   let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
   let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
@@ -138,6 +138,7 @@
   let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
   let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
   let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
+  let FutureOfLibraryMirror = () => (FutureOfLibraryMirror = dart.constFn(async.Future$(mirrors.LibraryMirror)))();
   let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
   let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
   let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
@@ -149,7 +150,6 @@
   let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
   let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
   let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
-  let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
   let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
   let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
   let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
@@ -171,7 +171,6 @@
   let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
   let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
   let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
-  let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
   let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
   let _Future = () => (_Future = dart.constFn(async._Future$()))();
   let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
@@ -207,8 +206,9 @@
   let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
   let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
   let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
-  let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
+  let _StreamIterator = () => (_StreamIterator = dart.constFn(async._StreamIterator$()))();
   let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
+  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
   let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
   let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
   let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
@@ -311,7 +311,6 @@
   let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
   let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
   let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
-  let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
   let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
   let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
   let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
@@ -340,8 +339,10 @@
   let List = () => (List = dart.constFn(core.List$()))();
   let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
   let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
+  let ChunkedConverterOfString$ListOfint$String$ListOfint = () => (ChunkedConverterOfString$ListOfint$String$ListOfint = dart.constFn(convert.ChunkedConverter$(core.String, ListOfint(), core.String, ListOfint())))();
   let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
   let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
+  let ChunkedConverterOfListOfint$String$ListOfint$String = () => (ChunkedConverterOfListOfint$String$ListOfint$String = dart.constFn(convert.ChunkedConverter$(ListOfint(), core.String, ListOfint(), core.String)))();
   let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
   let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
   let _ChunkedConversionCallbackOfListOfint = () => (_ChunkedConversionCallbackOfListOfint = dart.constFn(convert._ChunkedConversionCallback$(ListOfint())))();
@@ -352,8 +353,12 @@
   let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
   let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
   let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
+  let ChunkedConverterOfString$String$String$String = () => (ChunkedConverterOfString$String$String$String = dart.constFn(convert.ChunkedConverter$(core.String, core.String, core.String, core.String)))();
+  let ChunkedConverterOfObject$String$Object$String = () => (ChunkedConverterOfObject$String$Object$String = dart.constFn(convert.ChunkedConverter$(core.Object, core.String, core.Object, core.String)))();
   let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
   let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
+  let ChunkedConverterOfObject$ListOfint$Object$ListOfint = () => (ChunkedConverterOfObject$ListOfint$Object$ListOfint = dart.constFn(convert.ChunkedConverter$(core.Object, ListOfint(), core.Object, ListOfint())))();
+  let ChunkedConverterOfString$Object$String$Object = () => (ChunkedConverterOfString$Object$String$Object = dart.constFn(convert.ChunkedConverter$(core.String, core.Object, core.String, core.Object)))();
   let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
   let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
   let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
@@ -364,59 +369,62 @@
   let Expando = () => (Expando = dart.constFn(core.Expando$()))();
   let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
   let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
-  let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
   let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
   let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
   let Set = () => (Set = dart.constFn(core.Set$()))();
   let Sink = () => (Sink = dart.constFn(core.Sink$()))();
   let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
+  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
   let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
-  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
   let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+  let ListOfUint8List = () => (ListOfUint8List = dart.constFn(core.List$(typed_data.Uint8List)))();
   let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
   let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
   let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
   let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
   let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
   let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
-  let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
-  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
+  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+  let ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = () => (ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = dart.constFn(convert.ChunkedConverter$(ListOfint(), ListOfint(), ListOfint(), ListOfint())))();
   let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
   let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
-  let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
   let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
   let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
   let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
   let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
   let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
+  let StreamControllerOfFileSystemEntity = () => (StreamControllerOfFileSystemEntity = dart.constFn(async.StreamController$(io.FileSystemEntity)))();
   let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
   let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
   let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
+  let CompleterOfListOfint = () => (CompleterOfListOfint = dart.constFn(async.Completer$(ListOfint())))();
   let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
   let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
   let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
-  let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
+  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
   let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
   let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
   let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
   let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
   let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
   let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
-  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
   let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
   let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
   let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
   let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
   let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
   let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
+  let CompleterOfSocket = () => (CompleterOfSocket = dart.constFn(async.Completer$(io.Socket)))();
   let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
   let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
-  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
   let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
+  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
+  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
   let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
   let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
+  let CompleterOf_ConnectionInfo = () => (CompleterOf_ConnectionInfo = dart.constFn(async.Completer$(io._ConnectionInfo)))();
   let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
   let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
   let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
@@ -438,8 +446,7 @@
   let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
   let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
   let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
-  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
-  let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
+  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
   let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
   let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
   let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
@@ -450,14 +457,16 @@
   let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
   let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
   let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
+  let _CaseInsensitiveStringMapOfString = () => (_CaseInsensitiveStringMapOfString = dart.constFn(io._CaseInsensitiveStringMap$(core.String)))();
   let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
+  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
   let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
   let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
   let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
   let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
   let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
-  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
   let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
+  let CompleterOfRawSecureSocket = () => (CompleterOfRawSecureSocket = dart.constFn(async.Completer$(io.RawSecureSocket)))();
   let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
   let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
   let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
@@ -466,15 +475,14 @@
   let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
   let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
   let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
+  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
   let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
-  let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
   let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
   let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
-  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
-  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+  let FutureOfString = () => (FutureOfString = dart.constFn(async.Future$(core.String)))();
   let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
   let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
-  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
+  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate$.Isolate)))();
   let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
   let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
   let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
@@ -595,6 +603,7 @@
   let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
   let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
   let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
+  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
   let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
   let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
   let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
@@ -640,18 +649,20 @@
   let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
   let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
   let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
-  let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
-  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
+  let dynamicAndSetOfNameValuePairAnddynamic__Tovoid = () => (dynamicAndSetOfNameValuePairAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair(), dart.dynamic, core.bool], {tagTypes: dart.dynamic})))();
+  let NameValuePairAndNameValuePairToint = () => (NameValuePairAndNameValuePairToint = dart.constFn(dart.definiteFunctionType(core.int, [_debugger.NameValuePair, _debugger.NameValuePair])))();
+  let IterableOfNameValuePairToListOfNameValuePair = () => (IterableOfNameValuePairToListOfNameValuePair = dart.constFn(dart.definiteFunctionType(ListOfNameValuePair(), [IterableOfNameValuePair()])))();
   let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
   let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
   let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
   let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
   let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
   let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
   let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
   let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
   let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
   let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
   let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
   let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
@@ -665,6 +676,8 @@
   let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
   let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
+  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
+  let StringAndintToint = () => (StringAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int])))();
   let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
   let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
   let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
@@ -677,10 +690,11 @@
   let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
   let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
   let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
+  let VoidTo_Future = () => (VoidTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [])))();
+  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
   let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
   let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
-  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
   let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -741,7 +755,7 @@
   let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
   let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
   let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
-  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
+  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), dynamicAndStackTraceTodynamic()])))();
   let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
   let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
   let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
@@ -779,12 +793,18 @@
   let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
+  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
+  let StringAndintTovoid = () => (StringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.int])))();
+  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
   let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
-  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
-  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
   let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
+  let intToUint8List = () => (intToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [core.int])))();
+  let dynamicAnddynamicToUint8List = () => (dynamicAnddynamicToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [dart.dynamic, dart.dynamic])))();
+  let Uint8ListAndStringAndintTovoid = () => (Uint8ListAndStringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.String, core.int])))();
+  let VoidToListOfUint8List = () => (VoidToListOfUint8List = dart.constFn(dart.definiteFunctionType(ListOfUint8List(), [])))();
+  let StringAndintAndint__Toint = () => (StringAndintAndint__Toint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, ListOfint()])))();
   let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
   let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
   let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -797,10 +817,11 @@
   let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
   let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
   let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
-  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
-  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
+  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort])))();
+  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.bool])))();
+  let SendPortToString = () => (SendPortToString = dart.constFn(dart.definiteFunctionType(core.String, [isolate$.SendPort])))();
   let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
-  let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
+  let ListOfintAndintAndintTo_BufferAndStart = () => (ListOfintAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [ListOfint(), core.int, core.int])))();
   let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
   let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
   let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
@@ -819,17 +840,15 @@
   let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
   let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
   let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
-  let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
-  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
   let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
+  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
   let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
   let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
   let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
-  let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
+  let dynamicToListOfint = () => (dynamicToListOfint = dart.constFn(dart.definiteFunctionType(ListOfint(), [dart.dynamic])))();
   let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
   let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
   let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
   let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
   let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
@@ -845,11 +864,14 @@
   let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
   let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
   let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
+  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
   let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
   let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
   let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
   let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
-  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
+  let SocketToSocket = () => (SocketToSocket = dart.constFn(dart.definiteFunctionType(io.Socket, [io.Socket])))();
+  let SocketTo_DetachedSocket = () => (SocketTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [io.Socket])))();
+  let SocketTovoid = () => (SocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Socket])))();
   let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
   let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
   let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
@@ -863,14 +885,15 @@
   let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
   let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
   let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
+  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
   let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
   let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
   let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
   let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
-  let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
-  let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
-  let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
+  let _FileResourceInfoToMapOfString$dynamic = () => (_FileResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._FileResourceInfo])))();
+  let _ProcessResourceInfoToMapOfString$dynamic = () => (_ProcessResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._ProcessResourceInfo])))();
+  let _SocketResourceInfoToMapOfString$dynamic = () => (_SocketResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._SocketResourceInfo])))();
   let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
   let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
   let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
@@ -883,7 +906,6 @@
   let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
   let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
   let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
-  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
   let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
   let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
   let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
@@ -891,14 +913,13 @@
   let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
   let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
   let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
-  let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
+  let StringToFutureOfWebSocket = () => (StringToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [core.String])))();
   let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
-  let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
   let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
   let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
-  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
+  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate$.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
   let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
   let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
@@ -1463,8 +1484,8 @@
   dart.getIsNamedConstructor = function(value) {
     return value[dart.isNamedConstructor];
   };
-  dart.getDartLibraryName = function(value) {
-    return value[dart_library.dartLibraryName];
+  dart.getModuleName = function(value) {
+    return value[dart._moduleName];
   };
   dart.tag = function(value, t) {
     value[dart._runtimeType] = t;
@@ -1475,6 +1496,18 @@
   dart.tagLazy = function(value, compute) {
     dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
   };
+  dart.getModuleNames = function() {
+    return Array.from(dart._loadedModules.keys());
+  };
+  dart.getModuleLibraries = function(name) {
+    let module = dart._loadedModules.get(name);
+    if (module == null) return null;
+    module[dart._moduleName] = name;
+    return module;
+  };
+  dart.trackLibraries = function(moduleName, libraries) {
+    dart._loadedModules.set(moduleName, libraries);
+  };
   dart._warn = function(arg) {
     console.warn(arg);
   };
@@ -1617,6 +1650,9 @@
   dart.definiteFunctionType = function(returnType, args, extra) {
     return dart._functionType(true, returnType, args, extra);
   };
+  dart.isType = function(obj) {
+    return dart._getRuntimeType(obj) === core.Type;
+  };
   dart.typeName = function(type) {
     if (type === void 0) return "undefined type";
     if (type === null) return "null type";
@@ -2041,7 +2077,7 @@
     return name;
   };
   dart._dartSymbol = function(name) {
-    return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
+    return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.PrivateSymbol(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
   };
   dart.extractNamedArgs = function(args) {
     if (args.length > 0) {
@@ -2435,6 +2471,7 @@
       return obj[dartx.toString]();
     }
     if (typeof obj == "function") {
+      if (dart.test(dart.isType(obj))) return dart.typeName(obj);
       return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
     }
     return obj.toString();
@@ -2639,12 +2676,19 @@
   dart.dartx = dartx;
   dart._runtimeType = Symbol("_runtimeType");
   dart.isNamedConstructor = Symbol("isNamedConstructor");
+  dart._moduleName = Symbol("_moduleName");
   dart.defineLazy(dart, {
     get _lazyJSTypes() {
       return new Map();
     },
     set _lazyJSTypes(_) {}
   });
+  dart.defineLazy(dart, {
+    get _loadedModules() {
+      return new Map();
+    },
+    set _loadedModules(_) {}
+  });
   dart.metadata = Symbol("metadata");
   dart._typeObject = Symbol("typeObject");
   core.Object = class Object {
@@ -3198,9 +3242,51 @@
     names: ['getProperty', 'setProperty']
   });
   _debugger.addMetadataChildren = function(object, ret) {
-    ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
+    ret.add(new _debugger.NameValuePair({name: "[[class]]", value: dart.getReifiedType(object), config: _debugger.JsonMLConfig.asClass}));
   };
   dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
+  _debugger.addPropertiesFromSignature = function(sig, properties, object, walkPrototypeChain, opts) {
+    let tagTypes = opts && 'tagTypes' in opts ? opts.tagTypes : false;
+    let skippedNames = core.Set.new();
+    skippedNames.add('hashCode');
+    while (sig != null) {
+      for (let symbol of _debugger.getOwnPropertySymbols(sig)) {
+        let dartName = _debugger.symbolName(symbol);
+        let dartXPrefix = 'dartx.';
+        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
+          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
+        }
+        if (dart.test(skippedNames.contains(dartName))) continue;
+        let value = _debugger.safeGetProperty(object, symbol);
+        if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+          dart.tag(value, sig[symbol]);
+        }
+        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
+      }
+      for (let name of _debugger.getOwnPropertyNames(sig)) {
+        let value = _debugger.safeGetProperty(object, name);
+        if (dart.test(skippedNames.contains(name))) continue;
+        if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+          dart.tag(value, sig[name]);
+        }
+        properties.add(new _debugger.NameValuePair({name: name, value: value}));
+      }
+      if (!dart.test(walkPrototypeChain)) break;
+      sig = _debugger.safeGetProperty(sig, '__proto__');
+    }
+  };
+  dart.lazyFn(_debugger.addPropertiesFromSignature, () => dynamicAndSetOfNameValuePairAnddynamic__Tovoid());
+  _debugger.sortProperties = function(properties) {
+    let sortedProperties = properties[dartx.toList]();
+    sortedProperties[dartx.sort](dart.fn((a, b) => {
+      let aPrivate = a.name[dartx.startsWith]('_');
+      let bPrivate = b.name[dartx.startsWith]('_');
+      if (aPrivate != bPrivate) return dart.test(aPrivate) ? 1 : -1;
+      return a.name[dartx.compareTo](b.name);
+    }, NameValuePairAndNameValuePairToint()));
+    return sortedProperties;
+  };
+  dart.lazyFn(_debugger.sortProperties, () => IterableOfNameValuePairToListOfNameValuePair());
   _debugger.getObjectTypeName = function(object) {
     let reifiedType = dart.getReifiedType(object);
     if (reifiedType == null) {
@@ -3209,7 +3295,7 @@
       }
       return '<Error getting type name>';
     }
-    return _debugger.getTypeName(core.Type._check(reifiedType));
+    return _debugger.getTypeName(reifiedType);
   };
   dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
   _debugger.getTypeName = function(type) {
@@ -3217,11 +3303,7 @@
     if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
     return name;
   };
-  dart.lazyFn(_debugger.getTypeName, () => TypeToString());
-  _debugger._getType = function(object) {
-    return core.Type.is(object) ? object : dart.getReifiedType(object);
-  };
-  dart.fn(_debugger._getType, dynamicToObject());
+  dart.lazyFn(_debugger.getTypeName, () => dynamicToString());
   const _simpleFormatter = Symbol('_simpleFormatter');
   _debugger.safePreview = function(object, config) {
     try {
@@ -3261,7 +3343,9 @@
       this.hideName = hideName;
     }
     ['=='](other) {
-      return _debugger.NameValuePair.is(other) && other.name == this.name;
+      if (!_debugger.NameValuePair.is(other)) return false;
+      if (dart.test(this.hideName) || dart.test(dart.dload(other, 'hideName'))) return core.identical(this, other);
+      return dart.equals(dart.dload(other, 'name'), this.name);
     }
     get hashCode() {
       return dart.hashCode(this.name);
@@ -3454,7 +3538,7 @@
   });
   _debugger.isNativeJavaScriptObject = function(object) {
     let type = _debugger._typeof(object);
-    return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
+    return type != 'object' && type != 'function' || dart.test(dart.isJsInterop(object)) || html$.Node.is(object);
   };
   dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
   _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
@@ -3490,24 +3574,37 @@
         body.addStyle('color: rgb(196, 26, 22);');
       }
       let children = this[_simpleFormatter].children(object, config);
+      if (children == null) return body.toJsonML();
       for (let child of children) {
         let li = body.createChild('li');
-        let nameSpan = new _debugger.JsonMLElement('span');
-        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
-        nameSpan.setStyle('color: rgb(136, 19, 145);');
+        li.setStyle("padding-left: 13px;");
+        let nameSpan = null;
+        let valueStyle = '';
+        if (!dart.test(child.hideName)) {
+          nameSpan = new _debugger.JsonMLElement('span');
+          nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
+          nameSpan.setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+          valueStyle = 'margin-left: 13px';
+        }
         if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
-          nameSpan.addStyle("padding-left: 13px;");
-          li.appendChild(nameSpan);
-          let objectTag = li.createObjectTag(child.value);
-          objectTag.addAttribute('config', child.config);
-          if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
-            li.setStyle("padding-left: 13px;");
+          let valueSpan = new _debugger.JsonMLElement('span');
+          valueSpan.setStyle(valueStyle);
+          valueSpan.createObjectTag(child.value).addAttribute('config', child.config);
+          if (nameSpan != null) {
+            li.appendChild(nameSpan);
           }
+          li.appendChild(valueSpan);
         } else {
-          li.setStyle("padding-left: 13px;");
-          let _ = li.createChild('span');
-          _.appendChild(nameSpan);
-          _.createTextChild(_debugger.safePreview(child.value, child.config));
+          let line = li.createChild('span');
+          if (nameSpan != null) {
+            line.appendChild(nameSpan);
+          }
+          line.appendChild((() => {
+            let _ = new _debugger.JsonMLElement('span');
+            _.createTextChild(_debugger.safePreview(child.value, child.config));
+            _.setStyle(valueStyle);
+            return _;
+          })());
         }
       }
       return body.toJsonML();
@@ -3530,7 +3627,7 @@
   _debugger.DartFormatter = class DartFormatter extends core.Object {
     new() {
       this[_formatters] = null;
-      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
+      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.TypeFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
     }
     preview(object, config) {
       try {
@@ -3594,42 +3691,14 @@
       return true;
     }
     children(object) {
-      let properties = LinkedHashSetOfNameValuePair().new();
-      _debugger.addMetadataChildren(object, properties);
-      let current = object;
-      let protoChain = JSArrayOfObject().of([]);
-      while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
-        protoChain[dartx.add](current);
-        current = _debugger.safeGetProperty(current, '__proto__');
-      }
-      for (current of protoChain) {
-        for (let symbol of _debugger.getOwnPropertySymbols(current)) {
-          let dartName = _debugger.symbolName(symbol);
-          if (dart.test(_debugger.hasMethod(object, dartName))) {
-            continue;
-          }
-          let dartXPrefix = 'dartx.';
-          if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
-            dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
-          } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, symbol);
-          properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
-        }
-      }
-      for (current of protoChain) {
-        let className = dart.dload(dart.getReifiedType(current), 'name');
-        for (let name of _debugger.getOwnPropertyNames(current)) {
-          if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
-          if (dart.test(_debugger.hasMethod(object, name))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, name);
-          properties.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }
-      return properties.toList();
+      let type = dart.getType(object);
+      let ret = LinkedHashSetOfNameValuePair().new();
+      let properties = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getFieldSig(type), properties, object, true);
+      _debugger.addPropertiesFromSignature(dart.getGetterSig(type), properties, object, true);
+      ret.addAll(_debugger.sortProperties(properties));
+      _debugger.addMetadataChildren(object, ret);
+      return ret.toList();
     }
   };
   dart.setSignature(_debugger.ObjectFormatter, {
@@ -3640,28 +3709,16 @@
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
     })
   });
-  dart.defineLazy(_debugger.ObjectFormatter, {
-    get _customNames() {
-      return (() => {
-        let _ = SetOfString().new();
-        _.add('constructor');
-        _.add('prototype');
-        _.add('__proto__');
-        return _;
-      })();
-    },
-    set _customNames(_) {}
-  });
   _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
     accept(object, config) {
-      return dart.getDartLibraryName(object) != null;
+      return dart.getModuleName(object) != null;
     }
     hasChildren(object) {
       return true;
     }
     preview(object) {
-      let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
-      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
+      let libraryNames = dart.dsend(dart.getModuleName(object), 'split', '/');
+      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1)) && dart.equals(dart.dload(libraryNames, 'last'), dart.dindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 2)))) {
         dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
       }
       return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
@@ -3670,7 +3727,6 @@
       let children = LinkedHashSetOfNameValuePair().new();
       for (let name of _debugger.getOwnPropertyNames(object)) {
         let value = _debugger.safeGetProperty(object, name);
-        name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
         children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
       }
       return children.toList();
@@ -3700,36 +3756,16 @@
     }
     children(object) {
       let children = LinkedHashSetOfNameValuePair().new();
-      let nonGenericProperties = LinkedHashMapOfString$Object().new();
       let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
       dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
-        let genericTypeConstructor = dart.getGenericTypeCtor(value);
-        if (genericTypeConstructor != null) {
-          this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
-        } else {
-          nonGenericProperties._set(core.String._check(name), value);
-        }
+        if (dart.getGenericTypeCtor(value) != null) return;
+        children.add(_debugger.NameValuePair._check(dart.test(dart.isType(value)) ? this.classChild(core.String._check(name), value) : new _debugger.NameValuePair({name: core.String._check(name), value: value})));
       }, dynamicAnddynamicToNull()));
-      nonGenericProperties.forEach(dart.fn((name, value) => {
-        if (core.Type.is(value)) {
-          children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
-        } else {
-          children.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }, StringAndObjectToNull()));
       return children.toList();
     }
-    recordGenericParameters(name, genericTypeConstructor) {
-      this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
-    }
     classChild(name, child) {
-      let typeName = _debugger.getTypeName(core.Type._check(child));
-      let parameterName = dart.str`${name}\$`;
-      if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
-        typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
-        _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
-      }
-      return new _debugger.NameValuePair({name: typeName, value: child});
+      let typeName = _debugger.getTypeName(child);
+      return new _debugger.NameValuePair({name: typeName, value: child, config: _debugger.JsonMLConfig.asClass});
     }
   };
   _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -3740,7 +3776,6 @@
       hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
       preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
-      recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
       classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
     })
   });
@@ -3957,60 +3992,49 @@
   });
   _debugger.ClassFormatter = class ClassFormatter extends core.Object {
     accept(object, config) {
-      return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
+      return dart.equals(config, _debugger.JsonMLConfig.asClass);
     }
-    preview(object) {
-      let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
-      if (typeName != null) return core.String._check(typeName);
-      let type = _debugger._getType(object);
+    preview(type) {
       let implements$ = dart.getImplements(type);
-      typeName = _debugger.getTypeName(core.Type._check(type));
+      let typeName = _debugger.getTypeName(type);
       if (implements$ != null) {
         let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
         return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
       } else {
-        return core.String._check(typeName);
+        return typeName;
       }
     }
     hasChildren(object) {
       return true;
     }
-    children(object) {
-      let type = _debugger._getType(object);
-      let children = JSArrayOfNameValuePair().of([]);
-      let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
+    children(type) {
+      let ret = LinkedHashSetOfNameValuePair().new();
+      let staticProperties = SetOfNameValuePair().new();
+      let staticMethods = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getStaticFieldSig(type), staticProperties, type, false);
+      _debugger.addPropertiesFromSignature(dart.getStaticGetterSig(type), staticProperties, type, false);
+      _debugger.addPropertiesFromSignature(dart.getStaticSig(type), staticMethods, type, false);
+      if (dart.test(staticProperties.isNotEmpty) || dart.test(staticMethods.isNotEmpty)) {
+        ret.add(new _debugger.NameValuePair({value: '[[Static members]]', hideName: true}));
+        ret.addAll(_debugger.sortProperties(staticProperties));
+        ret.addAll(_debugger.sortProperties(staticMethods));
+      }
+      let instanceMethods = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getMethodSig(type), instanceMethods, type.prototype, false, {tagTypes: true});
+      if (dart.test(instanceMethods.isNotEmpty)) {
+        ret.add(new _debugger.NameValuePair({value: '[[Instance Methods]]', hideName: true}));
+        ret.addAll(_debugger.sortProperties(instanceMethods));
+      }
+      let typeName = _debugger.getTypeName(type);
       let mixins = dart.getMixins(type);
       if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
-        children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+        ret.add(new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
       }
-      let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
-      for (let name of _debugger.getOwnPropertyNames(object)) {
-        if (dart.test(hiddenProperties[dartx.contains](name))) continue;
-        let value = _debugger.safeGetProperty(object, name);
-        if (value != null && dart.getIsNamedConstructor(value) != null) {
-          value = new _debugger.NamedConstructor(value);
-          name = dart.str`${typeName}.${name}`;
-        }
-        children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+      let baseProto = type.__proto__;
+      if (baseProto != null && !dart.test(dart.isJsInterop(baseProto))) {
+        ret.add(new _debugger.NameValuePair({name: "[[base class]]", value: baseProto, config: _debugger.JsonMLConfig.asClass}));
       }
-      let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
-      let prototype = object.prototype;
-      if (prototype != null) {
-        for (let name of _debugger.getOwnPropertyNames(prototype)) {
-          if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
-          let func = _debugger.safeGetProperty(prototype, name);
-          let constructor = _debugger.safeGetProperty(prototype, 'constructor');
-          let sigObj = dart.getMethodSig(constructor);
-          if (sigObj != null) {
-            let value = _debugger.safeGetProperty(sigObj, name);
-            if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
-              dart.tag(func, value);
-              children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
-            }
-          }
-        }
-      }
-      return children;
+      return ret.toList();
     }
   };
   _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -4022,11 +4046,42 @@
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
     })
   });
+  _debugger.TypeFormatter = class TypeFormatter extends core.Object {
+    accept(object, config) {
+      return core.Type.is(object);
+    }
+    preview(object) {
+      return dart.toString(object);
+    }
+    hasChildren(object) {
+      return false;
+    }
+    children(object) {
+      return JSArrayOfNameValuePair().of([]);
+    }
+  };
+  _debugger.TypeFormatter[dart.implements] = () => [_debugger.Formatter];
+  dart.setSignature(_debugger.TypeFormatter, {
+    methods: () => ({
+      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+    })
+  });
   _debugger.registerDevtoolsFormatter = function() {
     let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
     dart.global.devtoolsFormatters = formatters;
   };
   dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
+  _debugger.getModuleNames = function() {
+    return dart.getModuleNames();
+  };
+  dart.fn(_debugger.getModuleNames, VoidTodynamic$());
+  _debugger.getModuleLibraries = function(name) {
+    return dart.getModuleLibraries(name);
+  };
+  dart.lazyFn(_debugger.getModuleLibraries, () => StringTodynamic());
   _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
     if (arg0 === void 0) arg0 = null;
     if (arg1 === void 0) arg1 = null;
@@ -4360,7 +4415,7 @@
         IterableOfE()._check(iterable);
         this[dartx.checkGrowable]('insertAll');
         core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable)) {
+        if (!_internal.EfficientLengthIterable.is(iterable)) {
           iterable = iterable[dartx.toList]();
         }
         let insertionLength = iterable[dartx.length];
@@ -4633,7 +4688,7 @@
         IterableOfE()._check(replacement);
         this[dartx.checkGrowable]('replace range');
         core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(replacement)) {
+        if (!_internal.EfficientLengthIterable.is(replacement)) {
           replacement = replacement[dartx.toList]();
         }
         let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6348,21 +6403,20 @@
         this[_filter](test, true);
       }
       [_filter](test, retainMatching) {
-        let source = this;
         let retained = JSArrayOfE().of([]);
-        let length = source[dartx.length];
+        let length = this[dartx.length];
         for (let i = 0; i < dart.notNull(length); i++) {
-          let element = source[dartx._get](i);
+          let element = this[dartx._get](i);
           if (dart.dcall(test, element) == retainMatching) {
             retained[dartx.add](element);
           }
-          if (length != source[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(source));
+          if (length != this[dartx.length]) {
+            dart.throw(new core.ConcurrentModificationError(this));
           }
         }
-        if (retained[dartx.length] != source[dartx.length]) {
-          source[dartx.setRange](0, retained[dartx.length], retained);
-          source[dartx.length] = retained[dartx.length];
+        if (retained[dartx.length] != this[dartx.length]) {
+          this[dartx.setRange](0, retained[dartx.length], retained);
+          this[dartx.length] = retained[dartx.length];
         }
       }
       clear() {
@@ -6378,11 +6432,10 @@
       }
       sort(compare) {
         if (compare === void 0) compare = null;
-        if (compare == null) {
-          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-        } else {
-          _internal.Sort.sort(E)(this, compare);
-        }
+        _internal.Sort.sort(E)(this, (compare != null ? compare : collection.ListMixin._compareAny));
+      }
+      static _compareAny(a, b) {
+        return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
       }
       shuffle(random) {
         if (random === void 0) random = null;
@@ -6462,7 +6515,7 @@
       replaceRange(start, end, newContents) {
         IterableOfE()._check(newContents);
         core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(newContents)) {
+        if (!_internal.EfficientLengthIterable.is(newContents)) {
           newContents = newContents[dartx.toList]();
         }
         let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6540,7 +6593,7 @@
       insertAll(index, iterable) {
         IterableOfE()._check(iterable);
         core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
+        if (!_internal.EfficientLengthIterable.is(iterable) || core.identical(iterable, this)) {
           iterable = iterable[dartx.toList]();
         }
         let insertionLength = iterable[dartx.length];
@@ -6629,7 +6682,9 @@
         removeAt: dart.definiteFunctionType(E, [core.int]),
         insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
         setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
-      })
+      }),
+      statics: () => ({_compareAny: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])}),
+      names: ['_compareAny']
     });
     dart.defineExtensionMembers(ListMixin, [
       'elementAt',
@@ -6888,7 +6943,66 @@
     names: ['stringOf']
   });
   dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
-  _internal.EfficientLength = class EfficientLength extends core.Object {};
+  _internal.ExternalName = class ExternalName extends core.Object {
+    new(name) {
+      this.name = name;
+    }
+  };
+  dart.setSignature(_internal.ExternalName, {
+    fields: () => ({name: core.String})
+  });
+  _internal.hexDigitValue = function(char) {
+    dart.assert(dart.notNull(char) >= 0 && dart.notNull(char) <= 65535);
+    let digit0 = 48;
+    let a = 97;
+    let f = 102;
+    let digit = (dart.notNull(char) ^ digit0) >>> 0;
+    if (digit <= 9) return digit;
+    let letter = (dart.notNull(char) | 32) >>> 0;
+    if (a <= letter && letter <= f) return letter - (a - 10);
+    return -1;
+  };
+  dart.fn(_internal.hexDigitValue, intToint());
+  _internal.parseHexByte = function(source, index) {
+    dart.assert(dart.notNull(index) + 2 <= dart.notNull(source[dartx.length]));
+    let digit1 = _internal.hexDigitValue(source[dartx.codeUnitAt](index));
+    let digit2 = _internal.hexDigitValue(source[dartx.codeUnitAt](dart.notNull(index) + 1));
+    return dart.notNull(digit1) * 16 + dart.notNull(digit2) - (dart.notNull(digit2) & 256);
+  };
+  dart.lazyFn(_internal.parseHexByte, () => StringAndintToint());
+  const _name$ = Symbol('_name');
+  const _nativeSymbol = Symbol('_nativeSymbol');
+  _internal.PrivateSymbol = class PrivateSymbol extends core.Object {
+    new(name, nativeSymbol) {
+      this[_name$] = name;
+      this[_nativeSymbol] = nativeSymbol;
+    }
+    static getName(symbol) {
+      return _internal.PrivateSymbol.as(symbol)[_name$];
+    }
+    static getNativeSymbol(symbol) {
+      if (_internal.PrivateSymbol.is(symbol)) return symbol[_nativeSymbol];
+      return null;
+    }
+    ['=='](other) {
+      return _internal.PrivateSymbol.is(other) && core.identical(this[_nativeSymbol], other[_nativeSymbol]);
+    }
+    toString() {
+      return dart.str`Symbol("${this[_name$]}")`;
+    }
+  };
+  _internal.PrivateSymbol[dart.implements] = () => [core.Symbol];
+  dart.setSignature(_internal.PrivateSymbol, {
+    fields: () => ({
+      [_name$]: core.String,
+      [_nativeSymbol]: core.Object
+    }),
+    statics: () => ({
+      getName: dart.definiteFunctionType(core.String, [core.Symbol]),
+      getNativeSymbol: dart.definiteFunctionType(core.Object, [core.Symbol])
+    }),
+    names: ['getName', 'getNativeSymbol']
+  });
   core.Iterable$ = dart.generic(E => {
     let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
     let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
@@ -7027,7 +7141,7 @@
         return SetOfE().from(this);
       }
       get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
+        dart.assert(!_internal.EfficientLengthIterable.is(this));
         let count = 0;
         let it = this[dartx.iterator];
         while (dart.test(it.moveNext())) {
@@ -7196,6 +7310,15 @@
     return Iterable;
   });
   core.Iterable = Iterable();
+  _internal.EfficientLengthIterable$ = dart.generic(T => {
+    class EfficientLengthIterable extends core.Iterable$(T) {
+      new() {
+        super.new();
+      }
+    }
+    return EfficientLengthIterable;
+  });
+  _internal.EfficientLengthIterable = EfficientLengthIterable();
   _internal.ListIterable$ = dart.generic(E => {
     let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
     let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
@@ -7205,7 +7328,7 @@
     let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListIterable extends core.Iterable$(E) {
+    class ListIterable extends _internal.EfficientLengthIterable$(E) {
       new() {
         super.new();
       }
@@ -7412,7 +7535,6 @@
         return result;
       }
     }
-    ListIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(ListIterable, {
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
@@ -7611,7 +7733,7 @@
     let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
     class MappedIterable extends core.Iterable$(T) {
       static new(iterable, func) {
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
         }
         return new (MappedIterableOfS$T())._(iterable, func);
@@ -7664,12 +7786,13 @@
   });
   _internal.MappedIterable = MappedIterable();
   _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
+    let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
     class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
       new(iterable, func) {
         super._(iterable, func);
       }
     }
-    EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthMappedIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
     return EfficientLengthMappedIterable;
   });
   _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
@@ -7730,7 +7853,6 @@
         return this[_f](this[_source][dartx.elementAt](index));
       }
     }
-    MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(MappedListIterable, {
       fields: () => ({
         [_source]: IterableOfS(),
@@ -7759,6 +7881,11 @@
       get iterator() {
         return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
       }
+      map(T) {
+        return f => {
+          return new (_internal.MappedIterable$(E, T))._(this, f);
+        };
+      }
     }
     dart.setSignature(WhereIterable, {
       fields: () => ({
@@ -7767,13 +7894,12 @@
       }),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
     });
-    dart.defineExtensionMembers(WhereIterable, ['iterator']);
+    dart.defineExtensionMembers(WhereIterable, ['map', 'iterator']);
     return WhereIterable;
   });
   _internal.WhereIterable = WhereIterable();
   _internal.WhereIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
     class WhereIterator extends core.Iterator$(E) {
       new(iterator, f) {
         this[_iterator] = iterator;
@@ -7781,7 +7907,7 @@
       }
       moveNext() {
         while (dart.test(this[_iterator].moveNext())) {
-          if (dart.test(this[_f](this[_iterator].current))) {
+          if (dart.test(dart.dcall(this[_f], this[_iterator].current))) {
             return true;
           }
         }
@@ -7794,7 +7920,7 @@
     dart.setSignature(WhereIterator, {
       fields: () => ({
         [_iterator]: IteratorOfE(),
-        [_f]: _ElementPredicateOfE()
+        [_f]: _internal._ElementPredicate
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7889,7 +8015,7 @@
         if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
           dart.throw(new core.ArgumentError(takeCount));
         }
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
         }
         return new (TakeIterableOfE())._(iterable, takeCount);
@@ -7916,6 +8042,7 @@
   });
   _internal.TakeIterable = TakeIterable();
   _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
       new(iterable, takeCount) {
         super._(iterable, takeCount);
@@ -7926,7 +8053,7 @@
         return iterableLength;
       }
     }
-    EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthTakeIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
     dart.setSignature(EfficientLengthTakeIterable, {});
     dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
     return EfficientLengthTakeIterable;
@@ -8033,7 +8160,7 @@
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
     class SkipIterable extends core.Iterable$(E) {
       static new(iterable, count) {
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthSkipIterableOfE())(iterable, count);
         }
         return new (SkipIterableOfE())._(iterable, count);
@@ -8071,6 +8198,7 @@
   });
   _internal.SkipIterable = SkipIterable();
   _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
       new(iterable, skipCount) {
         super._(iterable, skipCount);
@@ -8081,7 +8209,7 @@
         return 0;
       }
     }
-    EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthSkipIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
     dart.setSignature(EfficientLengthSkipIterable, {});
     dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
     return EfficientLengthSkipIterable;
@@ -8185,7 +8313,7 @@
     let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class EmptyIterable extends core.Iterable$(E) {
+    class EmptyIterable extends _internal.EfficientLengthIterable$(E) {
       new() {
         super.new();
       }
@@ -8281,7 +8409,6 @@
         return SetOfE().new();
       }
     }
-    EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(EmptyIterable, {
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
@@ -8670,79 +8797,6 @@
     };
   };
   dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
-  _internal.Lists = class Lists extends core.Object {
-    static copy(src, srcStart, dst, dstStart, count) {
-      if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
-        for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      } else {
-        for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      }
-    }
-    static areEqual(a, b) {
-      if (core.identical(a, b)) return true;
-      if (!core.List.is(b)) return false;
-      let length = a[dartx.length];
-      if (!dart.equals(length, dart.dload(b, 'length'))) return false;
-      for (let i = 0; i < dart.notNull(length); i++) {
-        if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
-      }
-      return true;
-    }
-    static indexOf(a, element, startIndex, endIndex) {
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) < 0) {
-        startIndex = 0;
-      }
-      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static lastIndexOf(a, element, startIndex) {
-      if (dart.notNull(startIndex) < 0) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        startIndex = dart.notNull(a[dartx.length]) - 1;
-      }
-      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static indicesCheck(a, start, end) {
-      core.RangeError.checkValidRange(start, end, a[dartx.length]);
-    }
-    static rangeCheck(a, start, length) {
-      core.RangeError.checkNotNegative(length);
-      core.RangeError.checkNotNegative(start);
-      if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
-        let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
-        dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
-      }
-    }
-  };
-  dart.setSignature(_internal.Lists, {
-    statics: () => ({
-      copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
-      areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
-      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-      indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
-      rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
-    }),
-    names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
-  });
   _internal.printToZone = null;
   _internal.printToConsole = function(line) {
     _js_primitives.printString(dart.str`${line}`);
@@ -8988,27 +9042,18 @@
     names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
   });
   _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-  const _name$ = Symbol('_name');
-  const _nativeSymbol = Symbol('_nativeSymbol');
   _internal.Symbol = class Symbol extends core.Object {
     new(name) {
       this[_name$] = name;
-      this[_nativeSymbol] = null;
-    }
-    es6(name, nativeSymbol) {
-      this[_name$] = name;
-      this[_nativeSymbol] = nativeSymbol;
     }
     unvalidated(name) {
       this[_name$] = name;
-      this[_nativeSymbol] = null;
     }
     validated(name) {
       this[_name$] = _internal.Symbol.validatePublicSymbol(name);
-      this[_nativeSymbol] = null;
     }
     ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+      return _internal.Symbol.is(other) && this[_name$] == other[_name$];
     }
     get hashCode() {
       let hash = this._hashCode;
@@ -9024,9 +9069,6 @@
     static getName(symbol) {
       return symbol[_name$];
     }
-    static getNativeSymbol(symbol) {
-      return symbol[_nativeSymbol];
-    }
     static validatePublicSymbol(name) {
       if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
       if (dart.test(name[dartx.startsWith]('_'))) {
@@ -9038,23 +9080,17 @@
       return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
     }
   };
-  dart.defineNamedConstructor(_internal.Symbol, 'es6');
   dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
   dart.defineNamedConstructor(_internal.Symbol, 'validated');
   _internal.Symbol[dart.implements] = () => [core.Symbol];
   dart.setSignature(_internal.Symbol, {
-    fields: () => ({
-      [_name$]: core.String,
-      [_nativeSymbol]: dart.dynamic
-    }),
-    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
+    fields: () => ({[_name$]: core.String}),
     statics: () => ({
       getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
-      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
       validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
       isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
     }),
-    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
+    names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
   });
   _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
   _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -9237,8 +9273,8 @@
       this.weakPorts = SetOfint().new();
       this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
       this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
-      this.pauseCapability = isolate.Capability.new();
-      this.terminateCapability = isolate.Capability.new();
+      this.pauseCapability = isolate$.Capability.new();
+      this.terminateCapability = isolate$.Capability.new();
       this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
       this.pauseTokens = SetOfCapability().new();
       this.errorPorts = SetOfSendPort().new();
@@ -9285,7 +9321,7 @@
       this.errorsAreFatal = errorsAreFatal;
     }
     handlePing(responsePort, pingType) {
-      if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      if (pingType == isolate$.Isolate.IMMEDIATE || pingType == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
         responsePort.send(null);
         return;
       }
@@ -9293,11 +9329,7 @@
         responsePort.send(null);
       }
       dart.fn(respond, VoidTovoid$());
-      if (pingType == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
-        return;
-      }
-      dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
+      dart.assert(pingType == isolate$.Isolate.BEFORE_NEXT_EVENT);
       if (this[_scheduledControlEvents] == null) {
         this[_scheduledControlEvents] = collection.Queue.new();
       }
@@ -9305,15 +9337,11 @@
     }
     handleKill(authentification, priority) {
       if (!dart.equals(this.terminateCapability, authentification)) return;
-      if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      if (priority == isolate$.Isolate.IMMEDIATE || priority == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
         this.kill();
         return;
       }
-      if (priority == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
-        return;
-      }
-      dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
+      dart.assert(priority == isolate$.Isolate.BEFORE_NEXT_EVENT);
       if (this[_scheduledControlEvents] == null) {
         this[_scheduledControlEvents] = collection.Queue.new();
       }
@@ -9381,47 +9409,47 @@
       switch (dart.dindex(message, 0)) {
         case "pause":
         {
-          this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
+          this.addPause(isolate$.Capability._check(dart.dindex(message, 1)), isolate$.Capability._check(dart.dindex(message, 2)));
           break;
         }
         case "resume":
         {
-          this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
+          this.removePause(isolate$.Capability._check(dart.dindex(message, 1)));
           break;
         }
         case 'add-ondone':
         {
-          this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.addDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case 'remove-ondone':
         {
-          this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.removeDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case 'set-errors-fatal':
         {
-          this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
+          this.setErrorsFatal(isolate$.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
           break;
         }
         case "ping":
         {
-          this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+          this.handlePing(isolate$.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
           break;
         }
         case "kill":
         {
-          this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+          this.handleKill(isolate$.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
           break;
         }
         case "getErrors":
         {
-          this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.addErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case "stopErrors":
         {
-          this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.removeErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         default:
@@ -9464,7 +9492,7 @@
       this.errorPorts.clear();
       if (this.doneHandlers != null) {
         for (let port of core.Iterable._check(this.doneHandlers)) {
-          isolate.SendPort._check(port);
+          isolate$.SendPort._check(port);
           port.send(null);
         }
         this.doneHandlers = null;
@@ -9484,8 +9512,8 @@
       weakPorts: SetOfint(),
       isolateStatics: dart.dynamic,
       controlPort: _isolate_helper.RawReceivePortImpl,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability,
+      pauseCapability: isolate$.Capability,
+      terminateCapability: isolate$.Capability,
       initialized: core.bool,
       isPaused: core.bool,
       delayedEvents: ListOf_IsolateEvent(),
@@ -9497,15 +9525,15 @@
       errorPorts: SetOfSendPort()
     }),
     methods: () => ({
-      addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
-      removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
-      handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
-      handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+      addPause: dart.definiteFunctionType(dart.void, [isolate$.Capability, isolate$.Capability]),
+      removePause: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      addDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.bool]),
+      handlePing: dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.int]),
+      handleKill: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.int]),
+      addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
       handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
       eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
       [_setGlobals]: dart.definiteFunctionType(dart.void, []),
@@ -9706,7 +9734,7 @@
           let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
           let context = new _isolate_helper._IsolateContext();
           _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
-            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
+            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate$.SendPort._check(replyTo));
           }, VoidToNull()), 'worker-start');
           _isolate_helper._globalState.currentContext = context;
           _isolate_helper._globalState.topEventLoop.run();
@@ -9719,7 +9747,7 @@
         }
         case 'message':
         {
-          let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
+          let port = isolate$.SendPort._check(dart.dindex(msg, 'port'));
           if (port != null) {
             dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
           }
@@ -9807,7 +9835,7 @@
       if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
         uri = dart.notNull(uri) + ".js";
       }
-      let port = isolate.ReceivePort.new();
+      let port = isolate$.ReceivePort.new();
       let completer = CompleterOfList().new();
       port.first.then(dart.dynamic)(dart.fn(msg => {
         if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
@@ -9846,7 +9874,7 @@
     }
     static get currentIsolate() {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-      return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
+      return new isolate$.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
     }
     static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -9924,10 +9952,10 @@
       spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
       spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
       spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
-      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
+      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
       workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
     }),
     names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
@@ -9954,10 +9982,10 @@
       }
     }
   };
-  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._BaseSendPort, {
     fields: () => ({[_isolateId]: core.int}),
-    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
+    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate$.SendPort])})
   });
   const _receivePort = Symbol('_receivePort');
   const _isClosed = Symbol('_isClosed');
@@ -9989,7 +10017,7 @@
       return this[_receivePort][_id];
     }
   };
-  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._NativeJsSendPort, {
     fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
     methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
@@ -10020,7 +10048,7 @@
       return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
     }
   };
-  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._WorkerSendPort, {
     fields: () => ({
       [_workerId]: core.int,
@@ -10078,14 +10106,14 @@
   };
   dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
   dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
-  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
+  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate$.RawReceivePort];
   dart.setSignature(_isolate_helper.RawReceivePortImpl, {
     fields: () => ({
       [_id]: core.int,
       [_handler]: core.Function,
       [_isClosed]: core.bool
     }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+    getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
     setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
     methods: () => ({
       [_close]: dart.definiteFunctionType(dart.void, []),
@@ -10231,7 +10259,8 @@
           }, VoidToNull()), onCancel: dart.fn(() => {
             if (timer != null) timer.cancel();
             timer = null;
-          }, VoidToNull())});
+            return async.Future._nullFuture;
+          }, VoidTo_Future())});
         return controller.stream;
       }
       static eventTransformed(source, mapSink) {
@@ -10290,9 +10319,7 @@
                 subscription.pause();
               }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
+              }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
           }
           return controller.stream;
         };
@@ -10330,9 +10357,7 @@
                 subscription.pause();
               }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
+              }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
           }
           return controller.stream;
         };
@@ -10863,13 +10888,13 @@
   dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
   dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
   dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
-  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
+  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate$.ReceivePort];
   dart.setSignature(_isolate_helper.ReceivePortImpl, {
     fields: () => ({
-      [_rawPort]: isolate.RawReceivePort,
+      [_rawPort]: isolate$.RawReceivePort,
       [_controller]: async.StreamController
     }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+    getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       close: dart.definiteFunctionType(dart.void, [])
@@ -10982,7 +11007,7 @@
     }
   };
   dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
-  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
+  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate$.Capability];
   dart.setSignature(_isolate_helper.CapabilityImpl, {
     fields: () => ({[_id]: core.int}),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
@@ -11020,7 +11045,7 @@
       if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
       if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
       if (_interceptors.Interceptor.is(x)) this.unsupported(x);
-      if (isolate.RawReceivePort.is(x)) {
+      if (isolate$.RawReceivePort.is(x)) {
         this.unsupported(x, "RawReceivePorts can't be transmitted:");
       }
       if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
@@ -11298,7 +11323,7 @@
     }
     deserializeRawSendPort(x) {
       dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
-      let result = isolate.SendPort._check(dart.dindex(x, 1));
+      let result = isolate$.SendPort._check(dart.dindex(x, 1));
       this.deserializedObjects[dartx.add](result);
       return result;
     }
@@ -11350,8 +11375,8 @@
       deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
       deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
       deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
-      deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-      deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+      deserializeSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
+      deserializeRawSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
       deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
       deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
       deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
@@ -11388,6 +11413,11 @@
   _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
   _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
   _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
+  dart.defineLazy(_js_helper, {
+    get _identityHashCode() {
+      return Symbol("_identityHashCode");
+    }
+  });
   _js_helper._Patch = class _Patch extends core.Object {
     new() {
     }
@@ -11407,10 +11437,10 @@
       _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
     }
     static objectHashCode(object) {
-      let hash = object.$identityHash;
+      let hash = object[_js_helper._identityHashCode];
       if (hash == null) {
         hash = Math.random() * 0x3fffffff | 0;
-        object.$identityHash = hash;
+        object[_js_helper._identityHashCode] = hash;
       }
       return hash;
     }
@@ -12049,6 +12079,9 @@
     new() {
       super.new();
     }
+    toString() {
+      return super.toString();
+    }
   };
   _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
     new() {
@@ -12071,13 +12104,18 @@
     fields: () => ({message: dart.dynamic})
   });
   core.AssertionError = class AssertionError extends core.Error {
-    new() {
+    new(message) {
+      if (message === void 0) message = null;
+      this.message = message;
       super.new();
     }
     toString() {
       return "Assertion failed";
     }
   };
+  dart.setSignature(core.AssertionError, {
+    fields: () => ({message: core.Object})
+  });
   _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
     new(message) {
       this[_message] = message;
@@ -12682,7 +12720,7 @@
     let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-    class LinkedHashMapKeyIterable extends core.Iterable$(E) {
+    class LinkedHashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
       new(map) {
         this[_map] = map;
         super.new();
@@ -12711,7 +12749,6 @@
         }
       }
     }
-    LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(LinkedHashMapKeyIterable, {
       fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -13382,7 +13419,11 @@
   };
   dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
   _js_mirrors.getName = function(symbol) {
-    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+    if (_internal.PrivateSymbol.is(symbol)) {
+      return _internal.PrivateSymbol.getName(symbol);
+    } else {
+      return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+    }
   };
   dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
   _js_mirrors.getSymbol = function(name, library) {
@@ -13461,7 +13502,7 @@
   });
   _js_mirrors._Lazy = _Lazy();
   _js_mirrors._getESSymbol = function(symbol) {
-    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+    return _internal.PrivateSymbol.getNativeSymbol(symbol);
   };
   dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
   _js_mirrors._getMember = function(symbol) {
@@ -13505,7 +13546,7 @@
   dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
   _js_mirrors._getSymbolForESSymbol = function(member) {
     let name = _js_mirrors._getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
+    return new _internal.PrivateSymbol(name, member);
   };
   dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
   _js_mirrors._getSymbolForMember = function(member) {
@@ -13513,7 +13554,7 @@
       return core.Symbol.new(member);
     } else {
       let name = _js_mirrors._getNameForESSymbol(member);
-      return new _internal.Symbol.es6(name, member);
+      return new _internal.PrivateSymbol(name, member);
     }
   };
   dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
@@ -13657,12 +13698,18 @@
   };
   _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
   _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
+    loadLibrary(...args) {
+      return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl('loadLibrary', args, {isMethod: true})));
+    }
     get isImport() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
     }
     get isExport() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
     }
+    get isDeferred() {
+      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isDeferred', [], {isGetter: true})));
+    }
     get sourceLibrary() {
       return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
     }
@@ -13693,6 +13740,9 @@
     setField(...args) {
       return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
     }
+    delegate(...args) {
+      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+    }
   };
   _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
   const _getAccessor = Symbol('_getAccessor');
@@ -13840,7 +13890,7 @@
         let setters = _js_mirrors._getSetters(unwrapped);
         setters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
-          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+          symbol = new _internal.PrivateSymbol(name, _js_mirrors._getESSymbol(symbol));
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
         }, SymbolAnddynamicToNull()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
@@ -13989,12 +14039,18 @@
     get typeVariables() {
       return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
     }
+    delegate(...args) {
+      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+    }
     isSubclassOf(...args) {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
     }
     get isAbstract() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
     }
+    get isEnum() {
+      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isEnum', [], {isGetter: true})));
+    }
     get instanceMembers() {
       return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
     }
@@ -16800,9 +16856,9 @@
   async._registerErrorHandler = function(R) {
     return (errorHandler, zone) => {
       if (async.ZoneBinaryCallback.is(errorHandler)) {
-        return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
+        return zone.registerBinaryCallback(R, dart.dynamic, core.StackTrace)(async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).as(errorHandler));
       } else {
-        return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
+        return zone.registerUnaryCallback(R, dart.dynamic)(async.ZoneUnaryCallback$(R, dart.dynamic).as(errorHandler));
       }
     };
   };
@@ -16956,7 +17012,6 @@
   const _waitsForCancel = Symbol('_waitsForCancel');
   const _canFire = Symbol('_canFire');
   const _cancelOnError = Symbol('_cancelOnError');
-  const _incrementPauseCount = Symbol('_incrementPauseCount');
   const _sendData = Symbol('_sendData');
   const _addPending = Symbol('_addPending');
   const _sendError = Symbol('_sendError');
@@ -17001,7 +17056,7 @@
       }
       onError(handleError) {
         if (handleError == null) handleError = async._nullErrorHandler;
-        this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
+        this[_onError] = async._registerErrorHandler(dart.dynamic)(handleError, this[_zone]);
       }
       onDone(handleDone) {
         if (handleDone == null) handleDone = async._nullDoneHandler;
@@ -17034,9 +17089,11 @@
       }
       cancel() {
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (dart.test(this[_isCanceled])) return this[_cancelFuture];
-        this[_cancel]();
-        return this[_cancelFuture];
+        if (!dart.test(this[_isCanceled])) {
+          this[_cancel]();
+        }
+        let l = this[_cancelFuture];
+        return l != null ? l : async.Future._nullFuture;
       }
       asFuture(E) {
         return futureValue => {
@@ -17046,8 +17103,14 @@
             result[_complete](futureValue);
           }, VoidToNull());
           this[_onError] = dart.fn((error, stackTrace) => {
-            this.cancel();
-            result[_completeError](error, core.StackTrace._check(stackTrace));
+            let cancelFuture = this.cancel();
+            if (!core.identical(cancelFuture, async.Future._nullFuture)) {
+              cancelFuture.whenComplete(dart.fn(() => {
+                result[_completeError](error, core.StackTrace._check(stackTrace));
+              }, VoidToNull()));
+            } else {
+              result[_completeError](error, core.StackTrace._check(stackTrace));
+            }
           }, dynamicAnddynamicToNull());
           return result;
         };
@@ -17093,9 +17156,6 @@
         if (!dart.test(this[_inCallback])) this[_pending] = null;
         this[_cancelFuture] = this[_onCancel]();
       }
-      [_incrementPauseCount]() {
-        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-      }
       [_decrementPauseCount]() {
         dart.assert(this[_isPaused]);
         this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
@@ -17182,7 +17242,7 @@
         if (dart.test(this[_cancelOnError])) {
           this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
           this[_cancel]();
-          if (async.Future.is(this[_cancelFuture])) {
+          if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
             this[_cancelFuture].whenComplete(sendError);
           } else {
             sendError();
@@ -17205,7 +17265,7 @@
         dart.fn(sendDone, VoidTovoid$());
         this[_cancel]();
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (async.Future.is(this[_cancelFuture])) {
+        if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
           this[_cancelFuture].whenComplete(sendDone);
         } else {
           sendDone();
@@ -17215,7 +17275,7 @@
         dart.assert(!dart.test(this[_inCallback]));
         let wasInputPaused = this[_isInputPaused];
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        callback();
+        dart.dcall(callback);
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
         this[_checkState](wasInputPaused);
       }
@@ -17283,7 +17343,6 @@
         cancel: dart.definiteFunctionType(async.Future, []),
         asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
         [_cancel]: dart.definiteFunctionType(dart.void, []),
-        [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
         [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
         [_add$]: dart.definiteFunctionType(dart.void, [T]),
         [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
@@ -17295,7 +17354,7 @@
         [_sendData]: dart.definiteFunctionType(dart.void, [T]),
         [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
         [_sendDone]: dart.definiteFunctionType(dart.void, []),
-        [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+        [_guardCallback]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
         [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
       })
     });
@@ -17310,7 +17369,6 @@
   async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
   async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
   async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
-  async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
   async._ControllerSubscription$ = dart.generic(T => {
     let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
     class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
@@ -18066,7 +18124,7 @@
               result[_completeError](error, stackTrace);
             }
           }
-          dart.fn(handleError, dynamicAnddynamicTovoid$());
+          dart.fn(handleError, dynamicAnddynamicToNull());
           try {
             for (let future of futures) {
               let pos = remaining;
@@ -18212,7 +18270,7 @@
   };
   dart.fn(async._nonNullError, ObjectToObject());
   async._FutureOnValue$ = dart.generic((S, T) => {
-    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
+    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(async.FutureOr$(T), [S]));
     return _FutureOnValue;
   });
   async._FutureOnValue = _FutureOnValue();
@@ -18303,6 +18361,9 @@
   const _whenCompleteAction = Symbol('_whenCompleteAction');
   async._FutureListener$ = dart.generic((S, T) => {
     let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
+    let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
+    let ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = () => (ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(FutureOrOfT(), core.Object, core.StackTrace)))();
+    let dynamicToFutureOrOfT = () => (dynamicToFutureOrOfT = dart.constFn(dart.functionType(FutureOrOfT(), [dart.dynamic])))();
     let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
     class _FutureListener extends core.Object {
       then(result, onValue, errorCallback) {
@@ -18362,7 +18423,7 @@
       }
       handleValue(sourceResult) {
         S._check(sourceResult);
-        return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
+        return this[_zone].runUnary(FutureOrOfT(), S)(this[_onValue], sourceResult);
       }
       matchesErrorTest(asyncError) {
         if (!dart.test(this.hasErrorTest)) return true;
@@ -18372,10 +18433,10 @@
       handleError(asyncError) {
         dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
         if (async.ZoneBinaryCallback.is(this.errorCallback)) {
-          let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
-          return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
+          let typedErrorCallback = ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace().as(this.errorCallback);
+          return this[_zone].runBinary(FutureOrOfT(), core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
         } else {
-          return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
+          return this[_zone].runUnary(FutureOrOfT(), dart.dynamic)(dynamicToFutureOrOfT()._check(this.errorCallback), asyncError.error);
         }
       }
       handleWhenComplete() {
@@ -18408,9 +18469,9 @@
         hasErrorCallback: dart.definiteFunctionType(core.bool, [])
       }),
       methods: () => ({
-        handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
+        handleValue: dart.definiteFunctionType(async.FutureOr$(T), [S]),
         matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
-        handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
+        handleError: dart.definiteFunctionType(async.FutureOr$(T), [async.AsyncError]),
         handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
       })
     });
@@ -18511,7 +18572,7 @@
           if (!core.identical(currentZone, async._ROOT_ZONE)) {
             f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
             if (onError != null) {
-              onError = async._registerErrorHandler(T)(onError, currentZone);
+              onError = async._registerErrorHandler(E)(onError, currentZone);
             }
           }
           return this[_thenNoZoneRegistration](E)(f, onError);
@@ -18520,7 +18581,7 @@
       [_thenNoZoneRegistration](E) {
         return (f, onError) => {
           let result = new (async._Future$(E))();
-          this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
+          this[_addListener](new (async._FutureListener$(T, E)).then(result, async._FutureOnValue$(T, E)._check(f), onError));
           return result;
         };
       }
@@ -19212,10 +19273,10 @@
   });
   async.StreamTransformer = StreamTransformer();
   async.StreamIterator$ = dart.generic(T => {
-    let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
+    let _StreamIteratorOfT = () => (_StreamIteratorOfT = dart.constFn(async._StreamIterator$(T)))();
     class StreamIterator extends core.Object {
       static new(stream) {
-        return new (_StreamIteratorImplOfT())(stream);
+        return new (_StreamIteratorOfT())(stream);
       }
     }
     dart.addTypeTests(StreamIterator);
@@ -20083,36 +20144,6 @@
     return _StreamImplEvents;
   });
   async._StreamImplEvents = _StreamImplEvents();
-  const _unlink = Symbol('_unlink');
-  const _insertBefore = Symbol('_insertBefore');
-  async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
-    new() {
-      this[_next$] = null;
-      this[_previous$] = null;
-    }
-    [_unlink]() {
-      this[_previous$][_next$] = this[_next$];
-      this[_next$][_previous$] = this[_previous$];
-      this[_next$] = this[_previous$] = this;
-    }
-    [_insertBefore](newNext) {
-      let newPrevious = newNext[_previous$];
-      newPrevious[_next$] = this;
-      newNext[_previous$] = this[_previous$];
-      this[_previous$][_next$] = newNext;
-      this[_previous$] = newPrevious;
-    }
-  };
-  dart.setSignature(async._BroadcastLinkedList, {
-    fields: () => ({
-      [_next$]: async._BroadcastLinkedList,
-      [_previous$]: async._BroadcastLinkedList
-    }),
-    methods: () => ({
-      [_unlink]: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
-    })
-  });
   async._BroadcastCallback$ = dart.generic(T => {
     const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
     return _BroadcastCallback;
@@ -20164,7 +20195,7 @@
         }
       }
       cancel() {
-        return null;
+        return async.Future._nullFuture;
       }
       asFuture(E) {
         return futureValue => {
@@ -20340,7 +20371,7 @@
       }
       cancel() {
         this[_stream][_cancelSubscription]();
-        return null;
+        return async.Future._nullFuture;
       }
       get isPaused() {
         return this[_stream][_isSubscriptionPaused];
@@ -20370,146 +20401,109 @@
     return _BroadcastSubscriptionWrapper;
   });
   async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-  const _current$1 = Symbol('_current');
-  const _futureOrPrefetch = Symbol('_futureOrPrefetch');
-  const _clear = Symbol('_clear');
-  async._StreamIteratorImpl$ = dart.generic(T => {
+  const _stateData = Symbol('_stateData');
+  const _initializeOrDone = Symbol('_initializeOrDone');
+  async._StreamIterator$ = dart.generic(T => {
+    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
     let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
-    class _StreamIteratorImpl extends core.Object {
+    class _StreamIterator extends core.Object {
       new(stream) {
+        this[_stateData] = stream;
         this[_subscription] = null;
-        this[_current$1] = null;
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+        this[_isPaused] = false;
       }
       get current() {
-        return this[_current$1];
+        if (this[_subscription] != null && dart.test(this[_isPaused])) {
+          return T.as(this[_stateData]);
+        }
+        return null;
       }
       moveNext() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
-          return new (_FutureOfbool()).immediate(false);
-        }
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        if (this[_subscription] != null) {
+          if (dart.test(this[_isPaused])) {
+            let future = new (_FutureOfbool())();
+            this[_stateData] = future;
+            this[_isPaused] = false;
+            this[_subscription].resume();
+            return future;
+          }
           dart.throw(new core.StateError("Already waiting for next."));
         }
-        if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
-          this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-          this[_current$1] = null;
-          let result = new (_FutureOfbool())();
-          this[_futureOrPrefetch] = result;
-          return result;
-        } else {
-          dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
-          switch (this[_state]) {
-            case async._StreamIteratorImpl._STATE_EXTRA_DATA:
-            {
-              this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-              this[_current$1] = T.as(this[_futureOrPrefetch]);
-              this[_futureOrPrefetch] = null;
-              this[_subscription].resume();
-              return new (_FutureOfbool()).immediate(true);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
-            {
-              let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
-              this[_clear]();
-              return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_DONE:
-            {
-              this[_clear]();
-              return new (_FutureOfbool()).immediate(false);
-            }
-          }
-        }
+        return this[_initializeOrDone]();
       }
-      [_clear]() {
-        this[_subscription] = null;
-        this[_futureOrPrefetch] = null;
-        this[_current$1] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_DONE;
+      [_initializeOrDone]() {
+        dart.assert(this[_subscription] == null);
+        let stateData = this[_stateData];
+        if (stateData != null) {
+          let stream = StreamOfT().as(stateData);
+          this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+          let future = new (_FutureOfbool())();
+          this[_stateData] = future;
+          return future;
+        }
+        return new (_FutureOfbool()).immediate(false);
       }
       cancel() {
-        let subscription = this[_subscription];
-        if (subscription == null) return null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-        } else {
-          this[_clear]();
+        let subscription = StreamSubscriptionOfT()._check(this[_subscription]);
+        let stateData = this[_stateData];
+        this[_stateData] = null;
+        if (subscription != null) {
+          this[_subscription] = null;
+          if (!dart.test(this[_isPaused])) {
+            let future = _FutureOfbool().as(stateData);
+            future[_asyncComplete](false);
+          }
+          return subscription.cancel();
         }
-        return subscription.cancel();
+        return async.Future._nullFuture;
       }
       [_onData](data) {
         T._check(data);
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          this[_current$1] = data;
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_futureOrPrefetch] = null;
-          this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-          hasNext[_complete](true);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = data;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_stateData] = data;
+        this[_isPaused] = true;
+        moveNextFuture[_complete](true);
+        if (this[_subscription] != null && dart.test(this[_isPaused])) this[_subscription].pause();
       }
       [_onError](error, stackTrace) {
         if (stackTrace === void 0) stackTrace = null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_completeError](error, stackTrace);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_subscription] = null;
+        this[_stateData] = null;
+        moveNextFuture[_completeError](error, stackTrace);
       }
       [_onDone]() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-          return;
-        }
-        this[_subscription].pause();
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_subscription] = null;
+        this[_stateData] = null;
+        moveNextFuture[_complete](false);
       }
     }
-    dart.addTypeTests(_StreamIteratorImpl);
-    _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
-    dart.setSignature(_StreamIteratorImpl, {
+    dart.addTypeTests(_StreamIterator);
+    _StreamIterator[dart.implements] = () => [StreamIteratorOfT()];
+    dart.setSignature(_StreamIterator, {
       fields: () => ({
         [_subscription]: async.StreamSubscription,
-        [_current$1]: T,
-        [_futureOrPrefetch]: dart.dynamic,
-        [_state]: core.int
+        [_stateData]: core.Object,
+        [_isPaused]: core.bool
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({
         moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
-        [_clear]: dart.definiteFunctionType(dart.void, []),
+        [_initializeOrDone]: dart.definiteFunctionType(async.Future$(core.bool), []),
         cancel: dart.definiteFunctionType(async.Future, []),
         [_onData]: dart.definiteFunctionType(dart.void, [T]),
         [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
         [_onDone]: dart.definiteFunctionType(dart.void, [])
       })
     });
-    return _StreamIteratorImpl;
+    return _StreamIterator;
   });
-  async._StreamIteratorImpl = _StreamIteratorImpl();
-  async._StreamIteratorImpl._STATE_FOUND = 0;
-  async._StreamIteratorImpl._STATE_DONE = 1;
-  async._StreamIteratorImpl._STATE_MOVING = 2;
-  async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
-  async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
-  async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
+  async._StreamIterator = _StreamIterator();
   async._EmptyStream$ = dart.generic(T => {
     let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
     let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20552,7 +20546,7 @@
   dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
   async._cancelAndError = function(subscription, future, error, stackTrace) {
     let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
+    if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
       cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
     } else {
       future[_completeError](error, stackTrace);
@@ -20577,7 +20571,7 @@
   dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
   async._cancelAndValue = function(subscription, future, value) {
     let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
+    if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
       cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
     } else {
       future[_complete](value);
@@ -20860,6 +20854,7 @@
   async._HandleErrorStream = _HandleErrorStream();
   const _count = Symbol('_count');
   async._TakeStream$ = dart.generic(T => {
+    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
     let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
     let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
     let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20870,6 +20865,10 @@
         if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
       }
       [_createSubscription](onData, onError, onDone, cancelOnError) {
+        if (this[_count] == 0) {
+          this[_source$].listen(null).cancel();
+          return new (_DoneStreamSubscriptionOfT())(onDone);
+        }
         return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
       }
       [_handleData](inputEvent, sink) {
@@ -21172,7 +21171,7 @@
         if (dart.test(this[_isSubscribed])) {
           let subscription = this[_subscription];
           this[_subscription] = null;
-          subscription.cancel();
+          return subscription.cancel();
         }
         return null;
       }
@@ -22476,8 +22475,8 @@
       if (onError != null) {
         errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
           try {
-            if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
-              return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
+            if (async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).is(onError)) {
+              return self.parent.runBinary(R, dart.dynamic, core.StackTrace)(onError, error, stackTrace);
             }
             return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
           } catch (e) {
@@ -22939,7 +22938,7 @@
     let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-    class _HashMapKeyIterable extends core.Iterable$(E) {
+    class _HashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -22966,7 +22965,6 @@
         }
       }
     }
-    _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_HashMapKeyIterable, {
       fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -22982,7 +22980,7 @@
   });
   collection._HashMapKeyIterable = _HashMapKeyIterable();
   const _offset = Symbol('_offset');
-  const _current$2 = Symbol('_current');
+  const _current$1 = Symbol('_current');
   collection._HashMapKeyIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
@@ -22992,10 +22990,10 @@
         this[_map$0] = map;
         this[_keys] = keys;
         this[_offset] = 0;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         let keys = this[_keys];
@@ -23003,10 +23001,10 @@
         if (keys !== this[_map$0][_keys]) {
           dart.throw(new core.ConcurrentModificationError(this[_map$0]));
         } else if (dart.notNull(offset) >= keys.length) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = keys[offset];
+          this[_current$1] = keys[offset];
           this[_offset] = dart.notNull(offset) + 1;
           return true;
         }
@@ -23019,7 +23017,7 @@
         [_map$0]: _HashMapOfE$dynamic(),
         [_keys]: ListOfE(),
         [_offset]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -23182,7 +23180,7 @@
   collection._Es6MapIterable$ = dart.generic(E => {
     let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class _Es6MapIterable extends core.Iterable$(E) {
+    class _Es6MapIterable extends _internal.EfficientLengthIterable$(E) {
       new(map, isKeys) {
         this[_map$0] = map;
         this[_isKeys] = isKeys;
@@ -23220,7 +23218,6 @@
         }
       }
     }
-    _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_Es6MapIterable, {
       fields: () => ({
         [_map$0]: dart.dynamic,
@@ -23250,7 +23247,7 @@
         this[_isKeys] = isKeys;
         this[_jsIterator$] = null;
         this[_next$0] = null;
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_done] = null;
         if (dart.test(this[_isKeys])) {
           this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
@@ -23260,7 +23257,7 @@
         this[_done] = false;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
@@ -23270,11 +23267,11 @@
         this[_next$0] = this[_jsIterator$].next();
         let done = this[_next$0].done;
         if (done) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           this[_done] = true;
           return false;
         } else {
-          this[_current$2] = this[_next$0].value;
+          this[_current$1] = this[_next$0].value;
           return true;
         }
       }
@@ -23288,7 +23285,7 @@
         [_isKeys]: core.bool,
         [_jsIterator$]: dart.dynamic,
         [_next$0]: dart.dynamic,
-        [_current$2]: E,
+        [_current$1]: E,
         [_done]: core.bool
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -24079,10 +24076,10 @@
         this[_set] = set;
         this[_elements] = elements;
         this[_offset] = 0;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         let elements = this[_elements];
@@ -24090,10 +24087,10 @@
         if (elements !== dart.dload(this[_set], _elements)) {
           dart.throw(new core.ConcurrentModificationError(this[_set]));
         } else if (dart.notNull(offset) >= elements.length) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = elements[offset];
+          this[_current$1] = elements[offset];
           this[_offset] = dart.notNull(offset) + 1;
           return true;
         }
@@ -24106,7 +24103,7 @@
         [_set]: dart.dynamic,
         [_elements]: ListOfE(),
         [_offset]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24560,20 +24557,20 @@
         this[_set] = set;
         this[_modifications$] = modifications;
         this[_cell$] = null;
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_cell$] = this[_set][_first$];
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (this[_modifications$] != this[_set][_modifications$]) {
           dart.throw(new core.ConcurrentModificationError(this[_set]));
         } else if (this[_cell$] == null) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = E._check(this[_cell$][_element]);
+          this[_current$1] = E._check(this[_cell$][_element]);
           this[_cell$] = this[_cell$][_next$0];
           return true;
         }
@@ -24586,7 +24583,7 @@
         [_set]: collection._LinkedHashSet,
         [_modifications$]: core.int,
         [_cell$]: collection._LinkedHashSetCell,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24851,7 +24848,7 @@
         return SetOfE().from(this);
       }
       get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
+        dart.assert(!_internal.EfficientLengthIterable.is(this));
         let count = 0;
         let it = this[dartx.iterator];
         while (dart.test(it.moveNext())) {
@@ -25279,9 +25276,9 @@
   });
   collection.LinkedHashSet = LinkedHashSet();
   const _modificationCount = Symbol('_modificationCount');
-  const _insertBefore$ = Symbol('_insertBefore');
+  const _insertBefore = Symbol('_insertBefore');
   const _list = Symbol('_list');
-  const _unlink$ = Symbol('_unlink');
+  const _unlink = Symbol('_unlink');
   collection.LinkedList$ = dart.generic(E => {
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
     let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
@@ -25295,12 +25292,12 @@
       }
       addFirst(entry) {
         E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+        this[_insertBefore](this[_first$], entry, {updateFirst: true});
         this[_first$] = entry;
       }
       add(entry) {
         E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: false});
+        this[_insertBefore](this[_first$], entry, {updateFirst: false});
       }
       addAll(entries) {
         IterableOfE()._check(entries);
@@ -25309,7 +25306,7 @@
       remove(entry) {
         E._check(entry);
         if (!dart.equals(entry[_list], this)) return false;
-        this[_unlink$](entry);
+        this[_unlink](entry);
         return true;
       }
       get iterator() {
@@ -25366,7 +25363,7 @@
       get isEmpty() {
         return this[_length$1] == 0;
       }
-      [_insertBefore$](entry, newEntry, opts) {
+      [_insertBefore](entry, newEntry, opts) {
         E._check(entry);
         E._check(newEntry);
         let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
@@ -25393,7 +25390,7 @@
         }
         this[_length$1] = dart.notNull(this[_length$1]) + 1;
       }
-      [_unlink$](entry) {
+      [_unlink](entry) {
         E._check(entry);
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
         entry[_next$0][_previous$0] = entry[_previous$0];
@@ -25420,8 +25417,8 @@
         addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
         remove: dart.definiteFunctionType(core.bool, [E]),
         clear: dart.definiteFunctionType(dart.void, []),
-        [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [E])
+        [_insertBefore]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+        [_unlink]: dart.definiteFunctionType(dart.void, [E])
       })
     });
     dart.defineExtensionMembers(LinkedList, [
@@ -25447,21 +25444,21 @@
         this[_modificationCount] = list[_modificationCount];
         this[_next$0] = list[_first$];
         this[_visitedFirst] = false;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (this[_modificationCount] != this[_list][_modificationCount]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
         if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         }
         this[_visitedFirst] = true;
-        this[_current$2] = E._check(this[_next$0]);
+        this[_current$1] = E._check(this[_next$0]);
         this[_next$0] = this[_next$0][_next$0];
         return true;
       }
@@ -25472,7 +25469,7 @@
       fields: () => ({
         [_list]: LinkedListOfE(),
         [_modificationCount]: core.int,
-        [_current$2]: E,
+        [_current$1]: E,
         [_next$0]: LinkedListEntryOfE(),
         [_visitedFirst]: core.bool
       }),
@@ -25494,23 +25491,23 @@
         return this[_list];
       }
       unlink() {
-        this[_list][_unlink$](E._check(this));
+        this[_list][_unlink](E._check(this));
       }
       get next() {
-        if (core.identical(this, this[_next$0])) return null;
+        if (this[_list] == null || core.identical(this[_list].first, this[_next$0])) return null;
         return this[_next$0];
       }
       get previous() {
-        if (core.identical(this, this[_previous$0])) return null;
+        if (this[_list] == null || core.identical(this, this[_list].first)) return null;
         return this[_previous$0];
       }
       insertAfter(entry) {
         E._check(entry);
-        this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
+        this[_list][_insertBefore](this[_next$0], entry, {updateFirst: false});
       }
       insertBefore(entry) {
         E._check(entry);
-        this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
+        this[_list][_insertBefore](E.as(this), entry, {updateFirst: true});
       }
     }
     dart.addTypeTests(LinkedListEntry);
@@ -25679,7 +25676,7 @@
   collection._MapBaseValueIterable$ = dart.generic((K, V) => {
     let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    class _MapBaseValueIterable extends core.Iterable$(V) {
+    class _MapBaseValueIterable extends _internal.EfficientLengthIterable$(V) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -25706,7 +25703,6 @@
         return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
       }
     }
-    _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_MapBaseValueIterable, {
       fields: () => ({[_map$0]: MapOfK$V()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -25731,18 +25727,18 @@
       new(map) {
         this[_map$0] = map;
         this[_keys] = map[dartx.keys][dartx.iterator];
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       moveNext() {
         if (dart.test(this[_keys].moveNext())) {
-          this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
+          this[_current$1] = this[_map$0][dartx._get](this[_keys].current);
           return true;
         }
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
     }
     dart.addTypeTests(_MapBaseValueIterator);
@@ -25751,7 +25747,7 @@
       fields: () => ({
         [_keys]: IteratorOfK(),
         [_map$0]: MapOfK$V(),
-        [_current$2]: V
+        [_current$1]: V
       }),
       getters: () => ({current: dart.definiteFunctionType(V, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25987,7 +25983,7 @@
   });
   collection.Queue$ = dart.generic(E => {
     let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class Queue extends core.Object {
       static new() {
         return new (ListQueueOfE())();
@@ -25995,33 +25991,30 @@
       static from(elements) {
         return ListQueueOfE().from(elements);
       }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
     }
     dart.addTypeTests(Queue);
-    Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+    Queue[dart.implements] = () => [EfficientLengthIterableOfE()];
     return Queue;
   });
   collection.Queue = Queue();
   const _previousLink = Symbol('_previousLink');
   const _nextLink = Symbol('_nextLink');
   const _link = Symbol('_link');
-  collection._DoubleLink$ = dart.generic(E => {
+  collection._DoubleLink$ = dart.generic(Link => {
     class _DoubleLink extends core.Object {
       new() {
         this[_previousLink] = null;
         this[_nextLink] = null;
       }
       [_link](previous, next) {
-        E._check(previous);
-        E._check(next);
+        Link._check(previous);
+        Link._check(next);
         this[_nextLink] = next;
         this[_previousLink] = previous;
         if (previous != null) previous[_nextLink] = this;
         if (next != null) next[_previousLink] = this;
       }
-      [_unlink$]() {
+      [_unlink]() {
         if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
         if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
         this[_nextLink] = null;
@@ -26031,46 +26024,34 @@
     dart.addTypeTests(_DoubleLink);
     dart.setSignature(_DoubleLink, {
       fields: () => ({
-        [_previousLink]: E,
-        [_nextLink]: E
+        [_previousLink]: Link,
+        [_nextLink]: Link
       }),
       methods: () => ({
-        [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [])
+        [_link]: dart.definiteFunctionType(dart.void, [Link, Link]),
+        [_unlink]: dart.definiteFunctionType(dart.void, [])
       })
     });
     return _DoubleLink;
   });
   collection._DoubleLink = _DoubleLink();
   collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-    class DoubleLinkedQueueEntry extends core.Object {
-      static new(element) {
-        return new (_UserDoubleLinkedQueueEntryOfE())(element);
-      }
-    }
-    dart.addTypeTests(DoubleLinkedQueueEntry);
-    return DoubleLinkedQueueEntry;
-  });
-  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
-  collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
     let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-    class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
+    class DoubleLinkedQueueEntry extends collection._DoubleLink {
       new(element) {
         this.element = element;
         super.new();
       }
       append(e) {
         E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
+        new (DoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
       }
       prepend(e) {
         E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
+        new (DoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
       }
       remove() {
-        this[_unlink$]();
+        this[_unlink]();
         return this.element;
       }
       previousEntry() {
@@ -26080,8 +26061,7 @@
         return this[_nextLink];
       }
     }
-    _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-    dart.setSignature(_UserDoubleLinkedQueueEntry, {
+    dart.setSignature(DoubleLinkedQueueEntry, {
       fields: () => ({element: E}),
       methods: () => ({
         append: dart.definiteFunctionType(dart.void, [E]),
@@ -26091,22 +26071,23 @@
         nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
       })
     });
-    return _UserDoubleLinkedQueueEntry;
-  }, _UserDoubleLinkedQueueEntry => {
-    dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
+    return DoubleLinkedQueueEntry;
+  }, DoubleLinkedQueueEntry => {
+    dart.setBaseClass(DoubleLinkedQueueEntry, collection._DoubleLink$(DoubleLinkedQueueEntry));
   });
-  collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
+  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
   const _queue = Symbol('_queue');
   const _append = Symbol('_append');
   const _prepend = Symbol('_prepend');
   const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
   collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    class _DoubleLinkedQueueEntry extends collection._DoubleLink {
-      new(queue) {
+    class _DoubleLinkedQueueEntry extends collection.DoubleLinkedQueueEntry$(E) {
+      new(element, queue) {
         this[_queue] = queue;
-        super.new();
+        super.new(element);
       }
       [_append](e) {
         E._check(e);
@@ -26116,34 +26097,34 @@
         E._check(e);
         new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
       }
+      get [_element]() {
+        return this.element;
+      }
       nextEntry() {
-        return this[_nextLink][_asNonSentinelEntry]();
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_nextLink]);
+        return entry[_asNonSentinelEntry]();
       }
       previousEntry() {
-        return this[_previousLink][_asNonSentinelEntry]();
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_previousLink]);
+        return entry[_asNonSentinelEntry]();
       }
     }
     dart.setSignature(_DoubleLinkedQueueEntry, {
       fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
+      getters: () => ({[_element]: dart.definiteFunctionType(E, [])}),
       methods: () => ({
         [_append]: dart.definiteFunctionType(dart.void, [E]),
-        [_prepend]: dart.definiteFunctionType(dart.void, [E]),
-        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+        [_prepend]: dart.definiteFunctionType(dart.void, [E])
       })
     });
     return _DoubleLinkedQueueEntry;
-  }, _DoubleLinkedQueueEntry => {
-    dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
   });
   collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
   const _elementCount = Symbol('_elementCount');
   collection._DoubleLinkedQueueElement$ = dart.generic(E => {
-    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
     class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
       new(element, queue) {
-        this.element = element;
-        super.new(queue);
+        super.new(element, queue);
       }
       append(e) {
         E._check(e);
@@ -26163,7 +26144,7 @@
       }
       [_remove]() {
         this[_queue] = null;
-        this[_unlink$]();
+        this[_unlink]();
         return this.element;
       }
       remove() {
@@ -26177,14 +26158,9 @@
         return this;
       }
     }
-    _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
     dart.setSignature(_DoubleLinkedQueueElement, {
-      fields: () => ({element: E}),
       methods: () => ({
-        append: dart.definiteFunctionType(dart.void, [E]),
-        prepend: dart.definiteFunctionType(dart.void, [E]),
         [_remove]: dart.definiteFunctionType(E, []),
-        remove: dart.definiteFunctionType(E, []),
         [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
       })
     });
@@ -26194,7 +26170,7 @@
   collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
     class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
       new(queue) {
-        super.new(queue);
+        super.new(null, queue);
         this[_previousLink] = this;
         this[_nextLink] = this;
       }
@@ -26204,12 +26180,11 @@
       [_remove]() {
         dart.throw(_internal.IterableElementError.noElement());
       }
-      get element() {
+      get [_element]() {
         dart.throw(_internal.IterableElementError.noElement());
       }
     }
     dart.setSignature(_DoubleLinkedQueueSentinel, {
-      getters: () => ({element: dart.definiteFunctionType(E, [])}),
       methods: () => ({
         [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         [_remove]: dart.definiteFunctionType(E, [])
@@ -26223,6 +26198,7 @@
     let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
     let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
     let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
     let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
@@ -26270,34 +26246,42 @@
         }
       }
       removeLast() {
-        let lastEntry = this[_sentinel][_previousLink];
+        let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
         let result = lastEntry[_remove]();
         this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         return result;
       }
       removeFirst() {
-        let firstEntry = this[_sentinel][_nextLink];
+        let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         let result = firstEntry[_remove]();
         this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         return result;
       }
       remove(o) {
-        let entry = this[_sentinel][_nextLink];
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          if (dart.equals(entry.element, o)) {
+          let equals = dart.equals(entry[_element], o);
+          if (!core.identical(this, entry[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          if (equals) {
             entry[_remove]();
             this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
             return true;
           }
-          entry = entry[_nextLink];
+          entry = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
         }
         return false;
       }
       [_filter](test, removeMatching) {
-        let entry = this[_sentinel][_nextLink];
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          let next = entry[_nextLink];
-          if (core.identical(removeMatching, test(entry.element))) {
+          let matches = test(entry[_element]);
+          if (!core.identical(this, entry[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          let next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+          if (core.identical(removeMatching, matches)) {
             entry[_remove]();
             this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
           }
@@ -26311,26 +26295,26 @@
         this[_filter](test, false);
       }
       get first() {
-        let firstEntry = this[_sentinel][_nextLink];
-        return firstEntry.element;
+        let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+        return firstEntry[_element];
       }
       get last() {
-        let lastEntry = this[_sentinel][_previousLink];
-        return lastEntry.element;
+        let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
+        return lastEntry[_element];
       }
       get single() {
         if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
-          let entry = this[_sentinel][_nextLink];
-          return entry.element;
+          let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+          return entry[_element];
         }
         dart.throw(_internal.IterableElementError.tooMany());
       }
-      lastEntry() {
-        return this[_sentinel].previousEntry();
-      }
       firstEntry() {
         return this[_sentinel].nextEntry();
       }
+      lastEntry() {
+        return this[_sentinel].previousEntry();
+      }
       get isEmpty() {
         return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
       }
@@ -26339,13 +26323,18 @@
         this[_sentinel][_previousLink] = this[_sentinel];
         this[_elementCount] = 0;
       }
-      forEachEntry(f) {
-        let entry = this[_sentinel][_nextLink];
+      forEachEntry(action) {
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          let nextEntry = entry[_nextLink];
           let element = _DoubleLinkedQueueElementOfE()._check(entry);
-          f(element);
-          entry = nextEntry;
+          let next = _DoubleLinkedQueueEntryOfE()._check(element[_nextLink]);
+          action(element);
+          if (core.identical(this, entry[_queue])) {
+            next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+          } else if (!core.identical(this, next[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          entry = next;
         }
       }
       get iterator() {
@@ -26373,8 +26362,8 @@
         [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
         removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
         retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         clear: dart.definiteFunctionType(dart.void, []),
         forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
       })
@@ -26393,33 +26382,33 @@
   collection.DoubleLinkedQueue = DoubleLinkedQueue();
   const _nextEntry = Symbol('_nextEntry');
   collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     class _DoubleLinkedQueueIterator extends core.Object {
       new(sentinel) {
         this[_sentinel] = sentinel;
-        this[_nextEntry] = sentinel[_nextLink];
-        this[_current$2] = null;
+        this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(sentinel[_nextLink]);
+        this[_current$1] = null;
       }
       moveNext() {
         if (core.identical(this[_nextEntry], this[_sentinel])) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           this[_nextEntry] = null;
           this[_sentinel] = null;
           return false;
         }
         let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
-        if (elementEntry[_queue] == null) {
+        if (!core.identical(this[_sentinel][_queue], elementEntry[_queue])) {
           dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
         }
-        this[_current$2] = elementEntry.element;
-        this[_nextEntry] = elementEntry[_nextLink];
+        this[_current$1] = elementEntry[_element];
+        this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(elementEntry[_nextLink]);
         return true;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
     }
     dart.addTypeTests(_DoubleLinkedQueueIterator);
@@ -26428,7 +26417,7 @@
       fields: () => ({
         [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
         [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26451,7 +26440,7 @@
     let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListQueue extends core.Iterable$(E) {
+    class ListQueue extends _internal.ListIterable$(E) {
       new(initialCapacity) {
         if (initialCapacity === void 0) initialCapacity = null;
         this[_head] = 0;
@@ -26479,7 +26468,7 @@
           return queue;
         } else {
           let capacity = collection.ListQueue._INITIAL_CAPACITY;
-          if (_internal.EfficientLength.is(elements)) {
+          if (_internal.EfficientLengthIterable.is(elements)) {
             capacity = elements[dartx.length];
           }
           let result = new (ListQueueOfE())(capacity);
@@ -26728,7 +26717,6 @@
         [_tail]: core.int,
         [_modificationCount]: core.int
       }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({
         add: dart.definiteFunctionType(dart.void, [E]),
         addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
@@ -26781,18 +26769,18 @@
         this[_end] = queue[_tail];
         this[_modificationCount] = queue[_modificationCount];
         this[_position] = queue[_head];
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         this[_queue][_checkModification](this[_modificationCount]);
         if (this[_position] == this[_end]) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         }
-        this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
+        this[_current$1] = this[_queue][_table][dartx._get](this[_position]);
         this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
         return true;
       }
@@ -26805,7 +26793,7 @@
         [_end]: core.int,
         [_modificationCount]: core.int,
         [_position]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26861,7 +26849,7 @@
   const _splayMin = Symbol('_splayMin');
   const _splayMax = Symbol('_splayMax');
   const _addNewRoot = Symbol('_addNewRoot');
-  const _clear$ = Symbol('_clear');
+  const _clear = Symbol('_clear');
   collection._SplayTree$ = dart.generic((K, Node) => {
     class _SplayTree extends core.Object {
       new() {
@@ -26986,7 +26974,7 @@
         this[_root] = this[_splayMax](this[_root]);
         return this[_root];
       }
-      [_clear$]() {
+      [_clear]() {
         this[_root] = null;
         this[_count$] = 0;
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
@@ -27009,7 +26997,7 @@
         [_splayMax]: dart.definiteFunctionType(Node, [Node]),
         [_remove]: dart.definiteFunctionType(Node, [K]),
         [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-        [_clear$]: dart.definiteFunctionType(dart.void, [])
+        [_clear]: dart.definiteFunctionType(dart.void, [])
       })
     });
     return _SplayTree;
@@ -27166,7 +27154,7 @@
         return this[_count$];
       }
       clear() {
-        this[_clear$]();
+        this[_clear]();
       }
       containsKey(key) {
         return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
@@ -27386,7 +27374,7 @@
     let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
     let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
     let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    class _SplayTreeKeyIterable extends core.Iterable$(K) {
+    class _SplayTreeKeyIterable extends _internal.EfficientLengthIterable$(K) {
       new(tree) {
         this[_tree] = tree;
         super.new();
@@ -27407,7 +27395,6 @@
         return set;
       }
     }
-    _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_SplayTreeKeyIterable, {
       fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
@@ -27419,7 +27406,7 @@
   collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
     let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
     let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-    class _SplayTreeValueIterable extends core.Iterable$(V) {
+    class _SplayTreeValueIterable extends _internal.EfficientLengthIterable$(V) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -27434,7 +27421,6 @@
         return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
       }
     }
-    _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_SplayTreeValueIterable, {
       fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -27650,7 +27636,7 @@
         return _;
       }
       clear() {
-        this[_clear$]();
+        this[_clear]();
       }
       toSet() {
         return this[_clone]();
@@ -28187,7 +28173,7 @@
   core.List$ = dart.generic(E => {
     let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
     let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class List extends core.Object {
       static new(length) {
         if (length === void 0) length = null;
@@ -28238,12 +28224,9 @@
         let result = ListOfE().from(elements, {growable: false});
         return _internal.makeFixedListUnmodifiable(E)(result);
       }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
-      }
     }
     dart.addTypeTests(List);
-    List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+    List[dart.implements] = () => [EfficientLengthIterableOfE()];
     return List;
   });
   core.List = List();
@@ -28382,6 +28365,7 @@
     }
   };
   dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
+  convert._UnicodeSubsetEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert._UnicodeSubsetEncoder, {
     fields: () => ({[_subsetMask]: core.int}),
     methods: () => ({
@@ -28464,6 +28448,7 @@
     }
   };
   dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
+  convert._UnicodeSubsetDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert._UnicodeSubsetDecoder, {
     fields: () => ({
       [_allowInvalid]: core.bool,
@@ -28628,6 +28613,7 @@
   };
   dart.addSimpleTypeTests(convert.Base64Encoder);
   dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
+  convert.Base64Encoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert.Base64Encoder, {
     fields: () => ({[_urlSafe]: core.bool}),
     methods: () => ({
@@ -28654,6 +28640,104 @@
     get decoder() {
       return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
     }
+    normalize(source, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
+      let percent = 37;
+      let equals = 61;
+      let buffer = null;
+      let sliceStart = start;
+      let alphabet = convert._Base64Encoder._base64Alphabet;
+      let inverseAlphabet = convert._Base64Decoder._inverseAlphabet;
+      let firstPadding = -1;
+      let firstPaddingSourceIndex = -1;
+      let paddingCount = 0;
+      for (let i = start; dart.notNull(i) < dart.notNull(end);) {
+        let sliceEnd = i;
+        let char = source[dartx.codeUnitAt]((() => {
+          let x = i;
+          i = dart.notNull(x) + 1;
+          return x;
+        })());
+        let originalChar = char;
+        if (char == percent) {
+          if (dart.notNull(i) + 2 <= dart.notNull(end)) {
+            char = _internal.parseHexByte(source, i);
+            i = dart.notNull(i) + 2;
+            if (char == percent) char = -1;
+          } else {
+            char = -1;
+          }
+        }
+        if (0 <= dart.notNull(char) && dart.notNull(char) <= 127) {
+          let value = inverseAlphabet[dartx._get](char);
+          if (dart.notNull(value) >= 0) {
+            char = alphabet[dartx.codeUnitAt](value);
+            if (char == originalChar) continue;
+          } else if (value == convert._Base64Decoder._padding) {
+            if (dart.notNull(firstPadding) < 0) {
+              firstPadding = (() => {
+                let l = dart.nullSafe(buffer, _ => _.length);
+                return l != null ? l : 0;
+              })() + (dart.notNull(sliceEnd) - dart.notNull(sliceStart));
+              firstPaddingSourceIndex = sliceEnd;
+            }
+            paddingCount = dart.notNull(paddingCount) + 1;
+            if (originalChar == equals) continue;
+          }
+          if (value != convert._Base64Decoder._invalid) {
+            let t = buffer;
+            t == null ? buffer = new core.StringBuffer() : t;
+            buffer.write(source[dartx.substring](sliceStart, sliceEnd));
+            buffer.writeCharCode(char);
+            sliceStart = i;
+            continue;
+          }
+        }
+        dart.throw(new core.FormatException("Invalid base64 data", source, sliceEnd));
+      }
+      if (buffer != null) {
+        buffer.write(source[dartx.substring](sliceStart, end));
+        if (dart.notNull(firstPadding) >= 0) {
+          convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, buffer.length);
+        } else {
+          let endLength = (dart.notNull(buffer.length) - 1)[dartx['%']](4) + 1;
+          if (endLength == 1) {
+            dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+          }
+          while (dart.notNull(endLength) < 4) {
+            buffer.write("=");
+            endLength = dart.notNull(endLength) + 1;
+          }
+        }
+        return source[dartx.replaceRange](start, end, dart.toString(buffer));
+      }
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (dart.notNull(firstPadding) >= 0) {
+        convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, length);
+      } else {
+        let endLength = length[dartx['%']](4);
+        if (endLength == 1) {
+          dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+        }
+        if (dart.notNull(endLength) > 1) {
+          source = source[dartx.replaceRange](end, end, endLength == 2 ? "==" : "=");
+        }
+      }
+      return source;
+    }
+    static _checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, length) {
+      if (length[dartx['%']](4) != 0) {
+        dart.throw(new core.FormatException("Invalid base64 padding, padded length must be multiple of four, " + dart.str`is ${length}`, source, sourceEnd));
+      }
+      if (dart.notNull(firstPadding) + dart.notNull(paddingCount) != length) {
+        dart.throw(new core.FormatException("Invalid base64 padding, '=' not at the end", source, sourceIndex));
+      }
+      if (dart.notNull(paddingCount) > 2) {
+        dart.throw(new core.FormatException("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
+      }
+    }
   };
   dart.addSimpleTypeTests(convert.Base64Codec);
   dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
@@ -28662,7 +28746,10 @@
     getters: () => ({
       encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
       decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
-    })
+    }),
+    methods: () => ({normalize: dart.definiteFunctionType(core.String, [core.String], [core.int, core.int])}),
+    statics: () => ({_checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, core.int, core.int])}),
+    names: ['_checkPadding']
   });
   convert.BASE64 = dart.const(new convert.Base64Codec());
   convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
@@ -28926,6 +29013,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Base64Decoder);
+  convert.Base64Decoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert.Base64Decoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -29454,6 +29542,7 @@
   });
   convert._InvertedCodec = _InvertedCodec();
   convert._FusedConverter$ = dart.generic((S, M, T) => {
+    let ChunkedConverterOfS$T$S$T = () => (ChunkedConverterOfS$T$S$T = dart.constFn(convert.ChunkedConverter$(S, T, S, T)))();
     let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
     let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
     let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
@@ -29472,6 +29561,7 @@
         return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
       }
     }
+    _FusedConverter[dart.implements] = () => [ChunkedConverterOfS$T$S$T()];
     dart.setSignature(_FusedConverter, {
       fields: () => ({
         [_first$0]: ConverterOfS$M(),
@@ -29606,6 +29696,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.HtmlEscape);
+  convert.HtmlEscape[dart.implements] = () => [ChunkedConverterOfString$String$String$String()];
   dart.setSignature(convert.HtmlEscape, {
     fields: () => ({mode: convert.HtmlEscapeMode}),
     methods: () => ({
@@ -29765,6 +29856,7 @@
   };
   dart.addSimpleTypeTests(convert.JsonEncoder);
   dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
+  convert.JsonEncoder[dart.implements] = () => [ChunkedConverterOfObject$String$Object$String()];
   dart.setSignature(convert.JsonEncoder, {
     fields: () => ({
       indent: core.String,
@@ -29837,6 +29929,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
+  convert.JsonUtf8Encoder[dart.implements] = () => [ChunkedConverterOfObject$ListOfint$Object$ListOfint()];
   dart.setSignature(convert.JsonUtf8Encoder, {
     fields: () => ({
       [_indent]: ListOfint(),
@@ -29944,6 +30037,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.JsonDecoder);
+  convert.JsonDecoder[dart.implements] = () => [ChunkedConverterOfString$Object$String$Object()];
   dart.setSignature(convert.JsonDecoder, {
     fields: () => ({[_reviver]: convert._Reviver}),
     methods: () => ({
@@ -31072,6 +31166,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Utf8Encoder);
+  convert.Utf8Encoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert.Utf8Encoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -31284,7 +31379,7 @@
       let buffer = new core.StringBuffer();
       let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
       decoder.convert(codeUnits, start, end);
-      decoder.close();
+      decoder.flush(codeUnits, end);
       return buffer.toString();
     }
     startChunkedConversion(sink) {
@@ -31309,6 +31404,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Utf8Decoder);
+  convert.Utf8Decoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert.Utf8Decoder, {
     fields: () => ({[_allowMalformed]: core.bool}),
     methods: () => ({
@@ -31358,10 +31454,12 @@
     close() {
       this.flush();
     }
-    flush() {
+    flush(source, offset) {
+      if (source === void 0) source = null;
+      if (offset === void 0) offset = null;
       if (dart.test(this.hasPartialInput)) {
         if (!dart.test(this[_allowMalformed])) {
-          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
+          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence", source, offset));
         }
         this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
         this[_value] = 0;
@@ -31405,7 +31503,7 @@
                 if ((dart.notNull(unit) & 192) != 128) {
                   expectedUnits = 0;
                   if (!dart.test(this[_allowMalformed])) {
-                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, i));
                   }
                   this[_isFirstCharacter] = false;
                   this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
@@ -31418,14 +31516,14 @@
               } while (dart.notNull(expectedUnits) > 0);
               if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
                 }
                 expectedUnits = extraUnits = 0;
                 value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               }
               if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
                 }
                 value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               }
@@ -31449,7 +31547,7 @@
             })());
             if (dart.notNull(unit) < 0) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
               }
               this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
             } else {
@@ -31470,7 +31568,7 @@
                 continue loop;
               }
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
               }
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               expectedUnits = extraUnits = 0;
@@ -31499,7 +31597,7 @@
     getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
     methods: () => ({
       close: dart.definiteFunctionType(dart.void, []),
-      flush: dart.definiteFunctionType(dart.void, []),
+      flush: dart.definiteFunctionType(dart.void, [], [ListOfint(), core.int]),
       convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
     })
   });
@@ -31536,6 +31634,7 @@
   };
   core.proxy = dart.const(new core._Proxy());
   dart.defineExtensionNames([
+    'hashCode',
     'toString'
   ]);
   core.bool = class bool extends core.Object {
@@ -31543,6 +31642,9 @@
       let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
       dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
     }
+    get [dartx.hashCode]() {
+      return super.hashCode;
+    }
     [dartx.toString]() {
       return this ? "true" : "false";
     }
@@ -32679,108 +32781,42 @@
     return _Generator;
   });
   core._Generator = _Generator();
-  const _end$ = Symbol('_end');
-  const _start$0 = Symbol('_start');
   const _generator$ = Symbol('_generator');
   core._GeneratorIterable$ = dart.generic(E => {
     let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
-    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-    class _GeneratorIterable extends core.Iterable$(E) {
-      new(end, generator) {
-        this[_end$] = end;
-        this[_start$0] = 0;
+    class _GeneratorIterable extends _internal.ListIterable$(E) {
+      get length() {
+        return this[length$];
+      }
+      set length(value) {
+        super.length = value;
+      }
+      new(length, generator) {
+        this[length$] = length;
         this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
         super.new();
       }
-      slice(start, end, generator) {
-        this[_start$0] = start;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        super.new();
-      }
-      get iterator() {
-        return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
-      }
-      get length() {
-        return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
-      }
-      skip(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return this;
-        let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
-        return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
-      }
-      take(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return new (EmptyIterableOfE())();
-        let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newEnd >= dart.notNull(this[_end$])) return this;
-        return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
+      elementAt(index) {
+        core.RangeError.checkValidIndex(index, this);
+        return this[_generator$](index);
       }
       static _id(n) {
         return n;
       }
     }
-    dart.defineNamedConstructor(_GeneratorIterable, 'slice');
-    _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
+    const length$ = Symbol("_GeneratorIterable.length");
     dart.setSignature(_GeneratorIterable, {
       fields: () => ({
-        [_start$0]: core.int,
-        [_end$]: core.int,
+        length: core.int,
         [_generator$]: _GeneratorOfE()
       }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
       names: ['_id']
     });
-    dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
+    dart.defineExtensionMembers(_GeneratorIterable, ['elementAt', 'length']);
     return _GeneratorIterable;
   });
   core._GeneratorIterable = _GeneratorIterable();
-  const _index$1 = Symbol('_index');
-  const _current$3 = Symbol('_current');
-  core._GeneratorIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    class _GeneratorIterator extends core.Object {
-      new(index, end, generator) {
-        this[_index$1] = index;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        this[_current$3] = null;
-      }
-      moveNext() {
-        if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
-          this[_current$3] = this[_generator$](this[_index$1]);
-          this[_index$1] = dart.notNull(this[_index$1]) + 1;
-          return true;
-        } else {
-          this[_current$3] = null;
-          return false;
-        }
-      }
-      get current() {
-        return this[_current$3];
-      }
-    }
-    dart.addTypeTests(_GeneratorIterator);
-    _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_GeneratorIterator, {
-      fields: () => ({
-        [_end$]: core.int,
-        [_generator$]: _GeneratorOfE(),
-        [_index$1]: core.int,
-        [_current$3]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _GeneratorIterator;
-  });
-  core._GeneratorIterator = _GeneratorIterator();
   core.BidirectionalIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     class BidirectionalIterator extends core.Object {}
@@ -32822,6 +32858,9 @@
     static _uninstantiable() {
       dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
     }
+    get hashCode() {
+      return super.hashCode;
+    }
     toString() {
       return "null";
     }
@@ -32857,7 +32896,7 @@
   core.RegExp[dart.implements] = () => [core.Pattern];
   core.Set$ = dart.generic(E => {
     let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-    class Set extends core.Iterable$(E) {
+    class Set extends _internal.EfficientLengthIterable$(E) {
       static new() {
         return LinkedHashSetOfE().new();
       }
@@ -32868,7 +32907,6 @@
         return LinkedHashSetOfE().from(elements);
       }
     }
-    Set[dart.implements] = () => [_internal.EfficientLength];
     return Set;
   });
   core.Set = Set();
@@ -32901,41 +32939,38 @@
   dart.setSignature(core._StringStackTrace, {
     fields: () => ({[_stackTrace]: core.String})
   });
+  const _start$0 = Symbol('_start');
   const _stop = Symbol('_stop');
   core.Stopwatch = class Stopwatch extends core.Object {
+    new() {
+      this[_start$0] = 0;
+      this[_stop] = 0;
+      if (core.Stopwatch._frequency == null) core.Stopwatch._initTicker();
+    }
     get frequency() {
       return core.Stopwatch._frequency;
     }
-    new() {
-      this[_start$0] = null;
-      this[_stop] = null;
-      core.Stopwatch._initTicker();
-    }
     start() {
-      if (dart.test(this.isRunning)) return;
-      if (this[_start$0] == null) {
-        this[_start$0] = core.Stopwatch._now();
-      } else {
-        this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
+      if (this[_stop] != null) {
+        this[_start$0] = dart.notNull(this[_start$0]) + (dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_stop]));
         this[_stop] = null;
       }
     }
     stop() {
-      if (!dart.test(this.isRunning)) return;
-      this[_stop] = core.Stopwatch._now();
+      let t = this[_stop];
+      t == null ? this[_stop] = core.Stopwatch._now() : t;
     }
     reset() {
-      if (this[_start$0] == null) return;
-      this[_start$0] = core.Stopwatch._now();
-      if (this[_stop] != null) {
-        this[_stop] = this[_start$0];
-      }
+      this[_start$0] = (() => {
+        let l = this[_stop];
+        return l != null ? l : core.Stopwatch._now();
+      })();
     }
     get elapsedTicks() {
-      if (this[_start$0] == null) {
-        return 0;
-      }
-      return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
+      return dart.notNull((() => {
+        let l = this[_stop];
+        return l != null ? l : core.Stopwatch._now();
+      })()) - dart.notNull(this[_start$0]);
     }
     get elapsed() {
       return new core.Duration({microseconds: this.elapsedMicroseconds});
@@ -32947,7 +32982,7 @@
       return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
     }
     get isRunning() {
-      return this[_start$0] != null && this[_stop] == null;
+      return this[_stop] == null;
     }
     static _initTicker() {
       _js_helper.Primitives.initTicker();
@@ -33223,37 +33258,471 @@
       return new _internal.Symbol(name);
     }
   };
+  core._SPACE = 32;
+  core._PERCENT = 37;
+  core._AMPERSAND = 38;
+  core._PLUS = 43;
+  core._DOT = 46;
+  core._SLASH = 47;
+  core._COLON = 58;
+  core._EQUALS = 61;
+  core._UPPER_CASE_A = 65;
+  core._UPPER_CASE_Z = 90;
+  core._LEFT_BRACKET = 91;
+  core._BACKSLASH = 92;
+  core._RIGHT_BRACKET = 93;
+  core._LOWER_CASE_A = 97;
+  core._LOWER_CASE_F = 102;
+  core._LOWER_CASE_Z = 122;
+  core._hexDigits = "0123456789ABCDEF";
+  core.Uri = class Uri extends core.Object {
+    static get base() {
+      let uri = _js_helper.Primitives.currentUri();
+      if (uri != null) return core.Uri.parse(uri);
+      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+    }
+    static new(opts) {
+      return core._Uri.new(opts);
+    }
+    static http(authority, unencodedPath, queryParameters) {
+      return core._Uri.http(authority, unencodedPath, queryParameters);
+    }
+    static https(authority, unencodedPath, queryParameters) {
+      return core._Uri.https(authority, unencodedPath, queryParameters);
+    }
+    static file(path, opts) {
+      return core._Uri.file(path, opts);
+    }
+    static directory(path, opts) {
+      return core._Uri.directory(path, opts);
+    }
+    static dataFromString(content, opts) {
+      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+      let base64 = opts && 'base64' in opts ? opts.base64 : false;
+      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
+      return data.uri;
+    }
+    static dataFromBytes(bytes, opts) {
+      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
+      return data.uri;
+    }
+    get hasScheme() {
+      return this.scheme[dartx.isNotEmpty];
+    }
+    static parse(uri, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      let t = end;
+      t == null ? end = uri[dartx.length] : t;
+      if (dart.notNull(end) >= dart.notNull(start) + 5) {
+        let dataDelta = core._startsWithData(uri, start);
+        if (dataDelta == 0) {
+          if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) uri = uri[dartx.substring](start, end);
+          return core.UriData._parse(uri, 5, null).uri;
+        } else if (dataDelta == 32) {
+          return core.UriData._parse(uri[dartx.substring](dart.notNull(start) + 5, end), 0, null).uri;
+        }
+      }
+      let indices = ListOfint().new(8);
+      indices[dartx._set](0, 0);
+      indices[dartx._set](core._schemeEndIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._hostStartIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._notSimpleIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._portStartIndex, start);
+      indices[dartx._set](core._pathStartIndex, start);
+      indices[dartx._set](core._queryStartIndex, end);
+      indices[dartx._set](core._fragmentStartIndex, end);
+      let state = core._scan(uri, start, end, core._uriStart, indices);
+      if (dart.notNull(state) >= core._nonSimpleEndStates) {
+        indices[dartx._set](core._notSimpleIndex, end);
+      }
+      let schemeEnd = indices[dartx._get](core._schemeEndIndex);
+      if (dart.notNull(schemeEnd) >= dart.notNull(start)) {
+        state = core._scan(uri, start, schemeEnd, core._schemeStart, indices);
+        if (state == core._schemeStart) {
+          indices[dartx._set](core._notSimpleIndex, schemeEnd);
+        }
+      }
+      let hostStart = dart.notNull(indices[dartx._get](core._hostStartIndex)) + 1;
+      let portStart = indices[dartx._get](core._portStartIndex);
+      let pathStart = indices[dartx._get](core._pathStartIndex);
+      let queryStart = indices[dartx._get](core._queryStartIndex);
+      let fragmentStart = indices[dartx._get](core._fragmentStartIndex);
+      let scheme = null;
+      if (dart.notNull(fragmentStart) < dart.notNull(queryStart)) queryStart = fragmentStart;
+      if (dart.notNull(pathStart) < dart.notNull(hostStart) || dart.notNull(pathStart) <= dart.notNull(schemeEnd)) {
+        pathStart = queryStart;
+      }
+      if (dart.notNull(portStart) < dart.notNull(hostStart)) portStart = pathStart;
+      dart.assert(hostStart == start || dart.notNull(schemeEnd) <= dart.notNull(hostStart));
+      dart.assert(dart.notNull(hostStart) <= dart.notNull(portStart));
+      dart.assert(dart.notNull(schemeEnd) <= dart.notNull(pathStart));
+      dart.assert(dart.notNull(portStart) <= dart.notNull(pathStart));
+      dart.assert(dart.notNull(pathStart) <= dart.notNull(queryStart));
+      dart.assert(dart.notNull(queryStart) <= dart.notNull(fragmentStart));
+      let isSimple = dart.notNull(indices[dartx._get](core._notSimpleIndex)) < dart.notNull(start);
+      if (isSimple) {
+        if (dart.notNull(hostStart) > dart.notNull(schemeEnd) + 3) {
+          isSimple = false;
+        } else if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 1 == pathStart) {
+          isSimple = false;
+        } else if (dart.notNull(queryStart) < dart.notNull(end) && queryStart == dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("..", pathStart)) || dart.notNull(queryStart) > dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("/..", dart.notNull(queryStart) - 3))) {
+          isSimple = false;
+        } else {
+          if (schemeEnd == dart.notNull(start) + 4) {
+            if (dart.test(uri[dartx.startsWith]("file", start))) {
+              scheme = "file";
+              if (dart.notNull(hostStart) <= dart.notNull(start)) {
+                let schemeAuth = "file://";
+                let delta = 2;
+                if (!dart.test(uri[dartx.startsWith]("/", pathStart))) {
+                  schemeAuth = "file:///";
+                  delta = 3;
+                }
+                uri = schemeAuth + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = 7;
+                portStart = 7;
+                pathStart = 7;
+                queryStart = dart.notNull(queryStart) + (delta - dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) + (delta - dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              } else if (pathStart == queryStart) {
+                if (start == 0 && end == uri[dartx.length]) {
+                  uri = uri[dartx.replaceRange](pathStart, queryStart, "/");
+                  queryStart = dart.notNull(queryStart) + 1;
+                  fragmentStart = dart.notNull(fragmentStart) + 1;
+                  end = dart.notNull(end) + 1;
+                } else {
+                  uri = dart.str`${uri[dartx.substring](start, pathStart)}/` + dart.str`${uri[dartx.substring](queryStart, end)}`;
+                  schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                  hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                  portStart = dart.notNull(portStart) - dart.notNull(start);
+                  pathStart = dart.notNull(pathStart) - dart.notNull(start);
+                  queryStart = dart.notNull(queryStart) + (1 - dart.notNull(start));
+                  fragmentStart = dart.notNull(fragmentStart) + (1 - dart.notNull(start));
+                  start = 0;
+                  end = uri[dartx.length];
+                }
+              }
+            } else if (dart.test(uri[dartx.startsWith]("http", start))) {
+              scheme = "http";
+              if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 3 == pathStart && dart.test(uri[dartx.startsWith]("80", dart.notNull(portStart) + 1))) {
+                if (start == 0 && end == uri[dartx.length]) {
+                  uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                  pathStart = dart.notNull(pathStart) - 3;
+                  queryStart = dart.notNull(queryStart) - 3;
+                  fragmentStart = dart.notNull(fragmentStart) - 3;
+                  end = dart.notNull(end) - 3;
+                } else {
+                  uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                  schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                  hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                  portStart = dart.notNull(portStart) - dart.notNull(start);
+                  pathStart = dart.notNull(pathStart) - (3 + dart.notNull(start));
+                  queryStart = dart.notNull(queryStart) - (3 + dart.notNull(start));
+                  fragmentStart = dart.notNull(fragmentStart) - (3 + dart.notNull(start));
+                  start = 0;
+                  end = uri[dartx.length];
+                }
+              }
+            }
+          } else if (schemeEnd == dart.notNull(start) + 5 && dart.test(uri[dartx.startsWith]("https", start))) {
+            scheme = "https";
+            if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 4 == pathStart && dart.test(uri[dartx.startsWith]("443", dart.notNull(portStart) + 1))) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                pathStart = dart.notNull(pathStart) - 4;
+                queryStart = dart.notNull(queryStart) - 4;
+                fragmentStart = dart.notNull(fragmentStart) - 4;
+                end = dart.notNull(end) - 3;
+              } else {
+                uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - (4 + dart.notNull(start));
+                queryStart = dart.notNull(queryStart) - (4 + dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) - (4 + dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          }
+        }
+      }
+      if (isSimple) {
+        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) {
+          uri = uri[dartx.substring](start, end);
+          schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+          hostStart = dart.notNull(hostStart) - dart.notNull(start);
+          portStart = dart.notNull(portStart) - dart.notNull(start);
+          pathStart = dart.notNull(pathStart) - dart.notNull(start);
+          queryStart = dart.notNull(queryStart) - dart.notNull(start);
+          fragmentStart = dart.notNull(fragmentStart) - dart.notNull(start);
+        }
+        return new core._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+      }
+      return core._Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+    }
+    static encodeComponent(component) {
+      return core._Uri._uriEncode(core._Uri._unreserved2396Table, component, convert.UTF8, false);
+    }
+    static encodeQueryComponent(component, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return core._Uri._uriEncode(core._Uri._unreservedTable, component, encoding, true);
+    }
+    static decodeComponent(encodedComponent) {
+      return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
+    }
+    static decodeQueryComponent(encodedComponent, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
+    }
+    static encodeFull(uri) {
+      return core._Uri._uriEncode(core._Uri._encodeFullTable, uri, convert.UTF8, false);
+    }
+    static decodeFull(uri) {
+      return core._Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
+    }
+    static splitQueryString(query, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
+        let index = element[dartx.indexOf]("=");
+        if (index == -1) {
+          if (element != "") {
+            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
+          }
+        } else if (index != 0) {
+          let key = element[dartx.substring](0, index);
+          let value = element[dartx.substring](dart.notNull(index) + 1);
+          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
+        }
+        return map;
+      }, MapOfString$StringAndStringToMapOfString$String()));
+    }
+    static parseIPv4Address(host) {
+      return core.Uri._parseIPv4Address(host, 0, host[dartx.length]);
+    }
+    static _parseIPv4Address(host, start, end) {
+      function error(msg, position) {
+        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`, host, position));
+      }
+      dart.fn(error, StringAndintTovoid());
+      let result = typed_data.Uint8List.new(4);
+      let partIndex = 0;
+      let partStart = start;
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = host[dartx.codeUnitAt](i);
+        if (char != core._DOT) {
+          if ((dart.notNull(char) ^ 48) >>> 0 > 9) {
+            error("invalid character", i);
+          }
+        } else {
+          if (partIndex == 3) {
+            error('IPv4 address should contain exactly 4 parts', i);
+          }
+          let part = core.int.parse(host[dartx.substring](partStart, i));
+          if (dart.notNull(part) > 255) {
+            error("each part must be in the range 0..255", partStart);
+          }
+          result[dartx._set](partIndex++, part);
+          partStart = dart.notNull(i) + 1;
+        }
+      }
+      if (partIndex != 3) {
+        error('IPv4 address should contain exactly 4 parts', end);
+      }
+      let part = core.int.parse(host[dartx.substring](partStart, end));
+      if (dart.notNull(part) > 255) {
+        error("each part must be in the range 0..255", partStart);
+      }
+      result[dartx._set](partIndex, part);
+      return result;
+    }
+    static parseIPv6Address(host, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      if (end == null) end = host[dartx.length];
+      function error(msg, position) {
+        if (position === void 0) position = null;
+        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
+      }
+      dart.fn(error, String__Tovoid());
+      function parseHex(start, end) {
+        if (dart.notNull(end) - dart.notNull(start) > 4) {
+          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
+        }
+        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
+        if (dart.notNull(value) < 0 || dart.notNull(value) > 65535) {
+          error('each part must be in the range of `0x0..0xFFFF`', start);
+        }
+        return value;
+      }
+      dart.fn(parseHex, intAndintToint());
+      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
+      let parts = JSArrayOfint().of([]);
+      let wildcardSeen = false;
+      let seenDot = false;
+      let partStart = start;
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = host[dartx.codeUnitAt](i);
+        if (char == core._COLON) {
+          if (i == start) {
+            i = dart.notNull(i) + 1;
+            if (host[dartx.codeUnitAt](i) != core._COLON) {
+              error('invalid start colon.', i);
+            }
+            partStart = i;
+          }
+          if (i == partStart) {
+            if (wildcardSeen) {
+              error('only one wildcard `::` is allowed', i);
+            }
+            wildcardSeen = true;
+            parts[dartx.add](-1);
+          } else {
+            parts[dartx.add](parseHex(partStart, i));
+          }
+          partStart = dart.notNull(i) + 1;
+        } else if (char == core._DOT) {
+          seenDot = true;
+        }
+      }
+      if (parts[dartx.length] == 0) error('too few parts');
+      let atEnd = partStart == end;
+      let isLastWildcard = parts[dartx.last] == -1;
+      if (atEnd && !isLastWildcard) {
+        error('expected a part after last `:`', end);
+      }
+      if (!atEnd) {
+        if (!seenDot) {
+          parts[dartx.add](parseHex(partStart, end));
+        } else {
+          let last = core.Uri._parseIPv4Address(host, partStart, end);
+          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
+          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
+        }
+      }
+      if (wildcardSeen) {
+        if (dart.notNull(parts[dartx.length]) > 7) {
+          error('an address with a wildcard must have less than 7 parts');
+        }
+      } else if (parts[dartx.length] != 8) {
+        error('an address without a wildcard must contain exactly 8 parts');
+      }
+      let bytes = typed_data.Uint8List.new(16);
+      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
+        let value = parts[dartx._get](i);
+        if (value == -1) {
+          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
+          for (let j = 0; j < wildCardLength; j++) {
+            bytes[dartx._set](index, 0);
+            bytes[dartx._set](index + 1, 0);
+            index = index + 2;
+          }
+        } else {
+          bytes[dartx._set](index, value[dartx['>>']](8));
+          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
+          index = index + 2;
+        }
+      }
+      return bytes;
+    }
+  };
+  dart.setSignature(core.Uri, {
+    getters: () => ({hasScheme: dart.definiteFunctionType(core.bool, [])}),
+    statics: () => ({
+      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
+      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
+      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+      _parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String, core.int, core.int]),
+      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int])
+    }),
+    names: ['parse', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', 'parseIPv4Address', '_parseIPv4Address', 'parseIPv6Address']
+  });
   const _userInfo = Symbol('_userInfo');
   const _host = Symbol('_host');
   const _port = Symbol('_port');
-  const _path = Symbol('_path');
   const _query = Symbol('_query');
   const _fragment = Symbol('_fragment');
   const _pathSegments = Symbol('_pathSegments');
+  const _text = Symbol('_text');
+  const _hashCodeCache = Symbol('_hashCodeCache');
   const _queryParameters = Symbol('_queryParameters');
   const _queryParameterLists = Symbol('_queryParameterLists');
   const _writeAuthority = Symbol('_writeAuthority');
   let const$51;
   const _mergePaths = Symbol('_mergePaths');
-  const _toWindowsFilePath = Symbol('_toWindowsFilePath');
   const _toFilePath = Symbol('_toFilePath');
   const _isPathAbsolute = Symbol('_isPathAbsolute');
-  core.Uri = class Uri extends core.Object {
+  const _initializeText = Symbol('_initializeText');
+  core._Uri = class _Uri extends core.Object {
     _internal(scheme, userInfo, host, port, path, query, fragment) {
       this.scheme = scheme;
       this[_userInfo] = userInfo;
       this[_host] = host;
       this[_port] = port;
-      this[_path] = path;
+      this.path = path;
       this[_query] = query;
       this[_fragment] = fragment;
       this[_pathSegments] = null;
+      this[_text] = null;
+      this[_hashCodeCache] = null;
       this[_queryParameters] = null;
       this[_queryParameterLists] = null;
     }
+    static notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme) {
+      if (scheme == null) {
+        scheme = "";
+        if (dart.notNull(schemeEnd) > dart.notNull(start)) {
+          scheme = core._Uri._makeScheme(uri, start, schemeEnd);
+        } else if (schemeEnd == start) {
+          core._Uri._fail(uri, start, "Invalid empty scheme");
+        }
+      }
+      let userInfo = "";
+      let host = null;
+      let port = null;
+      if (dart.notNull(hostStart) > dart.notNull(start)) {
+        let userInfoStart = dart.notNull(schemeEnd) + 3;
+        if (userInfoStart < dart.notNull(hostStart)) {
+          userInfo = core._Uri._makeUserInfo(uri, userInfoStart, dart.notNull(hostStart) - 1);
+        }
+        host = core._Uri._makeHost(uri, hostStart, portStart, false);
+        if (dart.notNull(portStart) + 1 < dart.notNull(pathStart)) {
+          port = core.int.parse(uri[dartx.substring](dart.notNull(portStart) + 1, pathStart), {onError: dart.fn(_ => {
+              dart.throw(new core.FormatException("Invalid port", uri, dart.notNull(portStart) + 1));
+            }, StringToNull())});
+          port = core._Uri._makePort(port, scheme);
+        }
+      }
+      let path = core._Uri._makePath(uri, pathStart, queryStart, null, scheme, host != null);
+      let query = null;
+      if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
+        query = core._Uri._makeQuery(uri, dart.notNull(queryStart) + 1, fragmentStart, null);
+      }
+      let fragment = null;
+      if (dart.notNull(fragmentStart) < dart.notNull(end)) {
+        fragment = core._Uri._makeFragment(uri, dart.notNull(fragmentStart) + 1, end);
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    }
     static new(opts) {
-      let scheme = opts && 'scheme' in opts ? opts.scheme : "";
-      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
+      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
       let host = opts && 'host' in opts ? opts.host : null;
       let port = opts && 'port' in opts ? opts.port : null;
       let path = opts && 'path' in opts ? opts.path : null;
@@ -33261,33 +33730,37 @@
       let query = opts && 'query' in opts ? opts.query : null;
       let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
       let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-      scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
-      userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
-      host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
+      scheme = core._Uri._makeScheme(scheme, 0, core._stringOrNullLength(scheme));
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, core._stringOrNullLength(userInfo));
+      host = core._Uri._makeHost(host, 0, core._stringOrNullLength(host), false);
       if (query == "") query = null;
-      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-      fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
-      port = core.Uri._makePort(port, scheme);
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+      fragment = core._Uri._makeFragment(fragment, 0, core._stringOrNullLength(fragment));
+      port = core._Uri._makePort(port, scheme);
       let isFile = scheme == "file";
       if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
         host = "";
       }
       let hasAuthority = host != null;
-      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
       if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
-        path = core.Uri._normalizeRelativePath(path);
+        let allowScheme = dart.test(scheme[dartx.isNotEmpty]) || host != null;
+        path = core._Uri._normalizeRelativePath(path, allowScheme);
       } else {
-        path = core.Uri._removeDotSegments(path);
+        path = core._Uri._removeDotSegments(path);
       }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+      if (host == null && dart.test(path[dartx.startsWith]("//"))) {
+        host = "";
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
     }
     static http(authority, unencodedPath, queryParameters) {
       if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+      return core._Uri._check(core._Uri._makeHttpUri("http", authority, unencodedPath, queryParameters));
     }
     static https(authority, unencodedPath, queryParameters) {
       if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+      return core._Uri._check(core._Uri._makeHttpUri("https", authority, unencodedPath, queryParameters));
     }
     get authority() {
       if (!dart.test(this.hasAuthority)) return "";
@@ -33306,7 +33779,7 @@
       return this[_host];
     }
     get port() {
-      if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
+      if (this[_port] == null) return core._Uri._defaultPort(this.scheme);
       return this[_port];
     }
     static _defaultPort(scheme) {
@@ -33314,181 +33787,34 @@
       if (scheme == "https") return 443;
       return 0;
     }
-    get path() {
-      return this[_path];
-    }
     get query() {
-      return this[_query] == null ? "" : this[_query];
+      return this[_query] != null ? this[_query] : "";
     }
     get fragment() {
-      return this[_fragment] == null ? "" : this[_fragment];
+      return this[_fragment] != null ? this[_fragment] : "";
     }
-    static parse(uri, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let EOI = -1;
-      let scheme = "";
-      let userinfo = "";
-      let host = null;
-      let port = null;
-      let path = null;
-      let query = null;
-      let fragment = null;
-      if (end == null) end = uri[dartx.length];
-      let index = start;
-      let pathStart = start;
-      let char = EOI;
-      function parseAuth() {
-        if (index == end) {
-          char = EOI;
-          return;
-        }
-        let authStart = index;
-        let lastColon = -1;
-        let lastAt = -1;
-        char = uri[dartx.codeUnitAt](index);
-        while (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          if (char == core.Uri._AT_SIGN) {
-            lastAt = index;
-            lastColon = -1;
-          } else if (char == core.Uri._COLON) {
-            lastColon = index;
-          } else if (char == core.Uri._LEFT_BRACKET) {
-            lastColon = -1;
-            let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
-            if (endBracket == -1) {
-              index = end;
-              char = EOI;
-              break;
-            } else {
-              index = endBracket;
+    isScheme(scheme) {
+      let thisScheme = this.scheme;
+      if (scheme == null) return thisScheme[dartx.isEmpty];
+      if (scheme[dartx.length] != thisScheme[dartx.length]) return false;
+      return core._Uri._compareScheme(scheme, thisScheme);
+    }
+    static _compareScheme(scheme, uri) {
+      for (let i = 0; i < dart.notNull(scheme[dartx.length]); i++) {
+        let schemeChar = scheme[dartx.codeUnitAt](i);
+        let uriChar = uri[dartx.codeUnitAt](i);
+        let delta = (dart.notNull(schemeChar) ^ dart.notNull(uriChar)) >>> 0;
+        if (delta != 0) {
+          if (delta == 32) {
+            let lowerChar = (dart.notNull(uriChar) | delta) >>> 0;
+            if (97 <= lowerChar && lowerChar <= 122) {
+              continue;
             }
           }
-          index = dart.notNull(index) + 1;
-          char = EOI;
-        }
-        let hostStart = authStart;
-        let hostEnd = index;
-        if (dart.notNull(lastAt) >= 0) {
-          userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
-          hostStart = dart.notNull(lastAt) + 1;
-        }
-        if (dart.notNull(lastColon) >= 0) {
-          let portNumber = null;
-          if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
-            portNumber = 0;
-            for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
-              let digit = uri[dartx.codeUnitAt](i);
-              if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
-                core.Uri._fail(uri, i, "Invalid port number");
-              }
-              portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
-            }
-          }
-          port = core.Uri._makePort(portNumber, scheme);
-          hostEnd = lastColon;
-        }
-        host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
-        if (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
+          return false;
         }
       }
-      dart.fn(parseAuth, VoidTovoid$());
-      let NOT_IN_PATH = 0;
-      let IN_PATH = 1;
-      let ALLOW_AUTH = 2;
-      let state = NOT_IN_PATH;
-      let i = index;
-      while (dart.notNull(i) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](i);
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          state = NOT_IN_PATH;
-          break;
-        }
-        if (char == core.Uri._SLASH) {
-          state = i == start ? ALLOW_AUTH : IN_PATH;
-          break;
-        }
-        if (char == core.Uri._COLON) {
-          if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
-          scheme = core.Uri._makeScheme(uri, start, i);
-          i = dart.notNull(i) + 1;
-          pathStart = i;
-          if (i == end) {
-            char = EOI;
-            state = NOT_IN_PATH;
-          } else {
-            char = uri[dartx.codeUnitAt](i);
-            if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-              state = NOT_IN_PATH;
-            } else if (char == core.Uri._SLASH) {
-              state = ALLOW_AUTH;
-            } else {
-              state = IN_PATH;
-            }
-          }
-          break;
-        }
-        i = dart.notNull(i) + 1;
-        char = EOI;
-      }
-      index = i;
-      if (state == ALLOW_AUTH) {
-        dart.assert(char == core.Uri._SLASH);
-        index = dart.notNull(index) + 1;
-        if (index == end) {
-          char = EOI;
-          state = NOT_IN_PATH;
-        } else {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH) {
-            index = dart.notNull(index) + 1;
-            parseAuth();
-            pathStart = index;
-          }
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
-            state = NOT_IN_PATH;
-          } else {
-            state = IN_PATH;
-          }
-        }
-      }
-      dart.assert(state == IN_PATH || state == NOT_IN_PATH);
-      if (state == IN_PATH) {
-        while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          char = EOI;
-        }
-        state = NOT_IN_PATH;
-      }
-      dart.assert(state == NOT_IN_PATH);
-      let hasAuthority = host != null;
-      path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
-      if (char == core.Uri._QUESTION) {
-        let numberSignIndex = -1;
-        for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
-          if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
-            numberSignIndex = i;
-            break;
-          }
-        }
-        if (numberSignIndex < 0) {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
-        } else {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
-          fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
-        }
-      } else if (char == core.Uri._NUMBER_SIGN) {
-        fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
-      }
-      return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
+      return true;
     }
     static _fail(uri, index, message) {
       dart.throw(new core.FormatException(message, uri, index));
@@ -33501,7 +33827,8 @@
         let hostStart = 0;
         let hasUserInfo = false;
         for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
-          if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
+          let atSign = 64;
+          if (authority[dartx.codeUnitAt](i) == atSign) {
             hasUserInfo = true;
             userInfo = authority[dartx.substring](0, i);
             hostStart = i + 1;
@@ -33509,22 +33836,22 @@
           }
         }
         let hostEnd = hostStart;
-        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
+        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core._LEFT_BRACKET) {
           for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-            if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
+            if (authority[dartx.codeUnitAt](hostEnd) == core._RIGHT_BRACKET) break;
           }
           if (hostEnd == authority[dartx.length]) {
             dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
           }
           core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
           hostEnd++;
-          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
+          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core._COLON) {
             dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
           }
         }
         let hasPort = false;
         for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
+          if (authority[dartx.codeUnitAt](hostEnd) == core._COLON) {
             let portString = authority[dartx.substring](hostEnd + 1);
             if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
             break;
@@ -33536,33 +33863,13 @@
     }
     static file(path, opts) {
       let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
+      windows = windows == null ? core._Uri._isWindows : windows;
+      return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, false) : core._Uri._makeFileUri(path, false));
     }
     static directory(path, opts) {
       let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
-    }
-    static dataFromString(content, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let base64 = opts && 'base64' in opts ? opts.base64 : false;
-      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
-      return data.uri;
-    }
-    static dataFromBytes(bytes, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
-      return data.uri;
-    }
-    static get base() {
-      let uri = _js_helper.Primitives.currentUri();
-      if (uri != null) return core.Uri.parse(uri);
-      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+      windows = windows == null ? core._Uri._isWindows : windows;
+      return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, true) : core._Uri._makeFileUri(path, true));
     }
     static get _isWindows() {
       return false;
@@ -33591,7 +33898,7 @@
       }
     }
     static _checkWindowsDriveLetter(charCode, argumentError) {
-      if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
+      if (core._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._UPPER_CASE_Z || core._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._LOWER_CASE_Z) {
         return;
       }
       if (dart.test(argumentError)) {
@@ -33618,7 +33925,7 @@
           path = path[dartx.replaceRange](0, 7, '\\');
         } else {
           path = path[dartx.substring](4);
-          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core._COLON || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
             dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
           }
         }
@@ -33626,16 +33933,16 @@
         path = path[dartx.replaceAll]("/", '\\');
       }
       let sep = '\\';
-      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
-        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core._COLON) {
+        core._Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
+        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
           dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
         }
         let pathSegments = path[dartx.split](sep);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
         return core.Uri.new({scheme: "file", pathSegments: pathSegments});
       }
       if (dart.test(path[dartx.startsWith](sep))) {
@@ -33644,7 +33951,7 @@
           let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
           let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
           let pathSegments = pathPart[dartx.split](sep);
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+          core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
           if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
             pathSegments[dartx.add]("");
           }
@@ -33654,12 +33961,12 @@
           if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
             pathSegments[dartx.add]("");
           }
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+          core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
           return core.Uri.new({scheme: "file", pathSegments: pathSegments});
         }
       } else {
         let pathSegments = path[dartx.split](sep);
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
@@ -33678,27 +33985,27 @@
       let fragment = opts && 'fragment' in opts ? opts.fragment : null;
       let schemeChanged = false;
       if (scheme != null) {
-        scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
-        schemeChanged = true;
+        scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+        schemeChanged = scheme != this.scheme;
       } else {
         scheme = this.scheme;
       }
       let isFile = scheme == "file";
       if (userInfo != null) {
-        userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+        userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
       } else {
         userInfo = this[_userInfo];
       }
       if (port != null) {
-        port = core.Uri._makePort(port, scheme);
+        port = core._Uri._makePort(port, scheme);
       } else {
         port = this[_port];
         if (schemeChanged) {
-          port = core.Uri._makePort(port, scheme);
+          port = core._Uri._makePort(port, scheme);
         }
       }
       if (host != null) {
-        host = core.Uri._makeHost(host, 0, host[dartx.length], false);
+        host = core._Uri._makeHost(host, 0, host[dartx.length], false);
       } else if (dart.test(this.hasAuthority)) {
         host = this[_host];
       } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
@@ -33706,34 +34013,34 @@
       }
       let hasAuthority = host != null;
       if (path != null || pathSegments != null) {
-        path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+        path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
       } else {
-        path = this[_path];
+        path = this.path;
         if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
           path = "/" + dart.notNull(path);
         }
       }
       if (query != null || queryParameters != null) {
-        query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+        query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
       } else {
         query = this[_query];
       }
       if (fragment != null) {
-        fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+        fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
       } else {
         fragment = this[_fragment];
       }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
     }
     removeFragment() {
       if (!dart.test(this.hasFragment)) return this;
-      return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
+      return new core._Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this.path, this[_query], null);
     }
     get pathSegments() {
       let result = this[_pathSegments];
       if (result != null) return result;
       let pathToSplit = this.path;
-      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
+      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core._SLASH) {
         pathToSplit = pathToSplit[dartx.substring](1);
       }
       result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
@@ -33748,7 +34055,7 @@
     }
     get queryParametersAll() {
       if (this[_queryParameterLists] == null) {
-        let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
+        let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
         for (let key of queryParameterLists[dartx.keys]) {
           queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
         }
@@ -33757,36 +34064,36 @@
       return this[_queryParameterLists];
     }
     normalizePath() {
-      let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
-      if (core.identical(path, this[_path])) return this;
+      let path = core._Uri._normalizePath(this.path, this.scheme, this.hasAuthority);
+      if (core.identical(path, this.path)) return this;
       return this.replace({path: path});
     }
     static _makePort(port, scheme) {
-      if (port != null && port == core.Uri._defaultPort(scheme)) return null;
+      if (port != null && port == core._Uri._defaultPort(scheme)) return null;
       return port;
     }
     static _makeHost(host, start, end, strictIPv6) {
       if (host == null) return null;
       if (start == end) return "";
-      if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
-        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
-          core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+      if (host[dartx.codeUnitAt](start) == core._LEFT_BRACKET) {
+        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core._RIGHT_BRACKET) {
+          core._Uri._fail(host, start, 'Missing end `]` to match `[` in host');
         }
         core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
         return host[dartx.substring](start, end)[dartx.toLowerCase]();
       }
       if (!dart.test(strictIPv6)) {
         for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+          if (host[dartx.codeUnitAt](i) == core._COLON) {
             core.Uri.parseIPv6Address(host, start, end);
             return dart.str`[${host}]`;
           }
         }
       }
-      return core.Uri._normalizeRegName(host, start, end);
+      return core._Uri._normalizeRegName(host, start, end);
     }
     static _isRegNameChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+      return dart.notNull(char) < 127 && (dart.notNull(core._Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
     }
     static _normalizeRegName(host, start, end) {
       let buffer = null;
@@ -33795,8 +34102,8 @@
       let isNormalized = true;
       while (dart.notNull(index) < dart.notNull(end)) {
         let char = host[dartx.codeUnitAt](index);
-        if (char == core.Uri._PERCENT) {
-          let replacement = core.Uri._normalizeEscape(host, index, true);
+        if (char == core._PERCENT) {
+          let replacement = core._Uri._normalizeEscape(host, index, true);
           if (replacement == null && isNormalized) {
             index = dart.notNull(index) + 3;
             continue;
@@ -33816,8 +34123,8 @@
           index = dart.notNull(index) + sourceLength;
           sectionStart = index;
           isNormalized = true;
-        } else if (dart.test(core.Uri._isRegNameChar(char))) {
-          if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
+        } else if (dart.test(core._Uri._isRegNameChar(char))) {
+          if (isNormalized && core._UPPER_CASE_A <= dart.notNull(char) && core._UPPER_CASE_Z >= dart.notNull(char)) {
             if (buffer == null) buffer = new core.StringBuffer();
             if (dart.notNull(sectionStart) < dart.notNull(index)) {
               buffer.write(host[dartx.substring](sectionStart, index));
@@ -33826,8 +34133,8 @@
             isNormalized = false;
           }
           index = dart.notNull(index) + 1;
-        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-          core.Uri._fail(host, index, "Invalid character");
+        } else if (dart.test(core._Uri._isGeneralDelimiter(char))) {
+          core._Uri._fail(host, index, "Invalid character");
         } else {
           let sourceLength = 1;
           if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
@@ -33841,7 +34148,7 @@
           let slice = host[dartx.substring](sectionStart, index);
           if (!isNormalized) slice = slice[dartx.toLowerCase]();
           buffer.write(slice);
-          buffer.write(core.Uri._escapeChar(char));
+          buffer.write(core._Uri._escapeChar(char));
           index = dart.notNull(index) + sourceLength;
           sectionStart = index;
         }
@@ -33857,26 +34164,33 @@
     static _makeScheme(scheme, start, end) {
       if (start == end) return "";
       let firstCodeUnit = scheme[dartx.codeUnitAt](start);
-      if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
-        core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
+      if (!dart.test(core._Uri._isAlphabeticCharacter(firstCodeUnit))) {
+        core._Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
       }
       let containsUpperCase = false;
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
         let codeUnit = scheme[dartx.codeUnitAt](i);
-        if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
-          core.Uri._fail(scheme, i, "Illegal scheme character");
+        if (!dart.test(core._Uri._isSchemeCharacter(codeUnit))) {
+          core._Uri._fail(scheme, i, "Illegal scheme character");
         }
-        if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
+        if (core._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core._UPPER_CASE_Z) {
           containsUpperCase = true;
         }
       }
       scheme = scheme[dartx.substring](start, end);
       if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
+      return core._Uri._canonicalizeScheme(scheme);
+    }
+    static _canonicalizeScheme(scheme) {
+      if (scheme == "http") return "http";
+      if (scheme == "file") return "file";
+      if (scheme == "https") return "https";
+      if (scheme == "package") return "package";
       return scheme;
     }
     static _makeUserInfo(userInfo, start, end) {
       if (userInfo == null) return "";
-      return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+      return core._Uri._normalizeOrSubstring(userInfo, start, end, core._Uri._userinfoTable);
     }
     static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
       let isFile = scheme == "file";
@@ -33887,30 +34201,32 @@
       }
       let result = null;
       if (path != null) {
-        result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
+        result = core._Uri._normalizeOrSubstring(path, start, end, core._Uri._pathCharOrSlashTable);
       } else {
-        result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
+        result = pathSegments[dartx.map](core.String)(dart.fn(s => core._Uri._uriEncode(core._Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
       }
       if (dart.test(dart.dload(result, 'isEmpty'))) {
         if (isFile) return "/";
       } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
         result = "/" + dart.notNull(core.String._check(result));
       }
-      result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
+      result = core._Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
       return core.String._check(result);
     }
     static _normalizePath(path, scheme, hasAuthority) {
       if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
-        return core.Uri._normalizeRelativePath(path);
+        return core._Uri._normalizeRelativePath(path, dart.test(scheme[dartx.isNotEmpty]) || dart.test(hasAuthority));
       }
-      return core.Uri._removeDotSegments(path);
+      return core._Uri._removeDotSegments(path);
     }
     static _makeQuery(query, start, end, queryParameters) {
-      if (query == null && queryParameters == null) return null;
-      if (query != null && queryParameters != null) {
-        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+      if (query != null) {
+        if (queryParameters != null) {
+          dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+        }
+        return core._Uri._normalizeOrSubstring(query, start, end, core._Uri._queryCharTable);
       }
-      if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
+      if (queryParameters == null) return null;
       let result = new core.StringBuffer();
       let separator = "";
       function writeParameter(key, value) {
@@ -33938,52 +34254,40 @@
     }
     static _makeFragment(fragment, start, end) {
       if (fragment == null) return null;
-      return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
-    }
-    static _stringOrNullLength(s) {
-      return s == null ? 0 : s[dartx.length];
+      return core._Uri._normalizeOrSubstring(fragment, start, end, core._Uri._queryCharTable);
     }
     static _normalizeEscape(source, index, lowerCase) {
-      dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
+      dart.assert(source[dartx.codeUnitAt](index) == core._PERCENT);
       if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
         return "%";
       }
       let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
       let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
-      let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
-      let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
+      let firstDigitValue = _internal.hexDigitValue(firstDigit);
+      let secondDigitValue = _internal.hexDigitValue(secondDigit);
       if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
         return "%";
       }
       let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
-      if (dart.test(core.Uri._isUnreservedChar(value))) {
-        if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
+      if (dart.test(core._Uri._isUnreservedChar(value))) {
+        if (dart.test(lowerCase) && core._UPPER_CASE_A <= value && core._UPPER_CASE_Z >= value) {
           value = (value | 32) >>> 0;
         }
         return core.String.fromCharCode(value);
       }
-      if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
+      if (dart.notNull(firstDigit) >= core._LOWER_CASE_A || dart.notNull(secondDigit) >= core._LOWER_CASE_A) {
         return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
       }
       return null;
     }
-    static _parseHexDigit(char) {
-      let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
-      if (digit <= 9) return digit;
-      let lowerCase = (dart.notNull(char) | 32) >>> 0;
-      if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
-        return lowerCase - (core.Uri._LOWER_CASE_A - 10);
-      }
-      return -1;
-    }
     static _escapeChar(char) {
       dart.assert(dart.notNull(char) <= 1114111);
       let codeUnits = null;
       if (dart.notNull(char) < 128) {
         codeUnits = ListOfint().new(3);
-        codeUnits[dartx._set](0, core.Uri._PERCENT);
-        codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
-        codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
+        codeUnits[dartx._set](0, core._PERCENT);
+        codeUnits[dartx._set](1, core._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
+        codeUnits[dartx._set](2, core._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
       } else {
         let flag = 192;
         let encodedBytes = 2;
@@ -33999,16 +34303,21 @@
         let index = 0;
         while (--encodedBytes >= 0) {
           let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
-          codeUnits[dartx._set](index, core.Uri._PERCENT);
-          codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
+          codeUnits[dartx._set](index, core._PERCENT);
+          codeUnits[dartx._set](index + 1, core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+          codeUnits[dartx._set](index + 2, core._hexDigits[dartx.codeUnitAt](byte & 15));
           index = index + 3;
           flag = 128;
         }
       }
       return core.String.fromCharCodes(codeUnits);
     }
-    static _normalize(component, start, end, charTable) {
+    static _normalizeOrSubstring(component, start, end, charTable) {
+      let l = core._Uri._normalize(component, start, end, charTable);
+      return l != null ? l : component[dartx.substring](start, end);
+    }
+    static _normalize(component, start, end, charTable, opts) {
+      let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
       let buffer = null;
       let sectionStart = start;
       let index = start;
@@ -34019,8 +34328,8 @@
         } else {
           let replacement = null;
           let sourceLength = null;
-          if (char == core.Uri._PERCENT) {
-            replacement = core.Uri._normalizeEscape(component, index, false);
+          if (char == core._PERCENT) {
+            replacement = core._Uri._normalizeEscape(component, index, false);
             if (replacement == null) {
               index = dart.notNull(index) + 3;
               continue;
@@ -34031,8 +34340,8 @@
             } else {
               sourceLength = 3;
             }
-          } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-            core.Uri._fail(component, index, "Invalid character");
+          } else if (!dart.test(escapeDelimiters) && dart.test(core._Uri._isGeneralDelimiter(char))) {
+            core._Uri._fail(component, index, "Invalid character");
           } else {
             sourceLength = 1;
             if ((dart.notNull(char) & 64512) == 55296) {
@@ -34044,7 +34353,7 @@
                 }
               }
             }
-            replacement = core.Uri._escapeChar(char);
+            replacement = core._Uri._escapeChar(char);
           }
           if (buffer == null) buffer = new core.StringBuffer();
           buffer.write(component[dartx.substring](sectionStart, index));
@@ -34054,7 +34363,7 @@
         }
       }
       if (buffer == null) {
-        return component[dartx.substring](start, end);
+        return null;
       }
       if (dart.notNull(sectionStart) < dart.notNull(end)) {
         buffer.write(component[dartx.substring](sectionStart, end));
@@ -34062,10 +34371,10 @@
       return dart.toString(buffer);
     }
     static _isSchemeCharacter(ch) {
-      return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+      return dart.notNull(ch) < 128 && (dart.notNull(core._Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
     }
     static _isGeneralDelimiter(ch) {
-      return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+      return dart.notNull(ch) <= core._RIGHT_BRACKET && (dart.notNull(core._Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
     }
     get isAbsolute() {
       return this.scheme != "" && this.fragment == "";
@@ -34084,7 +34393,7 @@
           break;
         }
         let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
-        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
+        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core._DOT)) {
           break;
         }
         baseEnd = newEnd;
@@ -34098,7 +34407,7 @@
       return index != -1;
     }
     static _removeDotSegments(path) {
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+      if (!dart.test(core._Uri._mayContainDotSegments(path))) return path;
       dart.assert(path[dartx.isNotEmpty]);
       let output = JSArrayOfString().of([]);
       let appendSlash = false;
@@ -34121,9 +34430,12 @@
       if (appendSlash) output[dartx.add]("");
       return output[dartx.join]("/");
     }
-    static _normalizeRelativePath(path) {
+    static _normalizeRelativePath(path, allowScheme) {
       dart.assert(!dart.test(path[dartx.startsWith]('/')));
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+      if (!dart.test(core._Uri._mayContainDotSegments(path))) {
+        if (!dart.test(allowScheme)) path = core._Uri._escapeScheme(path);
+        return path;
+      }
       dart.assert(path[dartx.isNotEmpty]);
       let output = JSArrayOfString().of([]);
       let appendSlash = false;
@@ -34146,8 +34458,23 @@
         return "./";
       }
       if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
+      if (!dart.test(allowScheme)) output[dartx._set](0, core._Uri._escapeScheme(output[dartx._get](0)));
       return output[dartx.join]("/");
     }
+    static _escapeScheme(path) {
+      if (dart.notNull(path[dartx.length]) >= 2 && dart.test(core._Uri._isAlphabeticCharacter(path[dartx.codeUnitAt](0)))) {
+        for (let i = 1; i < dart.notNull(path[dartx.length]); i++) {
+          let char = path[dartx.codeUnitAt](i);
+          if (char == core._COLON) {
+            return dart.str`${path[dartx.substring](0, i)}%3A${path[dartx.substring](i + 1)}`;
+          }
+          if (dart.notNull(char) > 127 || (dart.notNull(core._Uri._schemeTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) == 0) {
+            break;
+          }
+        }
+      }
+      return path;
+    }
     resolve(reference) {
       return this.resolveUri(core.Uri.parse(reference));
     }
@@ -34165,7 +34492,7 @@
           targetHost = reference.host;
           targetPort = dart.test(reference.hasPort) ? reference.port : null;
         }
-        targetPath = core.Uri._removeDotSegments(reference.path);
+        targetPath = core._Uri._removeDotSegments(reference.path);
         if (dart.test(reference.hasQuery)) {
           targetQuery = reference.query;
         }
@@ -34174,15 +34501,15 @@
         if (dart.test(reference.hasAuthority)) {
           targetUserInfo = reference.userInfo;
           targetHost = reference.host;
-          targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
-          targetPath = core.Uri._removeDotSegments(reference.path);
+          targetPort = core._Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
+          targetPath = core._Uri._removeDotSegments(reference.path);
           if (dart.test(reference.hasQuery)) targetQuery = reference.query;
         } else {
           targetUserInfo = this[_userInfo];
           targetHost = this[_host];
           targetPort = this[_port];
           if (reference.path == "") {
-            targetPath = this[_path];
+            targetPath = this.path;
             if (dart.test(reference.hasQuery)) {
               targetQuery = reference.query;
             } else {
@@ -34190,20 +34517,24 @@
             }
           } else {
             if (dart.test(reference.hasAbsolutePath)) {
-              targetPath = core.Uri._removeDotSegments(reference.path);
+              targetPath = core._Uri._removeDotSegments(reference.path);
             } else {
               if (dart.test(this.hasEmptyPath)) {
-                if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
-                  targetPath = reference.path;
+                if (!dart.test(this.hasAuthority)) {
+                  if (!dart.test(this.hasScheme)) {
+                    targetPath = reference.path;
+                  } else {
+                    targetPath = core._Uri._removeDotSegments(reference.path);
+                  }
                 } else {
-                  targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
+                  targetPath = core._Uri._removeDotSegments("/" + dart.notNull(reference.path));
                 }
               } else {
-                let mergedPath = this[_mergePaths](this[_path], reference.path);
+                let mergedPath = this[_mergePaths](this.path, reference.path);
                 if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
-                  targetPath = core.Uri._removeDotSegments(mergedPath);
+                  targetPath = core._Uri._removeDotSegments(mergedPath);
                 } else {
-                  targetPath = core.Uri._normalizeRelativePath(mergedPath);
+                  targetPath = core._Uri._normalizeRelativePath(mergedPath, dart.test(this.hasScheme) || dart.test(this.hasAuthority));
                 }
               }
             }
@@ -34212,7 +34543,7 @@
         }
       }
       let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
-      return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
+      return new core._Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
     }
     get hasScheme() {
       return this.scheme[dartx.isNotEmpty];
@@ -34230,18 +34561,21 @@
       return this[_fragment] != null;
     }
     get hasEmptyPath() {
-      return this[_path][dartx.isEmpty];
+      return this.path[dartx.isEmpty];
     }
     get hasAbsolutePath() {
-      return this[_path][dartx.startsWith]('/');
+      return this.path[dartx.startsWith]('/');
     }
     get origin() {
-      if (this.scheme == "" || this[_host] == null || this[_host] == "") {
+      if (this.scheme == "") {
         dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
       }
       if (this.scheme != "http" && this.scheme != "https") {
         dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
       }
+      if (this[_host] == null || this[_host] == "") {
+        dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+      }
       if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
       return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
     }
@@ -34256,43 +34590,46 @@
       if (this.fragment != "") {
         dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
       }
-      if (windows == null) windows = core.Uri._isWindows;
-      return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
+      if (windows == null) windows = core._Uri._isWindows;
+      return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
     }
     [_toFilePath]() {
-      if (this.host != "") {
+      if (dart.test(this.hasAuthority) && this.host != "") {
         dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
       }
-      core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
+      let pathSegments = this.pathSegments;
+      core._Uri._checkNonWindowsPathReservedCharacters(pathSegments, false);
       let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute])) result.write("/");
-      result.writeAll(this.pathSegments, "/");
+      if (dart.test(this.hasAbsolutePath)) result.write("/");
+      result.writeAll(pathSegments, "/");
       return result.toString();
     }
-    [_toWindowsFilePath]() {
+    static _toWindowsFilePath(uri) {
       let hasDriveLetter = false;
-      let segments = this.pathSegments;
-      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
-        core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
+      let segments = uri.pathSegments;
+      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core._COLON) {
+        core._Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
+        core._Uri._checkWindowsPathReservedCharacters(segments, false, 1);
         hasDriveLetter = true;
       } else {
-        core.Uri._checkWindowsPathReservedCharacters(segments, false);
+        core._Uri._checkWindowsPathReservedCharacters(segments, false, 0);
       }
       let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
-      if (this.host != "") {
-        result.write("\\");
-        result.write(this.host);
-        result.write("\\");
+      if (dart.test(uri.hasAbsolutePath) && !hasDriveLetter) result.write("\\");
+      if (dart.test(uri.hasAuthority)) {
+        let host = uri.host;
+        if (dart.test(host[dartx.isNotEmpty])) {
+          result.write("\\");
+          result.write(host);
+          result.write("\\");
+        }
       }
       result.writeAll(segments, "\\");
       if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
       return result.toString();
     }
     get [_isPathAbsolute]() {
-      if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
-      return this.path[dartx.startsWith]('/');
+      return this.path != null && dart.test(this.path[dartx.startsWith]('/'));
     }
     [_writeAuthority](ss) {
       if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
@@ -34309,9 +34646,17 @@
       return this.scheme == "data" ? core.UriData.fromUri(this) : null;
     }
     toString() {
+      let t = this[_text];
+      return t == null ? this[_text] = this[_initializeText]() : t;
+    }
+    [_initializeText]() {
+      dart.assert(this[_text] == null);
       let sb = new core.StringBuffer();
-      core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
-      if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
+      if (dart.test(this.scheme[dartx.isNotEmpty])) {
+        sb.write(this.scheme);
+        sb.write(":");
+      }
+      if (dart.test(this.hasAuthority) || this.scheme == "file") {
         sb.write("//");
         this[_writeAuthority](sb);
       }
@@ -34327,58 +34672,16 @@
       return sb.toString();
     }
     ['=='](other) {
-      if (!core.Uri.is(other)) return false;
-      let uri = core.Uri._check(other);
-      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+      if (core.identical(this, other)) return true;
+      if (core.Uri.is(other)) {
+        let uri = other;
+        return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+      }
+      return false;
     }
     get hashCode() {
-      function combine(part, current) {
-        return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
-      }
-      dart.fn(combine, dynamicAnddynamicToint());
-      return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
-    }
-    static _addIfNonEmpty(sb, test, first, second) {
-      if ("" != test) {
-        sb.write(first);
-        sb.write(second);
-      }
-    }
-    static encodeComponent(component) {
-      return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
-    }
-    static encodeQueryComponent(component, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
-    }
-    static decodeComponent(encodedComponent) {
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
-    }
-    static decodeQueryComponent(encodedComponent, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
-    }
-    static encodeFull(uri) {
-      return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
-    }
-    static decodeFull(uri) {
-      return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
-    }
-    static splitQueryString(query, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
-        let index = element[dartx.indexOf]("=");
-        if (index == -1) {
-          if (element != "") {
-            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
-          }
-        } else if (index != 0) {
-          let key = element[dartx.substring](0, index);
-          let value = element[dartx.substring](dart.notNull(index) + 1);
-          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
-        }
-        return map;
-      }, MapOfString$StringAndStringToMapOfString$String()));
+      let t = this[_hashCodeCache];
+      return t == null ? this[_hashCodeCache] = dart.hashCode(this.toString()) : t;
     }
     static _createList() {
       return [];
@@ -34394,22 +34697,20 @@
         let value = null;
         if (start == end) return;
         if (dart.notNull(equalsIndex) < 0) {
-          key = core.Uri._uriDecode(query, start, end, encoding, true);
+          key = core._Uri._uriDecode(query, start, end, encoding, true);
           value = "";
         } else {
-          key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
-          value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
+          key = core._Uri._uriDecode(query, start, equalsIndex, encoding, true);
+          value = core._Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
         }
-        dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
+        dart.dsend(result[dartx.putIfAbsent](key, core._Uri._createList), 'add', value);
       }
       dart.fn(parsePair, intAndintAndintTovoid());
-      let _equals = 61;
-      let _ampersand = 38;
       while (i < dart.notNull(query[dartx.length])) {
         let char = query[dartx.codeUnitAt](i);
-        if (char == _equals) {
+        if (char == core._EQUALS) {
           if (equalsIndex < 0) equalsIndex = i;
-        } else if (char == _ampersand) {
+        } else if (char == core._AMPERSAND) {
           parsePair(start, equalsIndex, i);
           start = i + 1;
           equalsIndex = -1;
@@ -34419,125 +34720,17 @@
       parsePair(start, equalsIndex, i);
       return result;
     }
-    static parseIPv4Address(host) {
-      function error(msg) {
-        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
-      }
-      dart.fn(error, StringTovoid$());
-      let bytes = host[dartx.split]('.');
-      if (bytes[dartx.length] != 4) {
-        error('IPv4 address should contain exactly 4 parts');
-      }
-      return bytes[dartx.map](core.int)(dart.fn(byteString => {
-        let byte = core.int.parse(byteString);
-        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-          error('each part must be in the range of `0..255`');
-        }
-        return byte;
-      }, StringToint$()))[dartx.toList]();
-    }
-    static parseIPv6Address(host, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (end == null) end = host[dartx.length];
-      function error(msg, position) {
-        if (position === void 0) position = null;
-        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
-      }
-      dart.fn(error, String__Tovoid());
-      function parseHex(start, end) {
-        if (dart.notNull(end) - dart.notNull(start) > 4) {
-          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-        }
-        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
-        if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
-          error('each part must be in the range of `0x0..0xFFFF`', start);
-        }
-        return value;
-      }
-      dart.fn(parseHex, intAndintToint());
-      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
-      let parts = JSArrayOfint().of([]);
-      let wildcardSeen = false;
-      let partStart = start;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-          if (i == start) {
-            i = dart.notNull(i) + 1;
-            if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
-              error('invalid start colon.', i);
-            }
-            partStart = i;
-          }
-          if (i == partStart) {
-            if (wildcardSeen) {
-              error('only one wildcard `::` is allowed', i);
-            }
-            wildcardSeen = true;
-            parts[dartx.add](-1);
-          } else {
-            parts[dartx.add](parseHex(partStart, i));
-          }
-          partStart = dart.notNull(i) + 1;
-        }
-      }
-      if (parts[dartx.length] == 0) error('too few parts');
-      let atEnd = partStart == end;
-      let isLastWildcard = parts[dartx.last] == -1;
-      if (atEnd && !isLastWildcard) {
-        error('expected a part after last `:`', end);
-      }
-      if (!atEnd) {
-        try {
-          parts[dartx.add](parseHex(partStart, end));
-        } catch (e) {
-          try {
-            let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
-            parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
-            parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
-          } catch (e) {
-            error('invalid end of IPv6 address.', partStart);
-          }
-
-        }
-
-      }
-      if (wildcardSeen) {
-        if (dart.notNull(parts[dartx.length]) > 7) {
-          error('an address with a wildcard must have less than 7 parts');
-        }
-      } else if (parts[dartx.length] != 8) {
-        error('an address without a wildcard must contain exactly 8 parts');
-      }
-      let bytes = typed_data.Uint8List.new(16);
-      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
-        let value = parts[dartx._get](i);
-        if (value == -1) {
-          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
-          for (let j = 0; j < wildCardLength; j++) {
-            bytes[dartx._set](index, 0);
-            bytes[dartx._set](index + 1, 0);
-            index = index + 2;
-          }
-        } else {
-          bytes[dartx._set](index, value[dartx['>>']](8));
-          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
-          index = index + 2;
-        }
-      }
-      return bytes;
-    }
     static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
-      if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
+      if (core.identical(encoding, convert.UTF8) && dart.test(core._Uri._needsNoEncoding.hasMatch(text))) {
         return text;
       }
-      let result = new core.StringBuffer();
+      let result = new core.StringBuffer('');
       let bytes = encoding.encode(text);
       for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
         let byte = bytes[dartx._get](i);
         if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
           result.writeCharCode(byte);
-        } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
+        } else if (dart.test(spaceToPlus) && byte == core._SPACE) {
           result.write('+');
         } else {
           let hexDigits = '0123456789ABCDEF';
@@ -34573,7 +34766,7 @@
       let simple = true;
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
         let codeUnit = text[dartx.codeUnitAt](i);
-        if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+        if (dart.notNull(codeUnit) > 127 || codeUnit == core._PERCENT || dart.test(plusToSpace) && codeUnit == core._PLUS) {
           simple = false;
           break;
         }
@@ -34592,14 +34785,14 @@
           if (dart.notNull(codeUnit) > 127) {
             dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
           }
-          if (codeUnit == core.Uri._PERCENT) {
+          if (codeUnit == core._PERCENT) {
             if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
               dart.throw(new core.ArgumentError('Truncated URI'));
             }
-            bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
+            bytes[dartx.add](core._Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
             i = dart.notNull(i) + 2;
-          } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-            bytes[dartx.add](core.Uri._SPACE);
+          } else if (dart.test(plusToSpace) && codeUnit == core._PLUS) {
+            bytes[dartx.add](core._SPACE);
           } else {
             bytes[dartx.add](codeUnit);
           }
@@ -34609,23 +34802,26 @@
     }
     static _isAlphabeticCharacter(codeUnit) {
       let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
-      return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
+      return core._LOWER_CASE_A <= lowerCase && lowerCase <= core._LOWER_CASE_Z;
     }
     static _isUnreservedChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+      return dart.notNull(char) < 127 && (dart.notNull(core._Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
     }
   };
-  dart.defineNamedConstructor(core.Uri, '_internal');
-  dart.setSignature(core.Uri, {
+  dart.defineNamedConstructor(core._Uri, '_internal');
+  core._Uri[dart.implements] = () => [core.Uri];
+  dart.setSignature(core._Uri, {
     fields: () => ({
       scheme: core.String,
       [_userInfo]: core.String,
       [_host]: core.String,
       [_port]: core.int,
-      [_path]: core.String,
+      path: core.String,
       [_query]: core.String,
       [_fragment]: core.String,
       [_pathSegments]: ListOfString(),
+      [_text]: core.String,
+      [_hashCodeCache]: core.int,
       [_queryParameters]: MapOfString$String(),
       [_queryParameterLists]: MapOfString$ListOfString()
     }),
@@ -34634,7 +34830,6 @@
       userInfo: dart.definiteFunctionType(core.String, []),
       host: dart.definiteFunctionType(core.String, []),
       port: dart.definiteFunctionType(core.int, []),
-      path: dart.definiteFunctionType(core.String, []),
       query: dart.definiteFunctionType(core.String, []),
       fragment: dart.definiteFunctionType(core.String, []),
       pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
@@ -34653,6 +34848,7 @@
       data: dart.definiteFunctionType(core.UriData, [])
     }),
     methods: () => ({
+      isScheme: dart.definiteFunctionType(core.bool, [core.String]),
       replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
       removeFragment: dart.definiteFunctionType(core.Uri, []),
       normalizePath: dart.definiteFunctionType(core.Uri, []),
@@ -34661,12 +34857,12 @@
       resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
       toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
       [_toFilePath]: dart.definiteFunctionType(core.String, []),
-      [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
-      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
+      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink]),
+      [_initializeText]: dart.definiteFunctionType(core.String, [])
     }),
     statics: () => ({
       _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
-      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+      _compareScheme: dart.definiteFunctionType(core.bool, [core.String, core.String]),
       _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
       _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
       _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
@@ -34679,85 +34875,50 @@
       _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
       _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
       _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+      _canonicalizeScheme: dart.definiteFunctionType(core.String, [core.String]),
       _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
       _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
       _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
       _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
       _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
       _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
-      _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
       _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
-      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+      _normalizeOrSubstring: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()], {escapeDelimiters: core.bool}),
       _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
       _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
       _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
       _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
-      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
-      _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
-      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String, core.bool]),
+      _escapeScheme: dart.definiteFunctionType(core.String, [core.String]),
+      _toWindowsFilePath: dart.definiteFunctionType(core.String, [core.Uri]),
       _createList: dart.definiteFunctionType(core.List, []),
       _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
-      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
       _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
       _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
       _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
       _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
       _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
     }),
-    names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
+    names: ['_defaultPort', '_compareScheme', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_canonicalizeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_normalizeEscape', '_escapeChar', '_normalizeOrSubstring', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_escapeScheme', '_toWindowsFilePath', '_createList', '_splitQueryStringAll', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
   });
-  core.Uri._SPACE = 32;
-  core.Uri._DOUBLE_QUOTE = 34;
-  core.Uri._NUMBER_SIGN = 35;
-  core.Uri._PERCENT = 37;
-  core.Uri._ASTERISK = 42;
-  core.Uri._PLUS = 43;
-  core.Uri._DOT = 46;
-  core.Uri._SLASH = 47;
-  core.Uri._ZERO = 48;
-  core.Uri._NINE = 57;
-  core.Uri._COLON = 58;
-  core.Uri._LESS = 60;
-  core.Uri._GREATER = 62;
-  core.Uri._QUESTION = 63;
-  core.Uri._AT_SIGN = 64;
-  core.Uri._UPPER_CASE_A = 65;
-  core.Uri._UPPER_CASE_F = 70;
-  core.Uri._UPPER_CASE_Z = 90;
-  core.Uri._LEFT_BRACKET = 91;
-  core.Uri._BACKSLASH = 92;
-  core.Uri._RIGHT_BRACKET = 93;
-  core.Uri._LOWER_CASE_A = 97;
-  core.Uri._LOWER_CASE_F = 102;
-  core.Uri._LOWER_CASE_Z = 122;
-  core.Uri._BAR = 124;
-  core.Uri._hexDigits = "0123456789ABCDEF";
-  core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
-  core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
-  core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
-  core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
-  dart.defineLazy(core.Uri, {
+  core._Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
+  core._Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
+  core._Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
+  core._Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
+  dart.defineLazy(core._Uri, {
     get _needsNoEncoding() {
       return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
     }
   });
-  const _text = Symbol('_text');
   const _separatorIndices = Symbol('_separatorIndices');
   const _uriCache = Symbol('_uriCache');
   core.UriData = class UriData extends core.Object {
@@ -34841,9 +35002,9 @@
         if (dart.notNull(slashIndex) < 0) {
           dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
         }
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
         buffer.write("/");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
       }
       if (charsetName != null) {
         if (indices != null) {
@@ -34851,7 +35012,7 @@
           indices[dartx.add](dart.notNull(buffer.length) + 8);
         }
         buffer.write(";charset=");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
       }
       dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
         if (dart.test(key[dartx.isEmpty])) {
@@ -34862,17 +35023,17 @@
         }
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write(';');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write('=');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
       }, StringAndStringToNull())));
     }
     static _validateMimeType(mimeType) {
       let slashIndex = -1;
       for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
         let char = mimeType[dartx.codeUnitAt](i);
-        if (char != core.Uri._SLASH) continue;
+        if (char != core._SLASH) continue;
         if (slashIndex < 0) {
           slashIndex = i;
           continue;
@@ -34882,10 +35043,16 @@
       return slashIndex;
     }
     static parse(uri) {
-      if (!dart.test(uri[dartx.startsWith]("data:"))) {
-        dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
+      if (dart.notNull(uri[dartx.length]) >= 5) {
+        let dataDelta = core._startsWithData(uri, 0);
+        if (dataDelta == 0) {
+          return core.UriData._parse(uri, 5, null);
+        }
+        if (dataDelta == 32) {
+          return core.UriData._parse(uri[dartx.substring](5), 0, null);
+        }
       }
-      return core.UriData._parse(uri, 5, null);
+      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
     }
     get uri() {
       if (this[_uriCache] != null) return this[_uriCache];
@@ -34893,20 +35060,20 @@
       let query = null;
       let colonIndex = this[_separatorIndices][dartx._get](0);
       let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
-      let end = null;
+      let end = this[_text][dartx.length];
       if (dart.notNull(queryIndex) >= 0) {
-        query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
+        query = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(queryIndex) + 1, end, core._Uri._queryCharTable);
         end = queryIndex;
       }
-      path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
-      this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
+      path = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(colonIndex) + 1, end, core._Uri._pathCharOrSlashTable);
+      this[_uriCache] = new core._DataUri(this, path, query);
       return this[_uriCache];
     }
     get mimeType() {
       let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
       let end = this[_separatorIndices][dartx._get](1);
       if (start == end) return "text/plain";
-      return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
+      return core._Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
     }
     get charset() {
       let parameterStart = 1;
@@ -34918,7 +35085,7 @@
         let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
         let keyEnd = this[_separatorIndices][dartx._get](i + 1);
         if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
-          return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
+          return core._Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
         }
       }
       return "US-ASCII";
@@ -34956,10 +35123,8 @@
           result[dartx._set](index++, codeUnit);
         } else {
           if (i + 2 < dart.notNull(text[dartx.length])) {
-            let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
-            let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
-            if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
-              let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
+            let byte = _internal.parseHexByte(text, i + 1);
+            if (dart.notNull(byte) >= 0) {
               result[dartx._set](index++, byte);
               i = i + 2;
               continue;
@@ -34986,7 +35151,7 @@
         let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
         return converter.convert(text[dartx.substring](start));
       }
-      return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
+      return core._Uri._uriDecode(text, start, text[dartx.length], encoding, false);
     }
     get parameters() {
       let result = dart.map({}, core.String, core.String);
@@ -34994,8 +35159,8 @@
         let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
         let equals = this[_separatorIndices][dartx._get](i - 1);
         let end = this[_separatorIndices][dartx._get](i);
-        let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
-        let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
+        let key = core._Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
+        let value = core._Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
         result[dartx._set](key, value);
       }
       return result;
@@ -35048,6 +35213,15 @@
         }
       }
       indices[dartx.add](i);
+      let isBase64 = indices[dartx.length][dartx.isOdd];
+      if (dart.test(isBase64)) {
+        text = convert.BASE64.normalize(text, dart.notNull(i) + 1, text[dartx.length]);
+      } else {
+        let data = core._Uri._normalize(text, dart.notNull(i) + 1, text[dartx.length], core.UriData._uricTable, {escapeDelimiters: true});
+        if (data != null) {
+          text = text[dartx.replaceRange](dart.notNull(i) + 1, text[dartx.length], data);
+        }
+      }
       return new core.UriData._(text, indices, sourceUri);
     }
     static _uriEncodeBytes(canonicalTable, bytes, buffer) {
@@ -35058,9 +35232,9 @@
         if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
           buffer.writeCharCode(byte);
         } else {
-          buffer.writeCharCode(core.Uri._PERCENT);
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+          buffer.writeCharCode(core._PERCENT);
+          buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+          buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
         }
       }
       if ((dart.notNull(byteOr) & ~255) != 0) {
@@ -35106,7 +35280,667 @@
   });
   core.UriData._noScheme = -1;
   core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
-  core.UriData._uricTable = core.Uri._queryCharTable;
+  core.UriData._uricTable = core._Uri._queryCharTable;
+  core.UriData._base64Table = dart.constList([0, 0, 34816, 1023, 65534, 2047, 65534, 2047], core.int);
+  core._schemeEndIndex = 1;
+  core._hostStartIndex = 2;
+  core._portStartIndex = 3;
+  core._pathStartIndex = 4;
+  core._queryStartIndex = 5;
+  core._fragmentStartIndex = 6;
+  core._notSimpleIndex = 7;
+  core._uriStart = 0;
+  core._nonSimpleEndStates = 14;
+  core._schemeStart = 20;
+  dart.defineLazy(core, {
+    get _scannerTables() {
+      return core._createTables();
+    }
+  });
+  core._createTables = function() {
+    let stateCount = 22;
+    let schemeOrPath = 1;
+    let authOrPath = 2;
+    let authOrPathSlash = 3;
+    let uinfoOrHost0 = 4;
+    let uinfoOrHost = 5;
+    let uinfoOrPort0 = 6;
+    let uinfoOrPort = 7;
+    let ipv6Host = 8;
+    let relPathSeg = 9;
+    let pathSeg = 10;
+    let path = 11;
+    let query = 12;
+    let fragment = 13;
+    let schemeOrPathDot = 14;
+    let schemeOrPathDot2 = 15;
+    let relPathSegDot = 16;
+    let relPathSegDot2 = 17;
+    let pathSegDot = 18;
+    let pathSegDot2 = 19;
+    let scheme0 = core._schemeStart;
+    let scheme = 21;
+    let schemeEnd = core._schemeEndIndex << 5;
+    let hostStart = core._hostStartIndex << 5;
+    let portStart = core._portStartIndex << 5;
+    let pathStart = core._pathStartIndex << 5;
+    let queryStart = core._queryStartIndex << 5;
+    let fragmentStart = core._fragmentStartIndex << 5;
+    let notSimple = core._notSimpleIndex << 5;
+    let unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
+    let subDelims = "!$&'()*+,;=";
+    let pchar = dart.str`${unreserved}${subDelims}`;
+    let tables = ListOfUint8List().generate(stateCount, dart.fn(_ => typed_data.Uint8List.new(96), intToUint8List()));
+    function build(state, defaultTransition) {
+      return (() => {
+        let _ = tables[dartx._get](core.int._check(state));
+        _[dartx.fillRange](0, 96, core.int._check(defaultTransition));
+        return _;
+      })();
+    }
+    dart.fn(build, dynamicAnddynamicToUint8List());
+    function setChars(target, chars, transition) {
+      for (let i = 0; i < dart.notNull(chars[dartx.length]); i++) {
+        let char = chars[dartx.codeUnitAt](i);
+        target[dartx._set]((dart.notNull(char) ^ 96) >>> 0, transition);
+      }
+    }
+    dart.fn(setChars, Uint8ListAndStringAndintTovoid());
+    function setRange(target, range, transition) {
+      for (let i = range[dartx.codeUnitAt](0), n = range[dartx.codeUnitAt](1); dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1) {
+        target[dartx._set]((dart.notNull(i) ^ 96) >>> 0, transition);
+      }
+    }
+    dart.fn(setRange, Uint8ListAndStringAndintTovoid());
+    let b = null;
+    b = build(core._uriStart, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot);
+    setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", authOrPathSlash);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPathDot, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot2);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPathDot2, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), "%", (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPath, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(authOrPath, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, (path | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (authOrPathSlash | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ".", (pathSegDot | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(authOrPathSlash, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrHost0, (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+    setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "[", (ipv6Host | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrHost, (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+    setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrPort0, (uinfoOrPort | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "19", uinfoOrPort);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrPort, (uinfoOrPort | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "09", uinfoOrPort);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(ipv6Host, ipv6Host);
+    setChars(typed_data.Uint8List._check(b), "]", uinfoOrHost);
+    b = build(relPathSeg, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", relPathSegDot);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(relPathSegDot, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", relPathSegDot2);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(relPathSegDot2, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSeg, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSegDot, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot2);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSegDot2, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(path, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(query, (query | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, query);
+    setChars(typed_data.Uint8List._check(b), "?", query);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(fragment, (fragment | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, fragment);
+    setChars(typed_data.Uint8List._check(b), "?", fragment);
+    b = build(scheme0, (scheme | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "az", scheme);
+    b = build(scheme, (scheme | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "az", scheme);
+    setRange(typed_data.Uint8List._check(b), "09", scheme);
+    setChars(typed_data.Uint8List._check(b), "+-.", scheme);
+    return tables;
+  };
+  dart.lazyFn(core._createTables, () => VoidToListOfUint8List());
+  core._scan = function(uri, start, end, state, indices) {
+    let tables = core._scannerTables;
+    dart.assert(dart.notNull(end) <= dart.notNull(uri[dartx.length]));
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let table = tables[dartx._get](state);
+      let char = (dart.notNull(uri[dartx.codeUnitAt](i)) ^ 96) >>> 0;
+      if (char > 95) char = 31;
+      let transition = table[dartx._get](char);
+      state = dart.notNull(transition) & 31;
+      indices[dartx._set](transition[dartx['>>']](5), i);
+    }
+    return state;
+  };
+  dart.fn(core._scan, StringAndintAndint__Toint());
+  const _uri = Symbol('_uri');
+  const _schemeEnd = Symbol('_schemeEnd');
+  const _hostStart = Symbol('_hostStart');
+  const _portStart = Symbol('_portStart');
+  const _pathStart = Symbol('_pathStart');
+  const _queryStart = Symbol('_queryStart');
+  const _fragmentStart = Symbol('_fragmentStart');
+  const _schemeCache = Symbol('_schemeCache');
+  const _isFile = Symbol('_isFile');
+  const _isHttp = Symbol('_isHttp');
+  const _isHttps = Symbol('_isHttps');
+  const _isPackage = Symbol('_isPackage');
+  const _isScheme = Symbol('_isScheme');
+  let const$52;
+  let const$53;
+  let const$54;
+  const _isPort = Symbol('_isPort');
+  const _simpleMerge = Symbol('_simpleMerge');
+  const _toNonSimple = Symbol('_toNonSimple');
+  core._SimpleUri = class _SimpleUri extends core.Object {
+    new(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, schemeCache) {
+      this[_uri] = uri;
+      this[_schemeEnd] = schemeEnd;
+      this[_hostStart] = hostStart;
+      this[_portStart] = portStart;
+      this[_pathStart] = pathStart;
+      this[_queryStart] = queryStart;
+      this[_fragmentStart] = fragmentStart;
+      this[_schemeCache] = schemeCache;
+      this[_hashCodeCache] = null;
+    }
+    get hasScheme() {
+      return dart.notNull(this[_schemeEnd]) > 0;
+    }
+    get hasAuthority() {
+      return dart.notNull(this[_hostStart]) > 0;
+    }
+    get hasUserInfo() {
+      return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 4;
+    }
+    get hasPort() {
+      return dart.notNull(this[_hostStart]) > 0 && dart.notNull(this[_portStart]) + 1 < dart.notNull(this[_pathStart]);
+    }
+    get hasQuery() {
+      return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]);
+    }
+    get hasFragment() {
+      return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]);
+    }
+    get [_isFile]() {
+      return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("file"));
+    }
+    get [_isHttp]() {
+      return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("http"));
+    }
+    get [_isHttps]() {
+      return this[_schemeEnd] == 5 && dart.test(this[_uri][dartx.startsWith]("https"));
+    }
+    get [_isPackage]() {
+      return this[_schemeEnd] == 7 && dart.test(this[_uri][dartx.startsWith]("package"));
+    }
+    [_isScheme](scheme) {
+      return this[_schemeEnd] == scheme[dartx.length] && dart.test(this[_uri][dartx.startsWith](scheme));
+    }
+    get hasAbsolutePath() {
+      return this[_uri][dartx.startsWith]("/", this[_pathStart]);
+    }
+    get hasEmptyPath() {
+      return this[_pathStart] == this[_queryStart];
+    }
+    get isAbsolute() {
+      return dart.test(this.hasScheme) && !dart.test(this.hasFragment);
+    }
+    isScheme(scheme) {
+      if (scheme == null || dart.test(scheme[dartx.isEmpty])) return dart.notNull(this[_schemeEnd]) < 0;
+      if (scheme[dartx.length] != this[_schemeEnd]) return false;
+      return core._Uri._compareScheme(scheme, this[_uri]);
+    }
+    get scheme() {
+      if (dart.notNull(this[_schemeEnd]) <= 0) return "";
+      if (this[_schemeCache] != null) return this[_schemeCache];
+      if (dart.test(this[_isHttp])) {
+        this[_schemeCache] = "http";
+      } else if (dart.test(this[_isHttps])) {
+        this[_schemeCache] = "https";
+      } else if (dart.test(this[_isFile])) {
+        this[_schemeCache] = "file";
+      } else if (dart.test(this[_isPackage])) {
+        this[_schemeCache] = "package";
+      } else {
+        this[_schemeCache] = this[_uri][dartx.substring](0, this[_schemeEnd]);
+      }
+      return this[_schemeCache];
+    }
+    get authority() {
+      return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_pathStart]) : "";
+    }
+    get userInfo() {
+      return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 3 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, dart.notNull(this[_hostStart]) - 1) : "";
+    }
+    get host() {
+      return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](this[_hostStart], this[_portStart]) : "";
+    }
+    get port() {
+      if (dart.test(this.hasPort)) return core.int.parse(this[_uri][dartx.substring](dart.notNull(this[_portStart]) + 1, this[_pathStart]));
+      if (dart.test(this[_isHttp])) return 80;
+      if (dart.test(this[_isHttps])) return 443;
+      return 0;
+    }
+    get path() {
+      return this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+    }
+    get query() {
+      return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]) ? this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]) : "";
+    }
+    get fragment() {
+      return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]) ? this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1) : "";
+    }
+    get origin() {
+      let isHttp = this[_isHttp];
+      if (dart.notNull(this[_schemeEnd]) < 0) {
+        dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
+      }
+      if (!dart.test(isHttp) && !dart.test(this[_isHttps])) {
+        dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
+      }
+      if (this[_hostStart] == this[_portStart]) {
+        dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+      }
+      if (this[_hostStart] == dart.notNull(this[_schemeEnd]) + 3) {
+        return this[_uri][dartx.substring](0, this[_pathStart]);
+      }
+      return dart.notNull(this[_uri][dartx.substring](0, dart.notNull(this[_schemeEnd]) + 3)) + dart.notNull(this[_uri][dartx.substring](this[_hostStart], this[_pathStart]));
+    }
+    get pathSegments() {
+      let start = this[_pathStart];
+      let end = this[_queryStart];
+      if (dart.test(this[_uri][dartx.startsWith]("/", start))) {
+        start = dart.notNull(start) + 1;
+      }
+      if (start == end) return const$52 || (const$52 = dart.constList([], core.String));
+      let parts = JSArrayOfString().of([]);
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = this[_uri][dartx.codeUnitAt](i);
+        if (char == core._SLASH) {
+          parts[dartx.add](this[_uri][dartx.substring](start, i));
+          start = dart.notNull(i) + 1;
+        }
+      }
+      parts[dartx.add](this[_uri][dartx.substring](start, end));
+      return ListOfString().unmodifiable(parts);
+    }
+    get queryParameters() {
+      if (!dart.test(this.hasQuery)) return const$53 || (const$53 = dart.const(dart.map({}, core.String, core.String)));
+      return new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
+    }
+    get queryParametersAll() {
+      if (!dart.test(this.hasQuery)) return const$54 || (const$54 = dart.const(dart.map({}, core.String, ListOfString())));
+      let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
+      for (let key of queryParameterLists[dartx.keys]) {
+        queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+      }
+      return MapOfString$ListOfString().unmodifiable(queryParameterLists);
+    }
+    [_isPort](port) {
+      let portDigitStart = dart.notNull(this[_portStart]) + 1;
+      return portDigitStart + dart.notNull(port[dartx.length]) == this[_pathStart] && dart.test(this[_uri][dartx.startsWith](port, portDigitStart));
+    }
+    normalizePath() {
+      return this;
+    }
+    removeFragment() {
+      if (!dart.test(this.hasFragment)) return this;
+      return new core._SimpleUri(this[_uri][dartx.substring](0, this[_fragmentStart]), this[_schemeEnd], this[_hostStart], this[_portStart], this[_pathStart], this[_queryStart], this[_fragmentStart], this[_schemeCache]);
+    }
+    replace(opts) {
+      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
+      let host = opts && 'host' in opts ? opts.host : null;
+      let port = opts && 'port' in opts ? opts.port : null;
+      let path = opts && 'path' in opts ? opts.path : null;
+      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+      let query = opts && 'query' in opts ? opts.query : null;
+      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+      let schemeChanged = false;
+      if (scheme != null) {
+        scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+        schemeChanged = !dart.test(this[_isScheme](scheme));
+      } else {
+        scheme = this.scheme;
+      }
+      let isFile = scheme == "file";
+      if (userInfo != null) {
+        userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+      } else if (dart.notNull(this[_hostStart]) > 0) {
+        userInfo = this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_hostStart]);
+      } else {
+        userInfo = "";
+      }
+      if (port != null) {
+        port = core._Uri._makePort(port, scheme);
+      } else {
+        port = dart.test(this.hasPort) ? this.port : null;
+        if (schemeChanged) {
+          port = core._Uri._makePort(port, scheme);
+        }
+      }
+      if (host != null) {
+        host = core._Uri._makeHost(host, 0, host[dartx.length], false);
+      } else if (dart.notNull(this[_hostStart]) > 0) {
+        host = this[_uri][dartx.substring](this[_hostStart], this[_portStart]);
+      } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
+        host = "";
+      }
+      let hasAuthority = host != null;
+      if (path != null || pathSegments != null) {
+        path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      } else {
+        path = this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+        if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
+          path = "/" + dart.notNull(path);
+        }
+      }
+      if (query != null || queryParameters != null) {
+        query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+      } else if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+        query = this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]);
+      }
+      if (fragment != null) {
+        fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+      } else if (dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length])) {
+        fragment = this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1);
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    }
+    resolve(reference) {
+      return this.resolveUri(core.Uri.parse(reference));
+    }
+    resolveUri(reference) {
+      if (core._SimpleUri.is(reference)) {
+        return this[_simpleMerge](this, reference);
+      }
+      return this[_toNonSimple]().resolveUri(reference);
+    }
+    [_simpleMerge](base, ref) {
+      if (dart.test(ref.hasScheme)) return ref;
+      if (dart.test(ref.hasAuthority)) {
+        if (!dart.test(base.hasScheme)) return ref;
+        let isSimple = true;
+        if (dart.test(base[_isFile])) {
+          isSimple = !dart.test(ref.hasEmptyPath);
+        } else if (dart.test(base[_isHttp])) {
+          isSimple = !dart.test(ref[_isPort]("80"));
+        } else if (dart.test(base[_isHttps])) {
+          isSimple = !dart.test(ref[_isPort]("443"));
+        }
+        if (isSimple) {
+          let delta = dart.notNull(base[_schemeEnd]) + 1;
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, dart.notNull(base[_schemeEnd]) + 1)) + dart.notNull(ref[_uri][dartx.substring](dart.notNull(ref[_schemeEnd]) + 1));
+          return new core._SimpleUri(newUri, base[_schemeEnd], dart.notNull(ref[_hostStart]) + delta, dart.notNull(ref[_portStart]) + delta, dart.notNull(ref[_pathStart]) + delta, dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        } else {
+          return this[_toNonSimple]().resolveUri(ref);
+        }
+      }
+      if (dart.test(ref.hasEmptyPath)) {
+        if (dart.test(ref.hasQuery)) {
+          let delta = dart.notNull(base[_queryStart]) - dart.notNull(ref[_queryStart]);
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_queryStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_queryStart]));
+          return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        }
+        if (dart.test(ref.hasFragment)) {
+          let delta = dart.notNull(base[_fragmentStart]) - dart.notNull(ref[_fragmentStart]);
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_fragmentStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_fragmentStart]));
+          return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], base[_queryStart], dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        }
+        return base.removeFragment();
+      }
+      if (dart.test(ref.hasAbsolutePath)) {
+        let delta = dart.notNull(base[_pathStart]) - dart.notNull(ref[_pathStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_pathStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_pathStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      if (dart.test(base.hasEmptyPath) && dart.test(base.hasAuthority)) {
+        let refStart = ref[_pathStart];
+        while (dart.test(ref[_uri][dartx.startsWith]("../", refStart))) {
+          refStart = dart.notNull(refStart) + 3;
+        }
+        let delta = dart.notNull(base[_pathStart]) - dart.notNull(refStart) + 1;
+        let newUri = dart.str`${base[_uri][dartx.substring](0, base[_pathStart])}/` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      let baseUri = base[_uri];
+      let refUri = ref[_uri];
+      let baseStart = base[_pathStart];
+      let baseEnd = base[_queryStart];
+      while (dart.test(baseUri[dartx.startsWith]("../", baseStart))) {
+        baseStart = dart.notNull(baseStart) + 3;
+      }
+      let refStart = ref[_pathStart];
+      let refEnd = ref[_queryStart];
+      let backCount = 0;
+      while (dart.notNull(refStart) + 3 <= dart.notNull(refEnd) && dart.test(refUri[dartx.startsWith]("../", refStart))) {
+        refStart = dart.notNull(refStart) + 3;
+        backCount = backCount + 1;
+      }
+      let insert = "";
+      while (dart.notNull(baseEnd) > dart.notNull(baseStart)) {
+        baseEnd = dart.notNull(baseEnd) - 1;
+        let char = baseUri[dartx.codeUnitAt](baseEnd);
+        if (char == core._SLASH) {
+          insert = "/";
+          if (backCount == 0) break;
+          backCount--;
+        }
+      }
+      if (baseEnd == baseStart && !dart.test(base.hasScheme) && !dart.test(base.hasAbsolutePath)) {
+        insert = "";
+        refStart = dart.notNull(refStart) - backCount * 3;
+      }
+      let delta = dart.notNull(baseEnd) - dart.notNull(refStart) + dart.notNull(insert[dartx.length]);
+      let newUri = dart.str`${base[_uri][dartx.substring](0, baseEnd)}${insert}` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    toFilePath(opts) {
+      let windows = opts && 'windows' in opts ? opts.windows : null;
+      if (dart.notNull(this[_schemeEnd]) >= 0 && !dart.test(this[_isFile])) {
+        dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
+      }
+      if (dart.notNull(this[_queryStart]) < dart.notNull(this[_uri][dartx.length])) {
+        if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+          dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
+        }
+        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
+      }
+      if (windows == null) windows = core._Uri._isWindows;
+      return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
+    }
+    [_toFilePath]() {
+      if (dart.notNull(this[_hostStart]) < dart.notNull(this[_portStart])) {
+        dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
+      }
+      return this.path;
+    }
+    get data() {
+      dart.assert(this.scheme != "data");
+      return null;
+    }
+    get hashCode() {
+      return (() => {
+        let t = this[_hashCodeCache];
+        return t == null ? this[_hashCodeCache] = dart.hashCode(this[_uri]) : t;
+      })();
+    }
+    ['=='](other) {
+      if (core.identical(this, other)) return true;
+      if (core.Uri.is(other)) return this[_uri] == dart.toString(other);
+      return false;
+    }
+    [_toNonSimple]() {
+      return new core._Uri._internal(this.scheme, this.userInfo, dart.test(this.hasAuthority) ? this.host : null, dart.test(this.hasPort) ? this.port : null, this.path, dart.test(this.hasQuery) ? this.query : null, dart.test(this.hasFragment) ? this.fragment : null);
+    }
+    toString() {
+      return this[_uri];
+    }
+  };
+  core._SimpleUri[dart.implements] = () => [core.Uri];
+  dart.setSignature(core._SimpleUri, {
+    fields: () => ({
+      [_uri]: core.String,
+      [_schemeEnd]: core.int,
+      [_hostStart]: core.int,
+      [_portStart]: core.int,
+      [_pathStart]: core.int,
+      [_queryStart]: core.int,
+      [_fragmentStart]: core.int,
+      [_schemeCache]: core.String,
+      [_hashCodeCache]: core.int
+    }),
+    getters: () => ({
+      hasScheme: dart.definiteFunctionType(core.bool, []),
+      hasAuthority: dart.definiteFunctionType(core.bool, []),
+      hasUserInfo: dart.definiteFunctionType(core.bool, []),
+      hasPort: dart.definiteFunctionType(core.bool, []),
+      hasQuery: dart.definiteFunctionType(core.bool, []),
+      hasFragment: dart.definiteFunctionType(core.bool, []),
+      [_isFile]: dart.definiteFunctionType(core.bool, []),
+      [_isHttp]: dart.definiteFunctionType(core.bool, []),
+      [_isHttps]: dart.definiteFunctionType(core.bool, []),
+      [_isPackage]: dart.definiteFunctionType(core.bool, []),
+      hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
+      hasEmptyPath: dart.definiteFunctionType(core.bool, []),
+      isAbsolute: dart.definiteFunctionType(core.bool, []),
+      scheme: dart.definiteFunctionType(core.String, []),
+      authority: dart.definiteFunctionType(core.String, []),
+      userInfo: dart.definiteFunctionType(core.String, []),
+      host: dart.definiteFunctionType(core.String, []),
+      port: dart.definiteFunctionType(core.int, []),
+      path: dart.definiteFunctionType(core.String, []),
+      query: dart.definiteFunctionType(core.String, []),
+      fragment: dart.definiteFunctionType(core.String, []),
+      origin: dart.definiteFunctionType(core.String, []),
+      pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
+      queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+      queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
+      data: dart.definiteFunctionType(core.UriData, [])
+    }),
+    methods: () => ({
+      [_isScheme]: dart.definiteFunctionType(core.bool, [core.String]),
+      isScheme: dart.definiteFunctionType(core.bool, [core.String]),
+      [_isPort]: dart.definiteFunctionType(core.bool, [core.String]),
+      normalizePath: dart.definiteFunctionType(core.Uri, []),
+      removeFragment: dart.definiteFunctionType(core.Uri, []),
+      replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+      resolve: dart.definiteFunctionType(core.Uri, [core.String]),
+      resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
+      [_simpleMerge]: dart.definiteFunctionType(core.Uri, [core._SimpleUri, core._SimpleUri]),
+      toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
+      [_toFilePath]: dart.definiteFunctionType(core.String, []),
+      '==': dart.definiteFunctionType(core.bool, [core.Object]),
+      [_toNonSimple]: dart.definiteFunctionType(core.Uri, [])
+    })
+  });
+  const _data$ = Symbol('_data');
+  core._DataUri = class _DataUri extends core._Uri {
+    new(data, path, query) {
+      this[_data$] = data;
+      super._internal("data", null, null, null, path, query, null);
+    }
+    get data() {
+      return this[_data$];
+    }
+  };
+  dart.setSignature(core._DataUri, {
+    fields: () => ({[_data$]: core.UriData})
+  });
+  core._startsWithData = function(text, start) {
+    let delta = ((dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 4)) ^ core._COLON) >>> 0) * 3;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](start)) ^ 100) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 1)) ^ 97) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 2)) ^ 116) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 3)) ^ 97) >>> 0;
+    return delta;
+  };
+  dart.fn(core._startsWithData, StringAndintToint());
+  core._stringOrNullLength = function(s) {
+    return s == null ? 0 : s[dartx.length];
+  };
+  dart.fn(core._stringOrNullLength, StringToint$());
   developer.debugger = function(opts) {
     let when = opts && 'when' in opts ? opts.when : true;
     let message = opts && 'message' in opts ? opts.message : null;
@@ -35136,6 +35970,49 @@
     }
   });
   developer._clockValue = 0;
+  developer._FakeUserTag = class _FakeUserTag extends core.Object {
+    real(label) {
+      this.label = label;
+    }
+    static new(label) {
+      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+      if (existingTag != null) {
+        return developer._FakeUserTag._check(existingTag);
+      }
+      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+      }
+      let instance = new developer._FakeUserTag.real(label);
+      developer._FakeUserTag._instances[dartx._set](label, instance);
+      return instance;
+    }
+    makeCurrent() {
+      let old = developer._currentTag;
+      developer._currentTag = this;
+      return old;
+    }
+  };
+  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+  dart.setSignature(developer._FakeUserTag, {
+    fields: () => ({label: core.String}),
+    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
+  });
+  dart.defineLazy(developer._FakeUserTag, {
+    get _instances() {
+      return dart.map();
+    },
+    set _instances(_) {},
+    get _defaultTag() {
+      return developer._FakeUserTag.new('Default');
+    }
+  });
+  dart.defineLazy(developer, {
+    get _currentTag() {
+      return developer._FakeUserTag._defaultTag;
+    },
+    set _currentTag(_) {}
+  });
   const _result = Symbol('_result');
   const _errorCode = Symbol('_errorCode');
   const _errorDetail = Symbol('_errorDetail');
@@ -35257,7 +36134,7 @@
   dart.fn(developer.postEvent, StringAndMapTovoid());
   developer._postEvent = function(eventKind, eventData) {
   };
-  dart.fn(developer._postEvent, StringAndStringTodynamic());
+  dart.fn(developer._postEvent, StringAndStringTovoid$());
   developer._lookupExtension = function(method) {
     return developer._extensions[dartx._get](method);
   };
@@ -35275,49 +36152,6 @@
     }
   };
   developer.UserTag.MAX_USER_TAGS = 64;
-  developer._FakeUserTag = class _FakeUserTag extends core.Object {
-    real(label) {
-      this.label = label;
-    }
-    static new(label) {
-      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
-      if (existingTag != null) {
-        return developer._FakeUserTag._check(existingTag);
-      }
-      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
-        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
-      }
-      let instance = new developer._FakeUserTag.real(label);
-      developer._FakeUserTag._instances[dartx._set](label, instance);
-      return instance;
-    }
-    makeCurrent() {
-      let old = developer._currentTag;
-      developer._currentTag = this;
-      return old;
-    }
-  };
-  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
-  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
-  dart.setSignature(developer._FakeUserTag, {
-    fields: () => ({label: core.String}),
-    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
-  });
-  dart.defineLazy(developer._FakeUserTag, {
-    get _instances() {
-      return dart.map();
-    },
-    set _instances(_) {},
-    get _defaultTag() {
-      return developer._FakeUserTag.new('Default');
-    }
-  });
-  dart.defineLazy(developer, {
-    get _currentTag() {
-      return developer._FakeUserTag._defaultTag;
-    },
-    set _currentTag(_) {}
-  });
   developer.getCurrentTag = function() {
     return developer._currentTag;
   };
@@ -35750,7 +36584,7 @@
   developer.Service = class Service extends core.Object {
     static getInfo() {
       return dart.async(function*() {
-        let receivePort = isolate.RawReceivePort.new();
+        let receivePort = isolate$.RawReceivePort.new();
         let uriCompleter = CompleterOfUri().new();
         receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
         developer._getServerInfo(receivePort.sendPort);
@@ -35765,7 +36599,7 @@
         if (!(typeof enable == 'boolean')) {
           dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
         }
-        let receivePort = isolate.RawReceivePort.new();
+        let receivePort = isolate$.RawReceivePort.new();
         let uriCompleter = CompleterOfUri().new();
         receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
         developer._webServerControl(receivePort.sendPort, enable);
@@ -35774,20 +36608,27 @@
         return new developer.ServiceProtocolInfo(uri);
       }, developer.ServiceProtocolInfo, opts);
     }
+    static getIsolateID(isolate) {
+      if (!isolate$.Isolate.is(isolate)) {
+        dart.throw(new core.ArgumentError.value(isolate, 'isolate', 'Must be an Isolate'));
+      }
+      return developer._getIsolateIDFromSendPort(isolate.controlPort);
+    }
   };
   dart.setSignature(developer.Service, {
     statics: () => ({
       getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
-      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool}),
+      getIsolateID: dart.definiteFunctionType(core.String, [isolate$.Isolate])
     }),
-    names: ['getInfo', 'controlWebServer']
+    names: ['getInfo', 'controlWebServer', 'getIsolateID']
   });
-  developer._getServerInfo = function(sp) {
-    sp.send(null);
+  developer._getServerInfo = function(sendPort) {
+    sendPort.send(null);
   };
   dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
-  developer._webServerControl = function(sp, enable) {
-    sp.send(null);
+  developer._webServerControl = function(sendPort, enable) {
+    sendPort.send(null);
   };
   dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
   developer._getServiceMajorVersion = function() {
@@ -35798,6 +36639,10 @@
     return 0;
   };
   dart.fn(developer._getServiceMinorVersion, VoidToint());
+  developer._getIsolateIDFromSendPort = function(sendPort) {
+    return null;
+  };
+  dart.lazyFn(developer._getIsolateIDFromSendPort, () => SendPortToString());
   io.BytesBuilder = class BytesBuilder extends core.Object {
     static new(opts) {
       let copy = opts && 'copy' in opts ? opts.copy : true;
@@ -35808,27 +36653,21 @@
       }
     }
   };
-  const _length$2 = Symbol('_length');
   const _buffer$ = Symbol('_buffer');
-  const _pow2roundup = Symbol('_pow2roundup');
+  const _length$2 = Symbol('_length');
+  const _grow$ = Symbol('_grow');
   io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
-    new() {
+    new(initialCapacity) {
+      if (initialCapacity === void 0) initialCapacity = 0;
+      this[_buffer$] = dart.notNull(initialCapacity) <= 0 ? io._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(io._CopyingBytesBuilder._pow2roundup(initialCapacity));
       this[_length$2] = 0;
-      this[_buffer$] = null;
     }
     add(bytes) {
       let bytesLength = bytes[dartx.length];
       if (bytesLength == 0) return;
       let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
-      if (this[_buffer$] == null) {
-        let size = this[_pow2roundup](required);
-        size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-        this[_buffer$] = typed_data.Uint8List.new(size);
-      } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
-        let size = dart.notNull(this[_pow2roundup](required)) * 2;
-        let newBuffer = typed_data.Uint8List.new(size);
-        newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
-        this[_buffer$] = newBuffer;
+      if (dart.notNull(this[_buffer$][dartx.length]) < required) {
+        this[_grow$](required);
       }
       dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
       if (typed_data.Uint8List.is(bytes)) {
@@ -35841,16 +36680,32 @@
       this[_length$2] = required;
     }
     addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
+      if (this[_buffer$][dartx.length] == this[_length$2]) {
+        this[_grow$](this[_length$2]);
+      }
+      dart.assert(dart.notNull(this[_buffer$][dartx.length]) > dart.notNull(this[_length$2]));
+      this[_buffer$][dartx._set](this[_length$2], byte);
+      this[_length$2] = dart.notNull(this[_length$2]) + 1;
+    }
+    [_grow$](required) {
+      let newSize = dart.notNull(required) * 2;
+      if (dart.notNull(newSize) < io._CopyingBytesBuilder._INIT_SIZE) {
+        newSize = io._CopyingBytesBuilder._INIT_SIZE;
+      } else {
+        newSize = io._CopyingBytesBuilder._pow2roundup(newSize);
+      }
+      let newBuffer = typed_data.Uint8List.new(newSize);
+      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+      this[_buffer$] = newBuffer;
     }
     takeBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
       this.clear();
       return buffer;
     }
     toBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
     }
     get length() {
@@ -35864,9 +36719,10 @@
     }
     clear() {
       this[_length$2] = 0;
-      this[_buffer$] = null;
+      this[_buffer$] = io._CopyingBytesBuilder._emptyList;
     }
-    [_pow2roundup](x) {
+    static _pow2roundup(x) {
+      dart.assert(dart.notNull(x) > 0);
       x = dart.notNull(x) - 1;
       x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
       x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
@@ -35890,33 +36746,48 @@
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addByte: dart.definiteFunctionType(dart.void, [core.int]),
+      [_grow$]: dart.definiteFunctionType(dart.void, [core.int]),
       takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
       toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      clear: dart.definiteFunctionType(dart.void, []),
-      [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
-    })
+      clear: dart.definiteFunctionType(dart.void, [])
+    }),
+    statics: () => ({_pow2roundup: dart.definiteFunctionType(core.int, [core.int])}),
+    names: ['_pow2roundup']
   });
   io._CopyingBytesBuilder._INIT_SIZE = 1024;
+  dart.defineLazy(io._CopyingBytesBuilder, {
+    get _emptyList() {
+      return typed_data.Uint8List.new(0);
+    }
+  });
   const _chunks = Symbol('_chunks');
   io._BytesBuilder = class _BytesBuilder extends core.Object {
     new() {
-      this[_chunks] = JSArrayOfListOfint().of([]);
+      this[_chunks] = JSArrayOfUint8List().of([]);
       this[_length$2] = 0;
     }
     add(bytes) {
-      if (!typed_data.Uint8List.is(bytes)) {
-        bytes = typed_data.Uint8List.fromList(bytes);
+      let typedBytes = null;
+      if (typed_data.Uint8List.is(bytes)) {
+        typedBytes = bytes;
+      } else {
+        typedBytes = typed_data.Uint8List.fromList(bytes);
       }
-      this[_chunks][dartx.add](bytes);
-      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
+      this[_chunks][dartx.add](typedBytes);
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(typedBytes[dartx.length]);
     }
     addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
+      this[_chunks][dartx.add]((() => {
+        let _ = typed_data.Uint8List.new(1);
+        _[dartx._set](0, byte);
+        return _;
+      })());
+      this[_length$2] = dart.notNull(this[_length$2]) + 1;
     }
     takeBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       if (this[_chunks][dartx.length] == 1) {
-        let buffer = this[_chunks][dartx.single];
+        let buffer = this[_chunks][dartx._get](0);
         this.clear();
         return buffer;
       }
@@ -35930,7 +36801,7 @@
       return buffer;
     }
     toBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       let buffer = typed_data.Uint8List.new(this[_length$2]);
       let offset = 0;
       for (let chunk of this[_chunks]) {
@@ -35957,7 +36828,7 @@
   dart.setSignature(io._BytesBuilder, {
     fields: () => ({
       [_length$2]: core.int,
-      [_chunks]: ListOfListOfint()
+      [_chunks]: ListOfUint8List()
     }),
     getters: () => ({
       length: dart.definiteFunctionType(core.int, []),
@@ -35988,7 +36859,7 @@
     switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
       case io._ILLEGAL_ARGUMENT_RESPONSE:
       {
-        return new core.ArgumentError();
+        return new core.ArgumentError(dart.str`${message}: ${path}`);
       }
       case io._OSERROR_RESPONSE:
       {
@@ -36051,7 +36922,7 @@
   };
   dart.setSignature(io._BufferAndStart, {
     fields: () => ({
-      buffer: core.List,
+      buffer: ListOfint(),
       start: core.int
     })
   });
@@ -36063,7 +36934,7 @@
     let newBuffer = typed_data.Uint8List.new(length);
     let j = start;
     for (let i = 0; i < length; i++) {
-      let value = core.int._check(buffer[dartx._get](j));
+      let value = buffer[dartx._get](j);
       if (!(typeof value == 'number')) {
         dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
       }
@@ -36072,7 +36943,7 @@
     }
     return new io._BufferAndStart(newBuffer, 0);
   };
-  dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
+  dart.fn(io._ensureFastAndSerializableByteData, ListOfintAndintAndintTo_BufferAndStart());
   io._IOCrypto = class _IOCrypto extends core.Object {
     static getRandomBytes(count) {
       dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
@@ -36238,13 +37109,13 @@
     }
     close() {
       if (dart.test(this[_digestCalled])) {
-        return ListOfint()._check(this[_resultAsBytes]());
+        return this[_resultAsBytes]();
       }
       this[_digestCalled] = true;
       this[_finalizeData]();
       this[_iterate]();
       dart.assert(this[_pendingData][dartx.length] == 0);
-      return ListOfint()._check(this[_resultAsBytes]());
+      return this[_resultAsBytes]();
     }
     get blockSize() {
       return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
@@ -36260,9 +37131,9 @@
       return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
     }
     [_resultAsBytes]() {
-      let result = [];
+      let result = JSArrayOfint().of([]);
       for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
-        result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
+        result[dartx.addAll](this[_wordToBytes](this[_h][dartx._get](i)));
       }
       return result;
     }
@@ -36313,11 +37184,11 @@
       let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
       dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
       if (dart.test(this[_bigEndianWords])) {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+        this[_pendingData][dartx.addAll](this[_wordToBytes](0));
+        this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
       } else {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+        this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
+        this[_pendingData][dartx.addAll](this[_wordToBytes](0));
       }
     }
   };
@@ -36339,9 +37210,9 @@
       [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
       [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
       [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
+      [_resultAsBytes]: dart.definiteFunctionType(core.List$(core.int), []),
       [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
-      [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+      [_wordToBytes]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
       [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
       [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
     })
@@ -36623,6 +37494,7 @@
     }
   };
   dart.addSimpleTypeTests(io.ZLibEncoder);
+  io.ZLibEncoder[dart.implements] = () => [ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint()];
   dart.setSignature(io.ZLibEncoder, {
     fields: () => ({
       gzip: core.bool,
@@ -36705,7 +37577,7 @@
   const _filter$ = Symbol('_filter');
   const _closed = Symbol('_closed');
   const _empty = Symbol('_empty');
-  let const$52;
+  let const$55;
   io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
     new(sink, filter) {
       this[_sink$0] = sink;
@@ -36724,10 +37596,10 @@
       try {
         this[_empty] = false;
         let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-        this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+        this[_filter$].process(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
         let out = null;
         while ((out = this[_filter$].processed({flush: false})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
+          this[_sink$0].add(out);
         }
       } catch (e) {
         this[_closed] = true;
@@ -36738,11 +37610,11 @@
     }
     close() {
       if (dart.test(this[_closed])) return;
-      if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
+      if (dart.test(this[_empty])) this[_filter$].process(const$55 || (const$55 = dart.constList([], core.int)), 0, 0);
       try {
         let out = null;
         while ((out = this[_filter$].processed({end: true})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
+          this[_sink$0].add(out);
         }
       } catch (e) {
         this[_closed] = true;
@@ -36809,9 +37681,9 @@
     }
   };
   dart.fn(io._validateZLibMemLevel, intTovoid());
-  let const$53;
+  let const$56;
   io._validateZLibStrategy = function(strategy) {
-    let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+    let strategies = const$56 || (const$56 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
     if (strategies[dartx.indexOf](strategy) == -1) {
       dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
     }
@@ -36841,7 +37713,6 @@
   const _isErrorResponse = Symbol('_isErrorResponse');
   const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
   const _absolutePath = Symbol('_absolutePath');
-  const _computeExistingIndex = Symbol('_computeExistingIndex');
   const _delete = Symbol('_delete');
   const _deleteSync = Symbol('_deleteSync');
   const _type = Symbol('_type');
@@ -36862,6 +37733,12 @@
       io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
       return core.String._check(result);
     }
+    stat() {
+      return io.FileStat.stat(this.path);
+    }
+    statSync() {
+      return io.FileStat.statSync(this.path);
+    }
     delete(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       return this[_delete]({recursive: recursive});
@@ -37025,6 +37902,8 @@
     methods: () => ({
       resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
       resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
+      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+      statSync: dart.definiteFunctionType(io.FileStat, []),
       delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
       deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
@@ -37130,33 +38009,6 @@
     get absolute() {
       return io.Directory.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
-    [_computeExistingIndex](dirsToCreate) {
-      let future = null;
-      let notFound = dirsToCreate[dartx.length];
-      for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
-        if (future == null) {
-          future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        } else {
-          future = dart.dsend(future, 'then', dart.fn(index => {
-            if (!dart.equals(index, notFound)) {
-              return async.Future.value(index);
-            }
-            return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-          }, dynamicTodynamic$()));
-        }
-      }
-      if (future == null) {
-        return FutureOfint().value(notFound);
-      } else {
-        return FutureOfint()._check(future);
-      }
-    }
     create(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       if (dart.test(recursive)) {
@@ -37267,7 +38119,7 @@
     list(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
+      return new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream;
     }
     listSync(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
@@ -37311,9 +38163,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
-      [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
       create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
@@ -37359,7 +38208,7 @@
       this.nextRunning = false;
       this.closed = false;
       this[_ops] = null;
-      this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
+      this.controller = StreamControllerOfFileSystemEntity().new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
     }
     [_pointer]() {
       return this[_ops] == null ? null : this[_ops].getPointer();
@@ -37486,14 +38335,14 @@
       path: core.String,
       recursive: core.bool,
       followLinks: core.bool,
-      controller: async.StreamController,
+      controller: StreamControllerOfFileSystemEntity(),
       canceled: core.bool,
       nextRunning: core.bool,
       closed: core.bool,
       [_ops]: io._AsyncDirectoryListerOps,
       closeCompleter: async.Completer
     }),
-    getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
+    getters: () => ({stream: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [])}),
     methods: () => ({
       [_pointer]: dart.definiteFunctionType(core.int, []),
       onListen: dart.definiteFunctionType(dart.void, []),
@@ -37520,7 +38369,7 @@
     }
   };
   dart.setSignature(io._EventHandler, {
-    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
+    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate$.SendPort, core.int])}),
     names: ['_sendData']
   });
   const _mode = Symbol('_mode');
@@ -37562,7 +38411,9 @@
     toString() {
       return {
         0: "FileLock.SHARED",
-        1: "FileLock.EXCLUSIVE"
+        1: "FileLock.EXCLUSIVE",
+        2: "FileLock.BLOCKING_SHARED",
+        3: "FileLock.BLOCKING_EXCLUSIVE"
       }[this.index];
     }
   };
@@ -37571,7 +38422,9 @@
   });
   dart.defineEnumValues(io.FileLock, [
     'SHARED',
-    'EXCLUSIVE'
+    'EXCLUSIVE',
+    'BLOCKING_SHARED',
+    'BLOCKING_EXCLUSIVE'
   ]);
   io.File = class File extends core.Object {
     static new(path) {
@@ -37624,9 +38477,9 @@
   });
   io._BLOCK_SIZE = 64 * 1024;
   const _closeCompleter = Symbol('_closeCompleter');
-  const _path$ = Symbol('_path');
+  const _path = Symbol('_path');
   const _position$0 = Symbol('_position');
-  const _end$0 = Symbol('_end');
+  const _end$ = Symbol('_end');
   const _controller$0 = Symbol('_controller');
   const _openedFile = Symbol('_openedFile');
   const _unsubscribed = Symbol('_unsubscribed');
@@ -37639,9 +38492,9 @@
   io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
     new(path, position, end) {
       this[_closeCompleter] = async.Completer.new();
-      this[_path$] = path;
+      this[_path] = path;
       this[_position$0] = position;
-      this[_end$0] = end;
+      this[_end$] = end;
       this[_controller$0] = null;
       this[_openedFile] = null;
       this[_unsubscribed] = false;
@@ -37655,9 +38508,9 @@
       this[_closeCompleter] = async.Completer.new();
       this[_position$0] = 0;
       this[_controller$0] = null;
-      this[_path$] = null;
+      this[_path] = null;
       this[_openedFile] = null;
-      this[_end$0] = null;
+      this[_end$] = null;
       this[_unsubscribed] = false;
       this[_readInProgress] = true;
       this[_closed] = false;
@@ -37698,12 +38551,12 @@
       }
       this[_readInProgress] = true;
       let readBytes = io._BLOCK_SIZE;
-      if (this[_end$0] != null) {
-        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
+      if (this[_end$] != null) {
+        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$]) - dart.notNull(this[_position$0]));
         if (dart.notNull(readBytes) < 0) {
           this[_readInProgress] = false;
           if (!dart.test(this[_unsubscribed])) {
-            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
+            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$]}`));
             this[_closeFile]();
             this[_unsubscribed] = true;
           }
@@ -37717,7 +38570,7 @@
           return;
         }
         this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
-        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
+        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$] != null && this[_position$0] == this[_end$]) {
           this[_atEnd] = true;
         }
         if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
@@ -37766,8 +38619,8 @@
         this[_closeCompleter].complete();
       }).bind(this);
       dart.fn(openFailed, dynamicAnddynamicTovoid$());
-      if (this[_path$] != null) {
-        io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+      if (this[_path] != null) {
+        io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
       } else {
         try {
           onOpenFile(io._File._openStdioSync(0));
@@ -37784,10 +38637,10 @@
   dart.setSignature(io._FileStream, {
     fields: () => ({
       [_controller$0]: StreamControllerOfListOfint(),
-      [_path$]: core.String,
+      [_path]: core.String,
       [_openedFile]: io.RandomAccessFile,
       [_position$0]: core.int,
-      [_end$0]: core.int,
+      [_end$]: core.int,
       [_closeCompleter]: async.Completer,
       [_unsubscribed]: core.bool,
       [_readInProgress]: core.bool,
@@ -37859,8 +38712,8 @@
     })
   });
   const _tryDecode = Symbol('_tryDecode');
-  let const$54;
-  let const$55;
+  let const$57;
+  let const$58;
   io._File = class _File extends io.FileSystemEntity {
     new(path) {
       this.path = path;
@@ -37887,12 +38740,6 @@
     get absolute() {
       return io.File.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
     create(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
@@ -38009,6 +38856,41 @@
       io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
       return core.int._check(result);
     }
+    lastAccessed() {
+      return io._IOService._dispatch(io._FILE_LAST_ACCESSED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve access time", this.path));
+        }
+        return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
+      }, dynamicToDateTime()));
+    }
+    static _lastAccessed(path) {
+      dart.throw(new core.UnsupportedError("File._lastAccessed"));
+    }
+    lastAccessedSync() {
+      let ms = io._File._lastAccessed(this.path);
+      io._File.throwIfError(ms, "Cannot retrieve access time", this.path);
+      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
+    }
+    setLastAccessed(time) {
+      let millis = time.millisecondsSinceEpoch;
+      return io._IOService._dispatch(io._FILE_SET_LAST_ACCESSED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot set access time", this.path));
+        }
+        return null;
+      }, dynamicToNull$()));
+    }
+    static _setLastAccessed(path, millis) {
+      dart.throw(new core.UnsupportedError("File._setLastAccessed"));
+    }
+    setLastAccessedSync(time) {
+      let millis = time.millisecondsSinceEpoch;
+      let result = io._File._setLastAccessed(this.path, millis);
+      if (io.OSError.is(result)) {
+        dart.throw(new io.FileSystemException("Failed to set file access time", this.path, result));
+      }
+    }
     lastModified() {
       return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
         if (dart.test(io._isErrorResponse(response))) {
@@ -38025,6 +38907,25 @@
       io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
       return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
     }
+    setLastModified(time) {
+      let millis = time.millisecondsSinceEpoch;
+      return io._IOService._dispatch(io._FILE_SET_LAST_MODIFIED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot set modification time", this.path));
+        }
+        return null;
+      }, dynamicToNull$()));
+    }
+    static _setLastModified(path, millis) {
+      dart.throw(new core.UnsupportedError("File._setLastModified"));
+    }
+    setLastModifiedSync(time) {
+      let millis = time.millisecondsSinceEpoch;
+      let result = io._File._setLastModified(this.path, millis);
+      if (io.OSError.is(result)) {
+        dart.throw(new io.FileSystemException("Failed to set file modification time", this.path, result));
+      }
+    }
     static _open(path, mode) {
       dart.throw(new core.UnsupportedError("File._open"));
     }
@@ -38064,22 +38965,22 @@
     readAsBytes() {
       function readDataChunked(file) {
         let builder = io.BytesBuilder.new({copy: false});
-        let completer = async.Completer.new();
+        let completer = CompleterOfListOfint().new();
         function read() {
-          dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
-              builder.add(ListOfint()._check(data));
+          file.read(io._BLOCK_SIZE).then(dart.dynamic)(dart.fn(data => {
+            if (dart.notNull(data[dartx.length]) > 0) {
+              builder.add(data);
               read();
             } else {
               completer.complete(builder.takeBytes());
             }
-          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
+          }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError')});
         }
         dart.fn(read, VoidTovoid$());
         read();
-        return FutureOfListOfint()._check(completer.future);
+        return completer.future;
       }
-      dart.fn(readDataChunked, dynamicToFutureOfListOfint());
+      dart.fn(readDataChunked, RandomAccessFileToFutureOfListOfint());
       return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
         if (length == 0) {
           return readDataChunked(file);
@@ -38096,13 +38997,13 @@
           let builder = io.BytesBuilder.new({copy: false});
           do {
             data = opened.readSync(io._BLOCK_SIZE);
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
-          } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
+            if (dart.notNull(data[dartx.length]) > 0) builder.add(data);
+          } while (dart.notNull(data[dartx.length]) > 0);
           data = builder.takeBytes();
         } else {
           data = opened.readSync(length);
         }
-        return ListOfint()._check(data);
+        return data;
       } finally {
         opened.closeSync();
       }
@@ -38125,11 +39026,11 @@
     }
     readAsLines(opts) {
       let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
+      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$57 || (const$57 = dart.const(new convert.LineSplitter())), 'convert'));
     }
     readAsLinesSync(opts) {
       let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+      return (const$58 || (const$58 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
     }
     writeAsBytes(bytes, opts) {
       let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
@@ -38183,8 +39084,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
       create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
@@ -38196,8 +39095,14 @@
       open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
       length: dart.definiteFunctionType(async.Future$(core.int), []),
       lengthSync: dart.definiteFunctionType(core.int, []),
+      lastAccessed: dart.definiteFunctionType(async.Future$(core.DateTime), []),
+      lastAccessedSync: dart.definiteFunctionType(core.DateTime, []),
+      setLastAccessed: dart.definiteFunctionType(async.Future, [core.DateTime]),
+      setLastAccessedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
       lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
       lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
+      setLastModified: dart.definiteFunctionType(async.Future, [core.DateTime]),
+      setLastModifiedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
       openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
       openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
       openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
@@ -38224,26 +39129,49 @@
       _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
       _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
       _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _lastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _setLastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _setLastModified: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _openStdio: dart.definiteFunctionType(core.int, [core.int]),
       _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
       throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
     }),
-    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
+    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastAccessed', '_setLastAccessed', '_lastModified', '_setLastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
   });
   io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
     static new(pointer) {
       dart.throw(new core.UnsupportedError("RandomAccessFile"));
     }
   };
+  io._FileTranslation = class _FileTranslation extends core.Object {
+    new(index) {
+      this.index = index;
+    }
+    toString() {
+      return {
+        0: "_FileTranslation.text",
+        1: "_FileTranslation.binary"
+      }[this.index];
+    }
+  };
+  dart.setSignature(io._FileTranslation, {
+    fields: () => ({index: core.int})
+  });
+  dart.defineEnumValues(io._FileTranslation, [
+    'text',
+    'binary'
+  ]);
   const _asyncDispatched = Symbol('_asyncDispatched');
   const _fileService = Symbol('_fileService');
   const _resourceInfo = Symbol('_resourceInfo');
+  const _translation = Symbol('_translation');
   const _maybeConnectHandler = Symbol('_maybeConnectHandler');
   const _maybePerformCleanup = Symbol('_maybePerformCleanup');
   const _dispatch = Symbol('_dispatch');
   const _checkAvailable = Symbol('_checkAvailable');
+  const _fileLockValue = Symbol('_fileLockValue');
   io._RandomAccessFile = class _RandomAccessFile extends core.Object {
     new(pointer, path) {
       this.path = path;
@@ -38251,9 +39179,11 @@
       this[_fileService] = null;
       this[_resourceInfo] = null;
       this[_ops] = null;
+      this[_translation] = null;
       this.closed = false;
       this[_ops] = io._RandomAccessFileOps.new(pointer);
       this[_resourceInfo] = new io._FileResourceInfo(this);
+      this[_translation] = io._FileTranslation.binary;
       this[_maybeConnectHandler]();
     }
     [_maybePerformCleanup]() {
@@ -38315,8 +39245,8 @@
           dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
         }
         this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
-        return FutureOrOfListOfint()._check(dart.dindex(response, 1));
-      }, dynamicToFutureOrOfListOfint()));
+        return ListOfint().as(dart.dindex(response, 1));
+      }, dynamicToListOfint()));
     }
     readSync(bytes) {
       this[_checkAvailable]();
@@ -38328,7 +39258,7 @@
         dart.throw(new io.FileSystemException("readSync failed", this.path, result));
       }
       this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
-      return ListOfint()._check(result);
+      return ListOfint().as(result);
     }
     readInto(buffer, start, end) {
       if (start === void 0) start = 0;
@@ -38346,8 +39276,8 @@
           dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
         }
         let read = dart.dindex(response, 1);
-        let data = dart.dindex(response, 2);
-        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
+        let data = ListOfint().as(dart.dindex(response, 2));
+        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), data);
         this[_resourceInfo].addRead(core.int._check(read));
         return FutureOrOfint()._check(read);
       }, dynamicToFutureOrOfint()));
@@ -38436,7 +39366,7 @@
         return;
       }
       let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
-      let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      let result = this[_ops].writeFrom(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
       if (io.OSError.is(result)) {
         dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
       }
@@ -38535,6 +39465,30 @@
         dart.throw(new io.FileSystemException("flush failed", this.path, result));
       }
     }
+    [_fileLockValue](fl) {
+      switch (fl) {
+        case io.FileLock.SHARED:
+        {
+          return io._RandomAccessFile.LOCK_SHARED;
+        }
+        case io.FileLock.EXCLUSIVE:
+        {
+          return io._RandomAccessFile.LOCK_EXCLUSIVE;
+        }
+        case io.FileLock.BLOCKING_SHARED:
+        {
+          return io._RandomAccessFile.LOCK_BLOCKING_SHARED;
+        }
+        case io.FileLock.BLOCKING_EXCLUSIVE:
+        {
+          return io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE;
+        }
+        default:
+        {
+          return -1;
+        }
+      }
+    }
     lock(mode, start, end) {
       if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
       if (start === void 0) start = 0;
@@ -38545,7 +39499,7 @@
       if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
         dart.throw(new core.ArgumentError());
       }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+      let lock = this[_fileLockValue](mode);
       return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
         if (dart.test(io._isErrorResponse(response))) {
           dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
@@ -38580,7 +39534,7 @@
       if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
         dart.throw(new core.ArgumentError());
       }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+      let lock = this[_fileLockValue](mode);
       let result = this[_ops].lock(lock, start, end);
       if (io.OSError.is(result)) {
         dart.throw(new io.FileSystemException('lock failed', this.path, result));
@@ -38601,6 +39555,15 @@
         dart.throw(new io.FileSystemException('unlock failed', this.path, result));
       }
     }
+    get translation() {
+      return this[_translation];
+    }
+    set translation(translation) {
+      if (!dart.equals(this[_translation], translation)) {
+        this[_ops].setTranslation(translation.index);
+        this[_translation] = translation;
+      }
+    }
     [_pointer]() {
       return this[_ops].getPointer();
     }
@@ -38636,11 +39599,14 @@
     fields: () => ({
       path: core.String,
       [_asyncDispatched]: core.bool,
-      [_fileService]: isolate.SendPort,
+      [_fileService]: isolate$.SendPort,
       [_resourceInfo]: io._FileResourceInfo,
       [_ops]: io._RandomAccessFileOps,
+      [_translation]: io._FileTranslation,
       closed: core.bool
     }),
+    getters: () => ({translation: dart.definiteFunctionType(io._FileTranslation, [])}),
+    setters: () => ({translation: dart.definiteFunctionType(dart.void, [io._FileTranslation])}),
     methods: () => ({
       [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
       [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
@@ -38668,6 +39634,7 @@
       lengthSync: dart.definiteFunctionType(core.int, []),
       flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
       flushSync: dart.definiteFunctionType(dart.void, []),
+      [_fileLockValue]: dart.definiteFunctionType(core.int, [io.FileLock]),
       lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
       unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
       lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
@@ -38681,7 +39648,9 @@
   io._RandomAccessFile.LOCK_UNLOCK = 0;
   io._RandomAccessFile.LOCK_SHARED = 1;
   io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-  let const$56;
+  io._RandomAccessFile.LOCK_BLOCKING_SHARED = 3;
+  io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE = 4;
+  let const$59;
   io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
     _internal(type) {
       this[_type] = type;
@@ -38690,7 +39659,7 @@
       return io.FileSystemEntityType._typeList[dartx._get](type);
     }
     toString() {
-      return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+      return (const$59 || (const$59 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
     }
   };
   dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
@@ -38716,7 +39685,7 @@
       return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
     }
   });
-  let const$57;
+  let const$60;
   io.FileStat = class FileStat extends core.Object {
     _internal(changed, modified, accessed, type, mode, size) {
       this.changed = changed;
@@ -38762,7 +39731,7 @@
     }
     modeString() {
       let permissions = dart.notNull(this.mode) & 4095;
-      let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+      let codes = const$60 || (const$60 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
       let result = [];
       if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
       if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
@@ -39262,19 +40231,19 @@
     }),
     getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
   });
-  let const$58;
-  let const$59;
-  let const$60;
   let const$61;
   let const$62;
   let const$63;
   let const$64;
   let const$65;
   let const$66;
+  let const$67;
+  let const$68;
+  let const$69;
   io.HttpDate = class HttpDate extends core.Object {
     static format(date) {
-      let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+      let wkday = const$61 || (const$61 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+      let month = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
       let d = date.toUtc();
       let sb = new core.StringBuffer();
       sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
@@ -39296,12 +40265,12 @@
     }
     static parse(date) {
       let SP = 32;
-      let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-      let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-      let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-      let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-      let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+      let wkdays = const$63 || (const$63 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+      let weekdays = const$64 || (const$64 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+      let months = const$65 || (const$65 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+      let wkdaysLowerCase = const$66 || (const$66 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+      let weekdaysLowerCase = const$67 || (const$67 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+      let monthsLowerCase = const$68 || (const$68 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
       let formatRfc1123 = 0;
       let formatRfc850 = 1;
       let formatAsctime = 2;
@@ -39417,7 +40386,7 @@
       return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
     }
     static _parseCookieDate(date) {
-      let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+      let monthsLowerCase = const$69 || (const$69 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
       let position = 0;
       function error() {
         dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
@@ -39551,7 +40520,7 @@
   const _addIfModifiedSince = Symbol('_addIfModifiedSince');
   const _foldHeader = Symbol('_foldHeader');
   const _finalize = Symbol('_finalize');
-  const _write = Symbol('_write');
+  const _build = Symbol('_build');
   const _parseCookies = Symbol('_parseCookies');
   io._HttpHeaders = class _HttpHeaders extends core.Object {
     new(protocolVersion, opts) {
@@ -39987,81 +40956,32 @@
     [_finalize]() {
       this[_mutable] = false;
     }
-    [_write](buffer, offset) {
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
+    [_build](builder) {
       for (let name of this[_headers][dartx.keys]) {
         let values = this[_headers][dartx._get](name);
         let fold = core.bool._check(this[_foldHeader](name));
         let nameData = name[dartx.codeUnits];
-        write(nameData);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.COLON);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.SP);
+        builder.add(nameData);
+        builder.addByte(io._CharCode.COLON);
+        builder.addByte(io._CharCode.SP);
         for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
           if (i > 0) {
             if (dart.test(fold)) {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COMMA);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
+              builder.addByte(io._CharCode.COMMA);
+              builder.addByte(io._CharCode.SP);
             } else {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.CR);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.LF);
-              write(nameData);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COLON);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
+              builder.addByte(io._CharCode.CR);
+              builder.addByte(io._CharCode.LF);
+              builder.add(nameData);
+              builder.addByte(io._CharCode.COLON);
+              builder.addByte(io._CharCode.SP);
             }
           }
-          write(values[dartx._get](i)[dartx.codeUnits]);
+          builder.add(values[dartx._get](i)[dartx.codeUnits]);
         }
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.CR);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.LF);
+        builder.addByte(io._CharCode.CR);
+        builder.addByte(io._CharCode.LF);
       }
-      return offset;
     }
     toString() {
       let sb = new core.StringBuffer();
@@ -40236,7 +41156,7 @@
       [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
       [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
       [_finalize]: dart.definiteFunctionType(dart.void, []),
-      [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
+      [_build]: dart.definiteFunctionType(dart.void, [io.BytesBuilder]),
       [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
     }),
     statics: () => ({
@@ -40385,7 +41305,7 @@
             return;
           }
           let value = parseParameterValue();
-          if (name == 'charset' && io._ContentType.is(this)) {
+          if (name == 'charset' && io._ContentType.is(this) && value != null) {
             value = value[dartx.toLowerCase]();
           }
           parameters._set(name, value);
@@ -40496,7 +41416,7 @@
   });
   const _validate = Symbol('_validate');
   const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-  let const$67;
+  let const$70;
   io._Cookie = class _Cookie extends core.Object {
     new(name, value) {
       if (name === void 0) name = null;
@@ -40635,7 +41555,7 @@
       return sb.toString();
     }
     [_validate]() {
-      let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+      let SEPERATORS = const$70 || (const$70 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
       for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
         let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
         if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
@@ -40669,6 +41589,7 @@
     })
   });
   io._OUTGOING_BUFFER_SIZE = 8 * 1024;
+  io._BytesConsumer = dart.typedef('_BytesConsumer', () => dart.functionType(dart.void, [ListOfint()]));
   const _transferLength = Symbol('_transferLength');
   const _dataCompleter = Symbol('_dataCompleter');
   const _stream$ = Symbol('_stream');
@@ -40967,7 +41888,7 @@
       let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
       if (dart.test(this[_incoming].upgraded)) {
         this[_httpRequest][_httpClientConnection].destroy();
-        return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
+        return StreamOfListOfint().empty().listen(null, {onDone: onDone});
       }
       let stream = this[_incoming];
       if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
@@ -41089,7 +42010,7 @@
       [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
     })
   });
-  const _uri = Symbol('_uri');
+  const _uri$ = Symbol('_uri');
   const _outgoing = Symbol('_outgoing');
   const _encodingSet = Symbol('_encodingSet');
   const _bufferOutput = Symbol('_bufferOutput');
@@ -41317,7 +42238,7 @@
     class _HttpOutboundMessage extends io._IOSinkImpl {
       new(uri, protocolVersion, outgoing, opts) {
         let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-        this[_uri] = uri;
+        this[_uri$] = uri;
         this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
         this[_outgoing] = outgoing;
         this[_encodingSet] = false;
@@ -41380,7 +42301,7 @@
       fields: () => ({
         [_encodingSet]: core.bool,
         [_bufferOutput]: core.bool,
-        [_uri]: core.Uri,
+        [_uri$]: core.Uri,
         [_outgoing]: io._HttpOutgoing,
         headers: io._HttpHeaders
       }),
@@ -41477,43 +42398,18 @@
       }, VoidToNull()));
     }
     [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
+      let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
       if (this.headers.protocolVersion == "1.1") {
-        write(io._Const.HTTP11);
+        buffer.add(io._Const.HTTP11);
       } else {
-        write(io._Const.HTTP10);
+        buffer.add(io._Const.HTTP10);
       }
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(dart.toString(this.statusCode)[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this.reasonPhrase[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(dart.toString(this.statusCode)[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(this.reasonPhrase[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
       let session = this[_httpRequest][_session];
       if (session != null && !dart.test(session[_destroyed])) {
         session[_isNew] = false;
@@ -41542,18 +42438,11 @@
         }, CookieToNull()));
       }
       this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
+      this.headers[_build](buffer);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
+      let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+      this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
     }
     [_findReasonPhrase](statusCode) {
       if (this[_reasonPhrase] != null) {
@@ -41858,39 +42747,14 @@
       }
     }
     [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
-      write(this.method[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this[_requestUri]()[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(io._Const.HTTP11);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
+      buffer.add(this.method[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(this[_requestUri]()[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(io._Const.HTTP11);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
       if (!dart.test(this.cookies[dartx.isEmpty])) {
         let sb = new core.StringBuffer();
         for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
@@ -41902,18 +42766,11 @@
         this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
       }
       this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
+      this.headers[_build](buffer);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
+      let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+      this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
     }
   };
   dart.addSimpleTypeTests(io._HttpClientRequest);
@@ -41957,19 +42814,19 @@
       super.new();
     }
     add(chunk) {
-      dart.dcall(this[_consume], chunk);
+      this[_consume](chunk);
     }
     addSlice(chunk, start, end, isLast) {
       if (typed_data.Uint8List.is(chunk)) {
-        dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+        this[_consume](typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
       } else {
-        dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
+        this[_consume](chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
       }
     }
     close() {}
   };
   dart.setSignature(io._HttpGZipSink, {
-    fields: () => ({[_consume]: core.Function}),
+    fields: () => ({[_consume]: io._BytesConsumer}),
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
@@ -41989,10 +42846,10 @@
   const _addChunk$ = Symbol('_addChunk');
   const _chunkHeader = Symbol('_chunkHeader');
   const _ignoreError = Symbol('_ignoreError');
-  let const$68;
+  let const$71;
   io._HttpOutgoing = class _HttpOutgoing extends core.Object {
     new(socket) {
-      this[_doneCompleter] = async.Completer.new();
+      this[_doneCompleter] = CompleterOfSocket().new();
       this.socket = socket;
       this.ignoreBody = false;
       this.headersWritten = false;
@@ -42014,16 +42871,6 @@
     writeHeaders(opts) {
       let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
       let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
-      const write = (function() {
-        try {
-          this.outbound[_writeHeader]();
-        } catch (_) {
-          return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
-        }
-
-        return null;
-      }).bind(this);
-      dart.fn(write, VoidToFuture());
       if (dart.test(this.headersWritten)) return null;
       this.headersWritten = true;
       let drainFuture = null;
@@ -42045,22 +42892,22 @@
       } else {
         drainRequest = false;
       }
-      if (dart.test(this.ignoreBody)) {
-        return write();
-      }
-      if (dart.test(setOutgoing)) {
-        let contentLength = this.outbound.headers.contentLength;
-        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-          this.chunked = true;
-          if (gzip) this.gzip = true;
-        } else if (dart.notNull(contentLength) >= 0) {
-          this.contentLength = contentLength;
+      if (!dart.test(this.ignoreBody)) {
+        if (dart.test(setOutgoing)) {
+          let contentLength = this.outbound.headers.contentLength;
+          if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+            this.chunked = true;
+            if (gzip) this.gzip = true;
+          } else if (dart.notNull(contentLength) >= 0) {
+            this.contentLength = contentLength;
+          }
+        }
+        if (drainFuture != null) {
+          return drainFuture.then(dart.void)(dart.fn(_ => this.outbound[_writeHeader](), dynamicTovoid$()));
         }
       }
-      if (drainFuture != null) {
-        return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
-      }
-      return write();
+      this.outbound[_writeHeader]();
+      return null;
     }
     addStream(stream) {
       if (dart.test(this[_socketError])) {
@@ -42077,10 +42924,10 @@
         return this.close();
       }
       let sub = null;
-      let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
+      let controller = StreamControllerOfListOfint().new({onPause: dart.fn(() => sub.pause(), VoidTovoid$()), onResume: dart.fn(() => sub.resume(), VoidTovoid$()), sync: true});
       const onData = (function(data) {
         if (dart.test(this[_socketError])) return;
-        if (dart.equals(dart.dload(data, 'length'), 0)) return;
+        if (data[dartx.length] == 0) return;
         if (dart.test(this.chunked)) {
           if (dart.test(this[_gzip])) {
             this[_gzipAdd] = dart.bind(controller, 'add');
@@ -42088,28 +42935,28 @@
             this[_gzipAdd] = null;
             return;
           }
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+          this[_addChunk$](this[_chunkHeader](data[dartx.length]), dart.bind(controller, 'add'));
           this[_pendingChunkedFooter] = 2;
         } else {
           if (this.contentLength != null) {
-            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
+            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(data[dartx.length]);
             if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
-              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
+              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(data)}]`));
               return;
             }
           }
         }
         this[_addChunk$](data, dart.bind(controller, 'add'));
       }).bind(this);
-      dart.fn(onData, dynamicTovoid$());
+      dart.fn(onData, ListOfintTovoid());
       sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
       if (!dart.test(this.headersWritten)) {
         let future = this.writeHeaders();
         if (future != null) {
-          dart.dsend(sub, 'pause', future);
+          sub.pause(future);
         }
       }
-      return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+      return this.socket.addStream(controller.stream).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
           if (dart.test(this[_gzip])) this[_gzipSink].close();
           this[_socketError] = true;
           this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
@@ -42129,14 +42976,14 @@
           this.outbound.headers.chunkedTransferEncoding = false;
           this.outbound.headers.contentLength = 0;
         } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
-          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
+          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri$]});
           this[_doneCompleter].completeError(error);
           return this[_closeFuture] = async.Future.error(error);
         }
       }
       if (this.contentLength != null) {
         if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
-          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
+          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri$]});
           this[_doneCompleter].completeError(error);
           return this[_closeFuture] = async.Future.error(error);
         }
@@ -42182,7 +43029,6 @@
     }
     setHeader(data, length) {
       dart.assert(this[_length$2] == 0);
-      dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
       this[_buffer$] = typed_data.Uint8List._check(data);
       this[_length$2] = length;
     }
@@ -42193,10 +43039,10 @@
         dart.assert(this[_gzipSink] == null);
         this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
           if (this[_gzipAdd] == null) return;
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
+          this[_addChunk$](this[_chunkHeader](data[dartx.length]), this[_gzipAdd]);
           this[_pendingChunkedFooter] = 2;
-          this[_addChunk$](data, _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
-        }, dynamicToNull$())));
+          this[_addChunk$](data, this[_gzipAdd]);
+        }, ListOfintToNull())));
       }
     }
     [_ignoreError](error) {
@@ -42204,19 +43050,19 @@
     }
     [_addGZipChunk](chunk, add) {
       if (!dart.test(this.outbound.bufferOutput)) {
-        add(ListOfint()._check(chunk));
+        add(chunk);
         return;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
+      if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])) {
         add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
         this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
         this[_gzipBufferLength] = 0;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
+      if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+        add(chunk);
       } else {
-        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]), chunk);
+        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]);
       }
     }
     [_addChunk$](chunk, add) {
@@ -42226,23 +43072,23 @@
           this[_buffer$] = null;
           this[_length$2] = 0;
         }
-        add(ListOfint()._check(chunk));
+        add(chunk);
         return;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+      if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])) {
         add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
         this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
         this[_length$2] = 0;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
+      if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+        add(chunk);
       } else {
-        this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+        this[_buffer$][dartx.setRange](this[_length$2], dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]), chunk);
+        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]);
       }
     }
     [_chunkHeader](length) {
-      let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+      let hexDigits = const$71 || (const$71 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
       if (length == 0) {
         if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
         return io._HttpOutgoing._chunk0Length;
@@ -42271,7 +43117,7 @@
   io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
   dart.setSignature(io._HttpOutgoing, {
     fields: () => ({
-      [_doneCompleter]: async.Completer,
+      [_doneCompleter]: CompleterOfSocket(),
       socket: io.Socket,
       ignoreBody: core.bool,
       headersWritten: core.bool,
@@ -42284,13 +43130,13 @@
       [_bytesWritten]: core.int,
       [_gzip]: core.bool,
       [_gzipSink]: convert.ByteConversionSink,
-      [_gzipAdd]: core.Function,
+      [_gzipAdd]: io._BytesConsumer,
       [_gzipBuffer]: typed_data.Uint8List,
       [_gzipBufferLength]: core.int,
       [_socketError]: core.bool,
       outbound: io._HttpOutboundMessage
     }),
-    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+    getters: () => ({done: dart.definiteFunctionType(async.Future$(io.Socket), [])}),
     setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
     methods: () => ({
       writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
@@ -42298,8 +43144,8 @@
       close: dart.definiteFunctionType(async.Future, []),
       setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
       [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
-      [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
+      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
+      [_addChunk$]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
       [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
     })
   });
@@ -42407,7 +43253,7 @@
         }
       }
       this[_httpParser].isHead = method == "HEAD";
-      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
+      this[_streamFuture] = outgoing.done.then(io.Socket)(dart.fn(s => {
         this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
         this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
           this[_currentUri] = null;
@@ -42450,13 +43296,13 @@
         }, dynamicAnddynamicToNull()));
         this[_subscription$].resume();
         return s;
-      }, dynamicTodynamic$()), {onError: dart.fn(e => {
+      }, SocketToSocket()), {onError: dart.fn(e => {
           this.destroy();
         }, dynamicToNull$())});
       return request;
     }
     detachSocket() {
-      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
+      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), SocketTo_DetachedSocket()));
     }
     destroy() {
       this.closed = true;
@@ -42466,12 +43312,12 @@
     close() {
       this.closed = true;
       this[_httpClient][_connectionClosed](this);
-      this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
+      this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), SocketTovoid()));
     }
     createProxyTunnel(host, port, proxy, callback) {
-      let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
-      if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
-        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
+      let request = this.send(core.Uri.new({host: host, port: port}), port, "CONNECT", proxy);
+      if (dart.test(proxy.isAuthenticated)) {
+        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
         request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
       }
       return request.close().then(io.SecureSocket)(dart.fn(response => {
@@ -42479,9 +43325,9 @@
           dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
         }
         let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
-        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
+        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: callback});
       }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
-        let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
+        let key = core.String._check(io._HttpClientConnection.makeKey(true, host, port));
         return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
       }, SecureSocketTo_HttpClientConnection()));
     }
@@ -42519,7 +43365,7 @@
       closed: core.bool,
       [_currentUri]: core.Uri,
       [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
-      [_streamFuture]: async.Future
+      [_streamFuture]: FutureOfSocket()
     }),
     getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
     methods: () => ({
@@ -42527,7 +43373,7 @@
       detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
       destroy: dart.definiteFunctionType(dart.void, []),
       close: dart.definiteFunctionType(dart.void, []),
-      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [core.String, core.int, io._Proxy, X509CertificateTobool()]),
       stopTimer: dart.definiteFunctionType(dart.void, []),
       startTimer: dart.definiteFunctionType(dart.void, [])
     }),
@@ -42621,11 +43467,11 @@
         return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
       }
       if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
-        let completer = async.Completer.new();
+        let completer = CompleterOf_ConnectionInfo().new();
         this[_pending$].add(dart.fn(() => {
-          this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
+          completer.complete(this.connect(uriHost, uriPort, proxy, client));
         }, VoidToNull()));
-        return FutureOf_ConnectionInfo()._check(completer.future);
+        return completer.future;
       }
       let currentBadCertificateCallback = client[_badCertificateCallback];
       function callback(certificate) {
@@ -42685,7 +43531,7 @@
   });
   io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
   const _idleTimeout = Symbol('_idleTimeout');
-  let const$69;
+  let const$72;
   const _connectionTargets = Symbol('_connectionTargets');
   const _credentials = Symbol('_credentials');
   const _closing = Symbol('_closing');
@@ -42693,7 +43539,7 @@
   const _findProxy = Symbol('_findProxy');
   const _openUrl = Symbol('_openUrl');
   const _closeConnections = Symbol('_closeConnections');
-  let const$70;
+  let const$73;
   const _getConnection = Symbol('_getConnection');
   io._HttpClient = class _HttpClient extends core.Object {
     get idleTimeout() {
@@ -42710,7 +43556,7 @@
       this[_authenticate] = null;
       this[_authenticateProxy] = null;
       this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-      this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
+      this[_idleTimeout] = const$72 || (const$72 = dart.const(new core.Duration({seconds: 15})));
       this[_badCertificateCallback] = null;
       this.maxConnectionsPerHost = null;
       this.autoUncompress = true;
@@ -42828,7 +43674,7 @@
       if (port == 0) {
         port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
       }
-      let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
+      let proxyConf = const$73 || (const$73 = dart.const(new io._ProxyConfiguration.direct()));
       if (this[_findProxy] != null) {
         try {
           proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
@@ -43124,7 +43970,7 @@
       }
 
       io._HttpConnection._connections[dartx._set](this[_serviceId], this);
-      this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
+      this[_httpParser].listenToStream(io.Socket.as(this[_socket]));
       this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
         this[_httpServer][_markActive](this);
         incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
@@ -43146,7 +43992,7 @@
           } else {
             this.destroy();
           }
-        }, dynamicToNull$()), {onError: dart.fn(_ => {
+        }, SocketToNull()), {onError: dart.fn(_ => {
             this.destroy();
           }, dynamicToNull$())});
         outgoing.ignoreBody = request.method == "HEAD";
@@ -43177,7 +44023,7 @@
       let detachedIncoming = this[_httpParser].detachIncoming();
       return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
         io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-        return new io._DetachedSocket(this[_socket], detachedIncoming);
+        return new io._DetachedSocket(io.Socket._check(this[_socket]), detachedIncoming);
       }, dynamicTo_DetachedSocket()));
     }
     get connectionInfo() {
@@ -43287,8 +44133,8 @@
   const _idleConnections = Symbol('_idleConnections');
   const _serverSocket = Symbol('_serverSocket');
   const _closeServer = Symbol('_closeServer');
-  let const$71;
-  let const$72;
+  let const$74;
+  let const$75;
   io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
     static bind(address, port, backlog, v6Only, shared) {
       return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
@@ -43311,7 +44157,7 @@
       this[_controller$0] = null;
       super.new();
       this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
+      this.idleTimeout = const$74 || (const$74 = dart.const(new core.Duration({seconds: 120})));
       io._HttpServer._servers[dartx._set](this[_serviceId], this);
       dart.dput(this[_serverSocket], _owner, this);
     }
@@ -43330,7 +44176,7 @@
       this[_controller$0] = null;
       super.new();
       this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
+      this.idleTimeout = const$75 || (const$75 = dart.const(new core.Duration({seconds: 120})));
       io._HttpServer._servers[dartx._set](this[_serviceId], this);
       try {
         dart.dput(this[_serverSocket], _owner, this);
@@ -43574,8 +44420,8 @@
     }),
     getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
   });
-  let const$73;
-  let const$74;
+  let const$76;
+  let const$77;
   io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
     new(configuration) {
       this.proxies = ListOf_Proxy().new();
@@ -43630,7 +44476,7 @@
       }, StringToNull()));
     }
     direct() {
-      this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
+      this.proxies = const$77 || (const$77 = dart.constList([const$76 || (const$76 = dart.const(new io._Proxy.direct()))], io._Proxy));
     }
   };
   dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
@@ -43682,61 +44528,61 @@
       return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     get encoding() {
-      return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
+      return this[_socket].encoding;
     }
     set encoding(value) {
-      dart.dput(this[_socket], 'encoding', value);
+      this[_socket].encoding = value;
     }
     write(obj) {
-      dart.dsend(this[_socket], 'write', obj);
+      this[_socket].write(obj);
     }
     writeln(obj) {
       if (obj === void 0) obj = "";
-      dart.dsend(this[_socket], 'writeln', obj);
+      this[_socket].writeln(obj);
     }
     writeCharCode(charCode) {
-      dart.dsend(this[_socket], 'writeCharCode', charCode);
+      this[_socket].writeCharCode(charCode);
     }
     writeAll(objects, separator) {
       if (separator === void 0) separator = "";
-      dart.dsend(this[_socket], 'writeAll', objects, separator);
+      this[_socket].writeAll(objects, separator);
     }
     add(bytes) {
-      dart.dsend(this[_socket], 'add', bytes);
+      this[_socket].add(bytes);
     }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
-      return dart.dsend(this[_socket], 'addError', error, stackTrace);
+      return this[_socket].addError(error, stackTrace);
     }
     addStream(stream) {
-      return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
+      return this[_socket].addStream(stream);
     }
     destroy() {
-      dart.dsend(this[_socket], 'destroy');
+      this[_socket].destroy();
     }
     flush() {
-      return async.Future._check(dart.dsend(this[_socket], 'flush'));
+      return this[_socket].flush();
     }
     close() {
-      return async.Future._check(dart.dsend(this[_socket], 'close'));
+      return this[_socket].close();
     }
     get done() {
-      return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
+      return this[_socket].done;
     }
     get port() {
-      return core.int._check(dart.dload(this[_socket], 'port'));
+      return this[_socket].port;
     }
     get address() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
+      return this[_socket].address;
     }
     get remoteAddress() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
+      return this[_socket].remoteAddress;
     }
     get remotePort() {
-      return core.int._check(dart.dload(this[_socket], 'remotePort'));
+      return this[_socket].remotePort;
     }
     setOption(option, enabled) {
-      return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
+      return this[_socket].setOption(option, enabled);
     }
     [_toJSON$](ref) {
       return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
@@ -43750,7 +44596,7 @@
   dart.setSignature(io._DetachedSocket, {
     fields: () => ({
       [_incoming]: StreamOfListOfint(),
-      [_socket]: dart.dynamic
+      [_socket]: io.Socket
     }),
     getters: () => ({
       encoding: dart.definiteFunctionType(convert.Encoding, []),
@@ -43772,10 +44618,10 @@
       writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
       destroy: dart.definiteFunctionType(dart.void, []),
       flush: dart.definiteFunctionType(async.Future, []),
-      close: dart.definiteFunctionType(async.Future, []),
+      close: dart.definiteFunctionType(async.Future$(io.Socket), []),
       setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
       [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
     })
@@ -44216,23 +45062,21 @@
         this.subscription.onError(onError);
         this.subscription.onDone(onDone);
         if (this.bufferedData == null) {
-          return StreamSubscriptionOfListOfint()._check(((() => {
-            this.subscription.resume();
-            return this.subscription;
-          })()));
+          this.subscription.resume();
+          return this.subscription;
         }
-        let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
+        let _ = new io._HttpDetachedStreamSubscription(this.subscription, this.bufferedData, onData);
         _.resume();
         return _;
       } else {
-        return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+        return StreamOfListOfint().fromIterable(JSArrayOfListOfint().of([this.bufferedData])).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
       }
     }
   };
   dart.addSimpleTypeTests(io._HttpDetachedIncoming);
   dart.setSignature(io._HttpDetachedIncoming, {
     fields: () => ({
-      subscription: async.StreamSubscription,
+      subscription: StreamSubscriptionOfListOfint(),
       bufferedData: ListOfint()
     }),
     methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [_ChunkedConversionCallbackOfListOfint()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
@@ -44243,7 +45087,7 @@
   const _headerValue = Symbol('_headerValue');
   const _requestParser = Symbol('_requestParser');
   const _parserCalled = Symbol('_parserCalled');
-  const _index$2 = Symbol('_index');
+  const _index$1 = Symbol('_index');
   const _httpVersionIndex = Symbol('_httpVersionIndex');
   const _messageType = Symbol('_messageType');
   const _statusCodeLength = Symbol('_statusCodeLength');
@@ -44284,7 +45128,7 @@
       this[_requestParser] = requestParser;
       this[_parserCalled] = false;
       this[_buffer$] = null;
-      this[_index$2] = null;
+      this[_index$1] = null;
       this[_state$1] = null;
       this[_httpVersionIndex] = null;
       this[_messageType] = null;
@@ -44396,14 +45240,14 @@
       if (this[_state$1] == io._State.FAILURE) {
         dart.throw(new io.HttpException("Data on failed connection"));
       }
-      while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
+      while (this[_buffer$] != null && dart.notNull(this[_index$1]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
         if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
           this[_parserCalled] = false;
           return;
         }
         let byte = this[_buffer$][dartx._get]((() => {
-          let x = this[_index$2];
-          this[_index$2] = dart.notNull(x) + 1;
+          let x = this[_index$1];
+          this[_index$1] = dart.notNull(x) + 1;
           return x;
         })());
         switch (this[_state$1]) {
@@ -44584,7 +45428,7 @@
               this[_state$1] = io._State.HEADER_ENDING;
             } else if (byte == io._CharCode.LF) {
               this[_state$1] = io._State.HEADER_ENDING;
-              this[_index$2] = dart.notNull(this[_index$2]) - 1;
+              this[_index$1] = dart.notNull(this[_index$1]) - 1;
             } else {
               this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
               this[_state$1] = io._State.HEADER_FIELD;
@@ -44659,7 +45503,7 @@
                 this[_state$1] = io._State.HEADER_ENDING;
               } else if (byte == io._CharCode.LF) {
                 this[_state$1] = io._State.HEADER_ENDING;
-                this[_index$2] = dart.notNull(this[_index$2]) - 1;
+                this[_index$1] = dart.notNull(this[_index$1]) - 1;
               } else {
                 this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
                 this[_state$1] = io._State.HEADER_FIELD;
@@ -44733,17 +45577,17 @@
           }
           case io._State.BODY:
           {
-            this[_index$2] = dart.notNull(this[_index$2]) - 1;
-            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
+            this[_index$1] = dart.notNull(this[_index$1]) - 1;
+            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$1]);
             if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
               dataAvailable = this[_remainingContent];
             }
-            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
+            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$1]), dataAvailable);
             this[_bodyController].add(data);
             if (this[_remainingContent] != -1) {
               this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
             }
-            this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
+            this[_index$1] = dart.notNull(this[_index$1]) + dart.notNull(data[dartx.length]);
             if (this[_remainingContent] == 0) {
               if (!dart.test(this[_chunked])) {
                 this[_reset]();
@@ -44767,7 +45611,7 @@
         }
       }
       this[_parserCalled] = false;
-      if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
+      if (this[_buffer$] != null && this[_index$1] == this[_buffer$][dartx.length]) {
         this[_releaseBuffer]();
         if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
           this[_socketSubscription].resume();
@@ -44778,7 +45622,7 @@
       this[_socketSubscription].pause();
       dart.assert(this[_buffer$] == null);
       this[_buffer$] = typed_data.Uint8List._check(buffer);
-      this[_index$2] = 0;
+      this[_index$1] = 0;
       this[_parse]();
     }
     [_onDone$]() {
@@ -44851,8 +45695,8 @@
     }
     readUnparsedData() {
       if (this[_buffer$] == null) return null;
-      if (this[_index$2] == this[_buffer$][dartx.length]) return null;
-      let result = this[_buffer$][dartx.sublist](this[_index$2]);
+      if (this[_index$1] == this[_buffer$][dartx.length]) return null;
+      let result = this[_buffer$][dartx.sublist](this[_index$1]);
       this[_releaseBuffer]();
       return result;
     }
@@ -44877,7 +45721,7 @@
     }
     [_releaseBuffer]() {
       this[_buffer$] = null;
-      this[_index$2] = null;
+      this[_index$1] = null;
     }
     static _isTokenChar(byte) {
       return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
@@ -44997,7 +45841,7 @@
     fields: () => ({
       [_parserCalled]: core.bool,
       [_buffer$]: typed_data.Uint8List,
-      [_index$2]: core.int,
+      [_index$1]: core.int,
       [_requestParser]: core.bool,
       [_state$1]: core.int,
       [_httpVersionIndex]: core.int,
@@ -45017,7 +45861,7 @@
       [_remainingContent]: core.int,
       [_headers]: io._HttpHeaders,
       [_incoming]: io._HttpIncoming,
-      [_socketSubscription]: async.StreamSubscription,
+      [_socketSubscription]: StreamSubscriptionOfListOfint(),
       [_paused]: core.bool,
       [_bodyPaused]: core.bool,
       [_controller$0]: StreamControllerOf_HttpIncoming(),
@@ -45060,7 +45904,7 @@
     names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
   });
   io._DART_SESSION_ID = "DARTSESSID";
-  const _data$ = Symbol('_data');
+  const _data$0 = Symbol('_data');
   const _lastSeen = Symbol('_lastSeen');
   const _timeoutCallback = Symbol('_timeoutCallback');
   const _prev = Symbol('_prev');
@@ -45070,7 +45914,7 @@
   const _bumpToEnd = Symbol('_bumpToEnd');
   io._HttpSession = class _HttpSession extends core.Object {
     new(sessionManager, id) {
-      this[_data$] = collection.HashMap.new();
+      this[_data$0] = collection.HashMap.new();
       this[_sessionManager] = sessionManager;
       this.id = id;
       this[_lastSeen] = new core.DateTime.now();
@@ -45099,50 +45943,50 @@
       this[_timeoutCallback] = callback;
     }
     containsValue(value) {
-      return this[_data$][dartx.containsValue](value);
+      return this[_data$0][dartx.containsValue](value);
     }
     containsKey(key) {
-      return this[_data$][dartx.containsKey](key);
+      return this[_data$0][dartx.containsKey](key);
     }
     _get(key) {
-      return this[_data$][dartx._get](key);
+      return this[_data$0][dartx._get](key);
     }
     _set(key, value) {
-      this[_data$][dartx._set](key, value);
+      this[_data$0][dartx._set](key, value);
       return value;
     }
     putIfAbsent(key, ifAbsent) {
-      return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+      return this[_data$0][dartx.putIfAbsent](key, ifAbsent);
     }
     addAll(other) {
-      return this[_data$][dartx.addAll](other);
+      return this[_data$0][dartx.addAll](other);
     }
     remove(key) {
-      return this[_data$][dartx.remove](key);
+      return this[_data$0][dartx.remove](key);
     }
     clear() {
-      this[_data$][dartx.clear]();
+      this[_data$0][dartx.clear]();
     }
     forEach(f) {
-      this[_data$][dartx.forEach](f);
+      this[_data$0][dartx.forEach](f);
     }
     get keys() {
-      return this[_data$][dartx.keys];
+      return this[_data$0][dartx.keys];
     }
     get values() {
-      return this[_data$][dartx.values];
+      return this[_data$0][dartx.values];
     }
     get length() {
-      return this[_data$][dartx.length];
+      return this[_data$0][dartx.length];
     }
     get isEmpty() {
-      return this[_data$][dartx.isEmpty];
+      return this[_data$0][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_data$][dartx.isNotEmpty];
+      return this[_data$0][dartx.isNotEmpty];
     }
     toString() {
-      return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+      return dart.str`HttpSession id:${this.id} ${this[_data$0]}`;
     }
   };
   io._HttpSession[dart.implements] = () => [io.HttpSession];
@@ -45156,7 +46000,7 @@
       [_prev]: io._HttpSession,
       [_next$1]: io._HttpSession,
       id: core.String,
-      [_data$]: core.Map
+      [_data$0]: core.Map
     }),
     getters: () => ({
       lastSeen: dart.definiteFunctionType(core.DateTime, []),
@@ -45327,7 +46171,7 @@
       this.id = io._IOResourceInfo.getNextID();
     }
     get referenceValueMap() {
-      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
+      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.Object);
     }
     static getNextID() {
       return (() => {
@@ -45342,7 +46186,7 @@
       type: core.String,
       id: core.int
     }),
-    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
     names: ['getNextID']
   });
@@ -45383,7 +46227,7 @@
       super.new(type);
     }
     get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
+      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.Object);
     }
   };
   dart.setSignature(io._ReadWriteResourceInfo, {
@@ -45395,7 +46239,7 @@
       lastRead: core.double,
       lastWrite: core.double
     }),
-    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     methods: () => ({
       addRead: dart.definiteFunctionType(dart.void, [core.int]),
       didRead: dart.definiteFunctionType(dart.void, []),
@@ -45417,7 +46261,7 @@
       io._FileResourceInfo.openFiles[dartx.remove](info.id);
     }
     static getOpenFilesList() {
-      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$dynamic())));
     }
     static getOpenFiles(func, params) {
       dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
@@ -45426,8 +46270,7 @@
       return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
     }
     getFileInfoMap() {
-      let result = this.fullValueMap;
-      return result;
+      return this.fullValueMap;
     }
     static getFileInfoMapByID(func, params) {
       dart.assert(dart.dsend(params, 'containsKey', 'id'));
@@ -45443,7 +46286,7 @@
   dart.setSignature(io._FileResourceInfo, {
     fields: () => ({file: dart.dynamic}),
     getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({
       FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
       FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
@@ -45470,13 +46313,13 @@
       io._ProcessResourceInfo.ProcessStarted(this);
     }
     get name() {
-      return core.String._check(dart.dload(this.process, _path$));
+      return core.String._check(dart.dload(this.process, _path));
     }
     stopped() {
       io._ProcessResourceInfo.ProcessStopped(this);
     }
     get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+      return dart.map({type: this.type, id: this.id, name: this.name, pid: dart.dload(this.process, 'pid'), startedAt: this.startedAt, arguments: dart.dload(this.process, _arguments$0), workingDirectory: dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory)}, core.String, core.Object);
     }
     static ProcessStarted(info) {
       dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
@@ -45487,7 +46330,7 @@
       io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
     }
     static getStartedProcessesList() {
-      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$dynamic())));
     }
     static getStartedProcesses(func, params) {
       dart.assert(func == 'ext.dart.io.getProcesses');
@@ -45509,7 +46352,7 @@
     }),
     getters: () => ({
       name: dart.definiteFunctionType(core.String, []),
-      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])
     }),
     methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
     statics: () => ({
@@ -45549,18 +46392,18 @@
       return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
     }
     static getOpenSocketsList() {
-      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$dynamic())));
     }
     getSocketInfoMap() {
       let result = this.fullValueMap;
       result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
-      result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
-      result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
-      result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
+      result[dartx._set]('listening', dart.dload(this.socket, 'isListening'));
+      result[dartx._set]('host', dart.dload(dart.dload(this.socket, 'address'), 'host'));
+      result[dartx._set]('port', dart.dload(this.socket, 'port'));
       if (!dart.test(dart.dload(this.socket, 'isListening'))) {
         try {
-          result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
-          result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
+          result[dartx._set]('remoteHost', dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host'));
+          result[dartx._set]('remotePort', dart.dload(this.socket, 'remotePort'));
         } catch (e) {
           result[dartx._set]('remotePort', 'NA');
           result[dartx._set]('remoteHost', 'NA');
@@ -45570,7 +46413,7 @@
         result[dartx._set]('remotePort', 'NA');
         result[dartx._set]('remoteHost', 'NA');
       }
-      result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
+      result[dartx._set]('addressType', dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name'));
       return result;
     }
     static getSocketInfoMapByID(func, params) {
@@ -45598,7 +46441,7 @@
   dart.setSignature(io._SocketResourceInfo, {
     fields: () => ({socket: dart.dynamic}),
     getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({
       getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
       getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
@@ -45640,33 +46483,36 @@
   io._FILE_TRUNCATE = 10;
   io._FILE_LENGTH = 11;
   io._FILE_LENGTH_FROM_PATH = 12;
-  io._FILE_LAST_MODIFIED = 13;
-  io._FILE_FLUSH = 14;
-  io._FILE_READ_BYTE = 15;
-  io._FILE_WRITE_BYTE = 16;
-  io._FILE_READ = 17;
-  io._FILE_READ_INTO = 18;
-  io._FILE_WRITE_FROM = 19;
-  io._FILE_CREATE_LINK = 20;
-  io._FILE_DELETE_LINK = 21;
-  io._FILE_RENAME_LINK = 22;
-  io._FILE_LINK_TARGET = 23;
-  io._FILE_TYPE = 24;
-  io._FILE_IDENTICAL = 25;
-  io._FILE_STAT = 26;
-  io._FILE_LOCK = 27;
-  io._SOCKET_LOOKUP = 28;
-  io._SOCKET_LIST_INTERFACES = 29;
-  io._SOCKET_REVERSE_LOOKUP = 30;
-  io._DIRECTORY_CREATE = 31;
-  io._DIRECTORY_DELETE = 32;
-  io._DIRECTORY_EXISTS = 33;
-  io._DIRECTORY_CREATE_TEMP = 34;
-  io._DIRECTORY_LIST_START = 35;
-  io._DIRECTORY_LIST_NEXT = 36;
-  io._DIRECTORY_LIST_STOP = 37;
-  io._DIRECTORY_RENAME = 38;
-  io._SSL_PROCESS_FILTER = 39;
+  io._FILE_LAST_ACCESSED = 13;
+  io._FILE_SET_LAST_ACCESSED = 14;
+  io._FILE_LAST_MODIFIED = 15;
+  io._FILE_SET_LAST_MODIFIED = 16;
+  io._FILE_FLUSH = 17;
+  io._FILE_READ_BYTE = 18;
+  io._FILE_WRITE_BYTE = 19;
+  io._FILE_READ = 20;
+  io._FILE_READ_INTO = 21;
+  io._FILE_WRITE_FROM = 22;
+  io._FILE_CREATE_LINK = 23;
+  io._FILE_DELETE_LINK = 24;
+  io._FILE_RENAME_LINK = 25;
+  io._FILE_LINK_TARGET = 26;
+  io._FILE_TYPE = 27;
+  io._FILE_IDENTICAL = 28;
+  io._FILE_STAT = 29;
+  io._FILE_LOCK = 30;
+  io._SOCKET_LOOKUP = 31;
+  io._SOCKET_LIST_INTERFACES = 32;
+  io._SOCKET_REVERSE_LOOKUP = 33;
+  io._DIRECTORY_CREATE = 34;
+  io._DIRECTORY_DELETE = 35;
+  io._DIRECTORY_EXISTS = 36;
+  io._DIRECTORY_CREATE_TEMP = 37;
+  io._DIRECTORY_LIST_START = 38;
+  io._DIRECTORY_LIST_NEXT = 39;
+  io._DIRECTORY_LIST_STOP = 40;
+  io._DIRECTORY_RENAME = 41;
+  io._SSL_PROCESS_FILTER = 42;
   io._IOService = class _IOService extends core.Object {
     static _dispatch(request, data) {
       dart.throw(new core.UnsupportedError("_IOService._dispatch"));
@@ -45706,12 +46552,6 @@
     get absolute() {
       return io.Link.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
     create(target, opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       if (dart.test(io.Platform.isWindows)) {
@@ -45835,8 +46675,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
       create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
       [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
@@ -45922,6 +46760,9 @@
     },
     get isIOS() {
       return io.Platform._operatingSystem == "ios";
+    },
+    get isFuchsia() {
+      return io.Platform._operatingSystem == "fuchsia";
     }
   });
   io._Platform = class _Platform extends core.Object {
@@ -45983,14 +46824,17 @@
         let env = io._Platform._environment();
         if (!io.OSError.is(env)) {
           let isWindows = io._Platform.operatingSystem == 'windows';
-          let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
+          let result = isWindows ? new (_CaseInsensitiveStringMapOfString())() : MapOfString$String().new();
           for (let str of core.Iterable._check(env)) {
+            if (str == null) {
+              continue;
+            }
             let equalsIndex = dart.dsend(str, 'indexOf', '=');
             if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
-              result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
+              result[dartx._set](core.String._check(dart.dsend(str, 'substring', 0, equalsIndex)), core.String._check(dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1))));
             }
           }
-          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
+          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(result);
         } else {
           io._Platform._environmentCache = env;
         }
@@ -45998,7 +46842,7 @@
       if (io.OSError.is(io._Platform._environmentCache)) {
         dart.throw(io._Platform._environmentCache);
       } else {
-        return MapOfString$String()._check(io._Platform._environmentCache);
+        return MapOfString$String().as(io._Platform._environmentCache);
       }
     }
     static get version() {
@@ -46046,6 +46890,7 @@
     let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
+    let StringAndVToV = () => (StringAndVToV = dart.constFn(dart.definiteFunctionType(V, [core.String, V])))();
     class _CaseInsensitiveStringMap extends core.Object {
       new() {
         this[_map$1] = MapOfString$V().new();
@@ -46069,7 +46914,8 @@
         return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
       }
       addAll(other) {
-        other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
+        MapOfString$V()._check(other);
+        other[dartx.forEach](dart.fn((key, value) => this._set(key[dartx.toUpperCase](), value), StringAndVToV()));
       }
       remove(key) {
         return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
@@ -46116,7 +46962,7 @@
         _get: dart.definiteFunctionType(V, [core.Object]),
         _set: dart.definiteFunctionType(dart.void, [core.String, V]),
         putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
-        addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+        addAll: dart.definiteFunctionType(dart.void, [MapOfString$V()]),
         remove: dart.definiteFunctionType(V, [core.Object]),
         clear: dart.definiteFunctionType(dart.void, []),
         forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
@@ -46224,9 +47070,6 @@
     'DETACHED_WITH_STDIO'
   ]);
   io.Process = class Process extends core.Object {
-    new() {
-      this.exitCode = null;
-    }
     static start(executable, arguments$, opts) {
       let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
       let environment = opts && 'environment' in opts ? opts.environment : null;
@@ -46259,7 +47102,6 @@
     }
   };
   dart.setSignature(io.Process, {
-    fields: () => ({exitCode: FutureOfint()}),
     statics: () => ({
       start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
       run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
@@ -46455,22 +47297,14 @@
       let host = opts && 'host' in opts ? opts.host : null;
       let context = opts && 'context' in opts ? opts.context : null;
       let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
+      return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket.as(dart.dindex(detachedRaw, 0)), {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
     }
     static secureServer(socket, context, opts) {
       let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
       let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
       let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
       let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
+      return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket.as(dart.dindex(detachedRaw, 0)), context, {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
     }
   };
   io.SecureSocket[dart.implements] = () => [io.Socket];
@@ -46566,8 +47400,8 @@
   dart.setSignature(io.RawSecureSocket, {
     statics: () => ({
       connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: StreamSubscriptionOfRawSocketEvent(), host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
     }),
     names: ['connect', 'secure', 'secureServer']
   });
@@ -46738,13 +47572,13 @@
   const _pushAllFilterStages = Symbol('_pushAllFilterStages');
   const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
   const _sendReadEvent = Symbol('_sendReadEvent');
-  let const$75;
+  let const$78;
   io.RawSocketEvent = class RawSocketEvent extends core.Object {
     _(value) {
       this[_value$1] = value;
     }
     toString() {
-      return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
+      return (const$78 || (const$78 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
     }
   };
   dart.defineNamedConstructor(io.RawSocketEvent, '_');
@@ -46785,12 +47619,12 @@
       if (host != null) {
         address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
       }
-      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, subscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
     }
     new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
       this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
       this[_status] = io._RawSecureSocket.HANDSHAKE;
-      this[_closeCompleter] = async.Completer.new();
+      this[_closeCompleter] = CompleterOfRawSecureSocket().new();
       this[_filterStatus] = new io._FilterStatus();
       this[_secureFilter] = io._SecureFilter.new();
       this.address = address;
@@ -46900,7 +47734,7 @@
     }
     close() {
       this.shutdown(io.SocketDirection.BOTH);
-      return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+      return this[_closeCompleter].future;
     }
     [_completeCloseCompleter](dummy) {
       if (dummy === void 0) dummy = null;
@@ -47346,7 +48180,7 @@
       [_socketClosedWrite]: core.bool,
       [_closedRead]: core.bool,
       [_closedWrite]: core.bool,
-      [_closeCompleter]: async.Completer,
+      [_closeCompleter]: CompleterOfRawSecureSocket(),
       [_filterStatus]: io._FilterStatus,
       [_connectPending]: core.bool,
       [_filterPending]: core.bool,
@@ -47372,7 +48206,7 @@
       listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       available: dart.definiteFunctionType(core.int, []),
       close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
-      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [io.RawSocket]),
       [_close$0]: dart.definiteFunctionType(dart.void, []),
       shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
       read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
@@ -47402,7 +48236,7 @@
     }),
     statics: () => ({
       _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
-      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
       _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
     }),
     names: ['_isBufferEncrypted', 'connect', '_verifyFields']
@@ -47508,7 +48342,7 @@
       while (true) {
         let toWrite = this.linearLength;
         if (toWrite == 0) return false;
-        let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
+        let bytes = socket.write(this.data, this.start, toWrite);
         this.advanceStart(bytes);
         if (dart.notNull(bytes) < dart.notNull(toWrite)) {
           return true;
@@ -47518,7 +48352,7 @@
   };
   dart.setSignature(io._ExternalBuffer, {
     fields: () => ({
-      data: core.List,
+      data: ListOfint(),
       start: core.int,
       end: core.int,
       size: dart.dynamic
@@ -47982,7 +48816,7 @@
       let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
       let CR = 13;
       let LF = 10;
-      let line = [];
+      let line = JSArrayOfint().of([]);
       let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
       if (dart.test(retainNewlines)) {
         let byte = null;
@@ -48025,7 +48859,7 @@
             line[dartx.add](byte);
           }
       }
-      return encoding.decode(ListOfint()._check(line));
+      return encoding.decode(line);
     }
     set echoMode(enabled) {
       dart.throw(new core.UnsupportedError("Stdin.echoMode"));
@@ -48062,9 +48896,11 @@
   const _hasTerminal = Symbol('_hasTerminal');
   const _terminalColumns = Symbol('_terminalColumns');
   const _terminalLines = Symbol('_terminalLines');
-  io._StdSink = class _StdSink extends core.Object {
-    new(sink) {
+  const _isTranslatable = Symbol('_isTranslatable');
+  io._StdSinkHelper = class _StdSinkHelper extends core.Object {
+    new(sink, isTranslatable) {
       this[_sink$0] = sink;
+      this[_isTranslatable] = isTranslatable;
     }
     get encoding() {
       return this[_sink$0].encoding;
@@ -48072,18 +48908,29 @@
     set encoding(encoding) {
       this[_sink$0].encoding = encoding;
     }
+    set [_translation](t) {
+      if (dart.test(this[_isTranslatable])) {
+        let sink = io._IOSinkImpl._check(this[_sink$0]);
+        let target = io._StdConsumer._check(sink[_target$]);
+        dart.dput(target[_file], 'translation', t);
+      }
+    }
     write(object) {
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].write(object);
     }
     writeln(object) {
       if (object === void 0) object = "";
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeln(object);
     }
     writeAll(objects, sep) {
       if (sep === void 0) sep = "";
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeAll(objects, sep);
     }
     add(data) {
+      this[_translation] = io._FileTranslation.binary;
       this[_sink$0].add(data);
     }
     addError(error, stackTrace) {
@@ -48091,9 +48938,11 @@
       this[_sink$0].addError(error, stackTrace);
     }
     writeCharCode(charCode) {
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeCharCode(charCode);
     }
     addStream(stream) {
+      this[_translation] = io._FileTranslation.binary;
       return this[_sink$0].addStream(stream);
     }
     flush() {
@@ -48106,14 +48955,20 @@
       return this[_sink$0].done;
     }
   };
-  io._StdSink[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io._StdSink, {
-    fields: () => ({[_sink$0]: io.IOSink}),
+  io._StdSinkHelper[dart.implements] = () => [io.IOSink];
+  dart.setSignature(io._StdSinkHelper, {
+    fields: () => ({
+      [_sink$0]: io.IOSink,
+      [_isTranslatable]: core.bool
+    }),
     getters: () => ({
       encoding: dart.definiteFunctionType(convert.Encoding, []),
       done: dart.definiteFunctionType(async.Future, [])
     }),
-    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+    setters: () => ({
+      encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
+      [_translation]: dart.definiteFunctionType(dart.void, [io._FileTranslation])
+    }),
     methods: () => ({
       write: dart.definiteFunctionType(dart.void, [core.Object]),
       writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
@@ -48126,7 +48981,12 @@
       close: dart.definiteFunctionType(async.Future, [])
     })
   });
-  io.Stdout = class Stdout extends io._StdSink {
+  io._StdFileSink = class _StdFileSink extends io._StdSinkHelper {
+    new(sink) {
+      super.new(sink, true);
+    }
+  };
+  io.Stdout = class Stdout extends io._StdFileSink {
     _(sink, fd) {
       this[_fd] = fd;
       this[_nonBlocking] = null;
@@ -48193,6 +49053,23 @@
       osError: io.OSError
     })
   });
+  io.StdinException = class StdinException extends core.Object {
+    new(message, osError) {
+      if (osError === void 0) osError = null;
+      this.message = message;
+      this.osError = osError;
+    }
+    toString() {
+      return dart.str`StdinException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
+    }
+  };
+  io.StdinException[dart.implements] = () => [io.IOException];
+  dart.setSignature(io.StdinException, {
+    fields: () => ({
+      message: core.String,
+      osError: io.OSError
+    })
+  });
   io._StdConsumer = class _StdConsumer extends core.Object {
     new(fd) {
       this[_file] = io._File._openStdioSync(fd);
@@ -48225,6 +49102,11 @@
       close: dart.definiteFunctionType(async.Future, [])
     })
   });
+  io._StdSocketSink = class _StdSocketSink extends io._StdSinkHelper {
+    new(sink) {
+      super.new(sink, false);
+    }
+  };
   io.StdioType = class StdioType extends core.Object {
     _(name) {
       this.name = name;
@@ -48353,10 +49235,10 @@
     }),
     names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
   });
-  let const$76;
-  let const$77;
-  let const$78;
   let const$79;
+  let const$80;
+  let const$81;
+  let const$82;
   io.SystemEncoding = class SystemEncoding extends convert.Encoding {
     new() {
       super.new();
@@ -48372,16 +49254,16 @@
     }
     get encoder() {
       if (io.Platform.operatingSystem == "windows") {
-        return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+        return const$79 || (const$79 = dart.const(new io._WindowsCodePageEncoder()));
       } else {
-        return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
+        return const$80 || (const$80 = dart.const(new convert.Utf8Encoder()));
       }
     }
     get decoder() {
       if (io.Platform.operatingSystem == "windows") {
-        return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+        return const$81 || (const$81 = dart.const(new io._WindowsCodePageDecoder()));
       } else {
-        return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
+        return const$82 || (const$82 = dart.const(new convert.Utf8Decoder()));
       }
     }
   };
@@ -48412,6 +49294,7 @@
     }
   };
   dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
+  io._WindowsCodePageEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(io._WindowsCodePageEncoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
@@ -48464,6 +49347,7 @@
     }
   };
   dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
+  io._WindowsCodePageDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(io._WindowsCodePageDecoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.String, [ListOfint()]),
@@ -48692,6 +49576,14 @@
   io._WebSocketOpcode.RESERVED_D = 13;
   io._WebSocketOpcode.RESERVED_E = 14;
   io._WebSocketOpcode.RESERVED_F = 15;
+  io._EncodedString = class _EncodedString extends core.Object {
+    new(bytes) {
+      this.bytes = bytes;
+    }
+  };
+  dart.setSignature(io._EncodedString, {
+    fields: () => ({bytes: ListOfint()})
+  });
   io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
     new(headerValue, maxWindowBits) {
       if (headerValue === void 0) headerValue = null;
@@ -49031,7 +49923,7 @@
       this[_unmaskingIndex] = 0;
     }
   };
-  io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
+  io._WebSocketProtocolTransformer[dart.implements] = () => [EventSinkOfListOfint(), StreamTransformerOfListOfint$dynamic()];
   dart.setSignature(io._WebSocketProtocolTransformer, {
     fields: () => ({
       [_state$1]: core.int,
@@ -49054,7 +49946,7 @@
       [_deflate]: io._WebSocketPerMessageDeflate
     }),
     methods: () => ({
-      bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
+      bind: dart.definiteFunctionType(async.Stream, [StreamOfListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       close: dart.definiteFunctionType(dart.void, []),
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
@@ -49098,6 +49990,7 @@
   dart.setSignature(io._WebSocketPong, {
     fields: () => ({payload: ListOfint()})
   });
+  io._ProtocolSelector = dart.typedef('_ProtocolSelector', () => dart.functionType(dart.dynamic, [ListOfString()]));
   const _protocolSelector = Symbol('_protocolSelector');
   const _compression = Symbol('_compression');
   io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
@@ -49135,24 +50028,24 @@
         }
         let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
         response.headers.contentLength = 0;
-        return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
+        return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
       }
-      dart.fn(upgrade, StringToFuture());
+      dart.fn(upgrade, StringToFutureOfWebSocket());
       let protocols = request.headers._get('Sec-WebSocket-Protocol');
       if (protocols != null && _protocolSelector != null) {
         protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-        return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
-          if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
+        return FutureOfString().new(dart.fn(() => _protocolSelector(protocols), VoidTodynamic$())).then(core.String)(dart.fn(protocol => {
+          if (dart.notNull(protocols[dartx.indexOf](protocol)) < 0) {
             dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
           }
           return protocol;
-        }, dynamicTodynamic$())).catchError(dart.fn(error => {
+        }, StringToString$())).catchError(dart.fn(error => {
           response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
           response.close();
           dart.throw(error);
         }, dynamicToNull$())).then(io.WebSocket)(upgrade);
       } else {
-        return FutureOfWebSocket()._check(upgrade(null));
+        return upgrade(null);
       }
     }
     static _negotiateCompression(request, response, compression) {
@@ -49201,12 +50094,12 @@
   dart.setSignature(io._WebSocketTransformerImpl, {
     fields: () => ({
       [_controller$0]: StreamControllerOfWebSocket(),
-      [_protocolSelector]: core.Function,
+      [_protocolSelector]: io._ProtocolSelector,
       [_compression]: io.CompressionOptions
     }),
     methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
     statics: () => ({
-      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
+      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, io._ProtocolSelector, io.CompressionOptions]),
       _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
       _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
     }),
@@ -49214,7 +50107,7 @@
   });
   const _ensureDecoder = Symbol('_ensureDecoder');
   const _ensureEncoder = Symbol('_ensureEncoder');
-  let const$80;
+  let const$83;
   io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
     new(opts) {
       let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
@@ -49242,25 +50135,24 @@
     }
     processIncomingMessage(msg) {
       this[_ensureDecoder]();
-      let data = [];
+      let data = JSArrayOfint().of([]);
       data[dartx.addAll](msg);
-      data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
-      this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
-      let result = [];
+      data[dartx.addAll](const$83 || (const$83 = dart.constList([0, 0, 255, 255], core.int)));
+      this.decoder.process(data, 0, data[dartx.length]);
+      let result = JSArrayOfint().of([]);
       let out = null;
       while ((out = this.decoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
+        result[dartx.addAll](out);
       }
       if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
         this.decoder = null;
       }
-      return typed_data.Uint8List.fromList(ListOfint()._check(result));
+      return typed_data.Uint8List.fromList(result);
     }
     processOutgoingMessage(msg) {
       this[_ensureEncoder]();
-      let result = [];
+      let result = JSArrayOfint().of([]);
       let buffer = null;
-      let out = null;
       if (!typed_data.Uint8List.is(msg)) {
         for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
           if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
@@ -49272,8 +50164,9 @@
         buffer = typed_data.Uint8List._check(msg);
       }
       this.encoder.process(buffer, 0, buffer[dartx.length]);
+      let out = null;
       while ((out = this.encoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
+        result[dartx.addAll](out);
       }
       if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
         this.encoder = null;
@@ -49281,7 +50174,7 @@
       if (dart.notNull(result[dartx.length]) > 4) {
         result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
       }
-      return ListOfint()._check(result);
+      return result;
     }
   };
   dart.setSignature(io._WebSocketPerMessageDeflate, {
@@ -49335,13 +50228,14 @@
         if (typeof message == 'string') {
           opcode = io._WebSocketOpcode.TEXT;
           data = convert.UTF8.encode(message);
+        } else if (ListOfint().is(message)) {
+          opcode = io._WebSocketOpcode.BINARY;
+          data = message;
+        } else if (io._EncodedString.is(message)) {
+          opcode = io._WebSocketOpcode.TEXT;
+          data = message.bytes;
         } else {
-          if (ListOfint().is(message)) {
-            data = message;
-            opcode = io._WebSocketOpcode.BINARY;
-          } else {
-            dart.throw(new core.ArgumentError(message));
-          }
+          dart.throw(new core.ArgumentError(message));
         }
         if (this[_deflateHelper] != null) {
           data = this[_deflateHelper].processOutgoingMessage(data);
@@ -49371,7 +50265,7 @@
       this[_eventSink$].close();
     }
     addFrame(opcode, data) {
-      return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
+      io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
         this[_eventSink$].add(e);
       }, ListOfintToNull()));
     }
@@ -49563,7 +50457,7 @@
       this[_ensureController]();
       const closeSocket = (function() {
         return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, SocketTo_WebSocketImpl()));
       }).bind(this);
       dart.fn(closeSocket, VoidToFuture());
       this[_controller$0].close();
@@ -49613,7 +50507,7 @@
   const _pingTimer = Symbol('_pingTimer');
   const _consumer = Symbol('_consumer');
   const _closeTimer = Symbol('_closeTimer');
-  let const$81;
+  let const$84;
   io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
     static connect(url, protocols, headers, opts) {
       let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
@@ -49810,6 +50704,12 @@
     add(data) {
       this[_sink$0].add(data);
     }
+    addUtf8Text(bytes) {
+      if (!ListOfint().is(bytes)) {
+        dart.throw(new core.ArgumentError.value(bytes, "bytes", "Is not a list of bytes"));
+      }
+      this[_sink$0].add(new io._EncodedString(bytes));
+    }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
       this[_sink$0].addError(error, stackTrace);
@@ -49835,7 +50735,7 @@
           this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
         }
         if (this[_closeTimer] == null) {
-          this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
+          this[_closeTimer] = async.Timer.new(const$84 || (const$84 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
             this[_closeCode] = this[_outCloseCode];
             this[_closeReason] = this[_outCloseReason];
             if (this[_subscription$] != null) this[_subscription$].cancel();
@@ -49919,6 +50819,7 @@
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      addUtf8Text: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
       addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
       close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
@@ -49943,7 +50844,7 @@
       return io.HttpClient.new();
     }
   });
-  isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
+  isolate$.IsolateSpawnException = class IsolateSpawnException extends core.Object {
     new(message) {
       this.message = message;
     }
@@ -49951,12 +50852,12 @@
       return dart.str`IsolateSpawnException: ${this.message}`;
     }
   };
-  isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate.IsolateSpawnException, {
+  isolate$.IsolateSpawnException[dart.implements] = () => [core.Exception];
+  dart.setSignature(isolate$.IsolateSpawnException, {
     fields: () => ({message: core.String})
   });
   const _pause = Symbol('_pause');
-  isolate.Isolate = class Isolate extends core.Object {
+  isolate$.Isolate = class Isolate extends core.Object {
     new(controlPort, opts) {
       let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
       let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
@@ -49965,12 +50866,48 @@
       this.terminateCapability = terminateCapability;
     }
     static get current() {
-      return isolate.Isolate._currentIsolateCache;
+      return isolate$.Isolate._currentIsolateCache;
+    }
+    static get packageRoot() {
+      dart.throw(new core.UnsupportedError("Isolate.packageRoot"));
+    }
+    static get packageConfig() {
+      dart.throw(new core.UnsupportedError("Isolate.packageConfig"));
+    }
+    static resolvePackageUri(packageUri) {
+      return dart.async(function*(packageUri) {
+        if (packageUri.scheme != 'package') return packageUri;
+        return isolate$.Isolate._packageBase.resolveUri(packageUri.replace({scheme: ''}));
+      }, core.Uri, packageUri);
     }
     static spawn(entryPoint, message, opts) {
       let paused = opts && 'paused' in opts ? opts.paused : false;
+      let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+      let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let forcePause = errorsAreFatal != null || onExit != null || onError != null;
       try {
-        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+        if (!isolate$._UnaryFunction.is(entryPoint)) {
+          dart.throw(new core.ArgumentError(entryPoint));
+        }
+        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+          let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+          if (forcePause) {
+            if (errorsAreFatal != null) {
+              isolate.setErrorsFatal(errorsAreFatal);
+            }
+            if (onExit != null) {
+              isolate.addOnExitListener(onExit);
+            }
+            if (onError != null) {
+              isolate.addErrorListener(onError);
+            }
+            if (!dart.test(paused)) {
+              isolate.resume(isolate.pauseCapability);
+            }
+          }
+          return isolate;
+        }, ListToIsolate()));
       } catch (e) {
         let st = dart.stackTrace(e);
         return FutureOfIsolate().error(e, st);
@@ -49979,10 +50916,20 @@
     }
     static spawnUri(uri, args, message, opts) {
       let paused = opts && 'paused' in opts ? opts.paused : false;
+      let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+      let checked = opts && 'checked' in opts ? opts.checked : null;
+      let environment = opts && 'environment' in opts ? opts.environment : null;
       let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
+      let packageConfig = opts && 'packageConfig' in opts ? opts.packageConfig : null;
+      let automaticPackageResolution = opts && 'automaticPackageResolution' in opts ? opts.automaticPackageResolution : false;
+      if (environment != null) dart.throw(new core.UnimplementedError("environment"));
       if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
+      if (packageConfig != null) dart.throw(new core.UnimplementedError("packageConfig"));
+      let forcePause = errorsAreFatal != null || onExit != null || onError != null;
       try {
-        if (core.List.is(args)) {
+        if (ListOfString().is(args)) {
           for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
             if (!(typeof args[dartx._get](i) == 'string')) {
               dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
@@ -49991,7 +50938,24 @@
         } else if (args != null) {
           dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
         }
-        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+          let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+          if (forcePause) {
+            if (errorsAreFatal != null) {
+              isolate.setErrorsFatal(errorsAreFatal);
+            }
+            if (onExit != null) {
+              isolate.addOnExitListener(onExit);
+            }
+            if (onError != null) {
+              isolate.addErrorListener(onError);
+            }
+            if (!dart.test(paused)) {
+              isolate.resume(isolate.pauseCapability);
+            }
+          }
+          return isolate;
+        }, ListToIsolate()));
       } catch (e) {
         let st = dart.stackTrace(e);
         return FutureOfIsolate().error(e, st);
@@ -50000,7 +50964,8 @@
     }
     pause(resumeCapability) {
       if (resumeCapability === void 0) resumeCapability = null;
-      if (resumeCapability == null) resumeCapability = isolate.Capability.new();
+      let t = resumeCapability;
+      t == null ? resumeCapability = isolate$.Capability.new() : t;
       this[_pause](resumeCapability);
       return resumeCapability;
     }
@@ -50017,10 +50982,12 @@
       message[dartx._set](1, resumeCapability);
       this.controlPort.send(message);
     }
-    addOnExitListener(responsePort) {
-      let message = core.List.new(2);
+    addOnExitListener(responsePort, opts) {
+      let response = opts && 'response' in opts ? opts.response : null;
+      let message = core.List.new(3);
       message[dartx._set](0, "add-ondone");
       message[dartx._set](1, responsePort);
+      message[dartx._set](2, response);
       this.controlPort.send(message);
     }
     removeOnExitListener(responsePort) {
@@ -50036,16 +51003,18 @@
       message[dartx._set](2, errorsAreFatal);
       this.controlPort.send(message);
     }
-    kill(priority) {
-      if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
+    kill(opts) {
+      let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.BEFORE_NEXT_EVENT;
       this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
     }
-    ping(responsePort, pingType) {
-      if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
-      let message = core.List.new(3);
+    ping(responsePort, opts) {
+      let response = opts && 'response' in opts ? opts.response : null;
+      let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.IMMEDIATE;
+      let message = core.List.new(4);
       message[dartx._set](0, "ping");
       message[dartx._set](1, responsePort);
-      message[dartx._set](2, pingType);
+      message[dartx._set](2, priority);
+      message[dartx._set](3, response);
       this.controlPort.send(message);
     }
     addErrorListener(port) {
@@ -50066,12 +51035,12 @@
       function handleError(message) {
         let errorDescription = core.String._check(dart.dindex(message, 0));
         let stackDescription = core.String._check(dart.dindex(message, 1));
-        let error = new isolate.RemoteError(errorDescription, stackDescription);
+        let error = new isolate$.RemoteError(errorDescription, stackDescription);
         controller.addError(error, error.stackTrace);
       }
       dart.fn(handleError, dynamicTovoid$());
       controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
-          port = isolate.RawReceivePort.new(handleError);
+          port = isolate$.RawReceivePort.new(handleError);
           this.addErrorListener(port.sendPort);
         }, VoidToNull()), onCancel: dart.fn(() => {
           this.removeErrorListener(port.sendPort);
@@ -50081,42 +51050,46 @@
       return controller.stream;
     }
   };
-  dart.setSignature(isolate.Isolate, {
+  dart.setSignature(isolate$.Isolate, {
     fields: () => ({
-      controlPort: isolate.SendPort,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability
+      controlPort: isolate$.SendPort,
+      pauseCapability: isolate$.Capability,
+      terminateCapability: isolate$.Capability
     }),
     getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
     methods: () => ({
-      pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
-      [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+      pause: dart.definiteFunctionType(isolate$.Capability, [], [isolate$.Capability]),
+      [_pause]: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      resume: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object}),
+      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
       setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
-      kill: dart.definiteFunctionType(dart.void, [], [core.int]),
-      ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
+      kill: dart.definiteFunctionType(dart.void, [], {priority: core.int}),
+      ping: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object, priority: core.int}),
+      addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort])
     }),
     statics: () => ({
-      spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
-      spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
+      resolvePackageUri: dart.definiteFunctionType(async.Future$(core.Uri), [core.Uri]),
+      spawn: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool, errorsAreFatal: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort}),
+      spawnUri: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort, errorsAreFatal: core.bool, checked: core.bool, environment: MapOfString$String(), packageRoot: core.Uri, packageConfig: core.Uri, automaticPackageResolution: core.bool})
     }),
-    names: ['spawn', 'spawnUri']
+    names: ['resolvePackageUri', 'spawn', 'spawnUri']
   });
-  isolate.Isolate.IMMEDIATE = 0;
-  isolate.Isolate.BEFORE_NEXT_EVENT = 1;
-  isolate.Isolate.AS_EVENT = 2;
-  dart.defineLazy(isolate.Isolate, {
+  isolate$.Isolate.IMMEDIATE = 0;
+  isolate$.Isolate.BEFORE_NEXT_EVENT = 1;
+  dart.defineLazy(isolate$.Isolate, {
     get _currentIsolateCache() {
       return _isolate_helper.IsolateNatives.currentIsolate;
-    }
+    },
+    get _packageBase() {
+      return core.Uri.base.resolve(core.String._check(dart.dload(_isolate_helper.IsolateNatives, 'packagesBase')));
+    },
+    set _packageBase(_) {}
   });
-  isolate.SendPort = class SendPort extends core.Object {};
-  isolate.SendPort[dart.implements] = () => [isolate.Capability];
-  isolate.ReceivePort = class ReceivePort extends core.Object {
+  isolate$.SendPort = class SendPort extends core.Object {};
+  isolate$.SendPort[dart.implements] = () => [isolate$.Capability];
+  isolate$.ReceivePort = class ReceivePort extends core.Object {
     static new() {
       return new _isolate_helper.ReceivePortImpl();
     }
@@ -50124,62 +51097,32 @@
       return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
     }
   };
-  isolate.ReceivePort[dart.implements] = () => [async.Stream];
-  isolate.RawReceivePort = class RawReceivePort extends core.Object {
+  isolate$.ReceivePort[dart.implements] = () => [async.Stream];
+  isolate$.RawReceivePort = class RawReceivePort extends core.Object {
     static new(handler) {
       if (handler === void 0) handler = null;
       return new _isolate_helper.RawReceivePortImpl(handler);
     }
   };
-  isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
-    new(message, source, stackTrace) {
-      this.message = message;
-      this.source = source;
-      this.stackTrace = stackTrace;
-    }
-    toString() {
-      return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
-    }
-  };
-  isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate._IsolateUnhandledException, {
-    fields: () => ({
-      message: dart.dynamic,
-      source: dart.dynamic,
-      stackTrace: core.StackTrace
-    })
-  });
   const _description = Symbol('_description');
-  isolate.RemoteError = class RemoteError extends core.Object {
+  isolate$.RemoteError = class RemoteError extends core.Object {
     new(description, stackDescription) {
       this[_description] = description;
-      this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
+      this.stackTrace = core.StackTrace.fromString(stackDescription);
     }
     toString() {
       return this[_description];
     }
   };
-  isolate.RemoteError[dart.implements] = () => [core.Error];
-  dart.setSignature(isolate.RemoteError, {
+  isolate$.RemoteError[dart.implements] = () => [core.Error];
+  dart.setSignature(isolate$.RemoteError, {
     fields: () => ({
       [_description]: core.String,
       stackTrace: core.StackTrace
     })
   });
-  const _trace$ = Symbol('_trace');
-  isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
-    new(trace) {
-      this[_trace$] = trace;
-    }
-    toString() {
-      return this[_trace$];
-    }
-  };
-  isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
-  dart.setSignature(isolate._RemoteStackTrace, {
-    fields: () => ({[_trace$]: core.String})
-  });
-  isolate.Capability = class Capability extends core.Object {
+  isolate$._UnaryFunction = dart.typedef('_UnaryFunction', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+  isolate$.Capability = class Capability extends core.Object {
     static new() {
       return new _isolate_helper.CapabilityImpl();
     }
@@ -50696,13 +51639,40 @@
   math.SQRT2 = 1.4142135623730951;
   math.min = function(T) {
     return (a, b) => {
-      return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
+      if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+      if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+      if (dart.notNull(a) > dart.notNull(b)) return b;
+      if (dart.notNull(a) < dart.notNull(b)) return a;
+      if (typeof b == 'number') {
+        if (typeof a == 'number') {
+          if (a == 0.0) {
+            return (dart.notNull(a) + dart.notNull(b)) * dart.notNull(a) * dart.notNull(b);
+          }
+        }
+        if (a == 0 && dart.test(b[dartx.isNegative]) || dart.test(b[dartx.isNaN])) return b;
+        return a;
+      }
+      return a;
     };
   };
   dart.fn(math.min, TAndTToT());
   math.max = function(T) {
     return (a, b) => {
-      return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
+      if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+      if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+      if (dart.notNull(a) > dart.notNull(b)) return a;
+      if (dart.notNull(a) < dart.notNull(b)) return b;
+      if (typeof b == 'number') {
+        if (typeof a == 'number') {
+          if (a == 0.0) {
+            return dart.notNull(a) + dart.notNull(b);
+          }
+        }
+        if (dart.test(b[dartx.isNaN])) return b;
+        return a;
+      }
+      if (b == 0 && dart.test(a[dartx.isNegative])) return b;
+      return a;
     };
   };
   dart.fn(math.max, TAndTToT$());
@@ -51055,11 +52025,11 @@
     return Point;
   });
   math.Point = Point$();
-  let const$82;
+  let const$85;
   math.Random = class Random extends core.Object {
     static new(seed) {
       if (seed === void 0) seed = null;
-      return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
+      return seed == null ? const$85 || (const$85 = dart.const(new math._JSRandom())) : new math._Random(seed);
     }
     static secure() {
       return math.Random._secureRandom;
@@ -51103,8 +52073,7 @@
       }
       ['=='](other) {
         if (!RectangleOfnum().is(other)) return false;
-        let otherRect = RectangleOfnum().as(other);
-        return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
+        return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.right], dart.dload(other, 'right')) && dart.equals(this[dartx.bottom], dart.dload(other, 'bottom'));
       }
       get hashCode() {
         return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
@@ -52414,7 +53383,7 @@
   });
   dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
   const _add$3 = Symbol('_add');
-  const _clear$0 = Symbol('_clear');
+  const _clear$ = Symbol('_clear');
   const _put = Symbol('_put');
   const _createIndex = Symbol('_createIndex');
   const _add_1 = Symbol('_add_1');
@@ -52462,7 +53431,7 @@
     }
     [dartx.clear]() {
       try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
+        return indexed_db._completeRequest(dart.dynamic)(this[_clear$]());
       } catch (e) {
         let stacktrace = dart.stackTrace(e);
         return async.Future.error(e, stacktrace);
@@ -52583,7 +53552,7 @@
     [_add_2](...args) {
       return this.add.apply(this, args);
     }
-    [_clear$0](...args) {
+    [_clear$](...args) {
       return this.clear.apply(this, args);
     }
     [_count$0](...args) {
@@ -52682,7 +53651,7 @@
       [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
       [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
       [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-      [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+      [_clear$]: dart.definiteFunctionType(indexed_db.Request, []),
       [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
       [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
       [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
@@ -59471,7 +60440,7 @@
   const _borderWidth = Symbol('_borderWidth');
   const _bottom = Symbol('_bottom');
   const _captionSide = Symbol('_captionSide');
-  const _clear$1 = Symbol('_clear');
+  const _clear$0 = Symbol('_clear');
   const _clip = Symbol('_clip');
   const _color = Symbol('_color');
   const _content = Symbol('_content');
@@ -64286,15 +65255,15 @@
       this.captionSide = value;
     }
     get [dartx.clear]() {
-      return this[_clear$1];
+      return this[_clear$0];
     }
     set [dartx.clear](value) {
-      this[_clear$1] = value == null ? '' : value;
+      this[_clear$0] = value == null ? '' : value;
     }
-    get [_clear$1]() {
+    get [_clear$0]() {
       return this.clear;
     }
-    set [_clear$1](value) {
+    set [_clear$0](value) {
       this.clear = value;
     }
     get [dartx.clip]() {
@@ -65041,7 +66010,7 @@
       [_borderWidth]: core.String,
       [_bottom]: core.String,
       [_captionSide]: core.String,
-      [_clear$1]: core.String,
+      [_clear$0]: core.String,
       [_clip]: core.String,
       [_color]: core.String,
       [_content]: core.String,
@@ -84089,7 +85058,7 @@
       return value;
     }
     [dartx.clear]() {
-      return this[_clear$1]();
+      return this[_clear$0]();
     }
     [dartx.forEach](f) {
       for (let i = 0; true; i++) {
@@ -84132,7 +85101,7 @@
     [__setter__](...args) {
       return this.__setter__.apply(this, args);
     }
-    [_clear$1](...args) {
+    [_clear$0](...args) {
       return this.clear.apply(this, args);
     }
     [_getItem](...args) {
@@ -84171,7 +85140,7 @@
       [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
       [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
       [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-      [_clear$1]: dart.definiteFunctionType(dart.void, []),
+      [_clear$0]: dart.definiteFunctionType(dart.void, []),
       [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
       [_key]: dart.definiteFunctionType(core.String, [core.int]),
       [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -93181,9 +94150,6 @@
       allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
     })
   });
-  let const$83;
-  let const$84;
-  let const$85;
   let const$86;
   let const$87;
   let const$88;
@@ -93191,15 +94157,18 @@
   let const$90;
   let const$91;
   let const$92;
+  let const$93;
+  let const$94;
+  let const$95;
   html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
     static allowNavigation(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
+      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['A::href', 'FORM::action'], core.String))});
     }
     static allowImages(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
+      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$89 || (const$89 = dart.constList(['IMG'], core.String)), allowedAttributes: const$90 || (const$90 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$91 || (const$91 = dart.constList(['IMG::src'], core.String))});
     }
     static allowTextElements() {
-      return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+      return new html$._SimpleNodeValidator(null, {allowedElements: const$92 || (const$92 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
     }
     new(uriPolicy, opts) {
       let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
@@ -93209,9 +94178,9 @@
       this.allowedAttributes = SetOfString().new();
       this.allowedUriAttributes = SetOfString().new();
       this.uriPolicy = uriPolicy;
-      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
-      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
-      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$93 || (const$93 = dart.constList([], core.String))));
+      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$94 || (const$94 = dart.constList([], core.String));
+      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$95 || (const$95 = dart.constList([], core.String));
       let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
       let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
       this.allowedAttributes.addAll(legalAttributes);
@@ -93497,7 +94466,7 @@
     names: ['get']
   });
   const _array = Symbol('_array');
-  const _current$4 = Symbol('_current');
+  const _current$2 = Symbol('_current');
   html$.FixedSizeListIterator$ = dart.generic(T => {
     let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
     let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
@@ -93506,21 +94475,21 @@
         this[_array] = array;
         this[_position$1] = -1;
         this[_length$3] = array[dartx.length];
-        this[_current$4] = null;
+        this[_current$2] = null;
       }
       moveNext() {
         let nextPosition = dart.notNull(this[_position$1]) + 1;
         if (nextPosition < dart.notNull(this[_length$3])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
+          this[_current$2] = this[_array][dartx._get](nextPosition);
           this[_position$1] = nextPosition;
           return true;
         }
-        this[_current$4] = null;
+        this[_current$2] = null;
         this[_position$1] = this[_length$3];
         return false;
       }
       get current() {
-        return this[_current$4];
+        return this[_current$2];
       }
     }
     dart.addTypeTests(FixedSizeListIterator);
@@ -93530,7 +94499,7 @@
         [_array]: ListOfT(),
         [_length$3]: core.int,
         [_position$1]: core.int,
-        [_current$4]: T
+        [_current$2]: T
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -93545,21 +94514,21 @@
       new(array) {
         this[_array] = array;
         this[_position$1] = -1;
-        this[_current$4] = null;
+        this[_current$2] = null;
       }
       moveNext() {
         let nextPosition = dart.notNull(this[_position$1]) + 1;
         if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
+          this[_current$2] = this[_array][dartx._get](nextPosition);
           this[_position$1] = nextPosition;
           return true;
         }
-        this[_current$4] = null;
+        this[_current$2] = null;
         this[_position$1] = this[_array][dartx.length];
         return false;
       }
       get current() {
-        return this[_current$4];
+        return this[_current$2];
       }
     }
     dart.addTypeTests(_VariableSizeListIterator);
@@ -93568,7 +94537,7 @@
       fields: () => ({
         [_array]: ListOfT(),
         [_position$1]: core.int,
-        [_current$4]: T
+        [_current$2]: T
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -104476,6 +105445,7 @@
     methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
   });
   dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
+  dart.trackLibraries("dart_sdk", {"dart:_runtime": dart, "dart:_debugger": _debugger, "dart:_foreign_helper": _foreign_helper, "dart:_interceptors": _interceptors, "dart:_internal": _internal, "dart:_isolate_helper": _isolate_helper, "dart:_js_embedded_names": _js_embedded_names, "dart:_js_helper": _js_helper, "dart:_js_mirrors": _js_mirrors, "dart:_js_primitives": _js_primitives, "dart:_metadata": _metadata, "dart:_native_typed_data": _native_typed_data, "dart:async": async, "dart:collection": collection, "dart:convert": convert, "dart:core": core, "dart:developer": developer, "dart:io": io, "dart:isolate": isolate$, "dart:js": js, "dart:js_util": js_util, "dart:math": math, "dart:mirrors": mirrors, "dart:typed_data": typed_data, "dart:indexed_db": indexed_db, "dart:html": html$, "dart:html_common": html_common, "dart:svg": svg$, "dart:web_audio": web_audio, "dart:web_gl": web_gl, "dart:web_sql": web_sql});
   // Exports:
   return {
     dart: dart,
@@ -104497,7 +105467,7 @@
     core: core,
     developer: developer,
     io: io,
-    isolate: isolate,
+    isolate: isolate$,
     js: js,
     js_util: js_util,
     math: math,
diff --git a/pkg/dev_compiler/lib/js/common/dart_sdk.js b/pkg/dev_compiler/lib/js/common/dart_sdk.js
index 0b3212c..0237cf3 100644
--- a/pkg/dev_compiler/lib/js/common/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/common/dart_sdk.js
@@ -18,7 +18,7 @@
 const core = Object.create(null);
 const developer = Object.create(null);
 const io = Object.create(null);
-const isolate = Object.create(null);
+const isolate$ = Object.create(null);
 const js = Object.create(null);
 const js_util = Object.create(null);
 const math = Object.create(null);
@@ -38,16 +38,14 @@
 let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
 let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
 let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
+let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
+let IterableOfNameValuePair = () => (IterableOfNameValuePair = dart.constFn(core.Iterable$(_debugger.NameValuePair)))();
 let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
 let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
 let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
 let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
 let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
-let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
 let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
-let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
-let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
-let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
 let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
 let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
 let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
@@ -56,6 +54,7 @@
 let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
 let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
 let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
+let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
 let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
 let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
 let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
@@ -69,6 +68,7 @@
 let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
 let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
 let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
+let EfficientLengthIterable = () => (EfficientLengthIterable = dart.constFn(_internal.EfficientLengthIterable$()))();
 let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
 let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
 let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
@@ -105,8 +105,8 @@
 let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
 let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
 let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
-let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
-let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
+let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate$.Capability)))();
+let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate$.SendPort)))();
 let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
 let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
 let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
@@ -137,6 +137,7 @@
 let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
 let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
 let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
+let FutureOfLibraryMirror = () => (FutureOfLibraryMirror = dart.constFn(async.Future$(mirrors.LibraryMirror)))();
 let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
 let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
 let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
@@ -148,7 +149,6 @@
 let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
 let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
 let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
-let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
 let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
 let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
 let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
@@ -170,7 +170,6 @@
 let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
 let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
 let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
-let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
 let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
 let _Future = () => (_Future = dart.constFn(async._Future$()))();
 let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
@@ -206,8 +205,9 @@
 let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
 let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
 let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
-let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
+let _StreamIterator = () => (_StreamIterator = dart.constFn(async._StreamIterator$()))();
 let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
+let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
 let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
 let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
 let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
@@ -310,7 +310,6 @@
 let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
 let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
 let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
-let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
 let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
 let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
 let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
@@ -339,8 +338,10 @@
 let List = () => (List = dart.constFn(core.List$()))();
 let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
 let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
+let ChunkedConverterOfString$ListOfint$String$ListOfint = () => (ChunkedConverterOfString$ListOfint$String$ListOfint = dart.constFn(convert.ChunkedConverter$(core.String, ListOfint(), core.String, ListOfint())))();
 let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
 let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
+let ChunkedConverterOfListOfint$String$ListOfint$String = () => (ChunkedConverterOfListOfint$String$ListOfint$String = dart.constFn(convert.ChunkedConverter$(ListOfint(), core.String, ListOfint(), core.String)))();
 let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
 let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
 let _ChunkedConversionCallbackOfListOfint = () => (_ChunkedConversionCallbackOfListOfint = dart.constFn(convert._ChunkedConversionCallback$(ListOfint())))();
@@ -351,8 +352,12 @@
 let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
 let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
 let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
+let ChunkedConverterOfString$String$String$String = () => (ChunkedConverterOfString$String$String$String = dart.constFn(convert.ChunkedConverter$(core.String, core.String, core.String, core.String)))();
+let ChunkedConverterOfObject$String$Object$String = () => (ChunkedConverterOfObject$String$Object$String = dart.constFn(convert.ChunkedConverter$(core.Object, core.String, core.Object, core.String)))();
 let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
 let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
+let ChunkedConverterOfObject$ListOfint$Object$ListOfint = () => (ChunkedConverterOfObject$ListOfint$Object$ListOfint = dart.constFn(convert.ChunkedConverter$(core.Object, ListOfint(), core.Object, ListOfint())))();
+let ChunkedConverterOfString$Object$String$Object = () => (ChunkedConverterOfString$Object$String$Object = dart.constFn(convert.ChunkedConverter$(core.String, core.Object, core.String, core.Object)))();
 let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
 let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
 let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
@@ -363,59 +368,62 @@
 let Expando = () => (Expando = dart.constFn(core.Expando$()))();
 let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
 let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
-let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
 let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
 let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
 let Set = () => (Set = dart.constFn(core.Set$()))();
 let Sink = () => (Sink = dart.constFn(core.Sink$()))();
 let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
+let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
 let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
 let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
-let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
 let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
 let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+let ListOfUint8List = () => (ListOfUint8List = dart.constFn(core.List$(typed_data.Uint8List)))();
 let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
 let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
 let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
 let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
 let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
 let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
-let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
-let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
+let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+let ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = () => (ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = dart.constFn(convert.ChunkedConverter$(ListOfint(), ListOfint(), ListOfint(), ListOfint())))();
 let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
 let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
-let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
 let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
 let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
 let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
 let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
 let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
+let StreamControllerOfFileSystemEntity = () => (StreamControllerOfFileSystemEntity = dart.constFn(async.StreamController$(io.FileSystemEntity)))();
 let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
 let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
 let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
+let CompleterOfListOfint = () => (CompleterOfListOfint = dart.constFn(async.Completer$(ListOfint())))();
 let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
 let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
 let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
-let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
+let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
 let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
 let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
 let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
 let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
 let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
 let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
-let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
 let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
 let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
 let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
 let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
 let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
 let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
+let CompleterOfSocket = () => (CompleterOfSocket = dart.constFn(async.Completer$(io.Socket)))();
 let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
 let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
-let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
 let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
+let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
+let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
 let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
 let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
+let CompleterOf_ConnectionInfo = () => (CompleterOf_ConnectionInfo = dart.constFn(async.Completer$(io._ConnectionInfo)))();
 let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
 let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
 let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
@@ -437,8 +445,7 @@
 let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
 let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
 let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
-let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
-let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
+let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
 let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
 let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
 let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
@@ -449,14 +456,16 @@
 let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
 let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
 let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
+let _CaseInsensitiveStringMapOfString = () => (_CaseInsensitiveStringMapOfString = dart.constFn(io._CaseInsensitiveStringMap$(core.String)))();
 let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
+let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
 let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
 let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
 let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
 let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
 let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
-let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
 let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
+let CompleterOfRawSecureSocket = () => (CompleterOfRawSecureSocket = dart.constFn(async.Completer$(io.RawSecureSocket)))();
 let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
 let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
 let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
@@ -465,15 +474,14 @@
 let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
 let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
 let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
+let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
 let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
-let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
 let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
 let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
-let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
-let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+let FutureOfString = () => (FutureOfString = dart.constFn(async.Future$(core.String)))();
 let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
 let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
-let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
+let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate$.Isolate)))();
 let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
 let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
 let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
@@ -594,6 +602,7 @@
 let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
 let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
 let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
+let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
 let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
 let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
 let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
@@ -639,18 +648,20 @@
 let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
 let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
 let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
-let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
-let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
+let dynamicAndSetOfNameValuePairAnddynamic__Tovoid = () => (dynamicAndSetOfNameValuePairAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair(), dart.dynamic, core.bool], {tagTypes: dart.dynamic})))();
+let NameValuePairAndNameValuePairToint = () => (NameValuePairAndNameValuePairToint = dart.constFn(dart.definiteFunctionType(core.int, [_debugger.NameValuePair, _debugger.NameValuePair])))();
+let IterableOfNameValuePairToListOfNameValuePair = () => (IterableOfNameValuePairToListOfNameValuePair = dart.constFn(dart.definiteFunctionType(ListOfNameValuePair(), [IterableOfNameValuePair()])))();
 let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
 let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
 let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
 let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
 let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
 let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
 let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
-let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
 let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
 let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
 let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
 let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
 let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
@@ -664,6 +675,8 @@
 let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
 let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
+let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
+let StringAndintToint = () => (StringAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int])))();
 let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
 let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
 let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
@@ -676,10 +689,11 @@
 let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
 let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
 let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
+let VoidTo_Future = () => (VoidTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [])))();
+let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
 let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
 let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
 let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
-let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
 let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
 let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -740,7 +754,7 @@
 let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
 let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
 let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
-let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
+let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), dynamicAndStackTraceTodynamic()])))();
 let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
 let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
 let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
@@ -778,12 +792,18 @@
 let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
 let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
 let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
+let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
+let StringAndintTovoid = () => (StringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.int])))();
+let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
 let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
 let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
-let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
 let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
-let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
 let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
+let intToUint8List = () => (intToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [core.int])))();
+let dynamicAnddynamicToUint8List = () => (dynamicAnddynamicToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [dart.dynamic, dart.dynamic])))();
+let Uint8ListAndStringAndintTovoid = () => (Uint8ListAndStringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.String, core.int])))();
+let VoidToListOfUint8List = () => (VoidToListOfUint8List = dart.constFn(dart.definiteFunctionType(ListOfUint8List(), [])))();
+let StringAndintAndint__Toint = () => (StringAndintAndint__Toint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, ListOfint()])))();
 let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
 let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
 let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -796,10 +816,11 @@
 let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
 let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
 let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
-let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
-let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
+let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort])))();
+let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.bool])))();
+let SendPortToString = () => (SendPortToString = dart.constFn(dart.definiteFunctionType(core.String, [isolate$.SendPort])))();
 let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
-let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
+let ListOfintAndintAndintTo_BufferAndStart = () => (ListOfintAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [ListOfint(), core.int, core.int])))();
 let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
 let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
 let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
@@ -818,17 +839,15 @@
 let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
 let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
 let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
-let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
-let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
 let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
+let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
 let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
 let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
 let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
 let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
-let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
+let dynamicToListOfint = () => (dynamicToListOfint = dart.constFn(dart.definiteFunctionType(ListOfint(), [dart.dynamic])))();
 let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
 let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
 let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
 let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
 let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
@@ -844,11 +863,14 @@
 let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
 let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
 let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
+let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
 let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
 let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
 let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
 let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
-let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
+let SocketToSocket = () => (SocketToSocket = dart.constFn(dart.definiteFunctionType(io.Socket, [io.Socket])))();
+let SocketTo_DetachedSocket = () => (SocketTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [io.Socket])))();
+let SocketTovoid = () => (SocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Socket])))();
 let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
 let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
 let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
@@ -862,14 +884,15 @@
 let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
 let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
 let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
+let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
 let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
 let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
 let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
 let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
-let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
-let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
-let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
+let _FileResourceInfoToMapOfString$dynamic = () => (_FileResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._FileResourceInfo])))();
+let _ProcessResourceInfoToMapOfString$dynamic = () => (_ProcessResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._ProcessResourceInfo])))();
+let _SocketResourceInfoToMapOfString$dynamic = () => (_SocketResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._SocketResourceInfo])))();
 let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
 let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
 let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
@@ -882,7 +905,6 @@
 let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
 let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
 let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
-let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
 let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
 let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
 let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
@@ -890,14 +912,13 @@
 let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
 let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
 let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
-let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
+let StringToFutureOfWebSocket = () => (StringToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [core.String])))();
 let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
-let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
 let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
 let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
 let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
 let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
-let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
+let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate$.Isolate, [core.List])))();
 let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
 let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
 let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
@@ -1462,8 +1483,8 @@
 dart.getIsNamedConstructor = function(value) {
   return value[dart.isNamedConstructor];
 };
-dart.getDartLibraryName = function(value) {
-  return value[dart_library.dartLibraryName];
+dart.getModuleName = function(value) {
+  return value[dart._moduleName];
 };
 dart.tag = function(value, t) {
   value[dart._runtimeType] = t;
@@ -1474,6 +1495,18 @@
 dart.tagLazy = function(value, compute) {
   dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
 };
+dart.getModuleNames = function() {
+  return Array.from(dart._loadedModules.keys());
+};
+dart.getModuleLibraries = function(name) {
+  let module = dart._loadedModules.get(name);
+  if (module == null) return null;
+  module[dart._moduleName] = name;
+  return module;
+};
+dart.trackLibraries = function(moduleName, libraries) {
+  dart._loadedModules.set(moduleName, libraries);
+};
 dart._warn = function(arg) {
   console.warn(arg);
 };
@@ -1616,6 +1649,9 @@
 dart.definiteFunctionType = function(returnType, args, extra) {
   return dart._functionType(true, returnType, args, extra);
 };
+dart.isType = function(obj) {
+  return dart._getRuntimeType(obj) === core.Type;
+};
 dart.typeName = function(type) {
   if (type === void 0) return "undefined type";
   if (type === null) return "null type";
@@ -2040,7 +2076,7 @@
   return name;
 };
 dart._dartSymbol = function(name) {
-  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
+  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.PrivateSymbol(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
 };
 dart.extractNamedArgs = function(args) {
   if (args.length > 0) {
@@ -2434,6 +2470,7 @@
     return obj[dartx.toString]();
   }
   if (typeof obj == "function") {
+    if (dart.test(dart.isType(obj))) return dart.typeName(obj);
     return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
   }
   return obj.toString();
@@ -2638,12 +2675,19 @@
 dart.dartx = dartx;
 dart._runtimeType = Symbol("_runtimeType");
 dart.isNamedConstructor = Symbol("isNamedConstructor");
+dart._moduleName = Symbol("_moduleName");
 dart.defineLazy(dart, {
   get _lazyJSTypes() {
     return new Map();
   },
   set _lazyJSTypes(_) {}
 });
+dart.defineLazy(dart, {
+  get _loadedModules() {
+    return new Map();
+  },
+  set _loadedModules(_) {}
+});
 dart.metadata = Symbol("metadata");
 dart._typeObject = Symbol("typeObject");
 core.Object = class Object {
@@ -3197,9 +3241,51 @@
   names: ['getProperty', 'setProperty']
 });
 _debugger.addMetadataChildren = function(object, ret) {
-  ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
+  ret.add(new _debugger.NameValuePair({name: "[[class]]", value: dart.getReifiedType(object), config: _debugger.JsonMLConfig.asClass}));
 };
 dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
+_debugger.addPropertiesFromSignature = function(sig, properties, object, walkPrototypeChain, opts) {
+  let tagTypes = opts && 'tagTypes' in opts ? opts.tagTypes : false;
+  let skippedNames = core.Set.new();
+  skippedNames.add('hashCode');
+  while (sig != null) {
+    for (let symbol of _debugger.getOwnPropertySymbols(sig)) {
+      let dartName = _debugger.symbolName(symbol);
+      let dartXPrefix = 'dartx.';
+      if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
+        dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
+      }
+      if (dart.test(skippedNames.contains(dartName))) continue;
+      let value = _debugger.safeGetProperty(object, symbol);
+      if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+        dart.tag(value, sig[symbol]);
+      }
+      properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
+    }
+    for (let name of _debugger.getOwnPropertyNames(sig)) {
+      let value = _debugger.safeGetProperty(object, name);
+      if (dart.test(skippedNames.contains(name))) continue;
+      if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+        dart.tag(value, sig[name]);
+      }
+      properties.add(new _debugger.NameValuePair({name: name, value: value}));
+    }
+    if (!dart.test(walkPrototypeChain)) break;
+    sig = _debugger.safeGetProperty(sig, '__proto__');
+  }
+};
+dart.lazyFn(_debugger.addPropertiesFromSignature, () => dynamicAndSetOfNameValuePairAnddynamic__Tovoid());
+_debugger.sortProperties = function(properties) {
+  let sortedProperties = properties[dartx.toList]();
+  sortedProperties[dartx.sort](dart.fn((a, b) => {
+    let aPrivate = a.name[dartx.startsWith]('_');
+    let bPrivate = b.name[dartx.startsWith]('_');
+    if (aPrivate != bPrivate) return dart.test(aPrivate) ? 1 : -1;
+    return a.name[dartx.compareTo](b.name);
+  }, NameValuePairAndNameValuePairToint()));
+  return sortedProperties;
+};
+dart.lazyFn(_debugger.sortProperties, () => IterableOfNameValuePairToListOfNameValuePair());
 _debugger.getObjectTypeName = function(object) {
   let reifiedType = dart.getReifiedType(object);
   if (reifiedType == null) {
@@ -3208,7 +3294,7 @@
     }
     return '<Error getting type name>';
   }
-  return _debugger.getTypeName(core.Type._check(reifiedType));
+  return _debugger.getTypeName(reifiedType);
 };
 dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
 _debugger.getTypeName = function(type) {
@@ -3216,11 +3302,7 @@
   if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
   return name;
 };
-dart.lazyFn(_debugger.getTypeName, () => TypeToString());
-_debugger._getType = function(object) {
-  return core.Type.is(object) ? object : dart.getReifiedType(object);
-};
-dart.fn(_debugger._getType, dynamicToObject());
+dart.lazyFn(_debugger.getTypeName, () => dynamicToString());
 const _simpleFormatter = Symbol('_simpleFormatter');
 _debugger.safePreview = function(object, config) {
   try {
@@ -3260,7 +3342,9 @@
     this.hideName = hideName;
   }
   ['=='](other) {
-    return _debugger.NameValuePair.is(other) && other.name == this.name;
+    if (!_debugger.NameValuePair.is(other)) return false;
+    if (dart.test(this.hideName) || dart.test(dart.dload(other, 'hideName'))) return core.identical(this, other);
+    return dart.equals(dart.dload(other, 'name'), this.name);
   }
   get hashCode() {
     return dart.hashCode(this.name);
@@ -3453,7 +3537,7 @@
 });
 _debugger.isNativeJavaScriptObject = function(object) {
   let type = _debugger._typeof(object);
-  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
+  return type != 'object' && type != 'function' || dart.test(dart.isJsInterop(object)) || html$.Node.is(object);
 };
 dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
 _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
@@ -3489,24 +3573,37 @@
       body.addStyle('color: rgb(196, 26, 22);');
     }
     let children = this[_simpleFormatter].children(object, config);
+    if (children == null) return body.toJsonML();
     for (let child of children) {
       let li = body.createChild('li');
-      let nameSpan = new _debugger.JsonMLElement('span');
-      nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
-      nameSpan.setStyle('color: rgb(136, 19, 145);');
+      li.setStyle("padding-left: 13px;");
+      let nameSpan = null;
+      let valueStyle = '';
+      if (!dart.test(child.hideName)) {
+        nameSpan = new _debugger.JsonMLElement('span');
+        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
+        nameSpan.setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+        valueStyle = 'margin-left: 13px';
+      }
       if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
-        nameSpan.addStyle("padding-left: 13px;");
-        li.appendChild(nameSpan);
-        let objectTag = li.createObjectTag(child.value);
-        objectTag.addAttribute('config', child.config);
-        if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
-          li.setStyle("padding-left: 13px;");
+        let valueSpan = new _debugger.JsonMLElement('span');
+        valueSpan.setStyle(valueStyle);
+        valueSpan.createObjectTag(child.value).addAttribute('config', child.config);
+        if (nameSpan != null) {
+          li.appendChild(nameSpan);
         }
+        li.appendChild(valueSpan);
       } else {
-        li.setStyle("padding-left: 13px;");
-        let _ = li.createChild('span');
-        _.appendChild(nameSpan);
-        _.createTextChild(_debugger.safePreview(child.value, child.config));
+        let line = li.createChild('span');
+        if (nameSpan != null) {
+          line.appendChild(nameSpan);
+        }
+        line.appendChild((() => {
+          let _ = new _debugger.JsonMLElement('span');
+          _.createTextChild(_debugger.safePreview(child.value, child.config));
+          _.setStyle(valueStyle);
+          return _;
+        })());
       }
     }
     return body.toJsonML();
@@ -3529,7 +3626,7 @@
 _debugger.DartFormatter = class DartFormatter extends core.Object {
   new() {
     this[_formatters] = null;
-    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
+    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.TypeFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
   }
   preview(object, config) {
     try {
@@ -3593,42 +3690,14 @@
     return true;
   }
   children(object) {
-    let properties = LinkedHashSetOfNameValuePair().new();
-    _debugger.addMetadataChildren(object, properties);
-    let current = object;
-    let protoChain = JSArrayOfObject().of([]);
-    while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
-      protoChain[dartx.add](current);
-      current = _debugger.safeGetProperty(current, '__proto__');
-    }
-    for (current of protoChain) {
-      for (let symbol of _debugger.getOwnPropertySymbols(current)) {
-        let dartName = _debugger.symbolName(symbol);
-        if (dart.test(_debugger.hasMethod(object, dartName))) {
-          continue;
-        }
-        let dartXPrefix = 'dartx.';
-        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
-          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
-        } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
-          continue;
-        }
-        let value = _debugger.safeGetProperty(object, symbol);
-        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
-      }
-    }
-    for (current of protoChain) {
-      let className = dart.dload(dart.getReifiedType(current), 'name');
-      for (let name of _debugger.getOwnPropertyNames(current)) {
-        if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
-        if (dart.test(_debugger.hasMethod(object, name))) {
-          continue;
-        }
-        let value = _debugger.safeGetProperty(object, name);
-        properties.add(new _debugger.NameValuePair({name: name, value: value}));
-      }
-    }
-    return properties.toList();
+    let type = dart.getType(object);
+    let ret = LinkedHashSetOfNameValuePair().new();
+    let properties = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getFieldSig(type), properties, object, true);
+    _debugger.addPropertiesFromSignature(dart.getGetterSig(type), properties, object, true);
+    ret.addAll(_debugger.sortProperties(properties));
+    _debugger.addMetadataChildren(object, ret);
+    return ret.toList();
   }
 };
 dart.setSignature(_debugger.ObjectFormatter, {
@@ -3639,28 +3708,16 @@
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
   })
 });
-dart.defineLazy(_debugger.ObjectFormatter, {
-  get _customNames() {
-    return (() => {
-      let _ = SetOfString().new();
-      _.add('constructor');
-      _.add('prototype');
-      _.add('__proto__');
-      return _;
-    })();
-  },
-  set _customNames(_) {}
-});
 _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
   accept(object, config) {
-    return dart.getDartLibraryName(object) != null;
+    return dart.getModuleName(object) != null;
   }
   hasChildren(object) {
     return true;
   }
   preview(object) {
-    let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
-    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
+    let libraryNames = dart.dsend(dart.getModuleName(object), 'split', '/');
+    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1)) && dart.equals(dart.dload(libraryNames, 'last'), dart.dindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 2)))) {
       dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
     }
     return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
@@ -3669,7 +3726,6 @@
     let children = LinkedHashSetOfNameValuePair().new();
     for (let name of _debugger.getOwnPropertyNames(object)) {
       let value = _debugger.safeGetProperty(object, name);
-      name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
       children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
     }
     return children.toList();
@@ -3699,36 +3755,16 @@
   }
   children(object) {
     let children = LinkedHashSetOfNameValuePair().new();
-    let nonGenericProperties = LinkedHashMapOfString$Object().new();
     let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
     dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
-      let genericTypeConstructor = dart.getGenericTypeCtor(value);
-      if (genericTypeConstructor != null) {
-        this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
-      } else {
-        nonGenericProperties._set(core.String._check(name), value);
-      }
+      if (dart.getGenericTypeCtor(value) != null) return;
+      children.add(_debugger.NameValuePair._check(dart.test(dart.isType(value)) ? this.classChild(core.String._check(name), value) : new _debugger.NameValuePair({name: core.String._check(name), value: value})));
     }, dynamicAnddynamicToNull()));
-    nonGenericProperties.forEach(dart.fn((name, value) => {
-      if (core.Type.is(value)) {
-        children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
-      } else {
-        children.add(new _debugger.NameValuePair({name: name, value: value}));
-      }
-    }, StringAndObjectToNull()));
     return children.toList();
   }
-  recordGenericParameters(name, genericTypeConstructor) {
-    this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
-  }
   classChild(name, child) {
-    let typeName = _debugger.getTypeName(core.Type._check(child));
-    let parameterName = dart.str`${name}\$`;
-    if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
-      typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
-      _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
-    }
-    return new _debugger.NameValuePair({name: typeName, value: child});
+    let typeName = _debugger.getTypeName(child);
+    return new _debugger.NameValuePair({name: typeName, value: child, config: _debugger.JsonMLConfig.asClass});
   }
 };
 _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -3739,7 +3775,6 @@
     hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
-    recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
     classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
   })
 });
@@ -3956,60 +3991,49 @@
 });
 _debugger.ClassFormatter = class ClassFormatter extends core.Object {
   accept(object, config) {
-    return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
+    return dart.equals(config, _debugger.JsonMLConfig.asClass);
   }
-  preview(object) {
-    let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
-    if (typeName != null) return core.String._check(typeName);
-    let type = _debugger._getType(object);
+  preview(type) {
     let implements$ = dart.getImplements(type);
-    typeName = _debugger.getTypeName(core.Type._check(type));
+    let typeName = _debugger.getTypeName(type);
     if (implements$ != null) {
       let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
       return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
     } else {
-      return core.String._check(typeName);
+      return typeName;
     }
   }
   hasChildren(object) {
     return true;
   }
-  children(object) {
-    let type = _debugger._getType(object);
-    let children = JSArrayOfNameValuePair().of([]);
-    let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
+  children(type) {
+    let ret = LinkedHashSetOfNameValuePair().new();
+    let staticProperties = SetOfNameValuePair().new();
+    let staticMethods = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getStaticFieldSig(type), staticProperties, type, false);
+    _debugger.addPropertiesFromSignature(dart.getStaticGetterSig(type), staticProperties, type, false);
+    _debugger.addPropertiesFromSignature(dart.getStaticSig(type), staticMethods, type, false);
+    if (dart.test(staticProperties.isNotEmpty) || dart.test(staticMethods.isNotEmpty)) {
+      ret.add(new _debugger.NameValuePair({value: '[[Static members]]', hideName: true}));
+      ret.addAll(_debugger.sortProperties(staticProperties));
+      ret.addAll(_debugger.sortProperties(staticMethods));
+    }
+    let instanceMethods = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getMethodSig(type), instanceMethods, type.prototype, false, {tagTypes: true});
+    if (dart.test(instanceMethods.isNotEmpty)) {
+      ret.add(new _debugger.NameValuePair({value: '[[Instance Methods]]', hideName: true}));
+      ret.addAll(_debugger.sortProperties(instanceMethods));
+    }
+    let typeName = _debugger.getTypeName(type);
     let mixins = dart.getMixins(type);
     if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
-      children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+      ret.add(new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
     }
-    let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
-    for (let name of _debugger.getOwnPropertyNames(object)) {
-      if (dart.test(hiddenProperties[dartx.contains](name))) continue;
-      let value = _debugger.safeGetProperty(object, name);
-      if (value != null && dart.getIsNamedConstructor(value) != null) {
-        value = new _debugger.NamedConstructor(value);
-        name = dart.str`${typeName}.${name}`;
-      }
-      children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+    let baseProto = type.__proto__;
+    if (baseProto != null && !dart.test(dart.isJsInterop(baseProto))) {
+      ret.add(new _debugger.NameValuePair({name: "[[base class]]", value: baseProto, config: _debugger.JsonMLConfig.asClass}));
     }
-    let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
-    let prototype = object.prototype;
-    if (prototype != null) {
-      for (let name of _debugger.getOwnPropertyNames(prototype)) {
-        if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
-        let func = _debugger.safeGetProperty(prototype, name);
-        let constructor = _debugger.safeGetProperty(prototype, 'constructor');
-        let sigObj = dart.getMethodSig(constructor);
-        if (sigObj != null) {
-          let value = _debugger.safeGetProperty(sigObj, name);
-          if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
-            dart.tag(func, value);
-            children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
-          }
-        }
-      }
-    }
-    return children;
+    return ret.toList();
   }
 };
 _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -4021,11 +4045,42 @@
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
   })
 });
+_debugger.TypeFormatter = class TypeFormatter extends core.Object {
+  accept(object, config) {
+    return core.Type.is(object);
+  }
+  preview(object) {
+    return dart.toString(object);
+  }
+  hasChildren(object) {
+    return false;
+  }
+  children(object) {
+    return JSArrayOfNameValuePair().of([]);
+  }
+};
+_debugger.TypeFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.TypeFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
 _debugger.registerDevtoolsFormatter = function() {
   let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
   dart.global.devtoolsFormatters = formatters;
 };
 dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
+_debugger.getModuleNames = function() {
+  return dart.getModuleNames();
+};
+dart.fn(_debugger.getModuleNames, VoidTodynamic$());
+_debugger.getModuleLibraries = function(name) {
+  return dart.getModuleLibraries(name);
+};
+dart.lazyFn(_debugger.getModuleLibraries, () => StringTodynamic());
 _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
   if (arg0 === void 0) arg0 = null;
   if (arg1 === void 0) arg1 = null;
@@ -4359,7 +4414,7 @@
       IterableOfE()._check(iterable);
       this[dartx.checkGrowable]('insertAll');
       core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-      if (!_internal.EfficientLength.is(iterable)) {
+      if (!_internal.EfficientLengthIterable.is(iterable)) {
         iterable = iterable[dartx.toList]();
       }
       let insertionLength = iterable[dartx.length];
@@ -4632,7 +4687,7 @@
       IterableOfE()._check(replacement);
       this[dartx.checkGrowable]('replace range');
       core.RangeError.checkValidRange(start, end, this[dartx.length]);
-      if (!_internal.EfficientLength.is(replacement)) {
+      if (!_internal.EfficientLengthIterable.is(replacement)) {
         replacement = replacement[dartx.toList]();
       }
       let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6347,21 +6402,20 @@
       this[_filter](test, true);
     }
     [_filter](test, retainMatching) {
-      let source = this;
       let retained = JSArrayOfE().of([]);
-      let length = source[dartx.length];
+      let length = this[dartx.length];
       for (let i = 0; i < dart.notNull(length); i++) {
-        let element = source[dartx._get](i);
+        let element = this[dartx._get](i);
         if (dart.dcall(test, element) == retainMatching) {
           retained[dartx.add](element);
         }
-        if (length != source[dartx.length]) {
-          dart.throw(new core.ConcurrentModificationError(source));
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
         }
       }
-      if (retained[dartx.length] != source[dartx.length]) {
-        source[dartx.setRange](0, retained[dartx.length], retained);
-        source[dartx.length] = retained[dartx.length];
+      if (retained[dartx.length] != this[dartx.length]) {
+        this[dartx.setRange](0, retained[dartx.length], retained);
+        this[dartx.length] = retained[dartx.length];
       }
     }
     clear() {
@@ -6377,11 +6431,10 @@
     }
     sort(compare) {
       if (compare === void 0) compare = null;
-      if (compare == null) {
-        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-      } else {
-        _internal.Sort.sort(E)(this, compare);
-      }
+      _internal.Sort.sort(E)(this, (compare != null ? compare : collection.ListMixin._compareAny));
+    }
+    static _compareAny(a, b) {
+      return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
     }
     shuffle(random) {
       if (random === void 0) random = null;
@@ -6461,7 +6514,7 @@
     replaceRange(start, end, newContents) {
       IterableOfE()._check(newContents);
       core.RangeError.checkValidRange(start, end, this[dartx.length]);
-      if (!_internal.EfficientLength.is(newContents)) {
+      if (!_internal.EfficientLengthIterable.is(newContents)) {
         newContents = newContents[dartx.toList]();
       }
       let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6539,7 +6592,7 @@
     insertAll(index, iterable) {
       IterableOfE()._check(iterable);
       core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-      if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
+      if (!_internal.EfficientLengthIterable.is(iterable) || core.identical(iterable, this)) {
         iterable = iterable[dartx.toList]();
       }
       let insertionLength = iterable[dartx.length];
@@ -6628,7 +6681,9 @@
       removeAt: dart.definiteFunctionType(E, [core.int]),
       insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
       setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
-    })
+    }),
+    statics: () => ({_compareAny: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])}),
+    names: ['_compareAny']
   });
   dart.defineExtensionMembers(ListMixin, [
     'elementAt',
@@ -6887,7 +6942,66 @@
   names: ['stringOf']
 });
 dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
-_internal.EfficientLength = class EfficientLength extends core.Object {};
+_internal.ExternalName = class ExternalName extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_internal.ExternalName, {
+  fields: () => ({name: core.String})
+});
+_internal.hexDigitValue = function(char) {
+  dart.assert(dart.notNull(char) >= 0 && dart.notNull(char) <= 65535);
+  let digit0 = 48;
+  let a = 97;
+  let f = 102;
+  let digit = (dart.notNull(char) ^ digit0) >>> 0;
+  if (digit <= 9) return digit;
+  let letter = (dart.notNull(char) | 32) >>> 0;
+  if (a <= letter && letter <= f) return letter - (a - 10);
+  return -1;
+};
+dart.fn(_internal.hexDigitValue, intToint());
+_internal.parseHexByte = function(source, index) {
+  dart.assert(dart.notNull(index) + 2 <= dart.notNull(source[dartx.length]));
+  let digit1 = _internal.hexDigitValue(source[dartx.codeUnitAt](index));
+  let digit2 = _internal.hexDigitValue(source[dartx.codeUnitAt](dart.notNull(index) + 1));
+  return dart.notNull(digit1) * 16 + dart.notNull(digit2) - (dart.notNull(digit2) & 256);
+};
+dart.lazyFn(_internal.parseHexByte, () => StringAndintToint());
+const _name$ = Symbol('_name');
+const _nativeSymbol = Symbol('_nativeSymbol');
+_internal.PrivateSymbol = class PrivateSymbol extends core.Object {
+  new(name, nativeSymbol) {
+    this[_name$] = name;
+    this[_nativeSymbol] = nativeSymbol;
+  }
+  static getName(symbol) {
+    return _internal.PrivateSymbol.as(symbol)[_name$];
+  }
+  static getNativeSymbol(symbol) {
+    if (_internal.PrivateSymbol.is(symbol)) return symbol[_nativeSymbol];
+    return null;
+  }
+  ['=='](other) {
+    return _internal.PrivateSymbol.is(other) && core.identical(this[_nativeSymbol], other[_nativeSymbol]);
+  }
+  toString() {
+    return dart.str`Symbol("${this[_name$]}")`;
+  }
+};
+_internal.PrivateSymbol[dart.implements] = () => [core.Symbol];
+dart.setSignature(_internal.PrivateSymbol, {
+  fields: () => ({
+    [_name$]: core.String,
+    [_nativeSymbol]: core.Object
+  }),
+  statics: () => ({
+    getName: dart.definiteFunctionType(core.String, [core.Symbol]),
+    getNativeSymbol: dart.definiteFunctionType(core.Object, [core.Symbol])
+  }),
+  names: ['getName', 'getNativeSymbol']
+});
 core.Iterable$ = dart.generic(E => {
   let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
   let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
@@ -7026,7 +7140,7 @@
       return SetOfE().from(this);
     }
     get length() {
-      dart.assert(!_internal.EfficientLength.is(this));
+      dart.assert(!_internal.EfficientLengthIterable.is(this));
       let count = 0;
       let it = this[dartx.iterator];
       while (dart.test(it.moveNext())) {
@@ -7195,6 +7309,15 @@
   return Iterable;
 });
 core.Iterable = Iterable();
+_internal.EfficientLengthIterable$ = dart.generic(T => {
+  class EfficientLengthIterable extends core.Iterable$(T) {
+    new() {
+      super.new();
+    }
+  }
+  return EfficientLengthIterable;
+});
+_internal.EfficientLengthIterable = EfficientLengthIterable();
 _internal.ListIterable$ = dart.generic(E => {
   let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
   let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
@@ -7204,7 +7327,7 @@
   let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class ListIterable extends core.Iterable$(E) {
+  class ListIterable extends _internal.EfficientLengthIterable$(E) {
     new() {
       super.new();
     }
@@ -7411,7 +7534,6 @@
       return result;
     }
   }
-  ListIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(ListIterable, {
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
@@ -7610,7 +7732,7 @@
   let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
   class MappedIterable extends core.Iterable$(T) {
     static new(iterable, func) {
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
       }
       return new (MappedIterableOfS$T())._(iterable, func);
@@ -7663,12 +7785,13 @@
 });
 _internal.MappedIterable = MappedIterable();
 _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
+  let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
   class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
     new(iterable, func) {
       super._(iterable, func);
     }
   }
-  EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthMappedIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
   return EfficientLengthMappedIterable;
 });
 _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
@@ -7729,7 +7852,6 @@
       return this[_f](this[_source][dartx.elementAt](index));
     }
   }
-  MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(MappedListIterable, {
     fields: () => ({
       [_source]: IterableOfS(),
@@ -7758,6 +7880,11 @@
     get iterator() {
       return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
+    map(T) {
+      return f => {
+        return new (_internal.MappedIterable$(E, T))._(this, f);
+      };
+    }
   }
   dart.setSignature(WhereIterable, {
     fields: () => ({
@@ -7766,13 +7893,12 @@
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
-  dart.defineExtensionMembers(WhereIterable, ['iterator']);
+  dart.defineExtensionMembers(WhereIterable, ['map', 'iterator']);
   return WhereIterable;
 });
 _internal.WhereIterable = WhereIterable();
 _internal.WhereIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
   class WhereIterator extends core.Iterator$(E) {
     new(iterator, f) {
       this[_iterator] = iterator;
@@ -7780,7 +7906,7 @@
     }
     moveNext() {
       while (dart.test(this[_iterator].moveNext())) {
-        if (dart.test(this[_f](this[_iterator].current))) {
+        if (dart.test(dart.dcall(this[_f], this[_iterator].current))) {
           return true;
         }
       }
@@ -7793,7 +7919,7 @@
   dart.setSignature(WhereIterator, {
     fields: () => ({
       [_iterator]: IteratorOfE(),
-      [_f]: _ElementPredicateOfE()
+      [_f]: _internal._ElementPredicate
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7888,7 +8014,7 @@
       if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
         dart.throw(new core.ArgumentError(takeCount));
       }
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
       }
       return new (TakeIterableOfE())._(iterable, takeCount);
@@ -7915,6 +8041,7 @@
 });
 _internal.TakeIterable = TakeIterable();
 _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
     new(iterable, takeCount) {
       super._(iterable, takeCount);
@@ -7925,7 +8052,7 @@
       return iterableLength;
     }
   }
-  EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthTakeIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
   dart.setSignature(EfficientLengthTakeIterable, {});
   dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
   return EfficientLengthTakeIterable;
@@ -8032,7 +8159,7 @@
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   class SkipIterable extends core.Iterable$(E) {
     static new(iterable, count) {
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthSkipIterableOfE())(iterable, count);
       }
       return new (SkipIterableOfE())._(iterable, count);
@@ -8070,6 +8197,7 @@
 });
 _internal.SkipIterable = SkipIterable();
 _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
     new(iterable, skipCount) {
       super._(iterable, skipCount);
@@ -8080,7 +8208,7 @@
       return 0;
     }
   }
-  EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthSkipIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
   dart.setSignature(EfficientLengthSkipIterable, {});
   dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
   return EfficientLengthSkipIterable;
@@ -8184,7 +8312,7 @@
   let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class EmptyIterable extends core.Iterable$(E) {
+  class EmptyIterable extends _internal.EfficientLengthIterable$(E) {
     new() {
       super.new();
     }
@@ -8280,7 +8408,6 @@
       return SetOfE().new();
     }
   }
-  EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(EmptyIterable, {
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
@@ -8669,79 +8796,6 @@
   };
 };
 dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
-_internal.Lists = class Lists extends core.Object {
-  static copy(src, srcStart, dst, dstStart, count) {
-    if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
-      for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
-        dst[dartx._set](j, src[dartx._get](i));
-      }
-    } else {
-      for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
-        dst[dartx._set](j, src[dartx._get](i));
-      }
-    }
-  }
-  static areEqual(a, b) {
-    if (core.identical(a, b)) return true;
-    if (!core.List.is(b)) return false;
-    let length = a[dartx.length];
-    if (!dart.equals(length, dart.dload(b, 'length'))) return false;
-    for (let i = 0; i < dart.notNull(length); i++) {
-      if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
-    }
-    return true;
-  }
-  static indexOf(a, element, startIndex, endIndex) {
-    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-      return -1;
-    }
-    if (dart.notNull(startIndex) < 0) {
-      startIndex = 0;
-    }
-    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-      if (dart.equals(a[dartx._get](i), element)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-  static lastIndexOf(a, element, startIndex) {
-    if (dart.notNull(startIndex) < 0) {
-      return -1;
-    }
-    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-      startIndex = dart.notNull(a[dartx.length]) - 1;
-    }
-    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-      if (dart.equals(a[dartx._get](i), element)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-  static indicesCheck(a, start, end) {
-    core.RangeError.checkValidRange(start, end, a[dartx.length]);
-  }
-  static rangeCheck(a, start, length) {
-    core.RangeError.checkNotNegative(length);
-    core.RangeError.checkNotNegative(start);
-    if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
-      let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
-      dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
-    }
-  }
-};
-dart.setSignature(_internal.Lists, {
-  statics: () => ({
-    copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
-    areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
-    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-    indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
-    rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
-  }),
-  names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
-});
 _internal.printToZone = null;
 _internal.printToConsole = function(line) {
   _js_primitives.printString(dart.str`${line}`);
@@ -8987,27 +9041,18 @@
   names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
 });
 _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-const _name$ = Symbol('_name');
-const _nativeSymbol = Symbol('_nativeSymbol');
 _internal.Symbol = class Symbol extends core.Object {
   new(name) {
     this[_name$] = name;
-    this[_nativeSymbol] = null;
-  }
-  es6(name, nativeSymbol) {
-    this[_name$] = name;
-    this[_nativeSymbol] = nativeSymbol;
   }
   unvalidated(name) {
     this[_name$] = name;
-    this[_nativeSymbol] = null;
   }
   validated(name) {
     this[_name$] = _internal.Symbol.validatePublicSymbol(name);
-    this[_nativeSymbol] = null;
   }
   ['=='](other) {
-    return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+    return _internal.Symbol.is(other) && this[_name$] == other[_name$];
   }
   get hashCode() {
     let hash = this._hashCode;
@@ -9023,9 +9068,6 @@
   static getName(symbol) {
     return symbol[_name$];
   }
-  static getNativeSymbol(symbol) {
-    return symbol[_nativeSymbol];
-  }
   static validatePublicSymbol(name) {
     if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
     if (dart.test(name[dartx.startsWith]('_'))) {
@@ -9037,23 +9079,17 @@
     return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
   }
 };
-dart.defineNamedConstructor(_internal.Symbol, 'es6');
 dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
 dart.defineNamedConstructor(_internal.Symbol, 'validated');
 _internal.Symbol[dart.implements] = () => [core.Symbol];
 dart.setSignature(_internal.Symbol, {
-  fields: () => ({
-    [_name$]: core.String,
-    [_nativeSymbol]: dart.dynamic
-  }),
-  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
+  fields: () => ({[_name$]: core.String}),
   statics: () => ({
     getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
-    getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
     validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
     isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
   }),
-  names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
+  names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
 });
 _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
 _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -9236,8 +9272,8 @@
     this.weakPorts = SetOfint().new();
     this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
     this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
-    this.pauseCapability = isolate.Capability.new();
-    this.terminateCapability = isolate.Capability.new();
+    this.pauseCapability = isolate$.Capability.new();
+    this.terminateCapability = isolate$.Capability.new();
     this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
     this.pauseTokens = SetOfCapability().new();
     this.errorPorts = SetOfSendPort().new();
@@ -9284,7 +9320,7 @@
     this.errorsAreFatal = errorsAreFatal;
   }
   handlePing(responsePort, pingType) {
-    if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+    if (pingType == isolate$.Isolate.IMMEDIATE || pingType == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
       responsePort.send(null);
       return;
     }
@@ -9292,11 +9328,7 @@
       responsePort.send(null);
     }
     dart.fn(respond, VoidTovoid$());
-    if (pingType == isolate.Isolate.AS_EVENT) {
-      _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
-      return;
-    }
-    dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
+    dart.assert(pingType == isolate$.Isolate.BEFORE_NEXT_EVENT);
     if (this[_scheduledControlEvents] == null) {
       this[_scheduledControlEvents] = collection.Queue.new();
     }
@@ -9304,15 +9336,11 @@
   }
   handleKill(authentification, priority) {
     if (!dart.equals(this.terminateCapability, authentification)) return;
-    if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+    if (priority == isolate$.Isolate.IMMEDIATE || priority == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
       this.kill();
       return;
     }
-    if (priority == isolate.Isolate.AS_EVENT) {
-      _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
-      return;
-    }
-    dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
+    dart.assert(priority == isolate$.Isolate.BEFORE_NEXT_EVENT);
     if (this[_scheduledControlEvents] == null) {
       this[_scheduledControlEvents] = collection.Queue.new();
     }
@@ -9380,47 +9408,47 @@
     switch (dart.dindex(message, 0)) {
       case "pause":
       {
-        this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
+        this.addPause(isolate$.Capability._check(dart.dindex(message, 1)), isolate$.Capability._check(dart.dindex(message, 2)));
         break;
       }
       case "resume":
       {
-        this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
+        this.removePause(isolate$.Capability._check(dart.dindex(message, 1)));
         break;
       }
       case 'add-ondone':
       {
-        this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.addDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case 'remove-ondone':
       {
-        this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.removeDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case 'set-errors-fatal':
       {
-        this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
+        this.setErrorsFatal(isolate$.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
         break;
       }
       case "ping":
       {
-        this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        this.handlePing(isolate$.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
         break;
       }
       case "kill":
       {
-        this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        this.handleKill(isolate$.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
         break;
       }
       case "getErrors":
       {
-        this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.addErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case "stopErrors":
       {
-        this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.removeErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       default:
@@ -9463,7 +9491,7 @@
     this.errorPorts.clear();
     if (this.doneHandlers != null) {
       for (let port of core.Iterable._check(this.doneHandlers)) {
-        isolate.SendPort._check(port);
+        isolate$.SendPort._check(port);
         port.send(null);
       }
       this.doneHandlers = null;
@@ -9483,8 +9511,8 @@
     weakPorts: SetOfint(),
     isolateStatics: dart.dynamic,
     controlPort: _isolate_helper.RawReceivePortImpl,
-    pauseCapability: isolate.Capability,
-    terminateCapability: isolate.Capability,
+    pauseCapability: isolate$.Capability,
+    terminateCapability: isolate$.Capability,
     initialized: core.bool,
     isPaused: core.bool,
     delayedEvents: ListOf_IsolateEvent(),
@@ -9496,15 +9524,15 @@
     errorPorts: SetOfSendPort()
   }),
   methods: () => ({
-    addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
-    removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
-    handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
-    handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
-    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    addPause: dart.definiteFunctionType(dart.void, [isolate$.Capability, isolate$.Capability]),
+    removePause: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    addDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.bool]),
+    handlePing: dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.int]),
+    handleKill: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.int]),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
     handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
     eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
     [_setGlobals]: dart.definiteFunctionType(dart.void, []),
@@ -9705,7 +9733,7 @@
         let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
         let context = new _isolate_helper._IsolateContext();
         _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
-          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
+          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate$.SendPort._check(replyTo));
         }, VoidToNull()), 'worker-start');
         _isolate_helper._globalState.currentContext = context;
         _isolate_helper._globalState.topEventLoop.run();
@@ -9718,7 +9746,7 @@
       }
       case 'message':
       {
-        let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
+        let port = isolate$.SendPort._check(dart.dindex(msg, 'port'));
         if (port != null) {
           dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
         }
@@ -9806,7 +9834,7 @@
     if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
       uri = dart.notNull(uri) + ".js";
     }
-    let port = isolate.ReceivePort.new();
+    let port = isolate$.ReceivePort.new();
     let completer = CompleterOfList().new();
     port.first.then(dart.dynamic)(dart.fn(msg => {
       if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
@@ -9845,7 +9873,7 @@
   }
   static get currentIsolate() {
     let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-    return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
+    return new isolate$.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
   }
   static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
     let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -9923,10 +9951,10 @@
     spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
     spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
     spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
-    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
+    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
     workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
   }),
   names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
@@ -9953,10 +9981,10 @@
     }
   }
 };
-_isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._BaseSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._BaseSendPort, {
   fields: () => ({[_isolateId]: core.int}),
-  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
+  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate$.SendPort])})
 });
 const _receivePort = Symbol('_receivePort');
 const _isClosed = Symbol('_isClosed');
@@ -9988,7 +10016,7 @@
     return this[_receivePort][_id];
   }
 };
-_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._NativeJsSendPort, {
   fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
   methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
@@ -10019,7 +10047,7 @@
     return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
   }
 };
-_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._WorkerSendPort, {
   fields: () => ({
     [_workerId]: core.int,
@@ -10077,14 +10105,14 @@
 };
 dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
 dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
-_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
+_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate$.RawReceivePort];
 dart.setSignature(_isolate_helper.RawReceivePortImpl, {
   fields: () => ({
     [_id]: core.int,
     [_handler]: core.Function,
     [_isClosed]: core.bool
   }),
-  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
   setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
   methods: () => ({
     [_close]: dart.definiteFunctionType(dart.void, []),
@@ -10230,7 +10258,8 @@
         }, VoidToNull()), onCancel: dart.fn(() => {
           if (timer != null) timer.cancel();
           timer = null;
-        }, VoidToNull())});
+          return async.Future._nullFuture;
+        }, VoidTo_Future())});
       return controller.stream;
     }
     static eventTransformed(source, mapSink) {
@@ -10289,9 +10318,7 @@
               subscription.pause();
             }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidToNull()), onCancel: dart.fn(() => {
-              subscription.cancel();
-            }, VoidToNull()), sync: true});
+            }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
         }
         return controller.stream;
       };
@@ -10329,9 +10356,7 @@
               subscription.pause();
             }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidToNull()), onCancel: dart.fn(() => {
-              subscription.cancel();
-            }, VoidToNull()), sync: true});
+            }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
         }
         return controller.stream;
       };
@@ -10862,13 +10887,13 @@
 dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
 dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
 dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
-_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
+_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate$.ReceivePort];
 dart.setSignature(_isolate_helper.ReceivePortImpl, {
   fields: () => ({
-    [_rawPort]: isolate.RawReceivePort,
+    [_rawPort]: isolate$.RawReceivePort,
     [_controller]: async.StreamController
   }),
-  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
   methods: () => ({
     listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     close: dart.definiteFunctionType(dart.void, [])
@@ -10981,7 +11006,7 @@
   }
 };
 dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
-_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
+_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate$.Capability];
 dart.setSignature(_isolate_helper.CapabilityImpl, {
   fields: () => ({[_id]: core.int}),
   methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
@@ -11019,7 +11044,7 @@
     if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
     if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
     if (_interceptors.Interceptor.is(x)) this.unsupported(x);
-    if (isolate.RawReceivePort.is(x)) {
+    if (isolate$.RawReceivePort.is(x)) {
       this.unsupported(x, "RawReceivePorts can't be transmitted:");
     }
     if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
@@ -11297,7 +11322,7 @@
   }
   deserializeRawSendPort(x) {
     dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
-    let result = isolate.SendPort._check(dart.dindex(x, 1));
+    let result = isolate$.SendPort._check(dart.dindex(x, 1));
     this.deserializedObjects[dartx.add](result);
     return result;
   }
@@ -11349,8 +11374,8 @@
     deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
     deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
     deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
-    deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-    deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+    deserializeSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
+    deserializeRawSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
     deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
     deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
     deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
@@ -11387,6 +11412,11 @@
 _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
 _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
 _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
+dart.defineLazy(_js_helper, {
+  get _identityHashCode() {
+    return Symbol("_identityHashCode");
+  }
+});
 _js_helper._Patch = class _Patch extends core.Object {
   new() {
   }
@@ -11406,10 +11436,10 @@
     _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
   }
   static objectHashCode(object) {
-    let hash = object.$identityHash;
+    let hash = object[_js_helper._identityHashCode];
     if (hash == null) {
       hash = Math.random() * 0x3fffffff | 0;
-      object.$identityHash = hash;
+      object[_js_helper._identityHashCode] = hash;
     }
     return hash;
   }
@@ -12048,6 +12078,9 @@
   new() {
     super.new();
   }
+  toString() {
+    return super.toString();
+  }
 };
 _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
   new() {
@@ -12070,13 +12103,18 @@
   fields: () => ({message: dart.dynamic})
 });
 core.AssertionError = class AssertionError extends core.Error {
-  new() {
+  new(message) {
+    if (message === void 0) message = null;
+    this.message = message;
     super.new();
   }
   toString() {
     return "Assertion failed";
   }
 };
+dart.setSignature(core.AssertionError, {
+  fields: () => ({message: core.Object})
+});
 _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
   new(message) {
     this[_message] = message;
@@ -12681,7 +12719,7 @@
   let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-  class LinkedHashMapKeyIterable extends core.Iterable$(E) {
+  class LinkedHashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
     new(map) {
       this[_map] = map;
       super.new();
@@ -12710,7 +12748,6 @@
       }
     }
   }
-  LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(LinkedHashMapKeyIterable, {
     fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -13381,7 +13418,11 @@
 };
 dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
 _js_mirrors.getName = function(symbol) {
-  return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+  if (_internal.PrivateSymbol.is(symbol)) {
+    return _internal.PrivateSymbol.getName(symbol);
+  } else {
+    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+  }
 };
 dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
 _js_mirrors.getSymbol = function(name, library) {
@@ -13460,7 +13501,7 @@
 });
 _js_mirrors._Lazy = _Lazy();
 _js_mirrors._getESSymbol = function(symbol) {
-  return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+  return _internal.PrivateSymbol.getNativeSymbol(symbol);
 };
 dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
 _js_mirrors._getMember = function(symbol) {
@@ -13504,7 +13545,7 @@
 dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
 _js_mirrors._getSymbolForESSymbol = function(member) {
   let name = _js_mirrors._getNameForESSymbol(member);
-  return new _internal.Symbol.es6(name, member);
+  return new _internal.PrivateSymbol(name, member);
 };
 dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
 _js_mirrors._getSymbolForMember = function(member) {
@@ -13512,7 +13553,7 @@
     return core.Symbol.new(member);
   } else {
     let name = _js_mirrors._getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
+    return new _internal.PrivateSymbol(name, member);
   }
 };
 dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
@@ -13656,12 +13697,18 @@
 };
 _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
 _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
+  loadLibrary(...args) {
+    return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl('loadLibrary', args, {isMethod: true})));
+  }
   get isImport() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
   }
   get isExport() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
   }
+  get isDeferred() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isDeferred', [], {isGetter: true})));
+  }
   get sourceLibrary() {
     return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
   }
@@ -13692,6 +13739,9 @@
   setField(...args) {
     return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
   }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
 };
 _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
 const _getAccessor = Symbol('_getAccessor');
@@ -13839,7 +13889,7 @@
       let setters = _js_mirrors._getSetters(unwrapped);
       setters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
-        symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+        symbol = new _internal.PrivateSymbol(name, _js_mirrors._getESSymbol(symbol));
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
       }, SymbolAnddynamicToNull()));
       let staticFields = _js_mirrors._getStaticFields(unwrapped);
@@ -13988,12 +14038,18 @@
   get typeVariables() {
     return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
   }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
   isSubclassOf(...args) {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
   }
   get isAbstract() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
   }
+  get isEnum() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isEnum', [], {isGetter: true})));
+  }
   get instanceMembers() {
     return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
   }
@@ -16799,9 +16855,9 @@
 async._registerErrorHandler = function(R) {
   return (errorHandler, zone) => {
     if (async.ZoneBinaryCallback.is(errorHandler)) {
-      return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
+      return zone.registerBinaryCallback(R, dart.dynamic, core.StackTrace)(async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).as(errorHandler));
     } else {
-      return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
+      return zone.registerUnaryCallback(R, dart.dynamic)(async.ZoneUnaryCallback$(R, dart.dynamic).as(errorHandler));
     }
   };
 };
@@ -16955,7 +17011,6 @@
 const _waitsForCancel = Symbol('_waitsForCancel');
 const _canFire = Symbol('_canFire');
 const _cancelOnError = Symbol('_cancelOnError');
-const _incrementPauseCount = Symbol('_incrementPauseCount');
 const _sendData = Symbol('_sendData');
 const _addPending = Symbol('_addPending');
 const _sendError = Symbol('_sendError');
@@ -17000,7 +17055,7 @@
     }
     onError(handleError) {
       if (handleError == null) handleError = async._nullErrorHandler;
-      this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
+      this[_onError] = async._registerErrorHandler(dart.dynamic)(handleError, this[_zone]);
     }
     onDone(handleDone) {
       if (handleDone == null) handleDone = async._nullDoneHandler;
@@ -17033,9 +17088,11 @@
     }
     cancel() {
       this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-      if (dart.test(this[_isCanceled])) return this[_cancelFuture];
-      this[_cancel]();
-      return this[_cancelFuture];
+      if (!dart.test(this[_isCanceled])) {
+        this[_cancel]();
+      }
+      let l = this[_cancelFuture];
+      return l != null ? l : async.Future._nullFuture;
     }
     asFuture(E) {
       return futureValue => {
@@ -17045,8 +17102,14 @@
           result[_complete](futureValue);
         }, VoidToNull());
         this[_onError] = dart.fn((error, stackTrace) => {
-          this.cancel();
-          result[_completeError](error, core.StackTrace._check(stackTrace));
+          let cancelFuture = this.cancel();
+          if (!core.identical(cancelFuture, async.Future._nullFuture)) {
+            cancelFuture.whenComplete(dart.fn(() => {
+              result[_completeError](error, core.StackTrace._check(stackTrace));
+            }, VoidToNull()));
+          } else {
+            result[_completeError](error, core.StackTrace._check(stackTrace));
+          }
         }, dynamicAnddynamicToNull());
         return result;
       };
@@ -17092,9 +17155,6 @@
       if (!dart.test(this[_inCallback])) this[_pending] = null;
       this[_cancelFuture] = this[_onCancel]();
     }
-    [_incrementPauseCount]() {
-      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-    }
     [_decrementPauseCount]() {
       dart.assert(this[_isPaused]);
       this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
@@ -17181,7 +17241,7 @@
       if (dart.test(this[_cancelOnError])) {
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
         this[_cancel]();
-        if (async.Future.is(this[_cancelFuture])) {
+        if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
           this[_cancelFuture].whenComplete(sendError);
         } else {
           sendError();
@@ -17204,7 +17264,7 @@
       dart.fn(sendDone, VoidTovoid$());
       this[_cancel]();
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-      if (async.Future.is(this[_cancelFuture])) {
+      if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
         this[_cancelFuture].whenComplete(sendDone);
       } else {
         sendDone();
@@ -17214,7 +17274,7 @@
       dart.assert(!dart.test(this[_inCallback]));
       let wasInputPaused = this[_isInputPaused];
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-      callback();
+      dart.dcall(callback);
       this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
       this[_checkState](wasInputPaused);
     }
@@ -17282,7 +17342,6 @@
       cancel: dart.definiteFunctionType(async.Future, []),
       asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
       [_cancel]: dart.definiteFunctionType(dart.void, []),
-      [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
       [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
       [_add$]: dart.definiteFunctionType(dart.void, [T]),
       [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
@@ -17294,7 +17353,7 @@
       [_sendData]: dart.definiteFunctionType(dart.void, [T]),
       [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
       [_sendDone]: dart.definiteFunctionType(dart.void, []),
-      [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      [_guardCallback]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
       [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
     })
   });
@@ -17309,7 +17368,6 @@
 async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
 async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
 async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
-async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
 async._ControllerSubscription$ = dart.generic(T => {
   let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
   class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
@@ -18065,7 +18123,7 @@
             result[_completeError](error, stackTrace);
           }
         }
-        dart.fn(handleError, dynamicAnddynamicTovoid$());
+        dart.fn(handleError, dynamicAnddynamicToNull());
         try {
           for (let future of futures) {
             let pos = remaining;
@@ -18211,7 +18269,7 @@
 };
 dart.fn(async._nonNullError, ObjectToObject());
 async._FutureOnValue$ = dart.generic((S, T) => {
-  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
+  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(async.FutureOr$(T), [S]));
   return _FutureOnValue;
 });
 async._FutureOnValue = _FutureOnValue();
@@ -18302,6 +18360,9 @@
 const _whenCompleteAction = Symbol('_whenCompleteAction');
 async._FutureListener$ = dart.generic((S, T) => {
   let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
+  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
+  let ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = () => (ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(FutureOrOfT(), core.Object, core.StackTrace)))();
+  let dynamicToFutureOrOfT = () => (dynamicToFutureOrOfT = dart.constFn(dart.functionType(FutureOrOfT(), [dart.dynamic])))();
   let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
   class _FutureListener extends core.Object {
     then(result, onValue, errorCallback) {
@@ -18361,7 +18422,7 @@
     }
     handleValue(sourceResult) {
       S._check(sourceResult);
-      return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
+      return this[_zone].runUnary(FutureOrOfT(), S)(this[_onValue], sourceResult);
     }
     matchesErrorTest(asyncError) {
       if (!dart.test(this.hasErrorTest)) return true;
@@ -18371,10 +18432,10 @@
     handleError(asyncError) {
       dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
       if (async.ZoneBinaryCallback.is(this.errorCallback)) {
-        let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
-        return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
+        let typedErrorCallback = ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace().as(this.errorCallback);
+        return this[_zone].runBinary(FutureOrOfT(), core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
       } else {
-        return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
+        return this[_zone].runUnary(FutureOrOfT(), dart.dynamic)(dynamicToFutureOrOfT()._check(this.errorCallback), asyncError.error);
       }
     }
     handleWhenComplete() {
@@ -18407,9 +18468,9 @@
       hasErrorCallback: dart.definiteFunctionType(core.bool, [])
     }),
     methods: () => ({
-      handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
+      handleValue: dart.definiteFunctionType(async.FutureOr$(T), [S]),
       matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
-      handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
+      handleError: dart.definiteFunctionType(async.FutureOr$(T), [async.AsyncError]),
       handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
     })
   });
@@ -18510,7 +18571,7 @@
         if (!core.identical(currentZone, async._ROOT_ZONE)) {
           f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
           if (onError != null) {
-            onError = async._registerErrorHandler(T)(onError, currentZone);
+            onError = async._registerErrorHandler(E)(onError, currentZone);
           }
         }
         return this[_thenNoZoneRegistration](E)(f, onError);
@@ -18519,7 +18580,7 @@
     [_thenNoZoneRegistration](E) {
       return (f, onError) => {
         let result = new (async._Future$(E))();
-        this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
+        this[_addListener](new (async._FutureListener$(T, E)).then(result, async._FutureOnValue$(T, E)._check(f), onError));
         return result;
       };
     }
@@ -19211,10 +19272,10 @@
 });
 async.StreamTransformer = StreamTransformer();
 async.StreamIterator$ = dart.generic(T => {
-  let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
+  let _StreamIteratorOfT = () => (_StreamIteratorOfT = dart.constFn(async._StreamIterator$(T)))();
   class StreamIterator extends core.Object {
     static new(stream) {
-      return new (_StreamIteratorImplOfT())(stream);
+      return new (_StreamIteratorOfT())(stream);
     }
   }
   dart.addTypeTests(StreamIterator);
@@ -20082,36 +20143,6 @@
   return _StreamImplEvents;
 });
 async._StreamImplEvents = _StreamImplEvents();
-const _unlink = Symbol('_unlink');
-const _insertBefore = Symbol('_insertBefore');
-async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
-  new() {
-    this[_next$] = null;
-    this[_previous$] = null;
-  }
-  [_unlink]() {
-    this[_previous$][_next$] = this[_next$];
-    this[_next$][_previous$] = this[_previous$];
-    this[_next$] = this[_previous$] = this;
-  }
-  [_insertBefore](newNext) {
-    let newPrevious = newNext[_previous$];
-    newPrevious[_next$] = this;
-    newNext[_previous$] = this[_previous$];
-    this[_previous$][_next$] = newNext;
-    this[_previous$] = newPrevious;
-  }
-};
-dart.setSignature(async._BroadcastLinkedList, {
-  fields: () => ({
-    [_next$]: async._BroadcastLinkedList,
-    [_previous$]: async._BroadcastLinkedList
-  }),
-  methods: () => ({
-    [_unlink]: dart.definiteFunctionType(dart.void, []),
-    [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
-  })
-});
 async._BroadcastCallback$ = dart.generic(T => {
   const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
   return _BroadcastCallback;
@@ -20163,7 +20194,7 @@
       }
     }
     cancel() {
-      return null;
+      return async.Future._nullFuture;
     }
     asFuture(E) {
       return futureValue => {
@@ -20339,7 +20370,7 @@
     }
     cancel() {
       this[_stream][_cancelSubscription]();
-      return null;
+      return async.Future._nullFuture;
     }
     get isPaused() {
       return this[_stream][_isSubscriptionPaused];
@@ -20369,146 +20400,109 @@
   return _BroadcastSubscriptionWrapper;
 });
 async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-const _current$1 = Symbol('_current');
-const _futureOrPrefetch = Symbol('_futureOrPrefetch');
-const _clear = Symbol('_clear');
-async._StreamIteratorImpl$ = dart.generic(T => {
+const _stateData = Symbol('_stateData');
+const _initializeOrDone = Symbol('_initializeOrDone');
+async._StreamIterator$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
-  class _StreamIteratorImpl extends core.Object {
+  class _StreamIterator extends core.Object {
     new(stream) {
+      this[_stateData] = stream;
       this[_subscription] = null;
-      this[_current$1] = null;
-      this[_futureOrPrefetch] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-      this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+      this[_isPaused] = false;
     }
     get current() {
-      return this[_current$1];
+      if (this[_subscription] != null && dart.test(this[_isPaused])) {
+        return T.as(this[_stateData]);
+      }
+      return null;
     }
     moveNext() {
-      if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
-        return new (_FutureOfbool()).immediate(false);
-      }
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+      if (this[_subscription] != null) {
+        if (dart.test(this[_isPaused])) {
+          let future = new (_FutureOfbool())();
+          this[_stateData] = future;
+          this[_isPaused] = false;
+          this[_subscription].resume();
+          return future;
+        }
         dart.throw(new core.StateError("Already waiting for next."));
       }
-      if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
-        this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-        this[_current$1] = null;
-        let result = new (_FutureOfbool())();
-        this[_futureOrPrefetch] = result;
-        return result;
-      } else {
-        dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
-        switch (this[_state]) {
-          case async._StreamIteratorImpl._STATE_EXTRA_DATA:
-          {
-            this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-            this[_current$1] = T.as(this[_futureOrPrefetch]);
-            this[_futureOrPrefetch] = null;
-            this[_subscription].resume();
-            return new (_FutureOfbool()).immediate(true);
-          }
-          case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
-          {
-            let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
-            this[_clear]();
-            return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
-          }
-          case async._StreamIteratorImpl._STATE_EXTRA_DONE:
-          {
-            this[_clear]();
-            return new (_FutureOfbool()).immediate(false);
-          }
-        }
-      }
+      return this[_initializeOrDone]();
     }
-    [_clear]() {
-      this[_subscription] = null;
-      this[_futureOrPrefetch] = null;
-      this[_current$1] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_DONE;
+    [_initializeOrDone]() {
+      dart.assert(this[_subscription] == null);
+      let stateData = this[_stateData];
+      if (stateData != null) {
+        let stream = StreamOfT().as(stateData);
+        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+        let future = new (_FutureOfbool())();
+        this[_stateData] = future;
+        return future;
+      }
+      return new (_FutureOfbool()).immediate(false);
     }
     cancel() {
-      let subscription = this[_subscription];
-      if (subscription == null) return null;
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_complete](false);
-      } else {
-        this[_clear]();
+      let subscription = StreamSubscriptionOfT()._check(this[_subscription]);
+      let stateData = this[_stateData];
+      this[_stateData] = null;
+      if (subscription != null) {
+        this[_subscription] = null;
+        if (!dart.test(this[_isPaused])) {
+          let future = _FutureOfbool().as(stateData);
+          future[_asyncComplete](false);
+        }
+        return subscription.cancel();
       }
-      return subscription.cancel();
+      return async.Future._nullFuture;
     }
     [_onData](data) {
       T._check(data);
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        this[_current$1] = data;
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-        hasNext[_complete](true);
-        return;
-      }
-      this[_subscription].pause();
-      dart.assert(this[_futureOrPrefetch] == null);
-      this[_futureOrPrefetch] = data;
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_stateData] = data;
+      this[_isPaused] = true;
+      moveNextFuture[_complete](true);
+      if (this[_subscription] != null && dart.test(this[_isPaused])) this[_subscription].pause();
     }
     [_onError](error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_completeError](error, stackTrace);
-        return;
-      }
-      this[_subscription].pause();
-      dart.assert(this[_futureOrPrefetch] == null);
-      this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_subscription] = null;
+      this[_stateData] = null;
+      moveNextFuture[_completeError](error, stackTrace);
     }
     [_onDone]() {
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_complete](false);
-        return;
-      }
-      this[_subscription].pause();
-      this[_futureOrPrefetch] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_subscription] = null;
+      this[_stateData] = null;
+      moveNextFuture[_complete](false);
     }
   }
-  dart.addTypeTests(_StreamIteratorImpl);
-  _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
-  dart.setSignature(_StreamIteratorImpl, {
+  dart.addTypeTests(_StreamIterator);
+  _StreamIterator[dart.implements] = () => [StreamIteratorOfT()];
+  dart.setSignature(_StreamIterator, {
     fields: () => ({
       [_subscription]: async.StreamSubscription,
-      [_current$1]: T,
-      [_futureOrPrefetch]: dart.dynamic,
-      [_state]: core.int
+      [_stateData]: core.Object,
+      [_isPaused]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({
       moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
-      [_clear]: dart.definiteFunctionType(dart.void, []),
+      [_initializeOrDone]: dart.definiteFunctionType(async.Future$(core.bool), []),
       cancel: dart.definiteFunctionType(async.Future, []),
       [_onData]: dart.definiteFunctionType(dart.void, [T]),
       [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       [_onDone]: dart.definiteFunctionType(dart.void, [])
     })
   });
-  return _StreamIteratorImpl;
+  return _StreamIterator;
 });
-async._StreamIteratorImpl = _StreamIteratorImpl();
-async._StreamIteratorImpl._STATE_FOUND = 0;
-async._StreamIteratorImpl._STATE_DONE = 1;
-async._StreamIteratorImpl._STATE_MOVING = 2;
-async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
-async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
-async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
+async._StreamIterator = _StreamIterator();
 async._EmptyStream$ = dart.generic(T => {
   let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20551,7 +20545,7 @@
 dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
 async._cancelAndError = function(subscription, future, error, stackTrace) {
   let cancelFuture = subscription.cancel();
-  if (async.Future.is(cancelFuture)) {
+  if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
     cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
   } else {
     future[_completeError](error, stackTrace);
@@ -20576,7 +20570,7 @@
 dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
 async._cancelAndValue = function(subscription, future, value) {
   let cancelFuture = subscription.cancel();
-  if (async.Future.is(cancelFuture)) {
+  if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
     cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
   } else {
     future[_complete](value);
@@ -20859,6 +20853,7 @@
 async._HandleErrorStream = _HandleErrorStream();
 const _count = Symbol('_count');
 async._TakeStream$ = dart.generic(T => {
+  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
   let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
   let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20869,6 +20864,10 @@
       if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
     }
     [_createSubscription](onData, onError, onDone, cancelOnError) {
+      if (this[_count] == 0) {
+        this[_source$].listen(null).cancel();
+        return new (_DoneStreamSubscriptionOfT())(onDone);
+      }
       return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
     }
     [_handleData](inputEvent, sink) {
@@ -21171,7 +21170,7 @@
       if (dart.test(this[_isSubscribed])) {
         let subscription = this[_subscription];
         this[_subscription] = null;
-        subscription.cancel();
+        return subscription.cancel();
       }
       return null;
     }
@@ -22475,8 +22474,8 @@
     if (onError != null) {
       errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
         try {
-          if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
-            return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
+          if (async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).is(onError)) {
+            return self.parent.runBinary(R, dart.dynamic, core.StackTrace)(onError, error, stackTrace);
           }
           return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
         } catch (e) {
@@ -22938,7 +22937,7 @@
   let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-  class _HashMapKeyIterable extends core.Iterable$(E) {
+  class _HashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -22965,7 +22964,6 @@
       }
     }
   }
-  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_HashMapKeyIterable, {
     fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -22981,7 +22979,7 @@
 });
 collection._HashMapKeyIterable = _HashMapKeyIterable();
 const _offset = Symbol('_offset');
-const _current$2 = Symbol('_current');
+const _current$1 = Symbol('_current');
 collection._HashMapKeyIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
@@ -22991,10 +22989,10 @@
       this[_map$0] = map;
       this[_keys] = keys;
       this[_offset] = 0;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       let keys = this[_keys];
@@ -23002,10 +23000,10 @@
       if (keys !== this[_map$0][_keys]) {
         dart.throw(new core.ConcurrentModificationError(this[_map$0]));
       } else if (dart.notNull(offset) >= keys.length) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = keys[offset];
+        this[_current$1] = keys[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -23018,7 +23016,7 @@
       [_map$0]: _HashMapOfE$dynamic(),
       [_keys]: ListOfE(),
       [_offset]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -23181,7 +23179,7 @@
 collection._Es6MapIterable$ = dart.generic(E => {
   let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-  class _Es6MapIterable extends core.Iterable$(E) {
+  class _Es6MapIterable extends _internal.EfficientLengthIterable$(E) {
     new(map, isKeys) {
       this[_map$0] = map;
       this[_isKeys] = isKeys;
@@ -23219,7 +23217,6 @@
       }
     }
   }
-  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_Es6MapIterable, {
     fields: () => ({
       [_map$0]: dart.dynamic,
@@ -23249,7 +23246,7 @@
       this[_isKeys] = isKeys;
       this[_jsIterator$] = null;
       this[_next$0] = null;
-      this[_current$2] = null;
+      this[_current$1] = null;
       this[_done] = null;
       if (dart.test(this[_isKeys])) {
         this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
@@ -23259,7 +23256,7 @@
       this[_done] = false;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
@@ -23269,11 +23266,11 @@
       this[_next$0] = this[_jsIterator$].next();
       let done = this[_next$0].done;
       if (done) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_done] = true;
         return false;
       } else {
-        this[_current$2] = this[_next$0].value;
+        this[_current$1] = this[_next$0].value;
         return true;
       }
     }
@@ -23287,7 +23284,7 @@
       [_isKeys]: core.bool,
       [_jsIterator$]: dart.dynamic,
       [_next$0]: dart.dynamic,
-      [_current$2]: E,
+      [_current$1]: E,
       [_done]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -24078,10 +24075,10 @@
       this[_set] = set;
       this[_elements] = elements;
       this[_offset] = 0;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       let elements = this[_elements];
@@ -24089,10 +24086,10 @@
       if (elements !== dart.dload(this[_set], _elements)) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
       } else if (dart.notNull(offset) >= elements.length) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = elements[offset];
+        this[_current$1] = elements[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -24105,7 +24102,7 @@
       [_set]: dart.dynamic,
       [_elements]: ListOfE(),
       [_offset]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24559,20 +24556,20 @@
       this[_set] = set;
       this[_modifications$] = modifications;
       this[_cell$] = null;
-      this[_current$2] = null;
+      this[_current$1] = null;
       this[_cell$] = this[_set][_first$];
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (this[_modifications$] != this[_set][_modifications$]) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
       } else if (this[_cell$] == null) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = E._check(this[_cell$][_element]);
+        this[_current$1] = E._check(this[_cell$][_element]);
         this[_cell$] = this[_cell$][_next$0];
         return true;
       }
@@ -24585,7 +24582,7 @@
       [_set]: collection._LinkedHashSet,
       [_modifications$]: core.int,
       [_cell$]: collection._LinkedHashSetCell,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24850,7 +24847,7 @@
       return SetOfE().from(this);
     }
     get length() {
-      dart.assert(!_internal.EfficientLength.is(this));
+      dart.assert(!_internal.EfficientLengthIterable.is(this));
       let count = 0;
       let it = this[dartx.iterator];
       while (dart.test(it.moveNext())) {
@@ -25278,9 +25275,9 @@
 });
 collection.LinkedHashSet = LinkedHashSet();
 const _modificationCount = Symbol('_modificationCount');
-const _insertBefore$ = Symbol('_insertBefore');
+const _insertBefore = Symbol('_insertBefore');
 const _list = Symbol('_list');
-const _unlink$ = Symbol('_unlink');
+const _unlink = Symbol('_unlink');
 collection.LinkedList$ = dart.generic(E => {
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
@@ -25294,12 +25291,12 @@
     }
     addFirst(entry) {
       E._check(entry);
-      this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+      this[_insertBefore](this[_first$], entry, {updateFirst: true});
       this[_first$] = entry;
     }
     add(entry) {
       E._check(entry);
-      this[_insertBefore$](this[_first$], entry, {updateFirst: false});
+      this[_insertBefore](this[_first$], entry, {updateFirst: false});
     }
     addAll(entries) {
       IterableOfE()._check(entries);
@@ -25308,7 +25305,7 @@
     remove(entry) {
       E._check(entry);
       if (!dart.equals(entry[_list], this)) return false;
-      this[_unlink$](entry);
+      this[_unlink](entry);
       return true;
     }
     get iterator() {
@@ -25365,7 +25362,7 @@
     get isEmpty() {
       return this[_length$1] == 0;
     }
-    [_insertBefore$](entry, newEntry, opts) {
+    [_insertBefore](entry, newEntry, opts) {
       E._check(entry);
       E._check(newEntry);
       let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
@@ -25392,7 +25389,7 @@
       }
       this[_length$1] = dart.notNull(this[_length$1]) + 1;
     }
-    [_unlink$](entry) {
+    [_unlink](entry) {
       E._check(entry);
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       entry[_next$0][_previous$0] = entry[_previous$0];
@@ -25419,8 +25416,8 @@
       addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
       remove: dart.definiteFunctionType(core.bool, [E]),
       clear: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-      [_unlink$]: dart.definiteFunctionType(dart.void, [E])
+      [_insertBefore]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+      [_unlink]: dart.definiteFunctionType(dart.void, [E])
     })
   });
   dart.defineExtensionMembers(LinkedList, [
@@ -25446,21 +25443,21 @@
       this[_modificationCount] = list[_modificationCount];
       this[_next$0] = list[_first$];
       this[_visitedFirst] = false;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (this[_modificationCount] != this[_list][_modificationCount]) {
         dart.throw(new core.ConcurrentModificationError(this));
       }
       if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
       this[_visitedFirst] = true;
-      this[_current$2] = E._check(this[_next$0]);
+      this[_current$1] = E._check(this[_next$0]);
       this[_next$0] = this[_next$0][_next$0];
       return true;
     }
@@ -25471,7 +25468,7 @@
     fields: () => ({
       [_list]: LinkedListOfE(),
       [_modificationCount]: core.int,
-      [_current$2]: E,
+      [_current$1]: E,
       [_next$0]: LinkedListEntryOfE(),
       [_visitedFirst]: core.bool
     }),
@@ -25493,23 +25490,23 @@
       return this[_list];
     }
     unlink() {
-      this[_list][_unlink$](E._check(this));
+      this[_list][_unlink](E._check(this));
     }
     get next() {
-      if (core.identical(this, this[_next$0])) return null;
+      if (this[_list] == null || core.identical(this[_list].first, this[_next$0])) return null;
       return this[_next$0];
     }
     get previous() {
-      if (core.identical(this, this[_previous$0])) return null;
+      if (this[_list] == null || core.identical(this, this[_list].first)) return null;
       return this[_previous$0];
     }
     insertAfter(entry) {
       E._check(entry);
-      this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
+      this[_list][_insertBefore](this[_next$0], entry, {updateFirst: false});
     }
     insertBefore(entry) {
       E._check(entry);
-      this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
+      this[_list][_insertBefore](E.as(this), entry, {updateFirst: true});
     }
   }
   dart.addTypeTests(LinkedListEntry);
@@ -25678,7 +25675,7 @@
 collection._MapBaseValueIterable$ = dart.generic((K, V) => {
   let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  class _MapBaseValueIterable extends core.Iterable$(V) {
+  class _MapBaseValueIterable extends _internal.EfficientLengthIterable$(V) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -25705,7 +25702,6 @@
       return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
     }
   }
-  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_MapBaseValueIterable, {
     fields: () => ({[_map$0]: MapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -25730,18 +25726,18 @@
     new(map) {
       this[_map$0] = map;
       this[_keys] = map[dartx.keys][dartx.iterator];
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     moveNext() {
       if (dart.test(this[_keys].moveNext())) {
-        this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
+        this[_current$1] = this[_map$0][dartx._get](this[_keys].current);
         return true;
       }
-      this[_current$2] = null;
+      this[_current$1] = null;
       return false;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
   }
   dart.addTypeTests(_MapBaseValueIterator);
@@ -25750,7 +25746,7 @@
     fields: () => ({
       [_keys]: IteratorOfK(),
       [_map$0]: MapOfK$V(),
-      [_current$2]: V
+      [_current$1]: V
     }),
     getters: () => ({current: dart.definiteFunctionType(V, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25986,7 +25982,7 @@
 });
 collection.Queue$ = dart.generic(E => {
   let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class Queue extends core.Object {
     static new() {
       return new (ListQueueOfE())();
@@ -25994,33 +25990,30 @@
     static from(elements) {
       return ListQueueOfE().from(elements);
     }
-    [Symbol.iterator]() {
-      return new dart.JsIterator(this.iterator);
-    }
   }
   dart.addTypeTests(Queue);
-  Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  Queue[dart.implements] = () => [EfficientLengthIterableOfE()];
   return Queue;
 });
 collection.Queue = Queue();
 const _previousLink = Symbol('_previousLink');
 const _nextLink = Symbol('_nextLink');
 const _link = Symbol('_link');
-collection._DoubleLink$ = dart.generic(E => {
+collection._DoubleLink$ = dart.generic(Link => {
   class _DoubleLink extends core.Object {
     new() {
       this[_previousLink] = null;
       this[_nextLink] = null;
     }
     [_link](previous, next) {
-      E._check(previous);
-      E._check(next);
+      Link._check(previous);
+      Link._check(next);
       this[_nextLink] = next;
       this[_previousLink] = previous;
       if (previous != null) previous[_nextLink] = this;
       if (next != null) next[_previousLink] = this;
     }
-    [_unlink$]() {
+    [_unlink]() {
       if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
       if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
       this[_nextLink] = null;
@@ -26030,46 +26023,34 @@
   dart.addTypeTests(_DoubleLink);
   dart.setSignature(_DoubleLink, {
     fields: () => ({
-      [_previousLink]: E,
-      [_nextLink]: E
+      [_previousLink]: Link,
+      [_nextLink]: Link
     }),
     methods: () => ({
-      [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-      [_unlink$]: dart.definiteFunctionType(dart.void, [])
+      [_link]: dart.definiteFunctionType(dart.void, [Link, Link]),
+      [_unlink]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _DoubleLink;
 });
 collection._DoubleLink = _DoubleLink();
 collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
-  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-  class DoubleLinkedQueueEntry extends core.Object {
-    static new(element) {
-      return new (_UserDoubleLinkedQueueEntryOfE())(element);
-    }
-  }
-  dart.addTypeTests(DoubleLinkedQueueEntry);
-  return DoubleLinkedQueueEntry;
-});
-collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
-collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
-  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
   let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-  class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
+  class DoubleLinkedQueueEntry extends collection._DoubleLink {
     new(element) {
       this.element = element;
       super.new();
     }
     append(e) {
       E._check(e);
-      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
+      new (DoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
     }
     prepend(e) {
       E._check(e);
-      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
+      new (DoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
     }
     remove() {
-      this[_unlink$]();
+      this[_unlink]();
       return this.element;
     }
     previousEntry() {
@@ -26079,8 +26060,7 @@
       return this[_nextLink];
     }
   }
-  _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-  dart.setSignature(_UserDoubleLinkedQueueEntry, {
+  dart.setSignature(DoubleLinkedQueueEntry, {
     fields: () => ({element: E}),
     methods: () => ({
       append: dart.definiteFunctionType(dart.void, [E]),
@@ -26090,22 +26070,23 @@
       nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
     })
   });
-  return _UserDoubleLinkedQueueEntry;
-}, _UserDoubleLinkedQueueEntry => {
-  dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
+  return DoubleLinkedQueueEntry;
+}, DoubleLinkedQueueEntry => {
+  dart.setBaseClass(DoubleLinkedQueueEntry, collection._DoubleLink$(DoubleLinkedQueueEntry));
 });
-collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
+collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
 const _queue = Symbol('_queue');
 const _append = Symbol('_append');
 const _prepend = Symbol('_prepend');
 const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
 collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-  class _DoubleLinkedQueueEntry extends collection._DoubleLink {
-    new(queue) {
+  class _DoubleLinkedQueueEntry extends collection.DoubleLinkedQueueEntry$(E) {
+    new(element, queue) {
       this[_queue] = queue;
-      super.new();
+      super.new(element);
     }
     [_append](e) {
       E._check(e);
@@ -26115,34 +26096,34 @@
       E._check(e);
       new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
     }
+    get [_element]() {
+      return this.element;
+    }
     nextEntry() {
-      return this[_nextLink][_asNonSentinelEntry]();
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_nextLink]);
+      return entry[_asNonSentinelEntry]();
     }
     previousEntry() {
-      return this[_previousLink][_asNonSentinelEntry]();
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_previousLink]);
+      return entry[_asNonSentinelEntry]();
     }
   }
   dart.setSignature(_DoubleLinkedQueueEntry, {
     fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
+    getters: () => ({[_element]: dart.definiteFunctionType(E, [])}),
     methods: () => ({
       [_append]: dart.definiteFunctionType(dart.void, [E]),
-      [_prepend]: dart.definiteFunctionType(dart.void, [E]),
-      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+      [_prepend]: dart.definiteFunctionType(dart.void, [E])
     })
   });
   return _DoubleLinkedQueueEntry;
-}, _DoubleLinkedQueueEntry => {
-  dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
 });
 collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
 const _elementCount = Symbol('_elementCount');
 collection._DoubleLinkedQueueElement$ = dart.generic(E => {
-  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
   class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
     new(element, queue) {
-      this.element = element;
-      super.new(queue);
+      super.new(element, queue);
     }
     append(e) {
       E._check(e);
@@ -26162,7 +26143,7 @@
     }
     [_remove]() {
       this[_queue] = null;
-      this[_unlink$]();
+      this[_unlink]();
       return this.element;
     }
     remove() {
@@ -26176,14 +26157,9 @@
       return this;
     }
   }
-  _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
   dart.setSignature(_DoubleLinkedQueueElement, {
-    fields: () => ({element: E}),
     methods: () => ({
-      append: dart.definiteFunctionType(dart.void, [E]),
-      prepend: dart.definiteFunctionType(dart.void, [E]),
       [_remove]: dart.definiteFunctionType(E, []),
-      remove: dart.definiteFunctionType(E, []),
       [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
     })
   });
@@ -26193,7 +26169,7 @@
 collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
   class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
     new(queue) {
-      super.new(queue);
+      super.new(null, queue);
       this[_previousLink] = this;
       this[_nextLink] = this;
     }
@@ -26203,12 +26179,11 @@
     [_remove]() {
       dart.throw(_internal.IterableElementError.noElement());
     }
-    get element() {
+    get [_element]() {
       dart.throw(_internal.IterableElementError.noElement());
     }
   }
   dart.setSignature(_DoubleLinkedQueueSentinel, {
-    getters: () => ({element: dart.definiteFunctionType(E, [])}),
     methods: () => ({
       [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       [_remove]: dart.definiteFunctionType(E, [])
@@ -26222,6 +26197,7 @@
   let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
   let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
   let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
   let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
@@ -26269,34 +26245,42 @@
       }
     }
     removeLast() {
-      let lastEntry = this[_sentinel][_previousLink];
+      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
       let result = lastEntry[_remove]();
       this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
       return result;
     }
     removeFirst() {
-      let firstEntry = this[_sentinel][_nextLink];
+      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       let result = firstEntry[_remove]();
       this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
       return result;
     }
     remove(o) {
-      let entry = this[_sentinel][_nextLink];
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        if (dart.equals(entry.element, o)) {
+        let equals = dart.equals(entry[_element], o);
+        if (!core.identical(this, entry[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        if (equals) {
           entry[_remove]();
           this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
           return true;
         }
-        entry = entry[_nextLink];
+        entry = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
       }
       return false;
     }
     [_filter](test, removeMatching) {
-      let entry = this[_sentinel][_nextLink];
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        let next = entry[_nextLink];
-        if (core.identical(removeMatching, test(entry.element))) {
+        let matches = test(entry[_element]);
+        if (!core.identical(this, entry[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        let next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+        if (core.identical(removeMatching, matches)) {
           entry[_remove]();
           this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         }
@@ -26310,26 +26294,26 @@
       this[_filter](test, false);
     }
     get first() {
-      let firstEntry = this[_sentinel][_nextLink];
-      return firstEntry.element;
+      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+      return firstEntry[_element];
     }
     get last() {
-      let lastEntry = this[_sentinel][_previousLink];
-      return lastEntry.element;
+      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
+      return lastEntry[_element];
     }
     get single() {
       if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
-        let entry = this[_sentinel][_nextLink];
-        return entry.element;
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+        return entry[_element];
       }
       dart.throw(_internal.IterableElementError.tooMany());
     }
-    lastEntry() {
-      return this[_sentinel].previousEntry();
-    }
     firstEntry() {
       return this[_sentinel].nextEntry();
     }
+    lastEntry() {
+      return this[_sentinel].previousEntry();
+    }
     get isEmpty() {
       return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
     }
@@ -26338,13 +26322,18 @@
       this[_sentinel][_previousLink] = this[_sentinel];
       this[_elementCount] = 0;
     }
-    forEachEntry(f) {
-      let entry = this[_sentinel][_nextLink];
+    forEachEntry(action) {
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        let nextEntry = entry[_nextLink];
         let element = _DoubleLinkedQueueElementOfE()._check(entry);
-        f(element);
-        entry = nextEntry;
+        let next = _DoubleLinkedQueueEntryOfE()._check(element[_nextLink]);
+        action(element);
+        if (core.identical(this, entry[_queue])) {
+          next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+        } else if (!core.identical(this, next[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        entry = next;
       }
     }
     get iterator() {
@@ -26372,8 +26361,8 @@
       [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
       removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
       retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       clear: dart.definiteFunctionType(dart.void, []),
       forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
     })
@@ -26392,33 +26381,33 @@
 collection.DoubleLinkedQueue = DoubleLinkedQueue();
 const _nextEntry = Symbol('_nextEntry');
 collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   class _DoubleLinkedQueueIterator extends core.Object {
     new(sentinel) {
       this[_sentinel] = sentinel;
-      this[_nextEntry] = sentinel[_nextLink];
-      this[_current$2] = null;
+      this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(sentinel[_nextLink]);
+      this[_current$1] = null;
     }
     moveNext() {
       if (core.identical(this[_nextEntry], this[_sentinel])) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_nextEntry] = null;
         this[_sentinel] = null;
         return false;
       }
       let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
-      if (elementEntry[_queue] == null) {
+      if (!core.identical(this[_sentinel][_queue], elementEntry[_queue])) {
         dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
       }
-      this[_current$2] = elementEntry.element;
-      this[_nextEntry] = elementEntry[_nextLink];
+      this[_current$1] = elementEntry[_element];
+      this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(elementEntry[_nextLink]);
       return true;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
   }
   dart.addTypeTests(_DoubleLinkedQueueIterator);
@@ -26427,7 +26416,7 @@
     fields: () => ({
       [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
       [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26450,7 +26439,7 @@
   let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class ListQueue extends core.Iterable$(E) {
+  class ListQueue extends _internal.ListIterable$(E) {
     new(initialCapacity) {
       if (initialCapacity === void 0) initialCapacity = null;
       this[_head] = 0;
@@ -26478,7 +26467,7 @@
         return queue;
       } else {
         let capacity = collection.ListQueue._INITIAL_CAPACITY;
-        if (_internal.EfficientLength.is(elements)) {
+        if (_internal.EfficientLengthIterable.is(elements)) {
           capacity = elements[dartx.length];
         }
         let result = new (ListQueueOfE())(capacity);
@@ -26727,7 +26716,6 @@
       [_tail]: core.int,
       [_modificationCount]: core.int
     }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [E]),
       addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
@@ -26780,18 +26768,18 @@
       this[_end] = queue[_tail];
       this[_modificationCount] = queue[_modificationCount];
       this[_position] = queue[_head];
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       this[_queue][_checkModification](this[_modificationCount]);
       if (this[_position] == this[_end]) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
-      this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
+      this[_current$1] = this[_queue][_table][dartx._get](this[_position]);
       this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
       return true;
     }
@@ -26804,7 +26792,7 @@
       [_end]: core.int,
       [_modificationCount]: core.int,
       [_position]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26860,7 +26848,7 @@
 const _splayMin = Symbol('_splayMin');
 const _splayMax = Symbol('_splayMax');
 const _addNewRoot = Symbol('_addNewRoot');
-const _clear$ = Symbol('_clear');
+const _clear = Symbol('_clear');
 collection._SplayTree$ = dart.generic((K, Node) => {
   class _SplayTree extends core.Object {
     new() {
@@ -26985,7 +26973,7 @@
       this[_root] = this[_splayMax](this[_root]);
       return this[_root];
     }
-    [_clear$]() {
+    [_clear]() {
       this[_root] = null;
       this[_count$] = 0;
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
@@ -27008,7 +26996,7 @@
       [_splayMax]: dart.definiteFunctionType(Node, [Node]),
       [_remove]: dart.definiteFunctionType(Node, [K]),
       [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-      [_clear$]: dart.definiteFunctionType(dart.void, [])
+      [_clear]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _SplayTree;
@@ -27165,7 +27153,7 @@
       return this[_count$];
     }
     clear() {
-      this[_clear$]();
+      this[_clear]();
     }
     containsKey(key) {
       return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
@@ -27385,7 +27373,7 @@
   let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
   let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
   let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-  class _SplayTreeKeyIterable extends core.Iterable$(K) {
+  class _SplayTreeKeyIterable extends _internal.EfficientLengthIterable$(K) {
     new(tree) {
       this[_tree] = tree;
       super.new();
@@ -27406,7 +27394,6 @@
       return set;
     }
   }
-  _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_SplayTreeKeyIterable, {
     fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
@@ -27418,7 +27405,7 @@
 collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
   let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
   let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-  class _SplayTreeValueIterable extends core.Iterable$(V) {
+  class _SplayTreeValueIterable extends _internal.EfficientLengthIterable$(V) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -27433,7 +27420,6 @@
       return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
     }
   }
-  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_SplayTreeValueIterable, {
     fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -27649,7 +27635,7 @@
       return _;
     }
     clear() {
-      this[_clear$]();
+      this[_clear]();
     }
     toSet() {
       return this[_clone]();
@@ -28186,7 +28172,7 @@
 core.List$ = dart.generic(E => {
   let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
   let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class List extends core.Object {
     static new(length) {
       if (length === void 0) length = null;
@@ -28237,12 +28223,9 @@
       let result = ListOfE().from(elements, {growable: false});
       return _internal.makeFixedListUnmodifiable(E)(result);
     }
-    [Symbol.iterator]() {
-      return new dart.JsIterator(this[dartx.iterator]);
-    }
   }
   dart.addTypeTests(List);
-  List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  List[dart.implements] = () => [EfficientLengthIterableOfE()];
   return List;
 });
 core.List = List();
@@ -28381,6 +28364,7 @@
   }
 };
 dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
+convert._UnicodeSubsetEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert._UnicodeSubsetEncoder, {
   fields: () => ({[_subsetMask]: core.int}),
   methods: () => ({
@@ -28463,6 +28447,7 @@
   }
 };
 dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
+convert._UnicodeSubsetDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert._UnicodeSubsetDecoder, {
   fields: () => ({
     [_allowInvalid]: core.bool,
@@ -28627,6 +28612,7 @@
 };
 dart.addSimpleTypeTests(convert.Base64Encoder);
 dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
+convert.Base64Encoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert.Base64Encoder, {
   fields: () => ({[_urlSafe]: core.bool}),
   methods: () => ({
@@ -28653,6 +28639,104 @@
   get decoder() {
     return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
   }
+  normalize(source, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    let percent = 37;
+    let equals = 61;
+    let buffer = null;
+    let sliceStart = start;
+    let alphabet = convert._Base64Encoder._base64Alphabet;
+    let inverseAlphabet = convert._Base64Decoder._inverseAlphabet;
+    let firstPadding = -1;
+    let firstPaddingSourceIndex = -1;
+    let paddingCount = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end);) {
+      let sliceEnd = i;
+      let char = source[dartx.codeUnitAt]((() => {
+        let x = i;
+        i = dart.notNull(x) + 1;
+        return x;
+      })());
+      let originalChar = char;
+      if (char == percent) {
+        if (dart.notNull(i) + 2 <= dart.notNull(end)) {
+          char = _internal.parseHexByte(source, i);
+          i = dart.notNull(i) + 2;
+          if (char == percent) char = -1;
+        } else {
+          char = -1;
+        }
+      }
+      if (0 <= dart.notNull(char) && dart.notNull(char) <= 127) {
+        let value = inverseAlphabet[dartx._get](char);
+        if (dart.notNull(value) >= 0) {
+          char = alphabet[dartx.codeUnitAt](value);
+          if (char == originalChar) continue;
+        } else if (value == convert._Base64Decoder._padding) {
+          if (dart.notNull(firstPadding) < 0) {
+            firstPadding = (() => {
+              let l = dart.nullSafe(buffer, _ => _.length);
+              return l != null ? l : 0;
+            })() + (dart.notNull(sliceEnd) - dart.notNull(sliceStart));
+            firstPaddingSourceIndex = sliceEnd;
+          }
+          paddingCount = dart.notNull(paddingCount) + 1;
+          if (originalChar == equals) continue;
+        }
+        if (value != convert._Base64Decoder._invalid) {
+          let t = buffer;
+          t == null ? buffer = new core.StringBuffer() : t;
+          buffer.write(source[dartx.substring](sliceStart, sliceEnd));
+          buffer.writeCharCode(char);
+          sliceStart = i;
+          continue;
+        }
+      }
+      dart.throw(new core.FormatException("Invalid base64 data", source, sliceEnd));
+    }
+    if (buffer != null) {
+      buffer.write(source[dartx.substring](sliceStart, end));
+      if (dart.notNull(firstPadding) >= 0) {
+        convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, buffer.length);
+      } else {
+        let endLength = (dart.notNull(buffer.length) - 1)[dartx['%']](4) + 1;
+        if (endLength == 1) {
+          dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+        }
+        while (dart.notNull(endLength) < 4) {
+          buffer.write("=");
+          endLength = dart.notNull(endLength) + 1;
+        }
+      }
+      return source[dartx.replaceRange](start, end, dart.toString(buffer));
+    }
+    let length = dart.notNull(end) - dart.notNull(start);
+    if (dart.notNull(firstPadding) >= 0) {
+      convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, length);
+    } else {
+      let endLength = length[dartx['%']](4);
+      if (endLength == 1) {
+        dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+      }
+      if (dart.notNull(endLength) > 1) {
+        source = source[dartx.replaceRange](end, end, endLength == 2 ? "==" : "=");
+      }
+    }
+    return source;
+  }
+  static _checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, length) {
+    if (length[dartx['%']](4) != 0) {
+      dart.throw(new core.FormatException("Invalid base64 padding, padded length must be multiple of four, " + dart.str`is ${length}`, source, sourceEnd));
+    }
+    if (dart.notNull(firstPadding) + dart.notNull(paddingCount) != length) {
+      dart.throw(new core.FormatException("Invalid base64 padding, '=' not at the end", source, sourceIndex));
+    }
+    if (dart.notNull(paddingCount) > 2) {
+      dart.throw(new core.FormatException("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
+    }
+  }
 };
 dart.addSimpleTypeTests(convert.Base64Codec);
 dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
@@ -28661,7 +28745,10 @@
   getters: () => ({
     encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
     decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
-  })
+  }),
+  methods: () => ({normalize: dart.definiteFunctionType(core.String, [core.String], [core.int, core.int])}),
+  statics: () => ({_checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, core.int, core.int])}),
+  names: ['_checkPadding']
 });
 convert.BASE64 = dart.const(new convert.Base64Codec());
 convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
@@ -28925,6 +29012,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Base64Decoder);
+convert.Base64Decoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert.Base64Decoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -29453,6 +29541,7 @@
 });
 convert._InvertedCodec = _InvertedCodec();
 convert._FusedConverter$ = dart.generic((S, M, T) => {
+  let ChunkedConverterOfS$T$S$T = () => (ChunkedConverterOfS$T$S$T = dart.constFn(convert.ChunkedConverter$(S, T, S, T)))();
   let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
   let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
   let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
@@ -29471,6 +29560,7 @@
       return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
     }
   }
+  _FusedConverter[dart.implements] = () => [ChunkedConverterOfS$T$S$T()];
   dart.setSignature(_FusedConverter, {
     fields: () => ({
       [_first$0]: ConverterOfS$M(),
@@ -29605,6 +29695,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.HtmlEscape);
+convert.HtmlEscape[dart.implements] = () => [ChunkedConverterOfString$String$String$String()];
 dart.setSignature(convert.HtmlEscape, {
   fields: () => ({mode: convert.HtmlEscapeMode}),
   methods: () => ({
@@ -29764,6 +29855,7 @@
 };
 dart.addSimpleTypeTests(convert.JsonEncoder);
 dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
+convert.JsonEncoder[dart.implements] = () => [ChunkedConverterOfObject$String$Object$String()];
 dart.setSignature(convert.JsonEncoder, {
   fields: () => ({
     indent: core.String,
@@ -29836,6 +29928,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
+convert.JsonUtf8Encoder[dart.implements] = () => [ChunkedConverterOfObject$ListOfint$Object$ListOfint()];
 dart.setSignature(convert.JsonUtf8Encoder, {
   fields: () => ({
     [_indent]: ListOfint(),
@@ -29943,6 +30036,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.JsonDecoder);
+convert.JsonDecoder[dart.implements] = () => [ChunkedConverterOfString$Object$String$Object()];
 dart.setSignature(convert.JsonDecoder, {
   fields: () => ({[_reviver]: convert._Reviver}),
   methods: () => ({
@@ -31071,6 +31165,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Utf8Encoder);
+convert.Utf8Encoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert.Utf8Encoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -31283,7 +31378,7 @@
     let buffer = new core.StringBuffer();
     let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
     decoder.convert(codeUnits, start, end);
-    decoder.close();
+    decoder.flush(codeUnits, end);
     return buffer.toString();
   }
   startChunkedConversion(sink) {
@@ -31308,6 +31403,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Utf8Decoder);
+convert.Utf8Decoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert.Utf8Decoder, {
   fields: () => ({[_allowMalformed]: core.bool}),
   methods: () => ({
@@ -31357,10 +31453,12 @@
   close() {
     this.flush();
   }
-  flush() {
+  flush(source, offset) {
+    if (source === void 0) source = null;
+    if (offset === void 0) offset = null;
     if (dart.test(this.hasPartialInput)) {
       if (!dart.test(this[_allowMalformed])) {
-        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
+        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence", source, offset));
       }
       this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
       this[_value] = 0;
@@ -31404,7 +31502,7 @@
               if ((dart.notNull(unit) & 192) != 128) {
                 expectedUnits = 0;
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, i));
                 }
                 this[_isFirstCharacter] = false;
                 this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
@@ -31417,14 +31515,14 @@
             } while (dart.notNull(expectedUnits) > 0);
             if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
               }
               expectedUnits = extraUnits = 0;
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             }
             if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
               }
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             }
@@ -31448,7 +31546,7 @@
           })());
           if (dart.notNull(unit) < 0) {
             if (!dart.test(this[_allowMalformed])) {
-              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
+              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
             }
             this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
           } else {
@@ -31469,7 +31567,7 @@
               continue loop;
             }
             if (!dart.test(this[_allowMalformed])) {
-              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
             }
             value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             expectedUnits = extraUnits = 0;
@@ -31498,7 +31596,7 @@
   getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
-    flush: dart.definiteFunctionType(dart.void, []),
+    flush: dart.definiteFunctionType(dart.void, [], [ListOfint(), core.int]),
     convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
   })
 });
@@ -31535,6 +31633,7 @@
 };
 core.proxy = dart.const(new core._Proxy());
 dart.defineExtensionNames([
+  'hashCode',
   'toString'
 ]);
 core.bool = class bool extends core.Object {
@@ -31542,6 +31641,9 @@
     let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
     dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
   }
+  get [dartx.hashCode]() {
+    return super.hashCode;
+  }
   [dartx.toString]() {
     return this ? "true" : "false";
   }
@@ -32678,108 +32780,42 @@
   return _Generator;
 });
 core._Generator = _Generator();
-const _end$ = Symbol('_end');
-const _start$0 = Symbol('_start');
 const _generator$ = Symbol('_generator');
 core._GeneratorIterable$ = dart.generic(E => {
   let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-  let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
-  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-  class _GeneratorIterable extends core.Iterable$(E) {
-    new(end, generator) {
-      this[_end$] = end;
-      this[_start$0] = 0;
+  class _GeneratorIterable extends _internal.ListIterable$(E) {
+    get length() {
+      return this[length$];
+    }
+    set length(value) {
+      super.length = value;
+    }
+    new(length, generator) {
+      this[length$] = length;
       this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
       super.new();
     }
-    slice(start, end, generator) {
-      this[_start$0] = start;
-      this[_end$] = end;
-      this[_generator$] = generator;
-      super.new();
-    }
-    get iterator() {
-      return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
-    }
-    get length() {
-      return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
-    }
-    skip(count) {
-      core.RangeError.checkNotNegative(count, "count");
-      if (count == 0) return this;
-      let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
-      if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
-      return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
-    }
-    take(count) {
-      core.RangeError.checkNotNegative(count, "count");
-      if (count == 0) return new (EmptyIterableOfE())();
-      let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
-      if (newEnd >= dart.notNull(this[_end$])) return this;
-      return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
+    elementAt(index) {
+      core.RangeError.checkValidIndex(index, this);
+      return this[_generator$](index);
     }
     static _id(n) {
       return n;
     }
   }
-  dart.defineNamedConstructor(_GeneratorIterable, 'slice');
-  _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
+  const length$ = Symbol("_GeneratorIterable.length");
   dart.setSignature(_GeneratorIterable, {
     fields: () => ({
-      [_start$0]: core.int,
-      [_end$]: core.int,
+      length: core.int,
       [_generator$]: _GeneratorOfE()
     }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
     names: ['_id']
   });
-  dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
+  dart.defineExtensionMembers(_GeneratorIterable, ['elementAt', 'length']);
   return _GeneratorIterable;
 });
 core._GeneratorIterable = _GeneratorIterable();
-const _index$1 = Symbol('_index');
-const _current$3 = Symbol('_current');
-core._GeneratorIterator$ = dart.generic(E => {
-  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-  class _GeneratorIterator extends core.Object {
-    new(index, end, generator) {
-      this[_index$1] = index;
-      this[_end$] = end;
-      this[_generator$] = generator;
-      this[_current$3] = null;
-    }
-    moveNext() {
-      if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
-        this[_current$3] = this[_generator$](this[_index$1]);
-        this[_index$1] = dart.notNull(this[_index$1]) + 1;
-        return true;
-      } else {
-        this[_current$3] = null;
-        return false;
-      }
-    }
-    get current() {
-      return this[_current$3];
-    }
-  }
-  dart.addTypeTests(_GeneratorIterator);
-  _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
-  dart.setSignature(_GeneratorIterator, {
-    fields: () => ({
-      [_end$]: core.int,
-      [_generator$]: _GeneratorOfE(),
-      [_index$1]: core.int,
-      [_current$3]: E
-    }),
-    getters: () => ({current: dart.definiteFunctionType(E, [])}),
-    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-  });
-  return _GeneratorIterator;
-});
-core._GeneratorIterator = _GeneratorIterator();
 core.BidirectionalIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class BidirectionalIterator extends core.Object {}
@@ -32821,6 +32857,9 @@
   static _uninstantiable() {
     dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
   }
+  get hashCode() {
+    return super.hashCode;
+  }
   toString() {
     return "null";
   }
@@ -32856,7 +32895,7 @@
 core.RegExp[dart.implements] = () => [core.Pattern];
 core.Set$ = dart.generic(E => {
   let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-  class Set extends core.Iterable$(E) {
+  class Set extends _internal.EfficientLengthIterable$(E) {
     static new() {
       return LinkedHashSetOfE().new();
     }
@@ -32867,7 +32906,6 @@
       return LinkedHashSetOfE().from(elements);
     }
   }
-  Set[dart.implements] = () => [_internal.EfficientLength];
   return Set;
 });
 core.Set = Set();
@@ -32900,41 +32938,38 @@
 dart.setSignature(core._StringStackTrace, {
   fields: () => ({[_stackTrace]: core.String})
 });
+const _start$0 = Symbol('_start');
 const _stop = Symbol('_stop');
 core.Stopwatch = class Stopwatch extends core.Object {
+  new() {
+    this[_start$0] = 0;
+    this[_stop] = 0;
+    if (core.Stopwatch._frequency == null) core.Stopwatch._initTicker();
+  }
   get frequency() {
     return core.Stopwatch._frequency;
   }
-  new() {
-    this[_start$0] = null;
-    this[_stop] = null;
-    core.Stopwatch._initTicker();
-  }
   start() {
-    if (dart.test(this.isRunning)) return;
-    if (this[_start$0] == null) {
-      this[_start$0] = core.Stopwatch._now();
-    } else {
-      this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
+    if (this[_stop] != null) {
+      this[_start$0] = dart.notNull(this[_start$0]) + (dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_stop]));
       this[_stop] = null;
     }
   }
   stop() {
-    if (!dart.test(this.isRunning)) return;
-    this[_stop] = core.Stopwatch._now();
+    let t = this[_stop];
+    t == null ? this[_stop] = core.Stopwatch._now() : t;
   }
   reset() {
-    if (this[_start$0] == null) return;
-    this[_start$0] = core.Stopwatch._now();
-    if (this[_stop] != null) {
-      this[_stop] = this[_start$0];
-    }
+    this[_start$0] = (() => {
+      let l = this[_stop];
+      return l != null ? l : core.Stopwatch._now();
+    })();
   }
   get elapsedTicks() {
-    if (this[_start$0] == null) {
-      return 0;
-    }
-    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
+    return dart.notNull((() => {
+      let l = this[_stop];
+      return l != null ? l : core.Stopwatch._now();
+    })()) - dart.notNull(this[_start$0]);
   }
   get elapsed() {
     return new core.Duration({microseconds: this.elapsedMicroseconds});
@@ -32946,7 +32981,7 @@
     return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
   }
   get isRunning() {
-    return this[_start$0] != null && this[_stop] == null;
+    return this[_stop] == null;
   }
   static _initTicker() {
     _js_helper.Primitives.initTicker();
@@ -33222,37 +33257,471 @@
     return new _internal.Symbol(name);
   }
 };
+core._SPACE = 32;
+core._PERCENT = 37;
+core._AMPERSAND = 38;
+core._PLUS = 43;
+core._DOT = 46;
+core._SLASH = 47;
+core._COLON = 58;
+core._EQUALS = 61;
+core._UPPER_CASE_A = 65;
+core._UPPER_CASE_Z = 90;
+core._LEFT_BRACKET = 91;
+core._BACKSLASH = 92;
+core._RIGHT_BRACKET = 93;
+core._LOWER_CASE_A = 97;
+core._LOWER_CASE_F = 102;
+core._LOWER_CASE_Z = 122;
+core._hexDigits = "0123456789ABCDEF";
+core.Uri = class Uri extends core.Object {
+  static get base() {
+    let uri = _js_helper.Primitives.currentUri();
+    if (uri != null) return core.Uri.parse(uri);
+    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+  }
+  static new(opts) {
+    return core._Uri.new(opts);
+  }
+  static http(authority, unencodedPath, queryParameters) {
+    return core._Uri.http(authority, unencodedPath, queryParameters);
+  }
+  static https(authority, unencodedPath, queryParameters) {
+    return core._Uri.https(authority, unencodedPath, queryParameters);
+  }
+  static file(path, opts) {
+    return core._Uri.file(path, opts);
+  }
+  static directory(path, opts) {
+    return core._Uri.directory(path, opts);
+  }
+  static dataFromString(content, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let base64 = opts && 'base64' in opts ? opts.base64 : false;
+    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
+    return data.uri;
+  }
+  static dataFromBytes(bytes, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
+    return data.uri;
+  }
+  get hasScheme() {
+    return this.scheme[dartx.isNotEmpty];
+  }
+  static parse(uri, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let t = end;
+    t == null ? end = uri[dartx.length] : t;
+    if (dart.notNull(end) >= dart.notNull(start) + 5) {
+      let dataDelta = core._startsWithData(uri, start);
+      if (dataDelta == 0) {
+        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) uri = uri[dartx.substring](start, end);
+        return core.UriData._parse(uri, 5, null).uri;
+      } else if (dataDelta == 32) {
+        return core.UriData._parse(uri[dartx.substring](dart.notNull(start) + 5, end), 0, null).uri;
+      }
+    }
+    let indices = ListOfint().new(8);
+    indices[dartx._set](0, 0);
+    indices[dartx._set](core._schemeEndIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._hostStartIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._notSimpleIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._portStartIndex, start);
+    indices[dartx._set](core._pathStartIndex, start);
+    indices[dartx._set](core._queryStartIndex, end);
+    indices[dartx._set](core._fragmentStartIndex, end);
+    let state = core._scan(uri, start, end, core._uriStart, indices);
+    if (dart.notNull(state) >= core._nonSimpleEndStates) {
+      indices[dartx._set](core._notSimpleIndex, end);
+    }
+    let schemeEnd = indices[dartx._get](core._schemeEndIndex);
+    if (dart.notNull(schemeEnd) >= dart.notNull(start)) {
+      state = core._scan(uri, start, schemeEnd, core._schemeStart, indices);
+      if (state == core._schemeStart) {
+        indices[dartx._set](core._notSimpleIndex, schemeEnd);
+      }
+    }
+    let hostStart = dart.notNull(indices[dartx._get](core._hostStartIndex)) + 1;
+    let portStart = indices[dartx._get](core._portStartIndex);
+    let pathStart = indices[dartx._get](core._pathStartIndex);
+    let queryStart = indices[dartx._get](core._queryStartIndex);
+    let fragmentStart = indices[dartx._get](core._fragmentStartIndex);
+    let scheme = null;
+    if (dart.notNull(fragmentStart) < dart.notNull(queryStart)) queryStart = fragmentStart;
+    if (dart.notNull(pathStart) < dart.notNull(hostStart) || dart.notNull(pathStart) <= dart.notNull(schemeEnd)) {
+      pathStart = queryStart;
+    }
+    if (dart.notNull(portStart) < dart.notNull(hostStart)) portStart = pathStart;
+    dart.assert(hostStart == start || dart.notNull(schemeEnd) <= dart.notNull(hostStart));
+    dart.assert(dart.notNull(hostStart) <= dart.notNull(portStart));
+    dart.assert(dart.notNull(schemeEnd) <= dart.notNull(pathStart));
+    dart.assert(dart.notNull(portStart) <= dart.notNull(pathStart));
+    dart.assert(dart.notNull(pathStart) <= dart.notNull(queryStart));
+    dart.assert(dart.notNull(queryStart) <= dart.notNull(fragmentStart));
+    let isSimple = dart.notNull(indices[dartx._get](core._notSimpleIndex)) < dart.notNull(start);
+    if (isSimple) {
+      if (dart.notNull(hostStart) > dart.notNull(schemeEnd) + 3) {
+        isSimple = false;
+      } else if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 1 == pathStart) {
+        isSimple = false;
+      } else if (dart.notNull(queryStart) < dart.notNull(end) && queryStart == dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("..", pathStart)) || dart.notNull(queryStart) > dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("/..", dart.notNull(queryStart) - 3))) {
+        isSimple = false;
+      } else {
+        if (schemeEnd == dart.notNull(start) + 4) {
+          if (dart.test(uri[dartx.startsWith]("file", start))) {
+            scheme = "file";
+            if (dart.notNull(hostStart) <= dart.notNull(start)) {
+              let schemeAuth = "file://";
+              let delta = 2;
+              if (!dart.test(uri[dartx.startsWith]("/", pathStart))) {
+                schemeAuth = "file:///";
+                delta = 3;
+              }
+              uri = schemeAuth + dart.notNull(uri[dartx.substring](pathStart, end));
+              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+              hostStart = 7;
+              portStart = 7;
+              pathStart = 7;
+              queryStart = dart.notNull(queryStart) + (delta - dart.notNull(start));
+              fragmentStart = dart.notNull(fragmentStart) + (delta - dart.notNull(start));
+              start = 0;
+              end = uri[dartx.length];
+            } else if (pathStart == queryStart) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](pathStart, queryStart, "/");
+                queryStart = dart.notNull(queryStart) + 1;
+                fragmentStart = dart.notNull(fragmentStart) + 1;
+                end = dart.notNull(end) + 1;
+              } else {
+                uri = dart.str`${uri[dartx.substring](start, pathStart)}/` + dart.str`${uri[dartx.substring](queryStart, end)}`;
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - dart.notNull(start);
+                queryStart = dart.notNull(queryStart) + (1 - dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) + (1 - dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          } else if (dart.test(uri[dartx.startsWith]("http", start))) {
+            scheme = "http";
+            if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 3 == pathStart && dart.test(uri[dartx.startsWith]("80", dart.notNull(portStart) + 1))) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                pathStart = dart.notNull(pathStart) - 3;
+                queryStart = dart.notNull(queryStart) - 3;
+                fragmentStart = dart.notNull(fragmentStart) - 3;
+                end = dart.notNull(end) - 3;
+              } else {
+                uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - (3 + dart.notNull(start));
+                queryStart = dart.notNull(queryStart) - (3 + dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) - (3 + dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          }
+        } else if (schemeEnd == dart.notNull(start) + 5 && dart.test(uri[dartx.startsWith]("https", start))) {
+          scheme = "https";
+          if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 4 == pathStart && dart.test(uri[dartx.startsWith]("443", dart.notNull(portStart) + 1))) {
+            if (start == 0 && end == uri[dartx.length]) {
+              uri = uri[dartx.replaceRange](portStart, pathStart, "");
+              pathStart = dart.notNull(pathStart) - 4;
+              queryStart = dart.notNull(queryStart) - 4;
+              fragmentStart = dart.notNull(fragmentStart) - 4;
+              end = dart.notNull(end) - 3;
+            } else {
+              uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+              hostStart = dart.notNull(hostStart) - dart.notNull(start);
+              portStart = dart.notNull(portStart) - dart.notNull(start);
+              pathStart = dart.notNull(pathStart) - (4 + dart.notNull(start));
+              queryStart = dart.notNull(queryStart) - (4 + dart.notNull(start));
+              fragmentStart = dart.notNull(fragmentStart) - (4 + dart.notNull(start));
+              start = 0;
+              end = uri[dartx.length];
+            }
+          }
+        }
+      }
+    }
+    if (isSimple) {
+      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) {
+        uri = uri[dartx.substring](start, end);
+        schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+        hostStart = dart.notNull(hostStart) - dart.notNull(start);
+        portStart = dart.notNull(portStart) - dart.notNull(start);
+        pathStart = dart.notNull(pathStart) - dart.notNull(start);
+        queryStart = dart.notNull(queryStart) - dart.notNull(start);
+        fragmentStart = dart.notNull(fragmentStart) - dart.notNull(start);
+      }
+      return new core._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+    }
+    return core._Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+  }
+  static encodeComponent(component) {
+    return core._Uri._uriEncode(core._Uri._unreserved2396Table, component, convert.UTF8, false);
+  }
+  static encodeQueryComponent(component, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core._Uri._uriEncode(core._Uri._unreservedTable, component, encoding, true);
+  }
+  static decodeComponent(encodedComponent) {
+    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
+  }
+  static decodeQueryComponent(encodedComponent, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
+  }
+  static encodeFull(uri) {
+    return core._Uri._uriEncode(core._Uri._encodeFullTable, uri, convert.UTF8, false);
+  }
+  static decodeFull(uri) {
+    return core._Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
+  }
+  static splitQueryString(query, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
+      let index = element[dartx.indexOf]("=");
+      if (index == -1) {
+        if (element != "") {
+          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
+        }
+      } else if (index != 0) {
+        let key = element[dartx.substring](0, index);
+        let value = element[dartx.substring](dart.notNull(index) + 1);
+        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
+      }
+      return map;
+    }, MapOfString$StringAndStringToMapOfString$String()));
+  }
+  static parseIPv4Address(host) {
+    return core.Uri._parseIPv4Address(host, 0, host[dartx.length]);
+  }
+  static _parseIPv4Address(host, start, end) {
+    function error(msg, position) {
+      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`, host, position));
+    }
+    dart.fn(error, StringAndintTovoid());
+    let result = typed_data.Uint8List.new(4);
+    let partIndex = 0;
+    let partStart = start;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = host[dartx.codeUnitAt](i);
+      if (char != core._DOT) {
+        if ((dart.notNull(char) ^ 48) >>> 0 > 9) {
+          error("invalid character", i);
+        }
+      } else {
+        if (partIndex == 3) {
+          error('IPv4 address should contain exactly 4 parts', i);
+        }
+        let part = core.int.parse(host[dartx.substring](partStart, i));
+        if (dart.notNull(part) > 255) {
+          error("each part must be in the range 0..255", partStart);
+        }
+        result[dartx._set](partIndex++, part);
+        partStart = dart.notNull(i) + 1;
+      }
+    }
+    if (partIndex != 3) {
+      error('IPv4 address should contain exactly 4 parts', end);
+    }
+    let part = core.int.parse(host[dartx.substring](partStart, end));
+    if (dart.notNull(part) > 255) {
+      error("each part must be in the range 0..255", partStart);
+    }
+    result[dartx._set](partIndex, part);
+    return result;
+  }
+  static parseIPv6Address(host, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (end == null) end = host[dartx.length];
+    function error(msg, position) {
+      if (position === void 0) position = null;
+      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
+    }
+    dart.fn(error, String__Tovoid());
+    function parseHex(start, end) {
+      if (dart.notNull(end) - dart.notNull(start) > 4) {
+        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
+      }
+      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
+      if (dart.notNull(value) < 0 || dart.notNull(value) > 65535) {
+        error('each part must be in the range of `0x0..0xFFFF`', start);
+      }
+      return value;
+    }
+    dart.fn(parseHex, intAndintToint());
+    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
+    let parts = JSArrayOfint().of([]);
+    let wildcardSeen = false;
+    let seenDot = false;
+    let partStart = start;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = host[dartx.codeUnitAt](i);
+      if (char == core._COLON) {
+        if (i == start) {
+          i = dart.notNull(i) + 1;
+          if (host[dartx.codeUnitAt](i) != core._COLON) {
+            error('invalid start colon.', i);
+          }
+          partStart = i;
+        }
+        if (i == partStart) {
+          if (wildcardSeen) {
+            error('only one wildcard `::` is allowed', i);
+          }
+          wildcardSeen = true;
+          parts[dartx.add](-1);
+        } else {
+          parts[dartx.add](parseHex(partStart, i));
+        }
+        partStart = dart.notNull(i) + 1;
+      } else if (char == core._DOT) {
+        seenDot = true;
+      }
+    }
+    if (parts[dartx.length] == 0) error('too few parts');
+    let atEnd = partStart == end;
+    let isLastWildcard = parts[dartx.last] == -1;
+    if (atEnd && !isLastWildcard) {
+      error('expected a part after last `:`', end);
+    }
+    if (!atEnd) {
+      if (!seenDot) {
+        parts[dartx.add](parseHex(partStart, end));
+      } else {
+        let last = core.Uri._parseIPv4Address(host, partStart, end);
+        parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
+        parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
+      }
+    }
+    if (wildcardSeen) {
+      if (dart.notNull(parts[dartx.length]) > 7) {
+        error('an address with a wildcard must have less than 7 parts');
+      }
+    } else if (parts[dartx.length] != 8) {
+      error('an address without a wildcard must contain exactly 8 parts');
+    }
+    let bytes = typed_data.Uint8List.new(16);
+    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
+      let value = parts[dartx._get](i);
+      if (value == -1) {
+        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
+        for (let j = 0; j < wildCardLength; j++) {
+          bytes[dartx._set](index, 0);
+          bytes[dartx._set](index + 1, 0);
+          index = index + 2;
+        }
+      } else {
+        bytes[dartx._set](index, value[dartx['>>']](8));
+        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
+        index = index + 2;
+      }
+    }
+    return bytes;
+  }
+};
+dart.setSignature(core.Uri, {
+  getters: () => ({hasScheme: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+    _parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String, core.int, core.int]),
+    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int])
+  }),
+  names: ['parse', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', 'parseIPv4Address', '_parseIPv4Address', 'parseIPv6Address']
+});
 const _userInfo = Symbol('_userInfo');
 const _host = Symbol('_host');
 const _port = Symbol('_port');
-const _path = Symbol('_path');
 const _query = Symbol('_query');
 const _fragment = Symbol('_fragment');
 const _pathSegments = Symbol('_pathSegments');
+const _text = Symbol('_text');
+const _hashCodeCache = Symbol('_hashCodeCache');
 const _queryParameters = Symbol('_queryParameters');
 const _queryParameterLists = Symbol('_queryParameterLists');
 const _writeAuthority = Symbol('_writeAuthority');
 let const$51;
 const _mergePaths = Symbol('_mergePaths');
-const _toWindowsFilePath = Symbol('_toWindowsFilePath');
 const _toFilePath = Symbol('_toFilePath');
 const _isPathAbsolute = Symbol('_isPathAbsolute');
-core.Uri = class Uri extends core.Object {
+const _initializeText = Symbol('_initializeText');
+core._Uri = class _Uri extends core.Object {
   _internal(scheme, userInfo, host, port, path, query, fragment) {
     this.scheme = scheme;
     this[_userInfo] = userInfo;
     this[_host] = host;
     this[_port] = port;
-    this[_path] = path;
+    this.path = path;
     this[_query] = query;
     this[_fragment] = fragment;
     this[_pathSegments] = null;
+    this[_text] = null;
+    this[_hashCodeCache] = null;
     this[_queryParameters] = null;
     this[_queryParameterLists] = null;
   }
+  static notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme) {
+    if (scheme == null) {
+      scheme = "";
+      if (dart.notNull(schemeEnd) > dart.notNull(start)) {
+        scheme = core._Uri._makeScheme(uri, start, schemeEnd);
+      } else if (schemeEnd == start) {
+        core._Uri._fail(uri, start, "Invalid empty scheme");
+      }
+    }
+    let userInfo = "";
+    let host = null;
+    let port = null;
+    if (dart.notNull(hostStart) > dart.notNull(start)) {
+      let userInfoStart = dart.notNull(schemeEnd) + 3;
+      if (userInfoStart < dart.notNull(hostStart)) {
+        userInfo = core._Uri._makeUserInfo(uri, userInfoStart, dart.notNull(hostStart) - 1);
+      }
+      host = core._Uri._makeHost(uri, hostStart, portStart, false);
+      if (dart.notNull(portStart) + 1 < dart.notNull(pathStart)) {
+        port = core.int.parse(uri[dartx.substring](dart.notNull(portStart) + 1, pathStart), {onError: dart.fn(_ => {
+            dart.throw(new core.FormatException("Invalid port", uri, dart.notNull(portStart) + 1));
+          }, StringToNull())});
+        port = core._Uri._makePort(port, scheme);
+      }
+    }
+    let path = core._Uri._makePath(uri, pathStart, queryStart, null, scheme, host != null);
+    let query = null;
+    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
+      query = core._Uri._makeQuery(uri, dart.notNull(queryStart) + 1, fragmentStart, null);
+    }
+    let fragment = null;
+    if (dart.notNull(fragmentStart) < dart.notNull(end)) {
+      fragment = core._Uri._makeFragment(uri, dart.notNull(fragmentStart) + 1, end);
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
   static new(opts) {
-    let scheme = opts && 'scheme' in opts ? opts.scheme : "";
-    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
+    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
     let host = opts && 'host' in opts ? opts.host : null;
     let port = opts && 'port' in opts ? opts.port : null;
     let path = opts && 'path' in opts ? opts.path : null;
@@ -33260,33 +33729,37 @@
     let query = opts && 'query' in opts ? opts.query : null;
     let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
     let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-    scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
-    userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
-    host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
+    scheme = core._Uri._makeScheme(scheme, 0, core._stringOrNullLength(scheme));
+    userInfo = core._Uri._makeUserInfo(userInfo, 0, core._stringOrNullLength(userInfo));
+    host = core._Uri._makeHost(host, 0, core._stringOrNullLength(host), false);
     if (query == "") query = null;
-    query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-    fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
-    port = core.Uri._makePort(port, scheme);
+    query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+    fragment = core._Uri._makeFragment(fragment, 0, core._stringOrNullLength(fragment));
+    port = core._Uri._makePort(port, scheme);
     let isFile = scheme == "file";
     if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
       host = "";
     }
     let hasAuthority = host != null;
-    path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
     if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
-      path = core.Uri._normalizeRelativePath(path);
+      let allowScheme = dart.test(scheme[dartx.isNotEmpty]) || host != null;
+      path = core._Uri._normalizeRelativePath(path, allowScheme);
     } else {
-      path = core.Uri._removeDotSegments(path);
+      path = core._Uri._removeDotSegments(path);
     }
-    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    if (host == null && dart.test(path[dartx.startsWith]("//"))) {
+      host = "";
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
   }
   static http(authority, unencodedPath, queryParameters) {
     if (queryParameters === void 0) queryParameters = null;
-    return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+    return core._Uri._check(core._Uri._makeHttpUri("http", authority, unencodedPath, queryParameters));
   }
   static https(authority, unencodedPath, queryParameters) {
     if (queryParameters === void 0) queryParameters = null;
-    return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+    return core._Uri._check(core._Uri._makeHttpUri("https", authority, unencodedPath, queryParameters));
   }
   get authority() {
     if (!dart.test(this.hasAuthority)) return "";
@@ -33305,7 +33778,7 @@
     return this[_host];
   }
   get port() {
-    if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
+    if (this[_port] == null) return core._Uri._defaultPort(this.scheme);
     return this[_port];
   }
   static _defaultPort(scheme) {
@@ -33313,181 +33786,34 @@
     if (scheme == "https") return 443;
     return 0;
   }
-  get path() {
-    return this[_path];
-  }
   get query() {
-    return this[_query] == null ? "" : this[_query];
+    return this[_query] != null ? this[_query] : "";
   }
   get fragment() {
-    return this[_fragment] == null ? "" : this[_fragment];
+    return this[_fragment] != null ? this[_fragment] : "";
   }
-  static parse(uri, start, end) {
-    if (start === void 0) start = 0;
-    if (end === void 0) end = null;
-    let EOI = -1;
-    let scheme = "";
-    let userinfo = "";
-    let host = null;
-    let port = null;
-    let path = null;
-    let query = null;
-    let fragment = null;
-    if (end == null) end = uri[dartx.length];
-    let index = start;
-    let pathStart = start;
-    let char = EOI;
-    function parseAuth() {
-      if (index == end) {
-        char = EOI;
-        return;
-      }
-      let authStart = index;
-      let lastColon = -1;
-      let lastAt = -1;
-      char = uri[dartx.codeUnitAt](index);
-      while (dart.notNull(index) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          break;
-        }
-        if (char == core.Uri._AT_SIGN) {
-          lastAt = index;
-          lastColon = -1;
-        } else if (char == core.Uri._COLON) {
-          lastColon = index;
-        } else if (char == core.Uri._LEFT_BRACKET) {
-          lastColon = -1;
-          let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
-          if (endBracket == -1) {
-            index = end;
-            char = EOI;
-            break;
-          } else {
-            index = endBracket;
+  isScheme(scheme) {
+    let thisScheme = this.scheme;
+    if (scheme == null) return thisScheme[dartx.isEmpty];
+    if (scheme[dartx.length] != thisScheme[dartx.length]) return false;
+    return core._Uri._compareScheme(scheme, thisScheme);
+  }
+  static _compareScheme(scheme, uri) {
+    for (let i = 0; i < dart.notNull(scheme[dartx.length]); i++) {
+      let schemeChar = scheme[dartx.codeUnitAt](i);
+      let uriChar = uri[dartx.codeUnitAt](i);
+      let delta = (dart.notNull(schemeChar) ^ dart.notNull(uriChar)) >>> 0;
+      if (delta != 0) {
+        if (delta == 32) {
+          let lowerChar = (dart.notNull(uriChar) | delta) >>> 0;
+          if (97 <= lowerChar && lowerChar <= 122) {
+            continue;
           }
         }
-        index = dart.notNull(index) + 1;
-        char = EOI;
-      }
-      let hostStart = authStart;
-      let hostEnd = index;
-      if (dart.notNull(lastAt) >= 0) {
-        userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
-        hostStart = dart.notNull(lastAt) + 1;
-      }
-      if (dart.notNull(lastColon) >= 0) {
-        let portNumber = null;
-        if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
-          portNumber = 0;
-          for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
-            let digit = uri[dartx.codeUnitAt](i);
-            if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
-              core.Uri._fail(uri, i, "Invalid port number");
-            }
-            portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
-          }
-        }
-        port = core.Uri._makePort(portNumber, scheme);
-        hostEnd = lastColon;
-      }
-      host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
-      if (dart.notNull(index) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
+        return false;
       }
     }
-    dart.fn(parseAuth, VoidTovoid$());
-    let NOT_IN_PATH = 0;
-    let IN_PATH = 1;
-    let ALLOW_AUTH = 2;
-    let state = NOT_IN_PATH;
-    let i = index;
-    while (dart.notNull(i) < dart.notNull(end)) {
-      char = uri[dartx.codeUnitAt](i);
-      if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-        state = NOT_IN_PATH;
-        break;
-      }
-      if (char == core.Uri._SLASH) {
-        state = i == start ? ALLOW_AUTH : IN_PATH;
-        break;
-      }
-      if (char == core.Uri._COLON) {
-        if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
-        scheme = core.Uri._makeScheme(uri, start, i);
-        i = dart.notNull(i) + 1;
-        pathStart = i;
-        if (i == end) {
-          char = EOI;
-          state = NOT_IN_PATH;
-        } else {
-          char = uri[dartx.codeUnitAt](i);
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            state = NOT_IN_PATH;
-          } else if (char == core.Uri._SLASH) {
-            state = ALLOW_AUTH;
-          } else {
-            state = IN_PATH;
-          }
-        }
-        break;
-      }
-      i = dart.notNull(i) + 1;
-      char = EOI;
-    }
-    index = i;
-    if (state == ALLOW_AUTH) {
-      dart.assert(char == core.Uri._SLASH);
-      index = dart.notNull(index) + 1;
-      if (index == end) {
-        char = EOI;
-        state = NOT_IN_PATH;
-      } else {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._SLASH) {
-          index = dart.notNull(index) + 1;
-          parseAuth();
-          pathStart = index;
-        }
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
-          state = NOT_IN_PATH;
-        } else {
-          state = IN_PATH;
-        }
-      }
-    }
-    dart.assert(state == IN_PATH || state == NOT_IN_PATH);
-    if (state == IN_PATH) {
-      while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          break;
-        }
-        char = EOI;
-      }
-      state = NOT_IN_PATH;
-    }
-    dart.assert(state == NOT_IN_PATH);
-    let hasAuthority = host != null;
-    path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
-    if (char == core.Uri._QUESTION) {
-      let numberSignIndex = -1;
-      for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
-        if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
-          numberSignIndex = i;
-          break;
-        }
-      }
-      if (numberSignIndex < 0) {
-        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
-      } else {
-        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
-        fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
-      }
-    } else if (char == core.Uri._NUMBER_SIGN) {
-      fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
-    }
-    return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
+    return true;
   }
   static _fail(uri, index, message) {
     dart.throw(new core.FormatException(message, uri, index));
@@ -33500,7 +33826,8 @@
       let hostStart = 0;
       let hasUserInfo = false;
       for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
-        if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
+        let atSign = 64;
+        if (authority[dartx.codeUnitAt](i) == atSign) {
           hasUserInfo = true;
           userInfo = authority[dartx.substring](0, i);
           hostStart = i + 1;
@@ -33508,22 +33835,22 @@
         }
       }
       let hostEnd = hostStart;
-      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
+      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core._LEFT_BRACKET) {
         for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
+          if (authority[dartx.codeUnitAt](hostEnd) == core._RIGHT_BRACKET) break;
         }
         if (hostEnd == authority[dartx.length]) {
           dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
         }
         core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
         hostEnd++;
-        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
+        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core._COLON) {
           dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
         }
       }
       let hasPort = false;
       for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-        if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
+        if (authority[dartx.codeUnitAt](hostEnd) == core._COLON) {
           let portString = authority[dartx.substring](hostEnd + 1);
           if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
           break;
@@ -33535,33 +33862,13 @@
   }
   static file(path, opts) {
     let windows = opts && 'windows' in opts ? opts.windows : null;
-    windows = windows == null ? core.Uri._isWindows : windows;
-    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
+    windows = windows == null ? core._Uri._isWindows : windows;
+    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, false) : core._Uri._makeFileUri(path, false));
   }
   static directory(path, opts) {
     let windows = opts && 'windows' in opts ? opts.windows : null;
-    windows = windows == null ? core.Uri._isWindows : windows;
-    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
-  }
-  static dataFromString(content, opts) {
-    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-    let base64 = opts && 'base64' in opts ? opts.base64 : false;
-    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
-    return data.uri;
-  }
-  static dataFromBytes(bytes, opts) {
-    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
-    return data.uri;
-  }
-  static get base() {
-    let uri = _js_helper.Primitives.currentUri();
-    if (uri != null) return core.Uri.parse(uri);
-    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+    windows = windows == null ? core._Uri._isWindows : windows;
+    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, true) : core._Uri._makeFileUri(path, true));
   }
   static get _isWindows() {
     return false;
@@ -33590,7 +33897,7 @@
     }
   }
   static _checkWindowsDriveLetter(charCode, argumentError) {
-    if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
+    if (core._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._UPPER_CASE_Z || core._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._LOWER_CASE_Z) {
       return;
     }
     if (dart.test(argumentError)) {
@@ -33617,7 +33924,7 @@
         path = path[dartx.replaceRange](0, 7, '\\');
       } else {
         path = path[dartx.substring](4);
-        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core._COLON || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
           dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
         }
       }
@@ -33625,16 +33932,16 @@
       path = path[dartx.replaceAll]("/", '\\');
     }
     let sep = '\\';
-    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
-      core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
-      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core._COLON) {
+      core._Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
+      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
         dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
       }
       let pathSegments = path[dartx.split](sep);
       if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
         pathSegments[dartx.add]("");
       }
-      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
       return core.Uri.new({scheme: "file", pathSegments: pathSegments});
     }
     if (dart.test(path[dartx.startsWith](sep))) {
@@ -33643,7 +33950,7 @@
         let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
         let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
         let pathSegments = pathPart[dartx.split](sep);
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
@@ -33653,12 +33960,12 @@
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         return core.Uri.new({scheme: "file", pathSegments: pathSegments});
       }
     } else {
       let pathSegments = path[dartx.split](sep);
-      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
       if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
         pathSegments[dartx.add]("");
       }
@@ -33677,27 +33984,27 @@
     let fragment = opts && 'fragment' in opts ? opts.fragment : null;
     let schemeChanged = false;
     if (scheme != null) {
-      scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
-      schemeChanged = true;
+      scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+      schemeChanged = scheme != this.scheme;
     } else {
       scheme = this.scheme;
     }
     let isFile = scheme == "file";
     if (userInfo != null) {
-      userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
     } else {
       userInfo = this[_userInfo];
     }
     if (port != null) {
-      port = core.Uri._makePort(port, scheme);
+      port = core._Uri._makePort(port, scheme);
     } else {
       port = this[_port];
       if (schemeChanged) {
-        port = core.Uri._makePort(port, scheme);
+        port = core._Uri._makePort(port, scheme);
       }
     }
     if (host != null) {
-      host = core.Uri._makeHost(host, 0, host[dartx.length], false);
+      host = core._Uri._makeHost(host, 0, host[dartx.length], false);
     } else if (dart.test(this.hasAuthority)) {
       host = this[_host];
     } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
@@ -33705,34 +34012,34 @@
     }
     let hasAuthority = host != null;
     if (path != null || pathSegments != null) {
-      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
     } else {
-      path = this[_path];
+      path = this.path;
       if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
         path = "/" + dart.notNull(path);
       }
     }
     if (query != null || queryParameters != null) {
-      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
     } else {
       query = this[_query];
     }
     if (fragment != null) {
-      fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+      fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
     } else {
       fragment = this[_fragment];
     }
-    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
   }
   removeFragment() {
     if (!dart.test(this.hasFragment)) return this;
-    return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
+    return new core._Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this.path, this[_query], null);
   }
   get pathSegments() {
     let result = this[_pathSegments];
     if (result != null) return result;
     let pathToSplit = this.path;
-    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
+    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core._SLASH) {
       pathToSplit = pathToSplit[dartx.substring](1);
     }
     result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
@@ -33747,7 +34054,7 @@
   }
   get queryParametersAll() {
     if (this[_queryParameterLists] == null) {
-      let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
+      let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
       for (let key of queryParameterLists[dartx.keys]) {
         queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
       }
@@ -33756,36 +34063,36 @@
     return this[_queryParameterLists];
   }
   normalizePath() {
-    let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
-    if (core.identical(path, this[_path])) return this;
+    let path = core._Uri._normalizePath(this.path, this.scheme, this.hasAuthority);
+    if (core.identical(path, this.path)) return this;
     return this.replace({path: path});
   }
   static _makePort(port, scheme) {
-    if (port != null && port == core.Uri._defaultPort(scheme)) return null;
+    if (port != null && port == core._Uri._defaultPort(scheme)) return null;
     return port;
   }
   static _makeHost(host, start, end, strictIPv6) {
     if (host == null) return null;
     if (start == end) return "";
-    if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
-      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
-        core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+    if (host[dartx.codeUnitAt](start) == core._LEFT_BRACKET) {
+      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core._RIGHT_BRACKET) {
+        core._Uri._fail(host, start, 'Missing end `]` to match `[` in host');
       }
       core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
       return host[dartx.substring](start, end)[dartx.toLowerCase]();
     }
     if (!dart.test(strictIPv6)) {
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+        if (host[dartx.codeUnitAt](i) == core._COLON) {
           core.Uri.parseIPv6Address(host, start, end);
           return dart.str`[${host}]`;
         }
       }
     }
-    return core.Uri._normalizeRegName(host, start, end);
+    return core._Uri._normalizeRegName(host, start, end);
   }
   static _isRegNameChar(char) {
-    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
   }
   static _normalizeRegName(host, start, end) {
     let buffer = null;
@@ -33794,8 +34101,8 @@
     let isNormalized = true;
     while (dart.notNull(index) < dart.notNull(end)) {
       let char = host[dartx.codeUnitAt](index);
-      if (char == core.Uri._PERCENT) {
-        let replacement = core.Uri._normalizeEscape(host, index, true);
+      if (char == core._PERCENT) {
+        let replacement = core._Uri._normalizeEscape(host, index, true);
         if (replacement == null && isNormalized) {
           index = dart.notNull(index) + 3;
           continue;
@@ -33815,8 +34122,8 @@
         index = dart.notNull(index) + sourceLength;
         sectionStart = index;
         isNormalized = true;
-      } else if (dart.test(core.Uri._isRegNameChar(char))) {
-        if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
+      } else if (dart.test(core._Uri._isRegNameChar(char))) {
+        if (isNormalized && core._UPPER_CASE_A <= dart.notNull(char) && core._UPPER_CASE_Z >= dart.notNull(char)) {
           if (buffer == null) buffer = new core.StringBuffer();
           if (dart.notNull(sectionStart) < dart.notNull(index)) {
             buffer.write(host[dartx.substring](sectionStart, index));
@@ -33825,8 +34132,8 @@
           isNormalized = false;
         }
         index = dart.notNull(index) + 1;
-      } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-        core.Uri._fail(host, index, "Invalid character");
+      } else if (dart.test(core._Uri._isGeneralDelimiter(char))) {
+        core._Uri._fail(host, index, "Invalid character");
       } else {
         let sourceLength = 1;
         if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
@@ -33840,7 +34147,7 @@
         let slice = host[dartx.substring](sectionStart, index);
         if (!isNormalized) slice = slice[dartx.toLowerCase]();
         buffer.write(slice);
-        buffer.write(core.Uri._escapeChar(char));
+        buffer.write(core._Uri._escapeChar(char));
         index = dart.notNull(index) + sourceLength;
         sectionStart = index;
       }
@@ -33856,26 +34163,33 @@
   static _makeScheme(scheme, start, end) {
     if (start == end) return "";
     let firstCodeUnit = scheme[dartx.codeUnitAt](start);
-    if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
-      core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
+    if (!dart.test(core._Uri._isAlphabeticCharacter(firstCodeUnit))) {
+      core._Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
     }
     let containsUpperCase = false;
     for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
       let codeUnit = scheme[dartx.codeUnitAt](i);
-      if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
-        core.Uri._fail(scheme, i, "Illegal scheme character");
+      if (!dart.test(core._Uri._isSchemeCharacter(codeUnit))) {
+        core._Uri._fail(scheme, i, "Illegal scheme character");
       }
-      if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
+      if (core._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core._UPPER_CASE_Z) {
         containsUpperCase = true;
       }
     }
     scheme = scheme[dartx.substring](start, end);
     if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
+    return core._Uri._canonicalizeScheme(scheme);
+  }
+  static _canonicalizeScheme(scheme) {
+    if (scheme == "http") return "http";
+    if (scheme == "file") return "file";
+    if (scheme == "https") return "https";
+    if (scheme == "package") return "package";
     return scheme;
   }
   static _makeUserInfo(userInfo, start, end) {
     if (userInfo == null) return "";
-    return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+    return core._Uri._normalizeOrSubstring(userInfo, start, end, core._Uri._userinfoTable);
   }
   static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
     let isFile = scheme == "file";
@@ -33886,30 +34200,32 @@
     }
     let result = null;
     if (path != null) {
-      result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
+      result = core._Uri._normalizeOrSubstring(path, start, end, core._Uri._pathCharOrSlashTable);
     } else {
-      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
+      result = pathSegments[dartx.map](core.String)(dart.fn(s => core._Uri._uriEncode(core._Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
     }
     if (dart.test(dart.dload(result, 'isEmpty'))) {
       if (isFile) return "/";
     } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
       result = "/" + dart.notNull(core.String._check(result));
     }
-    result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
+    result = core._Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
     return core.String._check(result);
   }
   static _normalizePath(path, scheme, hasAuthority) {
     if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
-      return core.Uri._normalizeRelativePath(path);
+      return core._Uri._normalizeRelativePath(path, dart.test(scheme[dartx.isNotEmpty]) || dart.test(hasAuthority));
     }
-    return core.Uri._removeDotSegments(path);
+    return core._Uri._removeDotSegments(path);
   }
   static _makeQuery(query, start, end, queryParameters) {
-    if (query == null && queryParameters == null) return null;
-    if (query != null && queryParameters != null) {
-      dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+    if (query != null) {
+      if (queryParameters != null) {
+        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+      }
+      return core._Uri._normalizeOrSubstring(query, start, end, core._Uri._queryCharTable);
     }
-    if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
+    if (queryParameters == null) return null;
     let result = new core.StringBuffer();
     let separator = "";
     function writeParameter(key, value) {
@@ -33937,52 +34253,40 @@
   }
   static _makeFragment(fragment, start, end) {
     if (fragment == null) return null;
-    return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
-  }
-  static _stringOrNullLength(s) {
-    return s == null ? 0 : s[dartx.length];
+    return core._Uri._normalizeOrSubstring(fragment, start, end, core._Uri._queryCharTable);
   }
   static _normalizeEscape(source, index, lowerCase) {
-    dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
+    dart.assert(source[dartx.codeUnitAt](index) == core._PERCENT);
     if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
       return "%";
     }
     let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
     let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
-    let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
-    let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
+    let firstDigitValue = _internal.hexDigitValue(firstDigit);
+    let secondDigitValue = _internal.hexDigitValue(secondDigit);
     if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
       return "%";
     }
     let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
-    if (dart.test(core.Uri._isUnreservedChar(value))) {
-      if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
+    if (dart.test(core._Uri._isUnreservedChar(value))) {
+      if (dart.test(lowerCase) && core._UPPER_CASE_A <= value && core._UPPER_CASE_Z >= value) {
         value = (value | 32) >>> 0;
       }
       return core.String.fromCharCode(value);
     }
-    if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
+    if (dart.notNull(firstDigit) >= core._LOWER_CASE_A || dart.notNull(secondDigit) >= core._LOWER_CASE_A) {
       return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
     }
     return null;
   }
-  static _parseHexDigit(char) {
-    let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
-    if (digit <= 9) return digit;
-    let lowerCase = (dart.notNull(char) | 32) >>> 0;
-    if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
-      return lowerCase - (core.Uri._LOWER_CASE_A - 10);
-    }
-    return -1;
-  }
   static _escapeChar(char) {
     dart.assert(dart.notNull(char) <= 1114111);
     let codeUnits = null;
     if (dart.notNull(char) < 128) {
       codeUnits = ListOfint().new(3);
-      codeUnits[dartx._set](0, core.Uri._PERCENT);
-      codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
-      codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
+      codeUnits[dartx._set](0, core._PERCENT);
+      codeUnits[dartx._set](1, core._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
+      codeUnits[dartx._set](2, core._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
     } else {
       let flag = 192;
       let encodedBytes = 2;
@@ -33998,16 +34302,21 @@
       let index = 0;
       while (--encodedBytes >= 0) {
         let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
-        codeUnits[dartx._set](index, core.Uri._PERCENT);
-        codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-        codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
+        codeUnits[dartx._set](index, core._PERCENT);
+        codeUnits[dartx._set](index + 1, core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        codeUnits[dartx._set](index + 2, core._hexDigits[dartx.codeUnitAt](byte & 15));
         index = index + 3;
         flag = 128;
       }
     }
     return core.String.fromCharCodes(codeUnits);
   }
-  static _normalize(component, start, end, charTable) {
+  static _normalizeOrSubstring(component, start, end, charTable) {
+    let l = core._Uri._normalize(component, start, end, charTable);
+    return l != null ? l : component[dartx.substring](start, end);
+  }
+  static _normalize(component, start, end, charTable, opts) {
+    let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
     let buffer = null;
     let sectionStart = start;
     let index = start;
@@ -34018,8 +34327,8 @@
       } else {
         let replacement = null;
         let sourceLength = null;
-        if (char == core.Uri._PERCENT) {
-          replacement = core.Uri._normalizeEscape(component, index, false);
+        if (char == core._PERCENT) {
+          replacement = core._Uri._normalizeEscape(component, index, false);
           if (replacement == null) {
             index = dart.notNull(index) + 3;
             continue;
@@ -34030,8 +34339,8 @@
           } else {
             sourceLength = 3;
           }
-        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-          core.Uri._fail(component, index, "Invalid character");
+        } else if (!dart.test(escapeDelimiters) && dart.test(core._Uri._isGeneralDelimiter(char))) {
+          core._Uri._fail(component, index, "Invalid character");
         } else {
           sourceLength = 1;
           if ((dart.notNull(char) & 64512) == 55296) {
@@ -34043,7 +34352,7 @@
               }
             }
           }
-          replacement = core.Uri._escapeChar(char);
+          replacement = core._Uri._escapeChar(char);
         }
         if (buffer == null) buffer = new core.StringBuffer();
         buffer.write(component[dartx.substring](sectionStart, index));
@@ -34053,7 +34362,7 @@
       }
     }
     if (buffer == null) {
-      return component[dartx.substring](start, end);
+      return null;
     }
     if (dart.notNull(sectionStart) < dart.notNull(end)) {
       buffer.write(component[dartx.substring](sectionStart, end));
@@ -34061,10 +34370,10 @@
     return dart.toString(buffer);
   }
   static _isSchemeCharacter(ch) {
-    return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+    return dart.notNull(ch) < 128 && (dart.notNull(core._Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
   }
   static _isGeneralDelimiter(ch) {
-    return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+    return dart.notNull(ch) <= core._RIGHT_BRACKET && (dart.notNull(core._Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
   }
   get isAbsolute() {
     return this.scheme != "" && this.fragment == "";
@@ -34083,7 +34392,7 @@
         break;
       }
       let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
-      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
+      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core._DOT)) {
         break;
       }
       baseEnd = newEnd;
@@ -34097,7 +34406,7 @@
     return index != -1;
   }
   static _removeDotSegments(path) {
-    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    if (!dart.test(core._Uri._mayContainDotSegments(path))) return path;
     dart.assert(path[dartx.isNotEmpty]);
     let output = JSArrayOfString().of([]);
     let appendSlash = false;
@@ -34120,9 +34429,12 @@
     if (appendSlash) output[dartx.add]("");
     return output[dartx.join]("/");
   }
-  static _normalizeRelativePath(path) {
+  static _normalizeRelativePath(path, allowScheme) {
     dart.assert(!dart.test(path[dartx.startsWith]('/')));
-    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    if (!dart.test(core._Uri._mayContainDotSegments(path))) {
+      if (!dart.test(allowScheme)) path = core._Uri._escapeScheme(path);
+      return path;
+    }
     dart.assert(path[dartx.isNotEmpty]);
     let output = JSArrayOfString().of([]);
     let appendSlash = false;
@@ -34145,8 +34457,23 @@
       return "./";
     }
     if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
+    if (!dart.test(allowScheme)) output[dartx._set](0, core._Uri._escapeScheme(output[dartx._get](0)));
     return output[dartx.join]("/");
   }
+  static _escapeScheme(path) {
+    if (dart.notNull(path[dartx.length]) >= 2 && dart.test(core._Uri._isAlphabeticCharacter(path[dartx.codeUnitAt](0)))) {
+      for (let i = 1; i < dart.notNull(path[dartx.length]); i++) {
+        let char = path[dartx.codeUnitAt](i);
+        if (char == core._COLON) {
+          return dart.str`${path[dartx.substring](0, i)}%3A${path[dartx.substring](i + 1)}`;
+        }
+        if (dart.notNull(char) > 127 || (dart.notNull(core._Uri._schemeTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) == 0) {
+          break;
+        }
+      }
+    }
+    return path;
+  }
   resolve(reference) {
     return this.resolveUri(core.Uri.parse(reference));
   }
@@ -34164,7 +34491,7 @@
         targetHost = reference.host;
         targetPort = dart.test(reference.hasPort) ? reference.port : null;
       }
-      targetPath = core.Uri._removeDotSegments(reference.path);
+      targetPath = core._Uri._removeDotSegments(reference.path);
       if (dart.test(reference.hasQuery)) {
         targetQuery = reference.query;
       }
@@ -34173,15 +34500,15 @@
       if (dart.test(reference.hasAuthority)) {
         targetUserInfo = reference.userInfo;
         targetHost = reference.host;
-        targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
-        targetPath = core.Uri._removeDotSegments(reference.path);
+        targetPort = core._Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
+        targetPath = core._Uri._removeDotSegments(reference.path);
         if (dart.test(reference.hasQuery)) targetQuery = reference.query;
       } else {
         targetUserInfo = this[_userInfo];
         targetHost = this[_host];
         targetPort = this[_port];
         if (reference.path == "") {
-          targetPath = this[_path];
+          targetPath = this.path;
           if (dart.test(reference.hasQuery)) {
             targetQuery = reference.query;
           } else {
@@ -34189,20 +34516,24 @@
           }
         } else {
           if (dart.test(reference.hasAbsolutePath)) {
-            targetPath = core.Uri._removeDotSegments(reference.path);
+            targetPath = core._Uri._removeDotSegments(reference.path);
           } else {
             if (dart.test(this.hasEmptyPath)) {
-              if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
-                targetPath = reference.path;
+              if (!dart.test(this.hasAuthority)) {
+                if (!dart.test(this.hasScheme)) {
+                  targetPath = reference.path;
+                } else {
+                  targetPath = core._Uri._removeDotSegments(reference.path);
+                }
               } else {
-                targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
+                targetPath = core._Uri._removeDotSegments("/" + dart.notNull(reference.path));
               }
             } else {
-              let mergedPath = this[_mergePaths](this[_path], reference.path);
+              let mergedPath = this[_mergePaths](this.path, reference.path);
               if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
-                targetPath = core.Uri._removeDotSegments(mergedPath);
+                targetPath = core._Uri._removeDotSegments(mergedPath);
               } else {
-                targetPath = core.Uri._normalizeRelativePath(mergedPath);
+                targetPath = core._Uri._normalizeRelativePath(mergedPath, dart.test(this.hasScheme) || dart.test(this.hasAuthority));
               }
             }
           }
@@ -34211,7 +34542,7 @@
       }
     }
     let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
-    return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
+    return new core._Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
   }
   get hasScheme() {
     return this.scheme[dartx.isNotEmpty];
@@ -34229,18 +34560,21 @@
     return this[_fragment] != null;
   }
   get hasEmptyPath() {
-    return this[_path][dartx.isEmpty];
+    return this.path[dartx.isEmpty];
   }
   get hasAbsolutePath() {
-    return this[_path][dartx.startsWith]('/');
+    return this.path[dartx.startsWith]('/');
   }
   get origin() {
-    if (this.scheme == "" || this[_host] == null || this[_host] == "") {
+    if (this.scheme == "") {
       dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
     }
     if (this.scheme != "http" && this.scheme != "https") {
       dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
     }
+    if (this[_host] == null || this[_host] == "") {
+      dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+    }
     if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
     return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
   }
@@ -34255,43 +34589,46 @@
     if (this.fragment != "") {
       dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
     }
-    if (windows == null) windows = core.Uri._isWindows;
-    return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
+    if (windows == null) windows = core._Uri._isWindows;
+    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
   }
   [_toFilePath]() {
-    if (this.host != "") {
+    if (dart.test(this.hasAuthority) && this.host != "") {
       dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
     }
-    core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
+    let pathSegments = this.pathSegments;
+    core._Uri._checkNonWindowsPathReservedCharacters(pathSegments, false);
     let result = new core.StringBuffer();
-    if (dart.test(this[_isPathAbsolute])) result.write("/");
-    result.writeAll(this.pathSegments, "/");
+    if (dart.test(this.hasAbsolutePath)) result.write("/");
+    result.writeAll(pathSegments, "/");
     return result.toString();
   }
-  [_toWindowsFilePath]() {
+  static _toWindowsFilePath(uri) {
     let hasDriveLetter = false;
-    let segments = this.pathSegments;
-    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
-      core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
-      core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
+    let segments = uri.pathSegments;
+    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core._COLON) {
+      core._Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
+      core._Uri._checkWindowsPathReservedCharacters(segments, false, 1);
       hasDriveLetter = true;
     } else {
-      core.Uri._checkWindowsPathReservedCharacters(segments, false);
+      core._Uri._checkWindowsPathReservedCharacters(segments, false, 0);
     }
     let result = new core.StringBuffer();
-    if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
-    if (this.host != "") {
-      result.write("\\");
-      result.write(this.host);
-      result.write("\\");
+    if (dart.test(uri.hasAbsolutePath) && !hasDriveLetter) result.write("\\");
+    if (dart.test(uri.hasAuthority)) {
+      let host = uri.host;
+      if (dart.test(host[dartx.isNotEmpty])) {
+        result.write("\\");
+        result.write(host);
+        result.write("\\");
+      }
     }
     result.writeAll(segments, "\\");
     if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
     return result.toString();
   }
   get [_isPathAbsolute]() {
-    if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
-    return this.path[dartx.startsWith]('/');
+    return this.path != null && dart.test(this.path[dartx.startsWith]('/'));
   }
   [_writeAuthority](ss) {
     if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
@@ -34308,9 +34645,17 @@
     return this.scheme == "data" ? core.UriData.fromUri(this) : null;
   }
   toString() {
+    let t = this[_text];
+    return t == null ? this[_text] = this[_initializeText]() : t;
+  }
+  [_initializeText]() {
+    dart.assert(this[_text] == null);
     let sb = new core.StringBuffer();
-    core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
-    if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
+    if (dart.test(this.scheme[dartx.isNotEmpty])) {
+      sb.write(this.scheme);
+      sb.write(":");
+    }
+    if (dart.test(this.hasAuthority) || this.scheme == "file") {
       sb.write("//");
       this[_writeAuthority](sb);
     }
@@ -34326,58 +34671,16 @@
     return sb.toString();
   }
   ['=='](other) {
-    if (!core.Uri.is(other)) return false;
-    let uri = core.Uri._check(other);
-    return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+    if (core.identical(this, other)) return true;
+    if (core.Uri.is(other)) {
+      let uri = other;
+      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+    }
+    return false;
   }
   get hashCode() {
-    function combine(part, current) {
-      return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
-    }
-    dart.fn(combine, dynamicAnddynamicToint());
-    return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
-  }
-  static _addIfNonEmpty(sb, test, first, second) {
-    if ("" != test) {
-      sb.write(first);
-      sb.write(second);
-    }
-  }
-  static encodeComponent(component) {
-    return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
-  }
-  static encodeQueryComponent(component, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
-  }
-  static decodeComponent(encodedComponent) {
-    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
-  }
-  static decodeQueryComponent(encodedComponent, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
-  }
-  static encodeFull(uri) {
-    return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
-  }
-  static decodeFull(uri) {
-    return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
-  }
-  static splitQueryString(query, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
-      let index = element[dartx.indexOf]("=");
-      if (index == -1) {
-        if (element != "") {
-          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
-        }
-      } else if (index != 0) {
-        let key = element[dartx.substring](0, index);
-        let value = element[dartx.substring](dart.notNull(index) + 1);
-        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
-      }
-      return map;
-    }, MapOfString$StringAndStringToMapOfString$String()));
+    let t = this[_hashCodeCache];
+    return t == null ? this[_hashCodeCache] = dart.hashCode(this.toString()) : t;
   }
   static _createList() {
     return [];
@@ -34393,22 +34696,20 @@
       let value = null;
       if (start == end) return;
       if (dart.notNull(equalsIndex) < 0) {
-        key = core.Uri._uriDecode(query, start, end, encoding, true);
+        key = core._Uri._uriDecode(query, start, end, encoding, true);
         value = "";
       } else {
-        key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
-        value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
+        key = core._Uri._uriDecode(query, start, equalsIndex, encoding, true);
+        value = core._Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
       }
-      dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
+      dart.dsend(result[dartx.putIfAbsent](key, core._Uri._createList), 'add', value);
     }
     dart.fn(parsePair, intAndintAndintTovoid());
-    let _equals = 61;
-    let _ampersand = 38;
     while (i < dart.notNull(query[dartx.length])) {
       let char = query[dartx.codeUnitAt](i);
-      if (char == _equals) {
+      if (char == core._EQUALS) {
         if (equalsIndex < 0) equalsIndex = i;
-      } else if (char == _ampersand) {
+      } else if (char == core._AMPERSAND) {
         parsePair(start, equalsIndex, i);
         start = i + 1;
         equalsIndex = -1;
@@ -34418,125 +34719,17 @@
     parsePair(start, equalsIndex, i);
     return result;
   }
-  static parseIPv4Address(host) {
-    function error(msg) {
-      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
-    }
-    dart.fn(error, StringTovoid$());
-    let bytes = host[dartx.split]('.');
-    if (bytes[dartx.length] != 4) {
-      error('IPv4 address should contain exactly 4 parts');
-    }
-    return bytes[dartx.map](core.int)(dart.fn(byteString => {
-      let byte = core.int.parse(byteString);
-      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-        error('each part must be in the range of `0..255`');
-      }
-      return byte;
-    }, StringToint$()))[dartx.toList]();
-  }
-  static parseIPv6Address(host, start, end) {
-    if (start === void 0) start = 0;
-    if (end === void 0) end = null;
-    if (end == null) end = host[dartx.length];
-    function error(msg, position) {
-      if (position === void 0) position = null;
-      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
-    }
-    dart.fn(error, String__Tovoid());
-    function parseHex(start, end) {
-      if (dart.notNull(end) - dart.notNull(start) > 4) {
-        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-      }
-      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
-      if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
-        error('each part must be in the range of `0x0..0xFFFF`', start);
-      }
-      return value;
-    }
-    dart.fn(parseHex, intAndintToint());
-    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
-    let parts = JSArrayOfint().of([]);
-    let wildcardSeen = false;
-    let partStart = start;
-    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-      if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-        if (i == start) {
-          i = dart.notNull(i) + 1;
-          if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
-            error('invalid start colon.', i);
-          }
-          partStart = i;
-        }
-        if (i == partStart) {
-          if (wildcardSeen) {
-            error('only one wildcard `::` is allowed', i);
-          }
-          wildcardSeen = true;
-          parts[dartx.add](-1);
-        } else {
-          parts[dartx.add](parseHex(partStart, i));
-        }
-        partStart = dart.notNull(i) + 1;
-      }
-    }
-    if (parts[dartx.length] == 0) error('too few parts');
-    let atEnd = partStart == end;
-    let isLastWildcard = parts[dartx.last] == -1;
-    if (atEnd && !isLastWildcard) {
-      error('expected a part after last `:`', end);
-    }
-    if (!atEnd) {
-      try {
-        parts[dartx.add](parseHex(partStart, end));
-      } catch (e) {
-        try {
-          let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
-          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
-          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
-        } catch (e) {
-          error('invalid end of IPv6 address.', partStart);
-        }
-
-      }
-
-    }
-    if (wildcardSeen) {
-      if (dart.notNull(parts[dartx.length]) > 7) {
-        error('an address with a wildcard must have less than 7 parts');
-      }
-    } else if (parts[dartx.length] != 8) {
-      error('an address without a wildcard must contain exactly 8 parts');
-    }
-    let bytes = typed_data.Uint8List.new(16);
-    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
-      let value = parts[dartx._get](i);
-      if (value == -1) {
-        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
-        for (let j = 0; j < wildCardLength; j++) {
-          bytes[dartx._set](index, 0);
-          bytes[dartx._set](index + 1, 0);
-          index = index + 2;
-        }
-      } else {
-        bytes[dartx._set](index, value[dartx['>>']](8));
-        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
-        index = index + 2;
-      }
-    }
-    return bytes;
-  }
   static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
-    if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
+    if (core.identical(encoding, convert.UTF8) && dart.test(core._Uri._needsNoEncoding.hasMatch(text))) {
       return text;
     }
-    let result = new core.StringBuffer();
+    let result = new core.StringBuffer('');
     let bytes = encoding.encode(text);
     for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
       let byte = bytes[dartx._get](i);
       if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
         result.writeCharCode(byte);
-      } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
+      } else if (dart.test(spaceToPlus) && byte == core._SPACE) {
         result.write('+');
       } else {
         let hexDigits = '0123456789ABCDEF';
@@ -34572,7 +34765,7 @@
     let simple = true;
     for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
       let codeUnit = text[dartx.codeUnitAt](i);
-      if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+      if (dart.notNull(codeUnit) > 127 || codeUnit == core._PERCENT || dart.test(plusToSpace) && codeUnit == core._PLUS) {
         simple = false;
         break;
       }
@@ -34591,14 +34784,14 @@
         if (dart.notNull(codeUnit) > 127) {
           dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
         }
-        if (codeUnit == core.Uri._PERCENT) {
+        if (codeUnit == core._PERCENT) {
           if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
             dart.throw(new core.ArgumentError('Truncated URI'));
           }
-          bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
+          bytes[dartx.add](core._Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
           i = dart.notNull(i) + 2;
-        } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-          bytes[dartx.add](core.Uri._SPACE);
+        } else if (dart.test(plusToSpace) && codeUnit == core._PLUS) {
+          bytes[dartx.add](core._SPACE);
         } else {
           bytes[dartx.add](codeUnit);
         }
@@ -34608,23 +34801,26 @@
   }
   static _isAlphabeticCharacter(codeUnit) {
     let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
-    return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
+    return core._LOWER_CASE_A <= lowerCase && lowerCase <= core._LOWER_CASE_Z;
   }
   static _isUnreservedChar(char) {
-    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
   }
 };
-dart.defineNamedConstructor(core.Uri, '_internal');
-dart.setSignature(core.Uri, {
+dart.defineNamedConstructor(core._Uri, '_internal');
+core._Uri[dart.implements] = () => [core.Uri];
+dart.setSignature(core._Uri, {
   fields: () => ({
     scheme: core.String,
     [_userInfo]: core.String,
     [_host]: core.String,
     [_port]: core.int,
-    [_path]: core.String,
+    path: core.String,
     [_query]: core.String,
     [_fragment]: core.String,
     [_pathSegments]: ListOfString(),
+    [_text]: core.String,
+    [_hashCodeCache]: core.int,
     [_queryParameters]: MapOfString$String(),
     [_queryParameterLists]: MapOfString$ListOfString()
   }),
@@ -34633,7 +34829,6 @@
     userInfo: dart.definiteFunctionType(core.String, []),
     host: dart.definiteFunctionType(core.String, []),
     port: dart.definiteFunctionType(core.int, []),
-    path: dart.definiteFunctionType(core.String, []),
     query: dart.definiteFunctionType(core.String, []),
     fragment: dart.definiteFunctionType(core.String, []),
     pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
@@ -34652,6 +34847,7 @@
     data: dart.definiteFunctionType(core.UriData, [])
   }),
   methods: () => ({
+    isScheme: dart.definiteFunctionType(core.bool, [core.String]),
     replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
     removeFragment: dart.definiteFunctionType(core.Uri, []),
     normalizePath: dart.definiteFunctionType(core.Uri, []),
@@ -34660,12 +34856,12 @@
     resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
     toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
     [_toFilePath]: dart.definiteFunctionType(core.String, []),
-    [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
-    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
+    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink]),
+    [_initializeText]: dart.definiteFunctionType(core.String, [])
   }),
   statics: () => ({
     _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
-    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+    _compareScheme: dart.definiteFunctionType(core.bool, [core.String, core.String]),
     _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
     _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
     _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
@@ -34678,85 +34874,50 @@
     _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
     _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
     _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _canonicalizeScheme: dart.definiteFunctionType(core.String, [core.String]),
     _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
     _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
     _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
     _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
     _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-    _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
     _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
-    _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
     _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
-    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+    _normalizeOrSubstring: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()], {escapeDelimiters: core.bool}),
     _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
     _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
     _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
     _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
-    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
-    _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
-    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
-    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
-    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String, core.bool]),
+    _escapeScheme: dart.definiteFunctionType(core.String, [core.String]),
+    _toWindowsFilePath: dart.definiteFunctionType(core.String, [core.Uri]),
     _createList: dart.definiteFunctionType(core.List, []),
     _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
-    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
     _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
     _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
     _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
     _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
     _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
   }),
-  names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
+  names: ['_defaultPort', '_compareScheme', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_canonicalizeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_normalizeEscape', '_escapeChar', '_normalizeOrSubstring', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_escapeScheme', '_toWindowsFilePath', '_createList', '_splitQueryStringAll', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
 });
-core.Uri._SPACE = 32;
-core.Uri._DOUBLE_QUOTE = 34;
-core.Uri._NUMBER_SIGN = 35;
-core.Uri._PERCENT = 37;
-core.Uri._ASTERISK = 42;
-core.Uri._PLUS = 43;
-core.Uri._DOT = 46;
-core.Uri._SLASH = 47;
-core.Uri._ZERO = 48;
-core.Uri._NINE = 57;
-core.Uri._COLON = 58;
-core.Uri._LESS = 60;
-core.Uri._GREATER = 62;
-core.Uri._QUESTION = 63;
-core.Uri._AT_SIGN = 64;
-core.Uri._UPPER_CASE_A = 65;
-core.Uri._UPPER_CASE_F = 70;
-core.Uri._UPPER_CASE_Z = 90;
-core.Uri._LEFT_BRACKET = 91;
-core.Uri._BACKSLASH = 92;
-core.Uri._RIGHT_BRACKET = 93;
-core.Uri._LOWER_CASE_A = 97;
-core.Uri._LOWER_CASE_F = 102;
-core.Uri._LOWER_CASE_Z = 122;
-core.Uri._BAR = 124;
-core.Uri._hexDigits = "0123456789ABCDEF";
-core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
-core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
-core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
-core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
-core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
-core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
-core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
-core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
-core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
-core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
-core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
-core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
-dart.defineLazy(core.Uri, {
+core._Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
+core._Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
+core._Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
+core._Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
+core._Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
+core._Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
+core._Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
+core._Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
+core._Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
+core._Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
+core._Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
+core._Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
+dart.defineLazy(core._Uri, {
   get _needsNoEncoding() {
     return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
   }
 });
-const _text = Symbol('_text');
 const _separatorIndices = Symbol('_separatorIndices');
 const _uriCache = Symbol('_uriCache');
 core.UriData = class UriData extends core.Object {
@@ -34840,9 +35001,9 @@
       if (dart.notNull(slashIndex) < 0) {
         dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
       }
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
       buffer.write("/");
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
     }
     if (charsetName != null) {
       if (indices != null) {
@@ -34850,7 +35011,7 @@
         indices[dartx.add](dart.notNull(buffer.length) + 8);
       }
       buffer.write(";charset=");
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
     }
     dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
       if (dart.test(key[dartx.isEmpty])) {
@@ -34861,17 +35022,17 @@
       }
       if (indices != null) indices[dartx.add](buffer.length);
       buffer.write(';');
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
       if (indices != null) indices[dartx.add](buffer.length);
       buffer.write('=');
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
     }, StringAndStringToNull())));
   }
   static _validateMimeType(mimeType) {
     let slashIndex = -1;
     for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
       let char = mimeType[dartx.codeUnitAt](i);
-      if (char != core.Uri._SLASH) continue;
+      if (char != core._SLASH) continue;
       if (slashIndex < 0) {
         slashIndex = i;
         continue;
@@ -34881,10 +35042,16 @@
     return slashIndex;
   }
   static parse(uri) {
-    if (!dart.test(uri[dartx.startsWith]("data:"))) {
-      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
+    if (dart.notNull(uri[dartx.length]) >= 5) {
+      let dataDelta = core._startsWithData(uri, 0);
+      if (dataDelta == 0) {
+        return core.UriData._parse(uri, 5, null);
+      }
+      if (dataDelta == 32) {
+        return core.UriData._parse(uri[dartx.substring](5), 0, null);
+      }
     }
-    return core.UriData._parse(uri, 5, null);
+    dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
   }
   get uri() {
     if (this[_uriCache] != null) return this[_uriCache];
@@ -34892,20 +35059,20 @@
     let query = null;
     let colonIndex = this[_separatorIndices][dartx._get](0);
     let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
-    let end = null;
+    let end = this[_text][dartx.length];
     if (dart.notNull(queryIndex) >= 0) {
-      query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
+      query = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(queryIndex) + 1, end, core._Uri._queryCharTable);
       end = queryIndex;
     }
-    path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
-    this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
+    path = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(colonIndex) + 1, end, core._Uri._pathCharOrSlashTable);
+    this[_uriCache] = new core._DataUri(this, path, query);
     return this[_uriCache];
   }
   get mimeType() {
     let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
     let end = this[_separatorIndices][dartx._get](1);
     if (start == end) return "text/plain";
-    return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
+    return core._Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
   }
   get charset() {
     let parameterStart = 1;
@@ -34917,7 +35084,7 @@
       let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
       let keyEnd = this[_separatorIndices][dartx._get](i + 1);
       if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
-        return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
+        return core._Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
       }
     }
     return "US-ASCII";
@@ -34955,10 +35122,8 @@
         result[dartx._set](index++, codeUnit);
       } else {
         if (i + 2 < dart.notNull(text[dartx.length])) {
-          let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
-          let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
-          if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
-            let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
+          let byte = _internal.parseHexByte(text, i + 1);
+          if (dart.notNull(byte) >= 0) {
             result[dartx._set](index++, byte);
             i = i + 2;
             continue;
@@ -34985,7 +35150,7 @@
       let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
       return converter.convert(text[dartx.substring](start));
     }
-    return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
+    return core._Uri._uriDecode(text, start, text[dartx.length], encoding, false);
   }
   get parameters() {
     let result = dart.map({}, core.String, core.String);
@@ -34993,8 +35158,8 @@
       let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
       let equals = this[_separatorIndices][dartx._get](i - 1);
       let end = this[_separatorIndices][dartx._get](i);
-      let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
-      let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
+      let key = core._Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
+      let value = core._Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
       result[dartx._set](key, value);
     }
     return result;
@@ -35047,6 +35212,15 @@
       }
     }
     indices[dartx.add](i);
+    let isBase64 = indices[dartx.length][dartx.isOdd];
+    if (dart.test(isBase64)) {
+      text = convert.BASE64.normalize(text, dart.notNull(i) + 1, text[dartx.length]);
+    } else {
+      let data = core._Uri._normalize(text, dart.notNull(i) + 1, text[dartx.length], core.UriData._uricTable, {escapeDelimiters: true});
+      if (data != null) {
+        text = text[dartx.replaceRange](dart.notNull(i) + 1, text[dartx.length], data);
+      }
+    }
     return new core.UriData._(text, indices, sourceUri);
   }
   static _uriEncodeBytes(canonicalTable, bytes, buffer) {
@@ -35057,9 +35231,9 @@
       if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
         buffer.writeCharCode(byte);
       } else {
-        buffer.writeCharCode(core.Uri._PERCENT);
-        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+        buffer.writeCharCode(core._PERCENT);
+        buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
       }
     }
     if ((dart.notNull(byteOr) & ~255) != 0) {
@@ -35105,7 +35279,667 @@
 });
 core.UriData._noScheme = -1;
 core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
-core.UriData._uricTable = core.Uri._queryCharTable;
+core.UriData._uricTable = core._Uri._queryCharTable;
+core.UriData._base64Table = dart.constList([0, 0, 34816, 1023, 65534, 2047, 65534, 2047], core.int);
+core._schemeEndIndex = 1;
+core._hostStartIndex = 2;
+core._portStartIndex = 3;
+core._pathStartIndex = 4;
+core._queryStartIndex = 5;
+core._fragmentStartIndex = 6;
+core._notSimpleIndex = 7;
+core._uriStart = 0;
+core._nonSimpleEndStates = 14;
+core._schemeStart = 20;
+dart.defineLazy(core, {
+  get _scannerTables() {
+    return core._createTables();
+  }
+});
+core._createTables = function() {
+  let stateCount = 22;
+  let schemeOrPath = 1;
+  let authOrPath = 2;
+  let authOrPathSlash = 3;
+  let uinfoOrHost0 = 4;
+  let uinfoOrHost = 5;
+  let uinfoOrPort0 = 6;
+  let uinfoOrPort = 7;
+  let ipv6Host = 8;
+  let relPathSeg = 9;
+  let pathSeg = 10;
+  let path = 11;
+  let query = 12;
+  let fragment = 13;
+  let schemeOrPathDot = 14;
+  let schemeOrPathDot2 = 15;
+  let relPathSegDot = 16;
+  let relPathSegDot2 = 17;
+  let pathSegDot = 18;
+  let pathSegDot2 = 19;
+  let scheme0 = core._schemeStart;
+  let scheme = 21;
+  let schemeEnd = core._schemeEndIndex << 5;
+  let hostStart = core._hostStartIndex << 5;
+  let portStart = core._portStartIndex << 5;
+  let pathStart = core._pathStartIndex << 5;
+  let queryStart = core._queryStartIndex << 5;
+  let fragmentStart = core._fragmentStartIndex << 5;
+  let notSimple = core._notSimpleIndex << 5;
+  let unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
+  let subDelims = "!$&'()*+,;=";
+  let pchar = dart.str`${unreserved}${subDelims}`;
+  let tables = ListOfUint8List().generate(stateCount, dart.fn(_ => typed_data.Uint8List.new(96), intToUint8List()));
+  function build(state, defaultTransition) {
+    return (() => {
+      let _ = tables[dartx._get](core.int._check(state));
+      _[dartx.fillRange](0, 96, core.int._check(defaultTransition));
+      return _;
+    })();
+  }
+  dart.fn(build, dynamicAnddynamicToUint8List());
+  function setChars(target, chars, transition) {
+    for (let i = 0; i < dart.notNull(chars[dartx.length]); i++) {
+      let char = chars[dartx.codeUnitAt](i);
+      target[dartx._set]((dart.notNull(char) ^ 96) >>> 0, transition);
+    }
+  }
+  dart.fn(setChars, Uint8ListAndStringAndintTovoid());
+  function setRange(target, range, transition) {
+    for (let i = range[dartx.codeUnitAt](0), n = range[dartx.codeUnitAt](1); dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1) {
+      target[dartx._set]((dart.notNull(i) ^ 96) >>> 0, transition);
+    }
+  }
+  dart.fn(setRange, Uint8ListAndStringAndintTovoid());
+  let b = null;
+  b = build(core._uriStart, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot);
+  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", authOrPathSlash);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPathDot, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot2);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPathDot2, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), "%", (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPath, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(authOrPath, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, (path | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (authOrPathSlash | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ".", (pathSegDot | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(authOrPathSlash, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrHost0, (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "[", (ipv6Host | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrHost, (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrPort0, (uinfoOrPort | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "19", uinfoOrPort);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrPort, (uinfoOrPort | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "09", uinfoOrPort);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(ipv6Host, ipv6Host);
+  setChars(typed_data.Uint8List._check(b), "]", uinfoOrHost);
+  b = build(relPathSeg, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(relPathSegDot, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot2);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(relPathSegDot2, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSeg, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSegDot, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot2);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSegDot2, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(path, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(query, (query | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, query);
+  setChars(typed_data.Uint8List._check(b), "?", query);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(fragment, (fragment | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, fragment);
+  setChars(typed_data.Uint8List._check(b), "?", fragment);
+  b = build(scheme0, (scheme | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "az", scheme);
+  b = build(scheme, (scheme | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "az", scheme);
+  setRange(typed_data.Uint8List._check(b), "09", scheme);
+  setChars(typed_data.Uint8List._check(b), "+-.", scheme);
+  return tables;
+};
+dart.lazyFn(core._createTables, () => VoidToListOfUint8List());
+core._scan = function(uri, start, end, state, indices) {
+  let tables = core._scannerTables;
+  dart.assert(dart.notNull(end) <= dart.notNull(uri[dartx.length]));
+  for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+    let table = tables[dartx._get](state);
+    let char = (dart.notNull(uri[dartx.codeUnitAt](i)) ^ 96) >>> 0;
+    if (char > 95) char = 31;
+    let transition = table[dartx._get](char);
+    state = dart.notNull(transition) & 31;
+    indices[dartx._set](transition[dartx['>>']](5), i);
+  }
+  return state;
+};
+dart.fn(core._scan, StringAndintAndint__Toint());
+const _uri = Symbol('_uri');
+const _schemeEnd = Symbol('_schemeEnd');
+const _hostStart = Symbol('_hostStart');
+const _portStart = Symbol('_portStart');
+const _pathStart = Symbol('_pathStart');
+const _queryStart = Symbol('_queryStart');
+const _fragmentStart = Symbol('_fragmentStart');
+const _schemeCache = Symbol('_schemeCache');
+const _isFile = Symbol('_isFile');
+const _isHttp = Symbol('_isHttp');
+const _isHttps = Symbol('_isHttps');
+const _isPackage = Symbol('_isPackage');
+const _isScheme = Symbol('_isScheme');
+let const$52;
+let const$53;
+let const$54;
+const _isPort = Symbol('_isPort');
+const _simpleMerge = Symbol('_simpleMerge');
+const _toNonSimple = Symbol('_toNonSimple');
+core._SimpleUri = class _SimpleUri extends core.Object {
+  new(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, schemeCache) {
+    this[_uri] = uri;
+    this[_schemeEnd] = schemeEnd;
+    this[_hostStart] = hostStart;
+    this[_portStart] = portStart;
+    this[_pathStart] = pathStart;
+    this[_queryStart] = queryStart;
+    this[_fragmentStart] = fragmentStart;
+    this[_schemeCache] = schemeCache;
+    this[_hashCodeCache] = null;
+  }
+  get hasScheme() {
+    return dart.notNull(this[_schemeEnd]) > 0;
+  }
+  get hasAuthority() {
+    return dart.notNull(this[_hostStart]) > 0;
+  }
+  get hasUserInfo() {
+    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 4;
+  }
+  get hasPort() {
+    return dart.notNull(this[_hostStart]) > 0 && dart.notNull(this[_portStart]) + 1 < dart.notNull(this[_pathStart]);
+  }
+  get hasQuery() {
+    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]);
+  }
+  get hasFragment() {
+    return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]);
+  }
+  get [_isFile]() {
+    return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("file"));
+  }
+  get [_isHttp]() {
+    return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("http"));
+  }
+  get [_isHttps]() {
+    return this[_schemeEnd] == 5 && dart.test(this[_uri][dartx.startsWith]("https"));
+  }
+  get [_isPackage]() {
+    return this[_schemeEnd] == 7 && dart.test(this[_uri][dartx.startsWith]("package"));
+  }
+  [_isScheme](scheme) {
+    return this[_schemeEnd] == scheme[dartx.length] && dart.test(this[_uri][dartx.startsWith](scheme));
+  }
+  get hasAbsolutePath() {
+    return this[_uri][dartx.startsWith]("/", this[_pathStart]);
+  }
+  get hasEmptyPath() {
+    return this[_pathStart] == this[_queryStart];
+  }
+  get isAbsolute() {
+    return dart.test(this.hasScheme) && !dart.test(this.hasFragment);
+  }
+  isScheme(scheme) {
+    if (scheme == null || dart.test(scheme[dartx.isEmpty])) return dart.notNull(this[_schemeEnd]) < 0;
+    if (scheme[dartx.length] != this[_schemeEnd]) return false;
+    return core._Uri._compareScheme(scheme, this[_uri]);
+  }
+  get scheme() {
+    if (dart.notNull(this[_schemeEnd]) <= 0) return "";
+    if (this[_schemeCache] != null) return this[_schemeCache];
+    if (dart.test(this[_isHttp])) {
+      this[_schemeCache] = "http";
+    } else if (dart.test(this[_isHttps])) {
+      this[_schemeCache] = "https";
+    } else if (dart.test(this[_isFile])) {
+      this[_schemeCache] = "file";
+    } else if (dart.test(this[_isPackage])) {
+      this[_schemeCache] = "package";
+    } else {
+      this[_schemeCache] = this[_uri][dartx.substring](0, this[_schemeEnd]);
+    }
+    return this[_schemeCache];
+  }
+  get authority() {
+    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_pathStart]) : "";
+  }
+  get userInfo() {
+    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 3 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, dart.notNull(this[_hostStart]) - 1) : "";
+  }
+  get host() {
+    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](this[_hostStart], this[_portStart]) : "";
+  }
+  get port() {
+    if (dart.test(this.hasPort)) return core.int.parse(this[_uri][dartx.substring](dart.notNull(this[_portStart]) + 1, this[_pathStart]));
+    if (dart.test(this[_isHttp])) return 80;
+    if (dart.test(this[_isHttps])) return 443;
+    return 0;
+  }
+  get path() {
+    return this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+  }
+  get query() {
+    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]) ? this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]) : "";
+  }
+  get fragment() {
+    return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]) ? this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1) : "";
+  }
+  get origin() {
+    let isHttp = this[_isHttp];
+    if (dart.notNull(this[_schemeEnd]) < 0) {
+      dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
+    }
+    if (!dart.test(isHttp) && !dart.test(this[_isHttps])) {
+      dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
+    }
+    if (this[_hostStart] == this[_portStart]) {
+      dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+    }
+    if (this[_hostStart] == dart.notNull(this[_schemeEnd]) + 3) {
+      return this[_uri][dartx.substring](0, this[_pathStart]);
+    }
+    return dart.notNull(this[_uri][dartx.substring](0, dart.notNull(this[_schemeEnd]) + 3)) + dart.notNull(this[_uri][dartx.substring](this[_hostStart], this[_pathStart]));
+  }
+  get pathSegments() {
+    let start = this[_pathStart];
+    let end = this[_queryStart];
+    if (dart.test(this[_uri][dartx.startsWith]("/", start))) {
+      start = dart.notNull(start) + 1;
+    }
+    if (start == end) return const$52 || (const$52 = dart.constList([], core.String));
+    let parts = JSArrayOfString().of([]);
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = this[_uri][dartx.codeUnitAt](i);
+      if (char == core._SLASH) {
+        parts[dartx.add](this[_uri][dartx.substring](start, i));
+        start = dart.notNull(i) + 1;
+      }
+    }
+    parts[dartx.add](this[_uri][dartx.substring](start, end));
+    return ListOfString().unmodifiable(parts);
+  }
+  get queryParameters() {
+    if (!dart.test(this.hasQuery)) return const$53 || (const$53 = dart.const(dart.map({}, core.String, core.String)));
+    return new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
+  }
+  get queryParametersAll() {
+    if (!dart.test(this.hasQuery)) return const$54 || (const$54 = dart.const(dart.map({}, core.String, ListOfString())));
+    let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
+    for (let key of queryParameterLists[dartx.keys]) {
+      queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+    }
+    return MapOfString$ListOfString().unmodifiable(queryParameterLists);
+  }
+  [_isPort](port) {
+    let portDigitStart = dart.notNull(this[_portStart]) + 1;
+    return portDigitStart + dart.notNull(port[dartx.length]) == this[_pathStart] && dart.test(this[_uri][dartx.startsWith](port, portDigitStart));
+  }
+  normalizePath() {
+    return this;
+  }
+  removeFragment() {
+    if (!dart.test(this.hasFragment)) return this;
+    return new core._SimpleUri(this[_uri][dartx.substring](0, this[_fragmentStart]), this[_schemeEnd], this[_hostStart], this[_portStart], this[_pathStart], this[_queryStart], this[_fragmentStart], this[_schemeCache]);
+  }
+  replace(opts) {
+    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
+    let host = opts && 'host' in opts ? opts.host : null;
+    let port = opts && 'port' in opts ? opts.port : null;
+    let path = opts && 'path' in opts ? opts.path : null;
+    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+    let query = opts && 'query' in opts ? opts.query : null;
+    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+    let schemeChanged = false;
+    if (scheme != null) {
+      scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+      schemeChanged = !dart.test(this[_isScheme](scheme));
+    } else {
+      scheme = this.scheme;
+    }
+    let isFile = scheme == "file";
+    if (userInfo != null) {
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+    } else if (dart.notNull(this[_hostStart]) > 0) {
+      userInfo = this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_hostStart]);
+    } else {
+      userInfo = "";
+    }
+    if (port != null) {
+      port = core._Uri._makePort(port, scheme);
+    } else {
+      port = dart.test(this.hasPort) ? this.port : null;
+      if (schemeChanged) {
+        port = core._Uri._makePort(port, scheme);
+      }
+    }
+    if (host != null) {
+      host = core._Uri._makeHost(host, 0, host[dartx.length], false);
+    } else if (dart.notNull(this[_hostStart]) > 0) {
+      host = this[_uri][dartx.substring](this[_hostStart], this[_portStart]);
+    } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
+      host = "";
+    }
+    let hasAuthority = host != null;
+    if (path != null || pathSegments != null) {
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    } else {
+      path = this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+      if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
+        path = "/" + dart.notNull(path);
+      }
+    }
+    if (query != null || queryParameters != null) {
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+    } else if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+      query = this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]);
+    }
+    if (fragment != null) {
+      fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+    } else if (dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length])) {
+      fragment = this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1);
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
+  resolve(reference) {
+    return this.resolveUri(core.Uri.parse(reference));
+  }
+  resolveUri(reference) {
+    if (core._SimpleUri.is(reference)) {
+      return this[_simpleMerge](this, reference);
+    }
+    return this[_toNonSimple]().resolveUri(reference);
+  }
+  [_simpleMerge](base, ref) {
+    if (dart.test(ref.hasScheme)) return ref;
+    if (dart.test(ref.hasAuthority)) {
+      if (!dart.test(base.hasScheme)) return ref;
+      let isSimple = true;
+      if (dart.test(base[_isFile])) {
+        isSimple = !dart.test(ref.hasEmptyPath);
+      } else if (dart.test(base[_isHttp])) {
+        isSimple = !dart.test(ref[_isPort]("80"));
+      } else if (dart.test(base[_isHttps])) {
+        isSimple = !dart.test(ref[_isPort]("443"));
+      }
+      if (isSimple) {
+        let delta = dart.notNull(base[_schemeEnd]) + 1;
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, dart.notNull(base[_schemeEnd]) + 1)) + dart.notNull(ref[_uri][dartx.substring](dart.notNull(ref[_schemeEnd]) + 1));
+        return new core._SimpleUri(newUri, base[_schemeEnd], dart.notNull(ref[_hostStart]) + delta, dart.notNull(ref[_portStart]) + delta, dart.notNull(ref[_pathStart]) + delta, dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      } else {
+        return this[_toNonSimple]().resolveUri(ref);
+      }
+    }
+    if (dart.test(ref.hasEmptyPath)) {
+      if (dart.test(ref.hasQuery)) {
+        let delta = dart.notNull(base[_queryStart]) - dart.notNull(ref[_queryStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_queryStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_queryStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      if (dart.test(ref.hasFragment)) {
+        let delta = dart.notNull(base[_fragmentStart]) - dart.notNull(ref[_fragmentStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_fragmentStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_fragmentStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], base[_queryStart], dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      return base.removeFragment();
+    }
+    if (dart.test(ref.hasAbsolutePath)) {
+      let delta = dart.notNull(base[_pathStart]) - dart.notNull(ref[_pathStart]);
+      let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_pathStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_pathStart]));
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    if (dart.test(base.hasEmptyPath) && dart.test(base.hasAuthority)) {
+      let refStart = ref[_pathStart];
+      while (dart.test(ref[_uri][dartx.startsWith]("../", refStart))) {
+        refStart = dart.notNull(refStart) + 3;
+      }
+      let delta = dart.notNull(base[_pathStart]) - dart.notNull(refStart) + 1;
+      let newUri = dart.str`${base[_uri][dartx.substring](0, base[_pathStart])}/` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    let baseUri = base[_uri];
+    let refUri = ref[_uri];
+    let baseStart = base[_pathStart];
+    let baseEnd = base[_queryStart];
+    while (dart.test(baseUri[dartx.startsWith]("../", baseStart))) {
+      baseStart = dart.notNull(baseStart) + 3;
+    }
+    let refStart = ref[_pathStart];
+    let refEnd = ref[_queryStart];
+    let backCount = 0;
+    while (dart.notNull(refStart) + 3 <= dart.notNull(refEnd) && dart.test(refUri[dartx.startsWith]("../", refStart))) {
+      refStart = dart.notNull(refStart) + 3;
+      backCount = backCount + 1;
+    }
+    let insert = "";
+    while (dart.notNull(baseEnd) > dart.notNull(baseStart)) {
+      baseEnd = dart.notNull(baseEnd) - 1;
+      let char = baseUri[dartx.codeUnitAt](baseEnd);
+      if (char == core._SLASH) {
+        insert = "/";
+        if (backCount == 0) break;
+        backCount--;
+      }
+    }
+    if (baseEnd == baseStart && !dart.test(base.hasScheme) && !dart.test(base.hasAbsolutePath)) {
+      insert = "";
+      refStart = dart.notNull(refStart) - backCount * 3;
+    }
+    let delta = dart.notNull(baseEnd) - dart.notNull(refStart) + dart.notNull(insert[dartx.length]);
+    let newUri = dart.str`${base[_uri][dartx.substring](0, baseEnd)}${insert}` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+    return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+  }
+  toFilePath(opts) {
+    let windows = opts && 'windows' in opts ? opts.windows : null;
+    if (dart.notNull(this[_schemeEnd]) >= 0 && !dart.test(this[_isFile])) {
+      dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
+    }
+    if (dart.notNull(this[_queryStart]) < dart.notNull(this[_uri][dartx.length])) {
+      if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
+      }
+      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
+    }
+    if (windows == null) windows = core._Uri._isWindows;
+    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
+  }
+  [_toFilePath]() {
+    if (dart.notNull(this[_hostStart]) < dart.notNull(this[_portStart])) {
+      dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
+    }
+    return this.path;
+  }
+  get data() {
+    dart.assert(this.scheme != "data");
+    return null;
+  }
+  get hashCode() {
+    return (() => {
+      let t = this[_hashCodeCache];
+      return t == null ? this[_hashCodeCache] = dart.hashCode(this[_uri]) : t;
+    })();
+  }
+  ['=='](other) {
+    if (core.identical(this, other)) return true;
+    if (core.Uri.is(other)) return this[_uri] == dart.toString(other);
+    return false;
+  }
+  [_toNonSimple]() {
+    return new core._Uri._internal(this.scheme, this.userInfo, dart.test(this.hasAuthority) ? this.host : null, dart.test(this.hasPort) ? this.port : null, this.path, dart.test(this.hasQuery) ? this.query : null, dart.test(this.hasFragment) ? this.fragment : null);
+  }
+  toString() {
+    return this[_uri];
+  }
+};
+core._SimpleUri[dart.implements] = () => [core.Uri];
+dart.setSignature(core._SimpleUri, {
+  fields: () => ({
+    [_uri]: core.String,
+    [_schemeEnd]: core.int,
+    [_hostStart]: core.int,
+    [_portStart]: core.int,
+    [_pathStart]: core.int,
+    [_queryStart]: core.int,
+    [_fragmentStart]: core.int,
+    [_schemeCache]: core.String,
+    [_hashCodeCache]: core.int
+  }),
+  getters: () => ({
+    hasScheme: dart.definiteFunctionType(core.bool, []),
+    hasAuthority: dart.definiteFunctionType(core.bool, []),
+    hasUserInfo: dart.definiteFunctionType(core.bool, []),
+    hasPort: dart.definiteFunctionType(core.bool, []),
+    hasQuery: dart.definiteFunctionType(core.bool, []),
+    hasFragment: dart.definiteFunctionType(core.bool, []),
+    [_isFile]: dart.definiteFunctionType(core.bool, []),
+    [_isHttp]: dart.definiteFunctionType(core.bool, []),
+    [_isHttps]: dart.definiteFunctionType(core.bool, []),
+    [_isPackage]: dart.definiteFunctionType(core.bool, []),
+    hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
+    hasEmptyPath: dart.definiteFunctionType(core.bool, []),
+    isAbsolute: dart.definiteFunctionType(core.bool, []),
+    scheme: dart.definiteFunctionType(core.String, []),
+    authority: dart.definiteFunctionType(core.String, []),
+    userInfo: dart.definiteFunctionType(core.String, []),
+    host: dart.definiteFunctionType(core.String, []),
+    port: dart.definiteFunctionType(core.int, []),
+    path: dart.definiteFunctionType(core.String, []),
+    query: dart.definiteFunctionType(core.String, []),
+    fragment: dart.definiteFunctionType(core.String, []),
+    origin: dart.definiteFunctionType(core.String, []),
+    pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
+    queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
+    data: dart.definiteFunctionType(core.UriData, [])
+  }),
+  methods: () => ({
+    [_isScheme]: dart.definiteFunctionType(core.bool, [core.String]),
+    isScheme: dart.definiteFunctionType(core.bool, [core.String]),
+    [_isPort]: dart.definiteFunctionType(core.bool, [core.String]),
+    normalizePath: dart.definiteFunctionType(core.Uri, []),
+    removeFragment: dart.definiteFunctionType(core.Uri, []),
+    replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+    resolve: dart.definiteFunctionType(core.Uri, [core.String]),
+    resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
+    [_simpleMerge]: dart.definiteFunctionType(core.Uri, [core._SimpleUri, core._SimpleUri]),
+    toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
+    [_toFilePath]: dart.definiteFunctionType(core.String, []),
+    '==': dart.definiteFunctionType(core.bool, [core.Object]),
+    [_toNonSimple]: dart.definiteFunctionType(core.Uri, [])
+  })
+});
+const _data$ = Symbol('_data');
+core._DataUri = class _DataUri extends core._Uri {
+  new(data, path, query) {
+    this[_data$] = data;
+    super._internal("data", null, null, null, path, query, null);
+  }
+  get data() {
+    return this[_data$];
+  }
+};
+dart.setSignature(core._DataUri, {
+  fields: () => ({[_data$]: core.UriData})
+});
+core._startsWithData = function(text, start) {
+  let delta = ((dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 4)) ^ core._COLON) >>> 0) * 3;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](start)) ^ 100) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 1)) ^ 97) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 2)) ^ 116) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 3)) ^ 97) >>> 0;
+  return delta;
+};
+dart.fn(core._startsWithData, StringAndintToint());
+core._stringOrNullLength = function(s) {
+  return s == null ? 0 : s[dartx.length];
+};
+dart.fn(core._stringOrNullLength, StringToint$());
 developer.debugger = function(opts) {
   let when = opts && 'when' in opts ? opts.when : true;
   let message = opts && 'message' in opts ? opts.message : null;
@@ -35135,6 +35969,49 @@
   }
 });
 developer._clockValue = 0;
+developer._FakeUserTag = class _FakeUserTag extends core.Object {
+  real(label) {
+    this.label = label;
+  }
+  static new(label) {
+    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+    if (existingTag != null) {
+      return developer._FakeUserTag._check(existingTag);
+    }
+    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+    }
+    let instance = new developer._FakeUserTag.real(label);
+    developer._FakeUserTag._instances[dartx._set](label, instance);
+    return instance;
+  }
+  makeCurrent() {
+    let old = developer._currentTag;
+    developer._currentTag = this;
+    return old;
+  }
+};
+dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+dart.setSignature(developer._FakeUserTag, {
+  fields: () => ({label: core.String}),
+  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
+});
+dart.defineLazy(developer._FakeUserTag, {
+  get _instances() {
+    return dart.map();
+  },
+  set _instances(_) {},
+  get _defaultTag() {
+    return developer._FakeUserTag.new('Default');
+  }
+});
+dart.defineLazy(developer, {
+  get _currentTag() {
+    return developer._FakeUserTag._defaultTag;
+  },
+  set _currentTag(_) {}
+});
 const _result = Symbol('_result');
 const _errorCode = Symbol('_errorCode');
 const _errorDetail = Symbol('_errorDetail');
@@ -35256,7 +36133,7 @@
 dart.fn(developer.postEvent, StringAndMapTovoid());
 developer._postEvent = function(eventKind, eventData) {
 };
-dart.fn(developer._postEvent, StringAndStringTodynamic());
+dart.fn(developer._postEvent, StringAndStringTovoid$());
 developer._lookupExtension = function(method) {
   return developer._extensions[dartx._get](method);
 };
@@ -35274,49 +36151,6 @@
   }
 };
 developer.UserTag.MAX_USER_TAGS = 64;
-developer._FakeUserTag = class _FakeUserTag extends core.Object {
-  real(label) {
-    this.label = label;
-  }
-  static new(label) {
-    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
-    if (existingTag != null) {
-      return developer._FakeUserTag._check(existingTag);
-    }
-    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
-      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
-    }
-    let instance = new developer._FakeUserTag.real(label);
-    developer._FakeUserTag._instances[dartx._set](label, instance);
-    return instance;
-  }
-  makeCurrent() {
-    let old = developer._currentTag;
-    developer._currentTag = this;
-    return old;
-  }
-};
-dart.defineNamedConstructor(developer._FakeUserTag, 'real');
-developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
-dart.setSignature(developer._FakeUserTag, {
-  fields: () => ({label: core.String}),
-  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
-});
-dart.defineLazy(developer._FakeUserTag, {
-  get _instances() {
-    return dart.map();
-  },
-  set _instances(_) {},
-  get _defaultTag() {
-    return developer._FakeUserTag.new('Default');
-  }
-});
-dart.defineLazy(developer, {
-  get _currentTag() {
-    return developer._FakeUserTag._defaultTag;
-  },
-  set _currentTag(_) {}
-});
 developer.getCurrentTag = function() {
   return developer._currentTag;
 };
@@ -35749,7 +36583,7 @@
 developer.Service = class Service extends core.Object {
   static getInfo() {
     return dart.async(function*() {
-      let receivePort = isolate.RawReceivePort.new();
+      let receivePort = isolate$.RawReceivePort.new();
       let uriCompleter = CompleterOfUri().new();
       receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
       developer._getServerInfo(receivePort.sendPort);
@@ -35764,7 +36598,7 @@
       if (!(typeof enable == 'boolean')) {
         dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
       }
-      let receivePort = isolate.RawReceivePort.new();
+      let receivePort = isolate$.RawReceivePort.new();
       let uriCompleter = CompleterOfUri().new();
       receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
       developer._webServerControl(receivePort.sendPort, enable);
@@ -35773,20 +36607,27 @@
       return new developer.ServiceProtocolInfo(uri);
     }, developer.ServiceProtocolInfo, opts);
   }
+  static getIsolateID(isolate) {
+    if (!isolate$.Isolate.is(isolate)) {
+      dart.throw(new core.ArgumentError.value(isolate, 'isolate', 'Must be an Isolate'));
+    }
+    return developer._getIsolateIDFromSendPort(isolate.controlPort);
+  }
 };
 dart.setSignature(developer.Service, {
   statics: () => ({
     getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
-    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool}),
+    getIsolateID: dart.definiteFunctionType(core.String, [isolate$.Isolate])
   }),
-  names: ['getInfo', 'controlWebServer']
+  names: ['getInfo', 'controlWebServer', 'getIsolateID']
 });
-developer._getServerInfo = function(sp) {
-  sp.send(null);
+developer._getServerInfo = function(sendPort) {
+  sendPort.send(null);
 };
 dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
-developer._webServerControl = function(sp, enable) {
-  sp.send(null);
+developer._webServerControl = function(sendPort, enable) {
+  sendPort.send(null);
 };
 dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
 developer._getServiceMajorVersion = function() {
@@ -35797,6 +36638,10 @@
   return 0;
 };
 dart.fn(developer._getServiceMinorVersion, VoidToint());
+developer._getIsolateIDFromSendPort = function(sendPort) {
+  return null;
+};
+dart.lazyFn(developer._getIsolateIDFromSendPort, () => SendPortToString());
 io.BytesBuilder = class BytesBuilder extends core.Object {
   static new(opts) {
     let copy = opts && 'copy' in opts ? opts.copy : true;
@@ -35807,27 +36652,21 @@
     }
   }
 };
-const _length$2 = Symbol('_length');
 const _buffer$ = Symbol('_buffer');
-const _pow2roundup = Symbol('_pow2roundup');
+const _length$2 = Symbol('_length');
+const _grow$ = Symbol('_grow');
 io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
-  new() {
+  new(initialCapacity) {
+    if (initialCapacity === void 0) initialCapacity = 0;
+    this[_buffer$] = dart.notNull(initialCapacity) <= 0 ? io._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(io._CopyingBytesBuilder._pow2roundup(initialCapacity));
     this[_length$2] = 0;
-    this[_buffer$] = null;
   }
   add(bytes) {
     let bytesLength = bytes[dartx.length];
     if (bytesLength == 0) return;
     let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
-    if (this[_buffer$] == null) {
-      let size = this[_pow2roundup](required);
-      size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-      this[_buffer$] = typed_data.Uint8List.new(size);
-    } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
-      let size = dart.notNull(this[_pow2roundup](required)) * 2;
-      let newBuffer = typed_data.Uint8List.new(size);
-      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
-      this[_buffer$] = newBuffer;
+    if (dart.notNull(this[_buffer$][dartx.length]) < required) {
+      this[_grow$](required);
     }
     dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
     if (typed_data.Uint8List.is(bytes)) {
@@ -35840,16 +36679,32 @@
     this[_length$2] = required;
   }
   addByte(byte) {
-    this.add(JSArrayOfint().of([byte]));
+    if (this[_buffer$][dartx.length] == this[_length$2]) {
+      this[_grow$](this[_length$2]);
+    }
+    dart.assert(dart.notNull(this[_buffer$][dartx.length]) > dart.notNull(this[_length$2]));
+    this[_buffer$][dartx._set](this[_length$2], byte);
+    this[_length$2] = dart.notNull(this[_length$2]) + 1;
+  }
+  [_grow$](required) {
+    let newSize = dart.notNull(required) * 2;
+    if (dart.notNull(newSize) < io._CopyingBytesBuilder._INIT_SIZE) {
+      newSize = io._CopyingBytesBuilder._INIT_SIZE;
+    } else {
+      newSize = io._CopyingBytesBuilder._pow2roundup(newSize);
+    }
+    let newBuffer = typed_data.Uint8List.new(newSize);
+    newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+    this[_buffer$] = newBuffer;
   }
   takeBytes() {
-    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
     this.clear();
     return buffer;
   }
   toBytes() {
-    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
   }
   get length() {
@@ -35863,9 +36718,10 @@
   }
   clear() {
     this[_length$2] = 0;
-    this[_buffer$] = null;
+    this[_buffer$] = io._CopyingBytesBuilder._emptyList;
   }
-  [_pow2roundup](x) {
+  static _pow2roundup(x) {
+    dart.assert(dart.notNull(x) > 0);
     x = dart.notNull(x) - 1;
     x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
     x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
@@ -35889,33 +36745,48 @@
   methods: () => ({
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addByte: dart.definiteFunctionType(dart.void, [core.int]),
+    [_grow$]: dart.definiteFunctionType(dart.void, [core.int]),
     takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
     toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-    clear: dart.definiteFunctionType(dart.void, []),
-    [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
-  })
+    clear: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({_pow2roundup: dart.definiteFunctionType(core.int, [core.int])}),
+  names: ['_pow2roundup']
 });
 io._CopyingBytesBuilder._INIT_SIZE = 1024;
+dart.defineLazy(io._CopyingBytesBuilder, {
+  get _emptyList() {
+    return typed_data.Uint8List.new(0);
+  }
+});
 const _chunks = Symbol('_chunks');
 io._BytesBuilder = class _BytesBuilder extends core.Object {
   new() {
-    this[_chunks] = JSArrayOfListOfint().of([]);
+    this[_chunks] = JSArrayOfUint8List().of([]);
     this[_length$2] = 0;
   }
   add(bytes) {
-    if (!typed_data.Uint8List.is(bytes)) {
-      bytes = typed_data.Uint8List.fromList(bytes);
+    let typedBytes = null;
+    if (typed_data.Uint8List.is(bytes)) {
+      typedBytes = bytes;
+    } else {
+      typedBytes = typed_data.Uint8List.fromList(bytes);
     }
-    this[_chunks][dartx.add](bytes);
-    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
+    this[_chunks][dartx.add](typedBytes);
+    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(typedBytes[dartx.length]);
   }
   addByte(byte) {
-    this.add(JSArrayOfint().of([byte]));
+    this[_chunks][dartx.add]((() => {
+      let _ = typed_data.Uint8List.new(1);
+      _[dartx._set](0, byte);
+      return _;
+    })());
+    this[_length$2] = dart.notNull(this[_length$2]) + 1;
   }
   takeBytes() {
-    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     if (this[_chunks][dartx.length] == 1) {
-      let buffer = this[_chunks][dartx.single];
+      let buffer = this[_chunks][dartx._get](0);
       this.clear();
       return buffer;
     }
@@ -35929,7 +36800,7 @@
     return buffer;
   }
   toBytes() {
-    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     let buffer = typed_data.Uint8List.new(this[_length$2]);
     let offset = 0;
     for (let chunk of this[_chunks]) {
@@ -35956,7 +36827,7 @@
 dart.setSignature(io._BytesBuilder, {
   fields: () => ({
     [_length$2]: core.int,
-    [_chunks]: ListOfListOfint()
+    [_chunks]: ListOfUint8List()
   }),
   getters: () => ({
     length: dart.definiteFunctionType(core.int, []),
@@ -35987,7 +36858,7 @@
   switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
     case io._ILLEGAL_ARGUMENT_RESPONSE:
     {
-      return new core.ArgumentError();
+      return new core.ArgumentError(dart.str`${message}: ${path}`);
     }
     case io._OSERROR_RESPONSE:
     {
@@ -36050,7 +36921,7 @@
 };
 dart.setSignature(io._BufferAndStart, {
   fields: () => ({
-    buffer: core.List,
+    buffer: ListOfint(),
     start: core.int
   })
 });
@@ -36062,7 +36933,7 @@
   let newBuffer = typed_data.Uint8List.new(length);
   let j = start;
   for (let i = 0; i < length; i++) {
-    let value = core.int._check(buffer[dartx._get](j));
+    let value = buffer[dartx._get](j);
     if (!(typeof value == 'number')) {
       dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
     }
@@ -36071,7 +36942,7 @@
   }
   return new io._BufferAndStart(newBuffer, 0);
 };
-dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
+dart.fn(io._ensureFastAndSerializableByteData, ListOfintAndintAndintTo_BufferAndStart());
 io._IOCrypto = class _IOCrypto extends core.Object {
   static getRandomBytes(count) {
     dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
@@ -36237,13 +37108,13 @@
   }
   close() {
     if (dart.test(this[_digestCalled])) {
-      return ListOfint()._check(this[_resultAsBytes]());
+      return this[_resultAsBytes]();
     }
     this[_digestCalled] = true;
     this[_finalizeData]();
     this[_iterate]();
     dart.assert(this[_pendingData][dartx.length] == 0);
-    return ListOfint()._check(this[_resultAsBytes]());
+    return this[_resultAsBytes]();
   }
   get blockSize() {
     return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
@@ -36259,9 +37130,9 @@
     return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
   }
   [_resultAsBytes]() {
-    let result = [];
+    let result = JSArrayOfint().of([]);
     for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
-      result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
+      result[dartx.addAll](this[_wordToBytes](this[_h][dartx._get](i)));
     }
     return result;
   }
@@ -36312,11 +37183,11 @@
     let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
     dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
     if (dart.test(this[_bigEndianWords])) {
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+      this[_pendingData][dartx.addAll](this[_wordToBytes](0));
+      this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
     } else {
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+      this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
+      this[_pendingData][dartx.addAll](this[_wordToBytes](0));
     }
   }
 };
@@ -36338,9 +37209,9 @@
     [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
     [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
     [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-    [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
+    [_resultAsBytes]: dart.definiteFunctionType(core.List$(core.int), []),
     [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
-    [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    [_wordToBytes]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
     [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
     [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
   })
@@ -36622,6 +37493,7 @@
   }
 };
 dart.addSimpleTypeTests(io.ZLibEncoder);
+io.ZLibEncoder[dart.implements] = () => [ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint()];
 dart.setSignature(io.ZLibEncoder, {
   fields: () => ({
     gzip: core.bool,
@@ -36704,7 +37576,7 @@
 const _filter$ = Symbol('_filter');
 const _closed = Symbol('_closed');
 const _empty = Symbol('_empty');
-let const$52;
+let const$55;
 io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
   new(sink, filter) {
     this[_sink$0] = sink;
@@ -36723,10 +37595,10 @@
     try {
       this[_empty] = false;
       let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-      this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      this[_filter$].process(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
       let out = null;
       while ((out = this[_filter$].processed({flush: false})) != null) {
-        this[_sink$0].add(ListOfint()._check(out));
+        this[_sink$0].add(out);
       }
     } catch (e) {
       this[_closed] = true;
@@ -36737,11 +37609,11 @@
   }
   close() {
     if (dart.test(this[_closed])) return;
-    if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
+    if (dart.test(this[_empty])) this[_filter$].process(const$55 || (const$55 = dart.constList([], core.int)), 0, 0);
     try {
       let out = null;
       while ((out = this[_filter$].processed({end: true})) != null) {
-        this[_sink$0].add(ListOfint()._check(out));
+        this[_sink$0].add(out);
       }
     } catch (e) {
       this[_closed] = true;
@@ -36808,9 +37680,9 @@
   }
 };
 dart.fn(io._validateZLibMemLevel, intTovoid());
-let const$53;
+let const$56;
 io._validateZLibStrategy = function(strategy) {
-  let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+  let strategies = const$56 || (const$56 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
   if (strategies[dartx.indexOf](strategy) == -1) {
     dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
   }
@@ -36840,7 +37712,6 @@
 const _isErrorResponse = Symbol('_isErrorResponse');
 const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
 const _absolutePath = Symbol('_absolutePath');
-const _computeExistingIndex = Symbol('_computeExistingIndex');
 const _delete = Symbol('_delete');
 const _deleteSync = Symbol('_deleteSync');
 const _type = Symbol('_type');
@@ -36861,6 +37732,12 @@
     io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
     return core.String._check(result);
   }
+  stat() {
+    return io.FileStat.stat(this.path);
+  }
+  statSync() {
+    return io.FileStat.statSync(this.path);
+  }
   delete(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     return this[_delete]({recursive: recursive});
@@ -37024,6 +37901,8 @@
   methods: () => ({
     resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
     resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+    statSync: dart.definiteFunctionType(io.FileStat, []),
     delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
     deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
@@ -37129,33 +38008,6 @@
   get absolute() {
     return io.Directory.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
-  [_computeExistingIndex](dirsToCreate) {
-    let future = null;
-    let notFound = dirsToCreate[dartx.length];
-    for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
-      if (future == null) {
-        future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-      } else {
-        future = dart.dsend(future, 'then', dart.fn(index => {
-          if (!dart.equals(index, notFound)) {
-            return async.Future.value(index);
-          }
-          return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        }, dynamicTodynamic$()));
-      }
-    }
-    if (future == null) {
-      return FutureOfint().value(notFound);
-    } else {
-      return FutureOfint()._check(future);
-    }
-  }
   create(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     if (dart.test(recursive)) {
@@ -37266,7 +38118,7 @@
   list(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-    return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
+    return new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream;
   }
   listSync(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
@@ -37310,9 +38162,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
-    [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
     create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
@@ -37358,7 +38207,7 @@
     this.nextRunning = false;
     this.closed = false;
     this[_ops] = null;
-    this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
+    this.controller = StreamControllerOfFileSystemEntity().new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
   }
   [_pointer]() {
     return this[_ops] == null ? null : this[_ops].getPointer();
@@ -37485,14 +38334,14 @@
     path: core.String,
     recursive: core.bool,
     followLinks: core.bool,
-    controller: async.StreamController,
+    controller: StreamControllerOfFileSystemEntity(),
     canceled: core.bool,
     nextRunning: core.bool,
     closed: core.bool,
     [_ops]: io._AsyncDirectoryListerOps,
     closeCompleter: async.Completer
   }),
-  getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
+  getters: () => ({stream: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [])}),
   methods: () => ({
     [_pointer]: dart.definiteFunctionType(core.int, []),
     onListen: dart.definiteFunctionType(dart.void, []),
@@ -37519,7 +38368,7 @@
   }
 };
 dart.setSignature(io._EventHandler, {
-  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
+  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate$.SendPort, core.int])}),
   names: ['_sendData']
 });
 const _mode = Symbol('_mode');
@@ -37561,7 +38410,9 @@
   toString() {
     return {
       0: "FileLock.SHARED",
-      1: "FileLock.EXCLUSIVE"
+      1: "FileLock.EXCLUSIVE",
+      2: "FileLock.BLOCKING_SHARED",
+      3: "FileLock.BLOCKING_EXCLUSIVE"
     }[this.index];
   }
 };
@@ -37570,7 +38421,9 @@
 });
 dart.defineEnumValues(io.FileLock, [
   'SHARED',
-  'EXCLUSIVE'
+  'EXCLUSIVE',
+  'BLOCKING_SHARED',
+  'BLOCKING_EXCLUSIVE'
 ]);
 io.File = class File extends core.Object {
   static new(path) {
@@ -37623,9 +38476,9 @@
 });
 io._BLOCK_SIZE = 64 * 1024;
 const _closeCompleter = Symbol('_closeCompleter');
-const _path$ = Symbol('_path');
+const _path = Symbol('_path');
 const _position$0 = Symbol('_position');
-const _end$0 = Symbol('_end');
+const _end$ = Symbol('_end');
 const _controller$0 = Symbol('_controller');
 const _openedFile = Symbol('_openedFile');
 const _unsubscribed = Symbol('_unsubscribed');
@@ -37638,9 +38491,9 @@
 io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
   new(path, position, end) {
     this[_closeCompleter] = async.Completer.new();
-    this[_path$] = path;
+    this[_path] = path;
     this[_position$0] = position;
-    this[_end$0] = end;
+    this[_end$] = end;
     this[_controller$0] = null;
     this[_openedFile] = null;
     this[_unsubscribed] = false;
@@ -37654,9 +38507,9 @@
     this[_closeCompleter] = async.Completer.new();
     this[_position$0] = 0;
     this[_controller$0] = null;
-    this[_path$] = null;
+    this[_path] = null;
     this[_openedFile] = null;
-    this[_end$0] = null;
+    this[_end$] = null;
     this[_unsubscribed] = false;
     this[_readInProgress] = true;
     this[_closed] = false;
@@ -37697,12 +38550,12 @@
     }
     this[_readInProgress] = true;
     let readBytes = io._BLOCK_SIZE;
-    if (this[_end$0] != null) {
-      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
+    if (this[_end$] != null) {
+      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$]) - dart.notNull(this[_position$0]));
       if (dart.notNull(readBytes) < 0) {
         this[_readInProgress] = false;
         if (!dart.test(this[_unsubscribed])) {
-          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
+          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$]}`));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
@@ -37716,7 +38569,7 @@
         return;
       }
       this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
-      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
+      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$] != null && this[_position$0] == this[_end$]) {
         this[_atEnd] = true;
       }
       if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
@@ -37765,8 +38618,8 @@
       this[_closeCompleter].complete();
     }).bind(this);
     dart.fn(openFailed, dynamicAnddynamicTovoid$());
-    if (this[_path$] != null) {
-      io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+    if (this[_path] != null) {
+      io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
     } else {
       try {
         onOpenFile(io._File._openStdioSync(0));
@@ -37783,10 +38636,10 @@
 dart.setSignature(io._FileStream, {
   fields: () => ({
     [_controller$0]: StreamControllerOfListOfint(),
-    [_path$]: core.String,
+    [_path]: core.String,
     [_openedFile]: io.RandomAccessFile,
     [_position$0]: core.int,
-    [_end$0]: core.int,
+    [_end$]: core.int,
     [_closeCompleter]: async.Completer,
     [_unsubscribed]: core.bool,
     [_readInProgress]: core.bool,
@@ -37858,8 +38711,8 @@
   })
 });
 const _tryDecode = Symbol('_tryDecode');
-let const$54;
-let const$55;
+let const$57;
+let const$58;
 io._File = class _File extends io.FileSystemEntity {
   new(path) {
     this.path = path;
@@ -37886,12 +38739,6 @@
   get absolute() {
     return io.File.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
   create(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
@@ -38008,6 +38855,41 @@
     io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
     return core.int._check(result);
   }
+  lastAccessed() {
+    return io._IOService._dispatch(io._FILE_LAST_ACCESSED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve access time", this.path));
+      }
+      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
+    }, dynamicToDateTime()));
+  }
+  static _lastAccessed(path) {
+    dart.throw(new core.UnsupportedError("File._lastAccessed"));
+  }
+  lastAccessedSync() {
+    let ms = io._File._lastAccessed(this.path);
+    io._File.throwIfError(ms, "Cannot retrieve access time", this.path);
+    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
+  }
+  setLastAccessed(time) {
+    let millis = time.millisecondsSinceEpoch;
+    return io._IOService._dispatch(io._FILE_SET_LAST_ACCESSED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot set access time", this.path));
+      }
+      return null;
+    }, dynamicToNull$()));
+  }
+  static _setLastAccessed(path, millis) {
+    dart.throw(new core.UnsupportedError("File._setLastAccessed"));
+  }
+  setLastAccessedSync(time) {
+    let millis = time.millisecondsSinceEpoch;
+    let result = io._File._setLastAccessed(this.path, millis);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Failed to set file access time", this.path, result));
+    }
+  }
   lastModified() {
     return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
       if (dart.test(io._isErrorResponse(response))) {
@@ -38024,6 +38906,25 @@
     io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
     return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
   }
+  setLastModified(time) {
+    let millis = time.millisecondsSinceEpoch;
+    return io._IOService._dispatch(io._FILE_SET_LAST_MODIFIED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot set modification time", this.path));
+      }
+      return null;
+    }, dynamicToNull$()));
+  }
+  static _setLastModified(path, millis) {
+    dart.throw(new core.UnsupportedError("File._setLastModified"));
+  }
+  setLastModifiedSync(time) {
+    let millis = time.millisecondsSinceEpoch;
+    let result = io._File._setLastModified(this.path, millis);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Failed to set file modification time", this.path, result));
+    }
+  }
   static _open(path, mode) {
     dart.throw(new core.UnsupportedError("File._open"));
   }
@@ -38063,22 +38964,22 @@
   readAsBytes() {
     function readDataChunked(file) {
       let builder = io.BytesBuilder.new({copy: false});
-      let completer = async.Completer.new();
+      let completer = CompleterOfListOfint().new();
       function read() {
-        dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
-          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
-            builder.add(ListOfint()._check(data));
+        file.read(io._BLOCK_SIZE).then(dart.dynamic)(dart.fn(data => {
+          if (dart.notNull(data[dartx.length]) > 0) {
+            builder.add(data);
             read();
           } else {
             completer.complete(builder.takeBytes());
           }
-        }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
+        }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError')});
       }
       dart.fn(read, VoidTovoid$());
       read();
-      return FutureOfListOfint()._check(completer.future);
+      return completer.future;
     }
-    dart.fn(readDataChunked, dynamicToFutureOfListOfint());
+    dart.fn(readDataChunked, RandomAccessFileToFutureOfListOfint());
     return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
       if (length == 0) {
         return readDataChunked(file);
@@ -38095,13 +38996,13 @@
         let builder = io.BytesBuilder.new({copy: false});
         do {
           data = opened.readSync(io._BLOCK_SIZE);
-          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
-        } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
+          if (dart.notNull(data[dartx.length]) > 0) builder.add(data);
+        } while (dart.notNull(data[dartx.length]) > 0);
         data = builder.takeBytes();
       } else {
         data = opened.readSync(length);
       }
-      return ListOfint()._check(data);
+      return data;
     } finally {
       opened.closeSync();
     }
@@ -38124,11 +39025,11 @@
   }
   readAsLines(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
+    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$57 || (const$57 = dart.const(new convert.LineSplitter())), 'convert'));
   }
   readAsLinesSync(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+    return (const$58 || (const$58 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
   }
   writeAsBytes(bytes, opts) {
     let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
@@ -38182,8 +39083,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
     create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
@@ -38195,8 +39094,14 @@
     open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
     length: dart.definiteFunctionType(async.Future$(core.int), []),
     lengthSync: dart.definiteFunctionType(core.int, []),
+    lastAccessed: dart.definiteFunctionType(async.Future$(core.DateTime), []),
+    lastAccessedSync: dart.definiteFunctionType(core.DateTime, []),
+    setLastAccessed: dart.definiteFunctionType(async.Future, [core.DateTime]),
+    setLastAccessedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
     lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
     lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
+    setLastModified: dart.definiteFunctionType(async.Future, [core.DateTime]),
+    setLastModifiedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
     openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
     openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
     openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
@@ -38223,26 +39128,49 @@
     _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
     _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
     _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _lastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _setLastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _setLastModified: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _openStdio: dart.definiteFunctionType(core.int, [core.int]),
     _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
     throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
   }),
-  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
+  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastAccessed', '_setLastAccessed', '_lastModified', '_setLastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
 });
 io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
   static new(pointer) {
     dart.throw(new core.UnsupportedError("RandomAccessFile"));
   }
 };
+io._FileTranslation = class _FileTranslation extends core.Object {
+  new(index) {
+    this.index = index;
+  }
+  toString() {
+    return {
+      0: "_FileTranslation.text",
+      1: "_FileTranslation.binary"
+    }[this.index];
+  }
+};
+dart.setSignature(io._FileTranslation, {
+  fields: () => ({index: core.int})
+});
+dart.defineEnumValues(io._FileTranslation, [
+  'text',
+  'binary'
+]);
 const _asyncDispatched = Symbol('_asyncDispatched');
 const _fileService = Symbol('_fileService');
 const _resourceInfo = Symbol('_resourceInfo');
+const _translation = Symbol('_translation');
 const _maybeConnectHandler = Symbol('_maybeConnectHandler');
 const _maybePerformCleanup = Symbol('_maybePerformCleanup');
 const _dispatch = Symbol('_dispatch');
 const _checkAvailable = Symbol('_checkAvailable');
+const _fileLockValue = Symbol('_fileLockValue');
 io._RandomAccessFile = class _RandomAccessFile extends core.Object {
   new(pointer, path) {
     this.path = path;
@@ -38250,9 +39178,11 @@
     this[_fileService] = null;
     this[_resourceInfo] = null;
     this[_ops] = null;
+    this[_translation] = null;
     this.closed = false;
     this[_ops] = io._RandomAccessFileOps.new(pointer);
     this[_resourceInfo] = new io._FileResourceInfo(this);
+    this[_translation] = io._FileTranslation.binary;
     this[_maybeConnectHandler]();
   }
   [_maybePerformCleanup]() {
@@ -38314,8 +39244,8 @@
         dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
       }
       this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
-      return FutureOrOfListOfint()._check(dart.dindex(response, 1));
-    }, dynamicToFutureOrOfListOfint()));
+      return ListOfint().as(dart.dindex(response, 1));
+    }, dynamicToListOfint()));
   }
   readSync(bytes) {
     this[_checkAvailable]();
@@ -38327,7 +39257,7 @@
       dart.throw(new io.FileSystemException("readSync failed", this.path, result));
     }
     this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
-    return ListOfint()._check(result);
+    return ListOfint().as(result);
   }
   readInto(buffer, start, end) {
     if (start === void 0) start = 0;
@@ -38345,8 +39275,8 @@
         dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
       }
       let read = dart.dindex(response, 1);
-      let data = dart.dindex(response, 2);
-      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
+      let data = ListOfint().as(dart.dindex(response, 2));
+      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), data);
       this[_resourceInfo].addRead(core.int._check(read));
       return FutureOrOfint()._check(read);
     }, dynamicToFutureOrOfint()));
@@ -38435,7 +39365,7 @@
       return;
     }
     let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
-    let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+    let result = this[_ops].writeFrom(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
     if (io.OSError.is(result)) {
       dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
     }
@@ -38534,6 +39464,30 @@
       dart.throw(new io.FileSystemException("flush failed", this.path, result));
     }
   }
+  [_fileLockValue](fl) {
+    switch (fl) {
+      case io.FileLock.SHARED:
+      {
+        return io._RandomAccessFile.LOCK_SHARED;
+      }
+      case io.FileLock.EXCLUSIVE:
+      {
+        return io._RandomAccessFile.LOCK_EXCLUSIVE;
+      }
+      case io.FileLock.BLOCKING_SHARED:
+      {
+        return io._RandomAccessFile.LOCK_BLOCKING_SHARED;
+      }
+      case io.FileLock.BLOCKING_EXCLUSIVE:
+      {
+        return io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE;
+      }
+      default:
+      {
+        return -1;
+      }
+    }
+  }
   lock(mode, start, end) {
     if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
     if (start === void 0) start = 0;
@@ -38544,7 +39498,7 @@
     if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
       dart.throw(new core.ArgumentError());
     }
-    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    let lock = this[_fileLockValue](mode);
     return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
       if (dart.test(io._isErrorResponse(response))) {
         dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
@@ -38579,7 +39533,7 @@
     if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
       dart.throw(new core.ArgumentError());
     }
-    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    let lock = this[_fileLockValue](mode);
     let result = this[_ops].lock(lock, start, end);
     if (io.OSError.is(result)) {
       dart.throw(new io.FileSystemException('lock failed', this.path, result));
@@ -38600,6 +39554,15 @@
       dart.throw(new io.FileSystemException('unlock failed', this.path, result));
     }
   }
+  get translation() {
+    return this[_translation];
+  }
+  set translation(translation) {
+    if (!dart.equals(this[_translation], translation)) {
+      this[_ops].setTranslation(translation.index);
+      this[_translation] = translation;
+    }
+  }
   [_pointer]() {
     return this[_ops].getPointer();
   }
@@ -38635,11 +39598,14 @@
   fields: () => ({
     path: core.String,
     [_asyncDispatched]: core.bool,
-    [_fileService]: isolate.SendPort,
+    [_fileService]: isolate$.SendPort,
     [_resourceInfo]: io._FileResourceInfo,
     [_ops]: io._RandomAccessFileOps,
+    [_translation]: io._FileTranslation,
     closed: core.bool
   }),
+  getters: () => ({translation: dart.definiteFunctionType(io._FileTranslation, [])}),
+  setters: () => ({translation: dart.definiteFunctionType(dart.void, [io._FileTranslation])}),
   methods: () => ({
     [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
     [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
@@ -38667,6 +39633,7 @@
     lengthSync: dart.definiteFunctionType(core.int, []),
     flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
     flushSync: dart.definiteFunctionType(dart.void, []),
+    [_fileLockValue]: dart.definiteFunctionType(core.int, [io.FileLock]),
     lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
     unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
     lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
@@ -38680,7 +39647,9 @@
 io._RandomAccessFile.LOCK_UNLOCK = 0;
 io._RandomAccessFile.LOCK_SHARED = 1;
 io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-let const$56;
+io._RandomAccessFile.LOCK_BLOCKING_SHARED = 3;
+io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE = 4;
+let const$59;
 io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
   _internal(type) {
     this[_type] = type;
@@ -38689,7 +39658,7 @@
     return io.FileSystemEntityType._typeList[dartx._get](type);
   }
   toString() {
-    return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+    return (const$59 || (const$59 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
   }
 };
 dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
@@ -38715,7 +39684,7 @@
     return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
   }
 });
-let const$57;
+let const$60;
 io.FileStat = class FileStat extends core.Object {
   _internal(changed, modified, accessed, type, mode, size) {
     this.changed = changed;
@@ -38761,7 +39730,7 @@
   }
   modeString() {
     let permissions = dart.notNull(this.mode) & 4095;
-    let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+    let codes = const$60 || (const$60 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
     let result = [];
     if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
     if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
@@ -39261,19 +40230,19 @@
   }),
   getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
 });
-let const$58;
-let const$59;
-let const$60;
 let const$61;
 let const$62;
 let const$63;
 let const$64;
 let const$65;
 let const$66;
+let const$67;
+let const$68;
+let const$69;
 io.HttpDate = class HttpDate extends core.Object {
   static format(date) {
-    let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkday = const$61 || (const$61 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let month = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
     let d = date.toUtc();
     let sb = new core.StringBuffer();
     sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
@@ -39295,12 +40264,12 @@
   }
   static parse(date) {
     let SP = 32;
-    let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-    let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-    let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-    let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-    let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let wkdays = const$63 || (const$63 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let weekdays = const$64 || (const$64 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+    let months = const$65 || (const$65 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkdaysLowerCase = const$66 || (const$66 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+    let weekdaysLowerCase = const$67 || (const$67 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+    let monthsLowerCase = const$68 || (const$68 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let formatRfc1123 = 0;
     let formatRfc850 = 1;
     let formatAsctime = 2;
@@ -39416,7 +40385,7 @@
     return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
   }
   static _parseCookieDate(date) {
-    let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let monthsLowerCase = const$69 || (const$69 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let position = 0;
     function error() {
       dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
@@ -39550,7 +40519,7 @@
 const _addIfModifiedSince = Symbol('_addIfModifiedSince');
 const _foldHeader = Symbol('_foldHeader');
 const _finalize = Symbol('_finalize');
-const _write = Symbol('_write');
+const _build = Symbol('_build');
 const _parseCookies = Symbol('_parseCookies');
 io._HttpHeaders = class _HttpHeaders extends core.Object {
   new(protocolVersion, opts) {
@@ -39986,81 +40955,32 @@
   [_finalize]() {
     this[_mutable] = false;
   }
-  [_write](buffer, offset) {
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
+  [_build](builder) {
     for (let name of this[_headers][dartx.keys]) {
       let values = this[_headers][dartx._get](name);
       let fold = core.bool._check(this[_foldHeader](name));
       let nameData = name[dartx.codeUnits];
-      write(nameData);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.COLON);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
+      builder.add(nameData);
+      builder.addByte(io._CharCode.COLON);
+      builder.addByte(io._CharCode.SP);
       for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
         if (i > 0) {
           if (dart.test(fold)) {
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.COMMA);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.SP);
+            builder.addByte(io._CharCode.COMMA);
+            builder.addByte(io._CharCode.SP);
           } else {
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.CR);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.LF);
-            write(nameData);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.COLON);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.SP);
+            builder.addByte(io._CharCode.CR);
+            builder.addByte(io._CharCode.LF);
+            builder.add(nameData);
+            builder.addByte(io._CharCode.COLON);
+            builder.addByte(io._CharCode.SP);
           }
         }
-        write(values[dartx._get](i)[dartx.codeUnits]);
+        builder.add(values[dartx._get](i)[dartx.codeUnits]);
       }
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      builder.addByte(io._CharCode.CR);
+      builder.addByte(io._CharCode.LF);
     }
-    return offset;
   }
   toString() {
     let sb = new core.StringBuffer();
@@ -40235,7 +41155,7 @@
     [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
     [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
     [_finalize]: dart.definiteFunctionType(dart.void, []),
-    [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
+    [_build]: dart.definiteFunctionType(dart.void, [io.BytesBuilder]),
     [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
   }),
   statics: () => ({
@@ -40384,7 +41304,7 @@
           return;
         }
         let value = parseParameterValue();
-        if (name == 'charset' && io._ContentType.is(this)) {
+        if (name == 'charset' && io._ContentType.is(this) && value != null) {
           value = value[dartx.toLowerCase]();
         }
         parameters._set(name, value);
@@ -40495,7 +41415,7 @@
 });
 const _validate = Symbol('_validate');
 const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-let const$67;
+let const$70;
 io._Cookie = class _Cookie extends core.Object {
   new(name, value) {
     if (name === void 0) name = null;
@@ -40634,7 +41554,7 @@
     return sb.toString();
   }
   [_validate]() {
-    let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+    let SEPERATORS = const$70 || (const$70 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
     for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
       let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
       if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
@@ -40668,6 +41588,7 @@
   })
 });
 io._OUTGOING_BUFFER_SIZE = 8 * 1024;
+io._BytesConsumer = dart.typedef('_BytesConsumer', () => dart.functionType(dart.void, [ListOfint()]));
 const _transferLength = Symbol('_transferLength');
 const _dataCompleter = Symbol('_dataCompleter');
 const _stream$ = Symbol('_stream');
@@ -40966,7 +41887,7 @@
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
     if (dart.test(this[_incoming].upgraded)) {
       this[_httpRequest][_httpClientConnection].destroy();
-      return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
+      return StreamOfListOfint().empty().listen(null, {onDone: onDone});
     }
     let stream = this[_incoming];
     if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
@@ -41088,7 +42009,7 @@
     [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
   })
 });
-const _uri = Symbol('_uri');
+const _uri$ = Symbol('_uri');
 const _outgoing = Symbol('_outgoing');
 const _encodingSet = Symbol('_encodingSet');
 const _bufferOutput = Symbol('_bufferOutput');
@@ -41316,7 +42237,7 @@
   class _HttpOutboundMessage extends io._IOSinkImpl {
     new(uri, protocolVersion, outgoing, opts) {
       let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-      this[_uri] = uri;
+      this[_uri$] = uri;
       this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
       this[_outgoing] = outgoing;
       this[_encodingSet] = false;
@@ -41379,7 +42300,7 @@
     fields: () => ({
       [_encodingSet]: core.bool,
       [_bufferOutput]: core.bool,
-      [_uri]: core.Uri,
+      [_uri$]: core.Uri,
       [_outgoing]: io._HttpOutgoing,
       headers: io._HttpHeaders
     }),
@@ -41476,43 +42397,18 @@
     }, VoidToNull()));
   }
   [_writeHeader]() {
-    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-    let offset = 0;
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
+    let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
     if (this.headers.protocolVersion == "1.1") {
-      write(io._Const.HTTP11);
+      buffer.add(io._Const.HTTP11);
     } else {
-      write(io._Const.HTTP10);
+      buffer.add(io._Const.HTTP10);
     }
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(dart.toString(this.statusCode)[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(this.reasonPhrase[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(dart.toString(this.statusCode)[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(this.reasonPhrase[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
     let session = this[_httpRequest][_session];
     if (session != null && !dart.test(session[_destroyed])) {
       session[_isNew] = false;
@@ -41541,18 +42437,11 @@
       }, CookieToNull()));
     }
     this.headers[_finalize]();
-    offset = this.headers[_write](buffer, offset);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
-    this[_outgoing].setHeader(buffer, offset);
+    this.headers[_build](buffer);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
+    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+    this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
   }
   [_findReasonPhrase](statusCode) {
     if (this[_reasonPhrase] != null) {
@@ -41857,39 +42746,14 @@
     }
   }
   [_writeHeader]() {
-    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-    let offset = 0;
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
-    write(this.method[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(this[_requestUri]()[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(io._Const.HTTP11);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
+    let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
+    buffer.add(this.method[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(this[_requestUri]()[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(io._Const.HTTP11);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
     if (!dart.test(this.cookies[dartx.isEmpty])) {
       let sb = new core.StringBuffer();
       for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
@@ -41901,18 +42765,11 @@
       this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
     }
     this.headers[_finalize]();
-    offset = this.headers[_write](buffer, offset);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
-    this[_outgoing].setHeader(buffer, offset);
+    this.headers[_build](buffer);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
+    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+    this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
   }
 };
 dart.addSimpleTypeTests(io._HttpClientRequest);
@@ -41956,19 +42813,19 @@
     super.new();
   }
   add(chunk) {
-    dart.dcall(this[_consume], chunk);
+    this[_consume](chunk);
   }
   addSlice(chunk, start, end, isLast) {
     if (typed_data.Uint8List.is(chunk)) {
-      dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+      this[_consume](typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
     } else {
-      dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
+      this[_consume](chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
     }
   }
   close() {}
 };
 dart.setSignature(io._HttpGZipSink, {
-  fields: () => ({[_consume]: core.Function}),
+  fields: () => ({[_consume]: io._BytesConsumer}),
   methods: () => ({
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
@@ -41988,10 +42845,10 @@
 const _addChunk$ = Symbol('_addChunk');
 const _chunkHeader = Symbol('_chunkHeader');
 const _ignoreError = Symbol('_ignoreError');
-let const$68;
+let const$71;
 io._HttpOutgoing = class _HttpOutgoing extends core.Object {
   new(socket) {
-    this[_doneCompleter] = async.Completer.new();
+    this[_doneCompleter] = CompleterOfSocket().new();
     this.socket = socket;
     this.ignoreBody = false;
     this.headersWritten = false;
@@ -42013,16 +42870,6 @@
   writeHeaders(opts) {
     let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
     let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
-    const write = (function() {
-      try {
-        this.outbound[_writeHeader]();
-      } catch (_) {
-        return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
-      }
-
-      return null;
-    }).bind(this);
-    dart.fn(write, VoidToFuture());
     if (dart.test(this.headersWritten)) return null;
     this.headersWritten = true;
     let drainFuture = null;
@@ -42044,22 +42891,22 @@
     } else {
       drainRequest = false;
     }
-    if (dart.test(this.ignoreBody)) {
-      return write();
-    }
-    if (dart.test(setOutgoing)) {
-      let contentLength = this.outbound.headers.contentLength;
-      if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-        this.chunked = true;
-        if (gzip) this.gzip = true;
-      } else if (dart.notNull(contentLength) >= 0) {
-        this.contentLength = contentLength;
+    if (!dart.test(this.ignoreBody)) {
+      if (dart.test(setOutgoing)) {
+        let contentLength = this.outbound.headers.contentLength;
+        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+          this.chunked = true;
+          if (gzip) this.gzip = true;
+        } else if (dart.notNull(contentLength) >= 0) {
+          this.contentLength = contentLength;
+        }
+      }
+      if (drainFuture != null) {
+        return drainFuture.then(dart.void)(dart.fn(_ => this.outbound[_writeHeader](), dynamicTovoid$()));
       }
     }
-    if (drainFuture != null) {
-      return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
-    }
-    return write();
+    this.outbound[_writeHeader]();
+    return null;
   }
   addStream(stream) {
     if (dart.test(this[_socketError])) {
@@ -42076,10 +42923,10 @@
       return this.close();
     }
     let sub = null;
-    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
+    let controller = StreamControllerOfListOfint().new({onPause: dart.fn(() => sub.pause(), VoidTovoid$()), onResume: dart.fn(() => sub.resume(), VoidTovoid$()), sync: true});
     const onData = (function(data) {
       if (dart.test(this[_socketError])) return;
-      if (dart.equals(dart.dload(data, 'length'), 0)) return;
+      if (data[dartx.length] == 0) return;
       if (dart.test(this.chunked)) {
         if (dart.test(this[_gzip])) {
           this[_gzipAdd] = dart.bind(controller, 'add');
@@ -42087,28 +42934,28 @@
           this[_gzipAdd] = null;
           return;
         }
-        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+        this[_addChunk$](this[_chunkHeader](data[dartx.length]), dart.bind(controller, 'add'));
         this[_pendingChunkedFooter] = 2;
       } else {
         if (this.contentLength != null) {
-          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
+          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(data[dartx.length]);
           if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
-            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
+            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(data)}]`));
             return;
           }
         }
       }
       this[_addChunk$](data, dart.bind(controller, 'add'));
     }).bind(this);
-    dart.fn(onData, dynamicTovoid$());
+    dart.fn(onData, ListOfintTovoid());
     sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
     if (!dart.test(this.headersWritten)) {
       let future = this.writeHeaders();
       if (future != null) {
-        dart.dsend(sub, 'pause', future);
+        sub.pause(future);
       }
     }
-    return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+    return this.socket.addStream(controller.stream).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
         if (dart.test(this[_gzip])) this[_gzipSink].close();
         this[_socketError] = true;
         this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
@@ -42128,14 +42975,14 @@
         this.outbound.headers.chunkedTransferEncoding = false;
         this.outbound.headers.contentLength = 0;
       } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
-        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
+        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri$]});
         this[_doneCompleter].completeError(error);
         return this[_closeFuture] = async.Future.error(error);
       }
     }
     if (this.contentLength != null) {
       if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
-        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
+        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri$]});
         this[_doneCompleter].completeError(error);
         return this[_closeFuture] = async.Future.error(error);
       }
@@ -42181,7 +43028,6 @@
   }
   setHeader(data, length) {
     dart.assert(this[_length$2] == 0);
-    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
     this[_buffer$] = typed_data.Uint8List._check(data);
     this[_length$2] = length;
   }
@@ -42192,10 +43038,10 @@
       dart.assert(this[_gzipSink] == null);
       this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
         if (this[_gzipAdd] == null) return;
-        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
+        this[_addChunk$](this[_chunkHeader](data[dartx.length]), this[_gzipAdd]);
         this[_pendingChunkedFooter] = 2;
-        this[_addChunk$](data, _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
-      }, dynamicToNull$())));
+        this[_addChunk$](data, this[_gzipAdd]);
+      }, ListOfintToNull())));
     }
   }
   [_ignoreError](error) {
@@ -42203,19 +43049,19 @@
   }
   [_addGZipChunk](chunk, add) {
     if (!dart.test(this.outbound.bufferOutput)) {
-      add(ListOfint()._check(chunk));
+      add(chunk);
       return;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
+    if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])) {
       add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
       this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
       this[_gzipBufferLength] = 0;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-      add(ListOfint()._check(chunk));
+    if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+      add(chunk);
     } else {
-      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]), chunk);
+      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]);
     }
   }
   [_addChunk$](chunk, add) {
@@ -42225,23 +43071,23 @@
         this[_buffer$] = null;
         this[_length$2] = 0;
       }
-      add(ListOfint()._check(chunk));
+      add(chunk);
       return;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+    if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])) {
       add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
       this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
       this[_length$2] = 0;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-      add(ListOfint()._check(chunk));
+    if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+      add(chunk);
     } else {
-      this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+      this[_buffer$][dartx.setRange](this[_length$2], dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]), chunk);
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]);
     }
   }
   [_chunkHeader](length) {
-    let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+    let hexDigits = const$71 || (const$71 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
     if (length == 0) {
       if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
       return io._HttpOutgoing._chunk0Length;
@@ -42270,7 +43116,7 @@
 io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
 dart.setSignature(io._HttpOutgoing, {
   fields: () => ({
-    [_doneCompleter]: async.Completer,
+    [_doneCompleter]: CompleterOfSocket(),
     socket: io.Socket,
     ignoreBody: core.bool,
     headersWritten: core.bool,
@@ -42283,13 +43129,13 @@
     [_bytesWritten]: core.int,
     [_gzip]: core.bool,
     [_gzipSink]: convert.ByteConversionSink,
-    [_gzipAdd]: core.Function,
+    [_gzipAdd]: io._BytesConsumer,
     [_gzipBuffer]: typed_data.Uint8List,
     [_gzipBufferLength]: core.int,
     [_socketError]: core.bool,
     outbound: io._HttpOutboundMessage
   }),
-  getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+  getters: () => ({done: dart.definiteFunctionType(async.Future$(io.Socket), [])}),
   setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
   methods: () => ({
     writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
@@ -42297,8 +43143,8 @@
     close: dart.definiteFunctionType(async.Future, []),
     setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
     [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
-    [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
+    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
+    [_addChunk$]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
     [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
   })
 });
@@ -42406,7 +43252,7 @@
       }
     }
     this[_httpParser].isHead = method == "HEAD";
-    this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
+    this[_streamFuture] = outgoing.done.then(io.Socket)(dart.fn(s => {
       this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
       this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
         this[_currentUri] = null;
@@ -42449,13 +43295,13 @@
       }, dynamicAnddynamicToNull()));
       this[_subscription$].resume();
       return s;
-    }, dynamicTodynamic$()), {onError: dart.fn(e => {
+    }, SocketToSocket()), {onError: dart.fn(e => {
         this.destroy();
       }, dynamicToNull$())});
     return request;
   }
   detachSocket() {
-    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
+    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), SocketTo_DetachedSocket()));
   }
   destroy() {
     this.closed = true;
@@ -42465,12 +43311,12 @@
   close() {
     this.closed = true;
     this[_httpClient][_connectionClosed](this);
-    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
+    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), SocketTovoid()));
   }
   createProxyTunnel(host, port, proxy, callback) {
-    let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
-    if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
-      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
+    let request = this.send(core.Uri.new({host: host, port: port}), port, "CONNECT", proxy);
+    if (dart.test(proxy.isAuthenticated)) {
+      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
       request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
     }
     return request.close().then(io.SecureSocket)(dart.fn(response => {
@@ -42478,9 +43324,9 @@
         dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
       }
       let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
-      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
+      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: callback});
     }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
-      let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
+      let key = core.String._check(io._HttpClientConnection.makeKey(true, host, port));
       return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
     }, SecureSocketTo_HttpClientConnection()));
   }
@@ -42518,7 +43364,7 @@
     closed: core.bool,
     [_currentUri]: core.Uri,
     [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
-    [_streamFuture]: async.Future
+    [_streamFuture]: FutureOfSocket()
   }),
   getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
   methods: () => ({
@@ -42526,7 +43372,7 @@
     detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
     destroy: dart.definiteFunctionType(dart.void, []),
     close: dart.definiteFunctionType(dart.void, []),
-    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [core.String, core.int, io._Proxy, X509CertificateTobool()]),
     stopTimer: dart.definiteFunctionType(dart.void, []),
     startTimer: dart.definiteFunctionType(dart.void, [])
   }),
@@ -42620,11 +43466,11 @@
       return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
     }
     if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
-      let completer = async.Completer.new();
+      let completer = CompleterOf_ConnectionInfo().new();
       this[_pending$].add(dart.fn(() => {
-        this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
+        completer.complete(this.connect(uriHost, uriPort, proxy, client));
       }, VoidToNull()));
-      return FutureOf_ConnectionInfo()._check(completer.future);
+      return completer.future;
     }
     let currentBadCertificateCallback = client[_badCertificateCallback];
     function callback(certificate) {
@@ -42684,7 +43530,7 @@
 });
 io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
 const _idleTimeout = Symbol('_idleTimeout');
-let const$69;
+let const$72;
 const _connectionTargets = Symbol('_connectionTargets');
 const _credentials = Symbol('_credentials');
 const _closing = Symbol('_closing');
@@ -42692,7 +43538,7 @@
 const _findProxy = Symbol('_findProxy');
 const _openUrl = Symbol('_openUrl');
 const _closeConnections = Symbol('_closeConnections');
-let const$70;
+let const$73;
 const _getConnection = Symbol('_getConnection');
 io._HttpClient = class _HttpClient extends core.Object {
   get idleTimeout() {
@@ -42709,7 +43555,7 @@
     this[_authenticate] = null;
     this[_authenticateProxy] = null;
     this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-    this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
+    this[_idleTimeout] = const$72 || (const$72 = dart.const(new core.Duration({seconds: 15})));
     this[_badCertificateCallback] = null;
     this.maxConnectionsPerHost = null;
     this.autoUncompress = true;
@@ -42827,7 +43673,7 @@
     if (port == 0) {
       port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
     }
-    let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
+    let proxyConf = const$73 || (const$73 = dart.const(new io._ProxyConfiguration.direct()));
     if (this[_findProxy] != null) {
       try {
         proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
@@ -43123,7 +43969,7 @@
     }
 
     io._HttpConnection._connections[dartx._set](this[_serviceId], this);
-    this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
+    this[_httpParser].listenToStream(io.Socket.as(this[_socket]));
     this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
       this[_httpServer][_markActive](this);
       incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
@@ -43145,7 +43991,7 @@
         } else {
           this.destroy();
         }
-      }, dynamicToNull$()), {onError: dart.fn(_ => {
+      }, SocketToNull()), {onError: dart.fn(_ => {
           this.destroy();
         }, dynamicToNull$())});
       outgoing.ignoreBody = request.method == "HEAD";
@@ -43176,7 +44022,7 @@
     let detachedIncoming = this[_httpParser].detachIncoming();
     return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
       io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-      return new io._DetachedSocket(this[_socket], detachedIncoming);
+      return new io._DetachedSocket(io.Socket._check(this[_socket]), detachedIncoming);
     }, dynamicTo_DetachedSocket()));
   }
   get connectionInfo() {
@@ -43286,8 +44132,8 @@
 const _idleConnections = Symbol('_idleConnections');
 const _serverSocket = Symbol('_serverSocket');
 const _closeServer = Symbol('_closeServer');
-let const$71;
-let const$72;
+let const$74;
+let const$75;
 io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
   static bind(address, port, backlog, v6Only, shared) {
     return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
@@ -43310,7 +44156,7 @@
     this[_controller$0] = null;
     super.new();
     this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
+    this.idleTimeout = const$74 || (const$74 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     dart.dput(this[_serverSocket], _owner, this);
   }
@@ -43329,7 +44175,7 @@
     this[_controller$0] = null;
     super.new();
     this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
+    this.idleTimeout = const$75 || (const$75 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     try {
       dart.dput(this[_serverSocket], _owner, this);
@@ -43573,8 +44419,8 @@
   }),
   getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
 });
-let const$73;
-let const$74;
+let const$76;
+let const$77;
 io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
   new(configuration) {
     this.proxies = ListOf_Proxy().new();
@@ -43629,7 +44475,7 @@
     }, StringToNull()));
   }
   direct() {
-    this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
+    this.proxies = const$77 || (const$77 = dart.constList([const$76 || (const$76 = dart.const(new io._Proxy.direct()))], io._Proxy));
   }
 };
 dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
@@ -43681,61 +44527,61 @@
     return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get encoding() {
-    return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
+    return this[_socket].encoding;
   }
   set encoding(value) {
-    dart.dput(this[_socket], 'encoding', value);
+    this[_socket].encoding = value;
   }
   write(obj) {
-    dart.dsend(this[_socket], 'write', obj);
+    this[_socket].write(obj);
   }
   writeln(obj) {
     if (obj === void 0) obj = "";
-    dart.dsend(this[_socket], 'writeln', obj);
+    this[_socket].writeln(obj);
   }
   writeCharCode(charCode) {
-    dart.dsend(this[_socket], 'writeCharCode', charCode);
+    this[_socket].writeCharCode(charCode);
   }
   writeAll(objects, separator) {
     if (separator === void 0) separator = "";
-    dart.dsend(this[_socket], 'writeAll', objects, separator);
+    this[_socket].writeAll(objects, separator);
   }
   add(bytes) {
-    dart.dsend(this[_socket], 'add', bytes);
+    this[_socket].add(bytes);
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    return dart.dsend(this[_socket], 'addError', error, stackTrace);
+    return this[_socket].addError(error, stackTrace);
   }
   addStream(stream) {
-    return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
+    return this[_socket].addStream(stream);
   }
   destroy() {
-    dart.dsend(this[_socket], 'destroy');
+    this[_socket].destroy();
   }
   flush() {
-    return async.Future._check(dart.dsend(this[_socket], 'flush'));
+    return this[_socket].flush();
   }
   close() {
-    return async.Future._check(dart.dsend(this[_socket], 'close'));
+    return this[_socket].close();
   }
   get done() {
-    return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
+    return this[_socket].done;
   }
   get port() {
-    return core.int._check(dart.dload(this[_socket], 'port'));
+    return this[_socket].port;
   }
   get address() {
-    return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
+    return this[_socket].address;
   }
   get remoteAddress() {
-    return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
+    return this[_socket].remoteAddress;
   }
   get remotePort() {
-    return core.int._check(dart.dload(this[_socket], 'remotePort'));
+    return this[_socket].remotePort;
   }
   setOption(option, enabled) {
-    return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
+    return this[_socket].setOption(option, enabled);
   }
   [_toJSON$](ref) {
     return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
@@ -43749,7 +44595,7 @@
 dart.setSignature(io._DetachedSocket, {
   fields: () => ({
     [_incoming]: StreamOfListOfint(),
-    [_socket]: dart.dynamic
+    [_socket]: io.Socket
   }),
   getters: () => ({
     encoding: dart.definiteFunctionType(convert.Encoding, []),
@@ -43771,10 +44617,10 @@
     writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-    addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
+    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
     destroy: dart.definiteFunctionType(dart.void, []),
     flush: dart.definiteFunctionType(async.Future, []),
-    close: dart.definiteFunctionType(async.Future, []),
+    close: dart.definiteFunctionType(async.Future$(io.Socket), []),
     setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
     [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
   })
@@ -44215,23 +45061,21 @@
       this.subscription.onError(onError);
       this.subscription.onDone(onDone);
       if (this.bufferedData == null) {
-        return StreamSubscriptionOfListOfint()._check(((() => {
-          this.subscription.resume();
-          return this.subscription;
-        })()));
+        this.subscription.resume();
+        return this.subscription;
       }
-      let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
+      let _ = new io._HttpDetachedStreamSubscription(this.subscription, this.bufferedData, onData);
       _.resume();
       return _;
     } else {
-      return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      return StreamOfListOfint().fromIterable(JSArrayOfListOfint().of([this.bufferedData])).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
   }
 };
 dart.addSimpleTypeTests(io._HttpDetachedIncoming);
 dart.setSignature(io._HttpDetachedIncoming, {
   fields: () => ({
-    subscription: async.StreamSubscription,
+    subscription: StreamSubscriptionOfListOfint(),
     bufferedData: ListOfint()
   }),
   methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [_ChunkedConversionCallbackOfListOfint()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
@@ -44242,7 +45086,7 @@
 const _headerValue = Symbol('_headerValue');
 const _requestParser = Symbol('_requestParser');
 const _parserCalled = Symbol('_parserCalled');
-const _index$2 = Symbol('_index');
+const _index$1 = Symbol('_index');
 const _httpVersionIndex = Symbol('_httpVersionIndex');
 const _messageType = Symbol('_messageType');
 const _statusCodeLength = Symbol('_statusCodeLength');
@@ -44283,7 +45127,7 @@
     this[_requestParser] = requestParser;
     this[_parserCalled] = false;
     this[_buffer$] = null;
-    this[_index$2] = null;
+    this[_index$1] = null;
     this[_state$1] = null;
     this[_httpVersionIndex] = null;
     this[_messageType] = null;
@@ -44395,14 +45239,14 @@
     if (this[_state$1] == io._State.FAILURE) {
       dart.throw(new io.HttpException("Data on failed connection"));
     }
-    while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
+    while (this[_buffer$] != null && dart.notNull(this[_index$1]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
       if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
         this[_parserCalled] = false;
         return;
       }
       let byte = this[_buffer$][dartx._get]((() => {
-        let x = this[_index$2];
-        this[_index$2] = dart.notNull(x) + 1;
+        let x = this[_index$1];
+        this[_index$1] = dart.notNull(x) + 1;
         return x;
       })());
       switch (this[_state$1]) {
@@ -44583,7 +45427,7 @@
             this[_state$1] = io._State.HEADER_ENDING;
           } else if (byte == io._CharCode.LF) {
             this[_state$1] = io._State.HEADER_ENDING;
-            this[_index$2] = dart.notNull(this[_index$2]) - 1;
+            this[_index$1] = dart.notNull(this[_index$1]) - 1;
           } else {
             this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
             this[_state$1] = io._State.HEADER_FIELD;
@@ -44658,7 +45502,7 @@
               this[_state$1] = io._State.HEADER_ENDING;
             } else if (byte == io._CharCode.LF) {
               this[_state$1] = io._State.HEADER_ENDING;
-              this[_index$2] = dart.notNull(this[_index$2]) - 1;
+              this[_index$1] = dart.notNull(this[_index$1]) - 1;
             } else {
               this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
               this[_state$1] = io._State.HEADER_FIELD;
@@ -44732,17 +45576,17 @@
         }
         case io._State.BODY:
         {
-          this[_index$2] = dart.notNull(this[_index$2]) - 1;
-          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
+          this[_index$1] = dart.notNull(this[_index$1]) - 1;
+          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$1]);
           if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
             dataAvailable = this[_remainingContent];
           }
-          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
+          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$1]), dataAvailable);
           this[_bodyController].add(data);
           if (this[_remainingContent] != -1) {
             this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
           }
-          this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
+          this[_index$1] = dart.notNull(this[_index$1]) + dart.notNull(data[dartx.length]);
           if (this[_remainingContent] == 0) {
             if (!dart.test(this[_chunked])) {
               this[_reset]();
@@ -44766,7 +45610,7 @@
       }
     }
     this[_parserCalled] = false;
-    if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
+    if (this[_buffer$] != null && this[_index$1] == this[_buffer$][dartx.length]) {
       this[_releaseBuffer]();
       if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
         this[_socketSubscription].resume();
@@ -44777,7 +45621,7 @@
     this[_socketSubscription].pause();
     dart.assert(this[_buffer$] == null);
     this[_buffer$] = typed_data.Uint8List._check(buffer);
-    this[_index$2] = 0;
+    this[_index$1] = 0;
     this[_parse]();
   }
   [_onDone$]() {
@@ -44850,8 +45694,8 @@
   }
   readUnparsedData() {
     if (this[_buffer$] == null) return null;
-    if (this[_index$2] == this[_buffer$][dartx.length]) return null;
-    let result = this[_buffer$][dartx.sublist](this[_index$2]);
+    if (this[_index$1] == this[_buffer$][dartx.length]) return null;
+    let result = this[_buffer$][dartx.sublist](this[_index$1]);
     this[_releaseBuffer]();
     return result;
   }
@@ -44876,7 +45720,7 @@
   }
   [_releaseBuffer]() {
     this[_buffer$] = null;
-    this[_index$2] = null;
+    this[_index$1] = null;
   }
   static _isTokenChar(byte) {
     return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
@@ -44996,7 +45840,7 @@
   fields: () => ({
     [_parserCalled]: core.bool,
     [_buffer$]: typed_data.Uint8List,
-    [_index$2]: core.int,
+    [_index$1]: core.int,
     [_requestParser]: core.bool,
     [_state$1]: core.int,
     [_httpVersionIndex]: core.int,
@@ -45016,7 +45860,7 @@
     [_remainingContent]: core.int,
     [_headers]: io._HttpHeaders,
     [_incoming]: io._HttpIncoming,
-    [_socketSubscription]: async.StreamSubscription,
+    [_socketSubscription]: StreamSubscriptionOfListOfint(),
     [_paused]: core.bool,
     [_bodyPaused]: core.bool,
     [_controller$0]: StreamControllerOf_HttpIncoming(),
@@ -45059,7 +45903,7 @@
   names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
 });
 io._DART_SESSION_ID = "DARTSESSID";
-const _data$ = Symbol('_data');
+const _data$0 = Symbol('_data');
 const _lastSeen = Symbol('_lastSeen');
 const _timeoutCallback = Symbol('_timeoutCallback');
 const _prev = Symbol('_prev');
@@ -45069,7 +45913,7 @@
 const _bumpToEnd = Symbol('_bumpToEnd');
 io._HttpSession = class _HttpSession extends core.Object {
   new(sessionManager, id) {
-    this[_data$] = collection.HashMap.new();
+    this[_data$0] = collection.HashMap.new();
     this[_sessionManager] = sessionManager;
     this.id = id;
     this[_lastSeen] = new core.DateTime.now();
@@ -45098,50 +45942,50 @@
     this[_timeoutCallback] = callback;
   }
   containsValue(value) {
-    return this[_data$][dartx.containsValue](value);
+    return this[_data$0][dartx.containsValue](value);
   }
   containsKey(key) {
-    return this[_data$][dartx.containsKey](key);
+    return this[_data$0][dartx.containsKey](key);
   }
   _get(key) {
-    return this[_data$][dartx._get](key);
+    return this[_data$0][dartx._get](key);
   }
   _set(key, value) {
-    this[_data$][dartx._set](key, value);
+    this[_data$0][dartx._set](key, value);
     return value;
   }
   putIfAbsent(key, ifAbsent) {
-    return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+    return this[_data$0][dartx.putIfAbsent](key, ifAbsent);
   }
   addAll(other) {
-    return this[_data$][dartx.addAll](other);
+    return this[_data$0][dartx.addAll](other);
   }
   remove(key) {
-    return this[_data$][dartx.remove](key);
+    return this[_data$0][dartx.remove](key);
   }
   clear() {
-    this[_data$][dartx.clear]();
+    this[_data$0][dartx.clear]();
   }
   forEach(f) {
-    this[_data$][dartx.forEach](f);
+    this[_data$0][dartx.forEach](f);
   }
   get keys() {
-    return this[_data$][dartx.keys];
+    return this[_data$0][dartx.keys];
   }
   get values() {
-    return this[_data$][dartx.values];
+    return this[_data$0][dartx.values];
   }
   get length() {
-    return this[_data$][dartx.length];
+    return this[_data$0][dartx.length];
   }
   get isEmpty() {
-    return this[_data$][dartx.isEmpty];
+    return this[_data$0][dartx.isEmpty];
   }
   get isNotEmpty() {
-    return this[_data$][dartx.isNotEmpty];
+    return this[_data$0][dartx.isNotEmpty];
   }
   toString() {
-    return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+    return dart.str`HttpSession id:${this.id} ${this[_data$0]}`;
   }
 };
 io._HttpSession[dart.implements] = () => [io.HttpSession];
@@ -45155,7 +45999,7 @@
     [_prev]: io._HttpSession,
     [_next$1]: io._HttpSession,
     id: core.String,
-    [_data$]: core.Map
+    [_data$0]: core.Map
   }),
   getters: () => ({
     lastSeen: dart.definiteFunctionType(core.DateTime, []),
@@ -45326,7 +46170,7 @@
     this.id = io._IOResourceInfo.getNextID();
   }
   get referenceValueMap() {
-    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
+    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.Object);
   }
   static getNextID() {
     return (() => {
@@ -45341,7 +46185,7 @@
     type: core.String,
     id: core.int
   }),
-  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
   names: ['getNextID']
 });
@@ -45382,7 +46226,7 @@
     super.new(type);
   }
   get fullValueMap() {
-    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
+    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.Object);
   }
 };
 dart.setSignature(io._ReadWriteResourceInfo, {
@@ -45394,7 +46238,7 @@
     lastRead: core.double,
     lastWrite: core.double
   }),
-  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   methods: () => ({
     addRead: dart.definiteFunctionType(dart.void, [core.int]),
     didRead: dart.definiteFunctionType(dart.void, []),
@@ -45416,7 +46260,7 @@
     io._FileResourceInfo.openFiles[dartx.remove](info.id);
   }
   static getOpenFilesList() {
-    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$dynamic())));
   }
   static getOpenFiles(func, params) {
     dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
@@ -45425,8 +46269,7 @@
     return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
   }
   getFileInfoMap() {
-    let result = this.fullValueMap;
-    return result;
+    return this.fullValueMap;
   }
   static getFileInfoMapByID(func, params) {
     dart.assert(dart.dsend(params, 'containsKey', 'id'));
@@ -45442,7 +46285,7 @@
 dart.setSignature(io._FileResourceInfo, {
   fields: () => ({file: dart.dynamic}),
   getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({
     FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
     FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
@@ -45469,13 +46312,13 @@
     io._ProcessResourceInfo.ProcessStarted(this);
   }
   get name() {
-    return core.String._check(dart.dload(this.process, _path$));
+    return core.String._check(dart.dload(this.process, _path));
   }
   stopped() {
     io._ProcessResourceInfo.ProcessStopped(this);
   }
   get fullValueMap() {
-    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+    return dart.map({type: this.type, id: this.id, name: this.name, pid: dart.dload(this.process, 'pid'), startedAt: this.startedAt, arguments: dart.dload(this.process, _arguments$0), workingDirectory: dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory)}, core.String, core.Object);
   }
   static ProcessStarted(info) {
     dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
@@ -45486,7 +46329,7 @@
     io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
   }
   static getStartedProcessesList() {
-    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$dynamic())));
   }
   static getStartedProcesses(func, params) {
     dart.assert(func == 'ext.dart.io.getProcesses');
@@ -45508,7 +46351,7 @@
   }),
   getters: () => ({
     name: dart.definiteFunctionType(core.String, []),
-    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])
   }),
   methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
   statics: () => ({
@@ -45548,18 +46391,18 @@
     return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
   }
   static getOpenSocketsList() {
-    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$dynamic())));
   }
   getSocketInfoMap() {
     let result = this.fullValueMap;
     result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
-    result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
-    result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
-    result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
+    result[dartx._set]('listening', dart.dload(this.socket, 'isListening'));
+    result[dartx._set]('host', dart.dload(dart.dload(this.socket, 'address'), 'host'));
+    result[dartx._set]('port', dart.dload(this.socket, 'port'));
     if (!dart.test(dart.dload(this.socket, 'isListening'))) {
       try {
-        result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
-        result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
+        result[dartx._set]('remoteHost', dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host'));
+        result[dartx._set]('remotePort', dart.dload(this.socket, 'remotePort'));
       } catch (e) {
         result[dartx._set]('remotePort', 'NA');
         result[dartx._set]('remoteHost', 'NA');
@@ -45569,7 +46412,7 @@
       result[dartx._set]('remotePort', 'NA');
       result[dartx._set]('remoteHost', 'NA');
     }
-    result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
+    result[dartx._set]('addressType', dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name'));
     return result;
   }
   static getSocketInfoMapByID(func, params) {
@@ -45597,7 +46440,7 @@
 dart.setSignature(io._SocketResourceInfo, {
   fields: () => ({socket: dart.dynamic}),
   getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({
     getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
     getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
@@ -45639,33 +46482,36 @@
 io._FILE_TRUNCATE = 10;
 io._FILE_LENGTH = 11;
 io._FILE_LENGTH_FROM_PATH = 12;
-io._FILE_LAST_MODIFIED = 13;
-io._FILE_FLUSH = 14;
-io._FILE_READ_BYTE = 15;
-io._FILE_WRITE_BYTE = 16;
-io._FILE_READ = 17;
-io._FILE_READ_INTO = 18;
-io._FILE_WRITE_FROM = 19;
-io._FILE_CREATE_LINK = 20;
-io._FILE_DELETE_LINK = 21;
-io._FILE_RENAME_LINK = 22;
-io._FILE_LINK_TARGET = 23;
-io._FILE_TYPE = 24;
-io._FILE_IDENTICAL = 25;
-io._FILE_STAT = 26;
-io._FILE_LOCK = 27;
-io._SOCKET_LOOKUP = 28;
-io._SOCKET_LIST_INTERFACES = 29;
-io._SOCKET_REVERSE_LOOKUP = 30;
-io._DIRECTORY_CREATE = 31;
-io._DIRECTORY_DELETE = 32;
-io._DIRECTORY_EXISTS = 33;
-io._DIRECTORY_CREATE_TEMP = 34;
-io._DIRECTORY_LIST_START = 35;
-io._DIRECTORY_LIST_NEXT = 36;
-io._DIRECTORY_LIST_STOP = 37;
-io._DIRECTORY_RENAME = 38;
-io._SSL_PROCESS_FILTER = 39;
+io._FILE_LAST_ACCESSED = 13;
+io._FILE_SET_LAST_ACCESSED = 14;
+io._FILE_LAST_MODIFIED = 15;
+io._FILE_SET_LAST_MODIFIED = 16;
+io._FILE_FLUSH = 17;
+io._FILE_READ_BYTE = 18;
+io._FILE_WRITE_BYTE = 19;
+io._FILE_READ = 20;
+io._FILE_READ_INTO = 21;
+io._FILE_WRITE_FROM = 22;
+io._FILE_CREATE_LINK = 23;
+io._FILE_DELETE_LINK = 24;
+io._FILE_RENAME_LINK = 25;
+io._FILE_LINK_TARGET = 26;
+io._FILE_TYPE = 27;
+io._FILE_IDENTICAL = 28;
+io._FILE_STAT = 29;
+io._FILE_LOCK = 30;
+io._SOCKET_LOOKUP = 31;
+io._SOCKET_LIST_INTERFACES = 32;
+io._SOCKET_REVERSE_LOOKUP = 33;
+io._DIRECTORY_CREATE = 34;
+io._DIRECTORY_DELETE = 35;
+io._DIRECTORY_EXISTS = 36;
+io._DIRECTORY_CREATE_TEMP = 37;
+io._DIRECTORY_LIST_START = 38;
+io._DIRECTORY_LIST_NEXT = 39;
+io._DIRECTORY_LIST_STOP = 40;
+io._DIRECTORY_RENAME = 41;
+io._SSL_PROCESS_FILTER = 42;
 io._IOService = class _IOService extends core.Object {
   static _dispatch(request, data) {
     dart.throw(new core.UnsupportedError("_IOService._dispatch"));
@@ -45705,12 +46551,6 @@
   get absolute() {
     return io.Link.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
   create(target, opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     if (dart.test(io.Platform.isWindows)) {
@@ -45834,8 +46674,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
     create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
     [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
@@ -45921,6 +46759,9 @@
   },
   get isIOS() {
     return io.Platform._operatingSystem == "ios";
+  },
+  get isFuchsia() {
+    return io.Platform._operatingSystem == "fuchsia";
   }
 });
 io._Platform = class _Platform extends core.Object {
@@ -45982,14 +46823,17 @@
       let env = io._Platform._environment();
       if (!io.OSError.is(env)) {
         let isWindows = io._Platform.operatingSystem == 'windows';
-        let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
+        let result = isWindows ? new (_CaseInsensitiveStringMapOfString())() : MapOfString$String().new();
         for (let str of core.Iterable._check(env)) {
+          if (str == null) {
+            continue;
+          }
           let equalsIndex = dart.dsend(str, 'indexOf', '=');
           if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
-            result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
+            result[dartx._set](core.String._check(dart.dsend(str, 'substring', 0, equalsIndex)), core.String._check(dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1))));
           }
         }
-        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
+        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(result);
       } else {
         io._Platform._environmentCache = env;
       }
@@ -45997,7 +46841,7 @@
     if (io.OSError.is(io._Platform._environmentCache)) {
       dart.throw(io._Platform._environmentCache);
     } else {
-      return MapOfString$String()._check(io._Platform._environmentCache);
+      return MapOfString$String().as(io._Platform._environmentCache);
     }
   }
   static get version() {
@@ -46045,6 +46889,7 @@
   let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
+  let StringAndVToV = () => (StringAndVToV = dart.constFn(dart.definiteFunctionType(V, [core.String, V])))();
   class _CaseInsensitiveStringMap extends core.Object {
     new() {
       this[_map$1] = MapOfString$V().new();
@@ -46068,7 +46913,8 @@
       return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
     }
     addAll(other) {
-      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
+      MapOfString$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => this._set(key[dartx.toUpperCase](), value), StringAndVToV()));
     }
     remove(key) {
       return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
@@ -46115,7 +46961,7 @@
       _get: dart.definiteFunctionType(V, [core.Object]),
       _set: dart.definiteFunctionType(dart.void, [core.String, V]),
       putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
-      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfString$V()]),
       remove: dart.definiteFunctionType(V, [core.Object]),
       clear: dart.definiteFunctionType(dart.void, []),
       forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
@@ -46223,9 +47069,6 @@
   'DETACHED_WITH_STDIO'
 ]);
 io.Process = class Process extends core.Object {
-  new() {
-    this.exitCode = null;
-  }
   static start(executable, arguments$, opts) {
     let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
     let environment = opts && 'environment' in opts ? opts.environment : null;
@@ -46258,7 +47101,6 @@
   }
 };
 dart.setSignature(io.Process, {
-  fields: () => ({exitCode: FutureOfint()}),
   statics: () => ({
     start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
     run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
@@ -46454,22 +47296,14 @@
     let host = opts && 'host' in opts ? opts.host : null;
     let context = opts && 'context' in opts ? opts.context : null;
     let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-    let completer = async.Completer.new();
-    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull$()));
-    return FutureOfSecureSocket()._check(completer.future);
+    return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket.as(dart.dindex(detachedRaw, 0)), {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
   }
   static secureServer(socket, context, opts) {
     let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
     let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
     let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
     let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-    let completer = async.Completer.new();
-    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull$()));
-    return FutureOfSecureSocket()._check(completer.future);
+    return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket.as(dart.dindex(detachedRaw, 0)), context, {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
   }
 };
 io.SecureSocket[dart.implements] = () => [io.Socket];
@@ -46565,8 +47399,8 @@
 dart.setSignature(io.RawSecureSocket, {
   statics: () => ({
     connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: StreamSubscriptionOfRawSocketEvent(), host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
   }),
   names: ['connect', 'secure', 'secureServer']
 });
@@ -46737,13 +47571,13 @@
 const _pushAllFilterStages = Symbol('_pushAllFilterStages');
 const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
 const _sendReadEvent = Symbol('_sendReadEvent');
-let const$75;
+let const$78;
 io.RawSocketEvent = class RawSocketEvent extends core.Object {
   _(value) {
     this[_value$1] = value;
   }
   toString() {
-    return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
+    return (const$78 || (const$78 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
   }
 };
 dart.defineNamedConstructor(io.RawSocketEvent, '_');
@@ -46784,12 +47618,12 @@
     if (host != null) {
       address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
     }
-    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, subscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
   }
   new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
     this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
     this[_status] = io._RawSecureSocket.HANDSHAKE;
-    this[_closeCompleter] = async.Completer.new();
+    this[_closeCompleter] = CompleterOfRawSecureSocket().new();
     this[_filterStatus] = new io._FilterStatus();
     this[_secureFilter] = io._SecureFilter.new();
     this.address = address;
@@ -46899,7 +47733,7 @@
   }
   close() {
     this.shutdown(io.SocketDirection.BOTH);
-    return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+    return this[_closeCompleter].future;
   }
   [_completeCloseCompleter](dummy) {
     if (dummy === void 0) dummy = null;
@@ -47345,7 +48179,7 @@
     [_socketClosedWrite]: core.bool,
     [_closedRead]: core.bool,
     [_closedWrite]: core.bool,
-    [_closeCompleter]: async.Completer,
+    [_closeCompleter]: CompleterOfRawSecureSocket(),
     [_filterStatus]: io._FilterStatus,
     [_connectPending]: core.bool,
     [_filterPending]: core.bool,
@@ -47371,7 +48205,7 @@
     listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     available: dart.definiteFunctionType(core.int, []),
     close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
-    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [io.RawSocket]),
     [_close$0]: dart.definiteFunctionType(dart.void, []),
     shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
     read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
@@ -47401,7 +48235,7 @@
   }),
   statics: () => ({
     _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
-    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
     _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
   }),
   names: ['_isBufferEncrypted', 'connect', '_verifyFields']
@@ -47507,7 +48341,7 @@
     while (true) {
       let toWrite = this.linearLength;
       if (toWrite == 0) return false;
-      let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
+      let bytes = socket.write(this.data, this.start, toWrite);
       this.advanceStart(bytes);
       if (dart.notNull(bytes) < dart.notNull(toWrite)) {
         return true;
@@ -47517,7 +48351,7 @@
 };
 dart.setSignature(io._ExternalBuffer, {
   fields: () => ({
-    data: core.List,
+    data: ListOfint(),
     start: core.int,
     end: core.int,
     size: dart.dynamic
@@ -47981,7 +48815,7 @@
     let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
     let CR = 13;
     let LF = 10;
-    let line = [];
+    let line = JSArrayOfint().of([]);
     let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
     if (dart.test(retainNewlines)) {
       let byte = null;
@@ -48024,7 +48858,7 @@
           line[dartx.add](byte);
         }
     }
-    return encoding.decode(ListOfint()._check(line));
+    return encoding.decode(line);
   }
   set echoMode(enabled) {
     dart.throw(new core.UnsupportedError("Stdin.echoMode"));
@@ -48061,9 +48895,11 @@
 const _hasTerminal = Symbol('_hasTerminal');
 const _terminalColumns = Symbol('_terminalColumns');
 const _terminalLines = Symbol('_terminalLines');
-io._StdSink = class _StdSink extends core.Object {
-  new(sink) {
+const _isTranslatable = Symbol('_isTranslatable');
+io._StdSinkHelper = class _StdSinkHelper extends core.Object {
+  new(sink, isTranslatable) {
     this[_sink$0] = sink;
+    this[_isTranslatable] = isTranslatable;
   }
   get encoding() {
     return this[_sink$0].encoding;
@@ -48071,18 +48907,29 @@
   set encoding(encoding) {
     this[_sink$0].encoding = encoding;
   }
+  set [_translation](t) {
+    if (dart.test(this[_isTranslatable])) {
+      let sink = io._IOSinkImpl._check(this[_sink$0]);
+      let target = io._StdConsumer._check(sink[_target$]);
+      dart.dput(target[_file], 'translation', t);
+    }
+  }
   write(object) {
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].write(object);
   }
   writeln(object) {
     if (object === void 0) object = "";
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeln(object);
   }
   writeAll(objects, sep) {
     if (sep === void 0) sep = "";
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeAll(objects, sep);
   }
   add(data) {
+    this[_translation] = io._FileTranslation.binary;
     this[_sink$0].add(data);
   }
   addError(error, stackTrace) {
@@ -48090,9 +48937,11 @@
     this[_sink$0].addError(error, stackTrace);
   }
   writeCharCode(charCode) {
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeCharCode(charCode);
   }
   addStream(stream) {
+    this[_translation] = io._FileTranslation.binary;
     return this[_sink$0].addStream(stream);
   }
   flush() {
@@ -48105,14 +48954,20 @@
     return this[_sink$0].done;
   }
 };
-io._StdSink[dart.implements] = () => [io.IOSink];
-dart.setSignature(io._StdSink, {
-  fields: () => ({[_sink$0]: io.IOSink}),
+io._StdSinkHelper[dart.implements] = () => [io.IOSink];
+dart.setSignature(io._StdSinkHelper, {
+  fields: () => ({
+    [_sink$0]: io.IOSink,
+    [_isTranslatable]: core.bool
+  }),
   getters: () => ({
     encoding: dart.definiteFunctionType(convert.Encoding, []),
     done: dart.definiteFunctionType(async.Future, [])
   }),
-  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+  setters: () => ({
+    encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
+    [_translation]: dart.definiteFunctionType(dart.void, [io._FileTranslation])
+  }),
   methods: () => ({
     write: dart.definiteFunctionType(dart.void, [core.Object]),
     writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
@@ -48125,7 +48980,12 @@
     close: dart.definiteFunctionType(async.Future, [])
   })
 });
-io.Stdout = class Stdout extends io._StdSink {
+io._StdFileSink = class _StdFileSink extends io._StdSinkHelper {
+  new(sink) {
+    super.new(sink, true);
+  }
+};
+io.Stdout = class Stdout extends io._StdFileSink {
   _(sink, fd) {
     this[_fd] = fd;
     this[_nonBlocking] = null;
@@ -48192,6 +49052,23 @@
     osError: io.OSError
   })
 });
+io.StdinException = class StdinException extends core.Object {
+  new(message, osError) {
+    if (osError === void 0) osError = null;
+    this.message = message;
+    this.osError = osError;
+  }
+  toString() {
+    return dart.str`StdinException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
+  }
+};
+io.StdinException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.StdinException, {
+  fields: () => ({
+    message: core.String,
+    osError: io.OSError
+  })
+});
 io._StdConsumer = class _StdConsumer extends core.Object {
   new(fd) {
     this[_file] = io._File._openStdioSync(fd);
@@ -48224,6 +49101,11 @@
     close: dart.definiteFunctionType(async.Future, [])
   })
 });
+io._StdSocketSink = class _StdSocketSink extends io._StdSinkHelper {
+  new(sink) {
+    super.new(sink, false);
+  }
+};
 io.StdioType = class StdioType extends core.Object {
   _(name) {
     this.name = name;
@@ -48352,10 +49234,10 @@
   }),
   names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
 });
-let const$76;
-let const$77;
-let const$78;
 let const$79;
+let const$80;
+let const$81;
+let const$82;
 io.SystemEncoding = class SystemEncoding extends convert.Encoding {
   new() {
     super.new();
@@ -48371,16 +49253,16 @@
   }
   get encoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+      return const$79 || (const$79 = dart.const(new io._WindowsCodePageEncoder()));
     } else {
-      return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
+      return const$80 || (const$80 = dart.const(new convert.Utf8Encoder()));
     }
   }
   get decoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+      return const$81 || (const$81 = dart.const(new io._WindowsCodePageDecoder()));
     } else {
-      return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
+      return const$82 || (const$82 = dart.const(new convert.Utf8Decoder()));
     }
   }
 };
@@ -48411,6 +49293,7 @@
   }
 };
 dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
+io._WindowsCodePageEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(io._WindowsCodePageEncoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
@@ -48463,6 +49346,7 @@
   }
 };
 dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
+io._WindowsCodePageDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(io._WindowsCodePageDecoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.String, [ListOfint()]),
@@ -48691,6 +49575,14 @@
 io._WebSocketOpcode.RESERVED_D = 13;
 io._WebSocketOpcode.RESERVED_E = 14;
 io._WebSocketOpcode.RESERVED_F = 15;
+io._EncodedString = class _EncodedString extends core.Object {
+  new(bytes) {
+    this.bytes = bytes;
+  }
+};
+dart.setSignature(io._EncodedString, {
+  fields: () => ({bytes: ListOfint()})
+});
 io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
   new(headerValue, maxWindowBits) {
     if (headerValue === void 0) headerValue = null;
@@ -49030,7 +49922,7 @@
     this[_unmaskingIndex] = 0;
   }
 };
-io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
+io._WebSocketProtocolTransformer[dart.implements] = () => [EventSinkOfListOfint(), StreamTransformerOfListOfint$dynamic()];
 dart.setSignature(io._WebSocketProtocolTransformer, {
   fields: () => ({
     [_state$1]: core.int,
@@ -49053,7 +49945,7 @@
     [_deflate]: io._WebSocketPerMessageDeflate
   }),
   methods: () => ({
-    bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
+    bind: dart.definiteFunctionType(async.Stream, [StreamOfListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
     close: dart.definiteFunctionType(dart.void, []),
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
@@ -49097,6 +49989,7 @@
 dart.setSignature(io._WebSocketPong, {
   fields: () => ({payload: ListOfint()})
 });
+io._ProtocolSelector = dart.typedef('_ProtocolSelector', () => dart.functionType(dart.dynamic, [ListOfString()]));
 const _protocolSelector = Symbol('_protocolSelector');
 const _compression = Symbol('_compression');
 io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
@@ -49134,24 +50027,24 @@
       }
       let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
       response.headers.contentLength = 0;
-      return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
+      return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
     }
-    dart.fn(upgrade, StringToFuture());
+    dart.fn(upgrade, StringToFutureOfWebSocket());
     let protocols = request.headers._get('Sec-WebSocket-Protocol');
     if (protocols != null && _protocolSelector != null) {
       protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
-        if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
+      return FutureOfString().new(dart.fn(() => _protocolSelector(protocols), VoidTodynamic$())).then(core.String)(dart.fn(protocol => {
+        if (dart.notNull(protocols[dartx.indexOf](protocol)) < 0) {
           dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
         }
         return protocol;
-      }, dynamicTodynamic$())).catchError(dart.fn(error => {
+      }, StringToString$())).catchError(dart.fn(error => {
         response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
         response.close();
         dart.throw(error);
       }, dynamicToNull$())).then(io.WebSocket)(upgrade);
     } else {
-      return FutureOfWebSocket()._check(upgrade(null));
+      return upgrade(null);
     }
   }
   static _negotiateCompression(request, response, compression) {
@@ -49200,12 +50093,12 @@
 dart.setSignature(io._WebSocketTransformerImpl, {
   fields: () => ({
     [_controller$0]: StreamControllerOfWebSocket(),
-    [_protocolSelector]: core.Function,
+    [_protocolSelector]: io._ProtocolSelector,
     [_compression]: io.CompressionOptions
   }),
   methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
   statics: () => ({
-    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
+    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, io._ProtocolSelector, io.CompressionOptions]),
     _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
     _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
   }),
@@ -49213,7 +50106,7 @@
 });
 const _ensureDecoder = Symbol('_ensureDecoder');
 const _ensureEncoder = Symbol('_ensureEncoder');
-let const$80;
+let const$83;
 io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
   new(opts) {
     let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
@@ -49241,25 +50134,24 @@
   }
   processIncomingMessage(msg) {
     this[_ensureDecoder]();
-    let data = [];
+    let data = JSArrayOfint().of([]);
     data[dartx.addAll](msg);
-    data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
-    this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
-    let result = [];
+    data[dartx.addAll](const$83 || (const$83 = dart.constList([0, 0, 255, 255], core.int)));
+    this.decoder.process(data, 0, data[dartx.length]);
+    let result = JSArrayOfint().of([]);
     let out = null;
     while ((out = this.decoder.processed()) != null) {
-      result[dartx.addAll](core.Iterable._check(out));
+      result[dartx.addAll](out);
     }
     if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.decoder = null;
     }
-    return typed_data.Uint8List.fromList(ListOfint()._check(result));
+    return typed_data.Uint8List.fromList(result);
   }
   processOutgoingMessage(msg) {
     this[_ensureEncoder]();
-    let result = [];
+    let result = JSArrayOfint().of([]);
     let buffer = null;
-    let out = null;
     if (!typed_data.Uint8List.is(msg)) {
       for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
         if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
@@ -49271,8 +50163,9 @@
       buffer = typed_data.Uint8List._check(msg);
     }
     this.encoder.process(buffer, 0, buffer[dartx.length]);
+    let out = null;
     while ((out = this.encoder.processed()) != null) {
-      result[dartx.addAll](core.Iterable._check(out));
+      result[dartx.addAll](out);
     }
     if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.encoder = null;
@@ -49280,7 +50173,7 @@
     if (dart.notNull(result[dartx.length]) > 4) {
       result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
     }
-    return ListOfint()._check(result);
+    return result;
   }
 };
 dart.setSignature(io._WebSocketPerMessageDeflate, {
@@ -49334,13 +50227,14 @@
       if (typeof message == 'string') {
         opcode = io._WebSocketOpcode.TEXT;
         data = convert.UTF8.encode(message);
+      } else if (ListOfint().is(message)) {
+        opcode = io._WebSocketOpcode.BINARY;
+        data = message;
+      } else if (io._EncodedString.is(message)) {
+        opcode = io._WebSocketOpcode.TEXT;
+        data = message.bytes;
       } else {
-        if (ListOfint().is(message)) {
-          data = message;
-          opcode = io._WebSocketOpcode.BINARY;
-        } else {
-          dart.throw(new core.ArgumentError(message));
-        }
+        dart.throw(new core.ArgumentError(message));
       }
       if (this[_deflateHelper] != null) {
         data = this[_deflateHelper].processOutgoingMessage(data);
@@ -49370,7 +50264,7 @@
     this[_eventSink$].close();
   }
   addFrame(opcode, data) {
-    return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
+    io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
       this[_eventSink$].add(e);
     }, ListOfintToNull()));
   }
@@ -49562,7 +50456,7 @@
     this[_ensureController]();
     const closeSocket = (function() {
       return this.socket.close().catchError(dart.fn(_ => {
-      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, SocketTo_WebSocketImpl()));
     }).bind(this);
     dart.fn(closeSocket, VoidToFuture());
     this[_controller$0].close();
@@ -49612,7 +50506,7 @@
 const _pingTimer = Symbol('_pingTimer');
 const _consumer = Symbol('_consumer');
 const _closeTimer = Symbol('_closeTimer');
-let const$81;
+let const$84;
 io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
   static connect(url, protocols, headers, opts) {
     let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
@@ -49809,6 +50703,12 @@
   add(data) {
     this[_sink$0].add(data);
   }
+  addUtf8Text(bytes) {
+    if (!ListOfint().is(bytes)) {
+      dart.throw(new core.ArgumentError.value(bytes, "bytes", "Is not a list of bytes"));
+    }
+    this[_sink$0].add(new io._EncodedString(bytes));
+  }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
     this[_sink$0].addError(error, stackTrace);
@@ -49834,7 +50734,7 @@
         this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
       }
       if (this[_closeTimer] == null) {
-        this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
+        this[_closeTimer] = async.Timer.new(const$84 || (const$84 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
           if (this[_subscription$] != null) this[_subscription$].cancel();
@@ -49918,6 +50818,7 @@
   methods: () => ({
     listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    addUtf8Text: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
     addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
     close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
@@ -49942,7 +50843,7 @@
     return io.HttpClient.new();
   }
 });
-isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
+isolate$.IsolateSpawnException = class IsolateSpawnException extends core.Object {
   new(message) {
     this.message = message;
   }
@@ -49950,12 +50851,12 @@
     return dart.str`IsolateSpawnException: ${this.message}`;
   }
 };
-isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
-dart.setSignature(isolate.IsolateSpawnException, {
+isolate$.IsolateSpawnException[dart.implements] = () => [core.Exception];
+dart.setSignature(isolate$.IsolateSpawnException, {
   fields: () => ({message: core.String})
 });
 const _pause = Symbol('_pause');
-isolate.Isolate = class Isolate extends core.Object {
+isolate$.Isolate = class Isolate extends core.Object {
   new(controlPort, opts) {
     let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
     let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
@@ -49964,12 +50865,48 @@
     this.terminateCapability = terminateCapability;
   }
   static get current() {
-    return isolate.Isolate._currentIsolateCache;
+    return isolate$.Isolate._currentIsolateCache;
+  }
+  static get packageRoot() {
+    dart.throw(new core.UnsupportedError("Isolate.packageRoot"));
+  }
+  static get packageConfig() {
+    dart.throw(new core.UnsupportedError("Isolate.packageConfig"));
+  }
+  static resolvePackageUri(packageUri) {
+    return dart.async(function*(packageUri) {
+      if (packageUri.scheme != 'package') return packageUri;
+      return isolate$.Isolate._packageBase.resolveUri(packageUri.replace({scheme: ''}));
+    }, core.Uri, packageUri);
   }
   static spawn(entryPoint, message, opts) {
     let paused = opts && 'paused' in opts ? opts.paused : false;
+    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let forcePause = errorsAreFatal != null || onExit != null || onError != null;
     try {
-      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+      if (!isolate$._UnaryFunction.is(entryPoint)) {
+        dart.throw(new core.ArgumentError(entryPoint));
+      }
+      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+        let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!dart.test(paused)) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      }, ListToIsolate()));
     } catch (e) {
       let st = dart.stackTrace(e);
       return FutureOfIsolate().error(e, st);
@@ -49978,10 +50915,20 @@
   }
   static spawnUri(uri, args, message, opts) {
     let paused = opts && 'paused' in opts ? opts.paused : false;
+    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+    let checked = opts && 'checked' in opts ? opts.checked : null;
+    let environment = opts && 'environment' in opts ? opts.environment : null;
     let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
+    let packageConfig = opts && 'packageConfig' in opts ? opts.packageConfig : null;
+    let automaticPackageResolution = opts && 'automaticPackageResolution' in opts ? opts.automaticPackageResolution : false;
+    if (environment != null) dart.throw(new core.UnimplementedError("environment"));
     if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
+    if (packageConfig != null) dart.throw(new core.UnimplementedError("packageConfig"));
+    let forcePause = errorsAreFatal != null || onExit != null || onError != null;
     try {
-      if (core.List.is(args)) {
+      if (ListOfString().is(args)) {
         for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
           if (!(typeof args[dartx._get](i) == 'string')) {
             dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
@@ -49990,7 +50937,24 @@
       } else if (args != null) {
         dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
       }
-      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+        let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!dart.test(paused)) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      }, ListToIsolate()));
     } catch (e) {
       let st = dart.stackTrace(e);
       return FutureOfIsolate().error(e, st);
@@ -49999,7 +50963,8 @@
   }
   pause(resumeCapability) {
     if (resumeCapability === void 0) resumeCapability = null;
-    if (resumeCapability == null) resumeCapability = isolate.Capability.new();
+    let t = resumeCapability;
+    t == null ? resumeCapability = isolate$.Capability.new() : t;
     this[_pause](resumeCapability);
     return resumeCapability;
   }
@@ -50016,10 +50981,12 @@
     message[dartx._set](1, resumeCapability);
     this.controlPort.send(message);
   }
-  addOnExitListener(responsePort) {
-    let message = core.List.new(2);
+  addOnExitListener(responsePort, opts) {
+    let response = opts && 'response' in opts ? opts.response : null;
+    let message = core.List.new(3);
     message[dartx._set](0, "add-ondone");
     message[dartx._set](1, responsePort);
+    message[dartx._set](2, response);
     this.controlPort.send(message);
   }
   removeOnExitListener(responsePort) {
@@ -50035,16 +51002,18 @@
     message[dartx._set](2, errorsAreFatal);
     this.controlPort.send(message);
   }
-  kill(priority) {
-    if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
+  kill(opts) {
+    let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.BEFORE_NEXT_EVENT;
     this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
   }
-  ping(responsePort, pingType) {
-    if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
-    let message = core.List.new(3);
+  ping(responsePort, opts) {
+    let response = opts && 'response' in opts ? opts.response : null;
+    let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.IMMEDIATE;
+    let message = core.List.new(4);
     message[dartx._set](0, "ping");
     message[dartx._set](1, responsePort);
-    message[dartx._set](2, pingType);
+    message[dartx._set](2, priority);
+    message[dartx._set](3, response);
     this.controlPort.send(message);
   }
   addErrorListener(port) {
@@ -50065,12 +51034,12 @@
     function handleError(message) {
       let errorDescription = core.String._check(dart.dindex(message, 0));
       let stackDescription = core.String._check(dart.dindex(message, 1));
-      let error = new isolate.RemoteError(errorDescription, stackDescription);
+      let error = new isolate$.RemoteError(errorDescription, stackDescription);
       controller.addError(error, error.stackTrace);
     }
     dart.fn(handleError, dynamicTovoid$());
     controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
-        port = isolate.RawReceivePort.new(handleError);
+        port = isolate$.RawReceivePort.new(handleError);
         this.addErrorListener(port.sendPort);
       }, VoidToNull()), onCancel: dart.fn(() => {
         this.removeErrorListener(port.sendPort);
@@ -50080,42 +51049,46 @@
     return controller.stream;
   }
 };
-dart.setSignature(isolate.Isolate, {
+dart.setSignature(isolate$.Isolate, {
   fields: () => ({
-    controlPort: isolate.SendPort,
-    pauseCapability: isolate.Capability,
-    terminateCapability: isolate.Capability
+    controlPort: isolate$.SendPort,
+    pauseCapability: isolate$.Capability,
+    terminateCapability: isolate$.Capability
   }),
   getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
   methods: () => ({
-    pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
-    [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    pause: dart.definiteFunctionType(isolate$.Capability, [], [isolate$.Capability]),
+    [_pause]: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    resume: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object}),
+    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
     setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
-    kill: dart.definiteFunctionType(dart.void, [], [core.int]),
-    ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
-    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
+    kill: dart.definiteFunctionType(dart.void, [], {priority: core.int}),
+    ping: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object, priority: core.int}),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort])
   }),
   statics: () => ({
-    spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
-    spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
+    resolvePackageUri: dart.definiteFunctionType(async.Future$(core.Uri), [core.Uri]),
+    spawn: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool, errorsAreFatal: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort}),
+    spawnUri: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort, errorsAreFatal: core.bool, checked: core.bool, environment: MapOfString$String(), packageRoot: core.Uri, packageConfig: core.Uri, automaticPackageResolution: core.bool})
   }),
-  names: ['spawn', 'spawnUri']
+  names: ['resolvePackageUri', 'spawn', 'spawnUri']
 });
-isolate.Isolate.IMMEDIATE = 0;
-isolate.Isolate.BEFORE_NEXT_EVENT = 1;
-isolate.Isolate.AS_EVENT = 2;
-dart.defineLazy(isolate.Isolate, {
+isolate$.Isolate.IMMEDIATE = 0;
+isolate$.Isolate.BEFORE_NEXT_EVENT = 1;
+dart.defineLazy(isolate$.Isolate, {
   get _currentIsolateCache() {
     return _isolate_helper.IsolateNatives.currentIsolate;
-  }
+  },
+  get _packageBase() {
+    return core.Uri.base.resolve(core.String._check(dart.dload(_isolate_helper.IsolateNatives, 'packagesBase')));
+  },
+  set _packageBase(_) {}
 });
-isolate.SendPort = class SendPort extends core.Object {};
-isolate.SendPort[dart.implements] = () => [isolate.Capability];
-isolate.ReceivePort = class ReceivePort extends core.Object {
+isolate$.SendPort = class SendPort extends core.Object {};
+isolate$.SendPort[dart.implements] = () => [isolate$.Capability];
+isolate$.ReceivePort = class ReceivePort extends core.Object {
   static new() {
     return new _isolate_helper.ReceivePortImpl();
   }
@@ -50123,62 +51096,32 @@
     return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
   }
 };
-isolate.ReceivePort[dart.implements] = () => [async.Stream];
-isolate.RawReceivePort = class RawReceivePort extends core.Object {
+isolate$.ReceivePort[dart.implements] = () => [async.Stream];
+isolate$.RawReceivePort = class RawReceivePort extends core.Object {
   static new(handler) {
     if (handler === void 0) handler = null;
     return new _isolate_helper.RawReceivePortImpl(handler);
   }
 };
-isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
-  new(message, source, stackTrace) {
-    this.message = message;
-    this.source = source;
-    this.stackTrace = stackTrace;
-  }
-  toString() {
-    return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
-  }
-};
-isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
-dart.setSignature(isolate._IsolateUnhandledException, {
-  fields: () => ({
-    message: dart.dynamic,
-    source: dart.dynamic,
-    stackTrace: core.StackTrace
-  })
-});
 const _description = Symbol('_description');
-isolate.RemoteError = class RemoteError extends core.Object {
+isolate$.RemoteError = class RemoteError extends core.Object {
   new(description, stackDescription) {
     this[_description] = description;
-    this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
+    this.stackTrace = core.StackTrace.fromString(stackDescription);
   }
   toString() {
     return this[_description];
   }
 };
-isolate.RemoteError[dart.implements] = () => [core.Error];
-dart.setSignature(isolate.RemoteError, {
+isolate$.RemoteError[dart.implements] = () => [core.Error];
+dart.setSignature(isolate$.RemoteError, {
   fields: () => ({
     [_description]: core.String,
     stackTrace: core.StackTrace
   })
 });
-const _trace$ = Symbol('_trace');
-isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
-  new(trace) {
-    this[_trace$] = trace;
-  }
-  toString() {
-    return this[_trace$];
-  }
-};
-isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
-dart.setSignature(isolate._RemoteStackTrace, {
-  fields: () => ({[_trace$]: core.String})
-});
-isolate.Capability = class Capability extends core.Object {
+isolate$._UnaryFunction = dart.typedef('_UnaryFunction', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+isolate$.Capability = class Capability extends core.Object {
   static new() {
     return new _isolate_helper.CapabilityImpl();
   }
@@ -50695,13 +51638,40 @@
 math.SQRT2 = 1.4142135623730951;
 math.min = function(T) {
   return (a, b) => {
-    return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
+    if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+    if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+    if (dart.notNull(a) > dart.notNull(b)) return b;
+    if (dart.notNull(a) < dart.notNull(b)) return a;
+    if (typeof b == 'number') {
+      if (typeof a == 'number') {
+        if (a == 0.0) {
+          return (dart.notNull(a) + dart.notNull(b)) * dart.notNull(a) * dart.notNull(b);
+        }
+      }
+      if (a == 0 && dart.test(b[dartx.isNegative]) || dart.test(b[dartx.isNaN])) return b;
+      return a;
+    }
+    return a;
   };
 };
 dart.fn(math.min, TAndTToT());
 math.max = function(T) {
   return (a, b) => {
-    return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
+    if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+    if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+    if (dart.notNull(a) > dart.notNull(b)) return a;
+    if (dart.notNull(a) < dart.notNull(b)) return b;
+    if (typeof b == 'number') {
+      if (typeof a == 'number') {
+        if (a == 0.0) {
+          return dart.notNull(a) + dart.notNull(b);
+        }
+      }
+      if (dart.test(b[dartx.isNaN])) return b;
+      return a;
+    }
+    if (b == 0 && dart.test(a[dartx.isNegative])) return b;
+    return a;
   };
 };
 dart.fn(math.max, TAndTToT$());
@@ -51054,11 +52024,11 @@
   return Point;
 });
 math.Point = Point$();
-let const$82;
+let const$85;
 math.Random = class Random extends core.Object {
   static new(seed) {
     if (seed === void 0) seed = null;
-    return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
+    return seed == null ? const$85 || (const$85 = dart.const(new math._JSRandom())) : new math._Random(seed);
   }
   static secure() {
     return math.Random._secureRandom;
@@ -51102,8 +52072,7 @@
     }
     ['=='](other) {
       if (!RectangleOfnum().is(other)) return false;
-      let otherRect = RectangleOfnum().as(other);
-      return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
+      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.right], dart.dload(other, 'right')) && dart.equals(this[dartx.bottom], dart.dload(other, 'bottom'));
     }
     get hashCode() {
       return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
@@ -52413,7 +53382,7 @@
 });
 dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
 const _add$3 = Symbol('_add');
-const _clear$0 = Symbol('_clear');
+const _clear$ = Symbol('_clear');
 const _put = Symbol('_put');
 const _createIndex = Symbol('_createIndex');
 const _add_1 = Symbol('_add_1');
@@ -52461,7 +53430,7 @@
   }
   [dartx.clear]() {
     try {
-      return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
+      return indexed_db._completeRequest(dart.dynamic)(this[_clear$]());
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       return async.Future.error(e, stacktrace);
@@ -52582,7 +53551,7 @@
   [_add_2](...args) {
     return this.add.apply(this, args);
   }
-  [_clear$0](...args) {
+  [_clear$](...args) {
     return this.clear.apply(this, args);
   }
   [_count$0](...args) {
@@ -52681,7 +53650,7 @@
     [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
     [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
     [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-    [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_clear$]: dart.definiteFunctionType(indexed_db.Request, []),
     [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
     [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
@@ -59470,7 +60439,7 @@
 const _borderWidth = Symbol('_borderWidth');
 const _bottom = Symbol('_bottom');
 const _captionSide = Symbol('_captionSide');
-const _clear$1 = Symbol('_clear');
+const _clear$0 = Symbol('_clear');
 const _clip = Symbol('_clip');
 const _color = Symbol('_color');
 const _content = Symbol('_content');
@@ -64285,15 +65254,15 @@
     this.captionSide = value;
   }
   get [dartx.clear]() {
-    return this[_clear$1];
+    return this[_clear$0];
   }
   set [dartx.clear](value) {
-    this[_clear$1] = value == null ? '' : value;
+    this[_clear$0] = value == null ? '' : value;
   }
-  get [_clear$1]() {
+  get [_clear$0]() {
     return this.clear;
   }
-  set [_clear$1](value) {
+  set [_clear$0](value) {
     this.clear = value;
   }
   get [dartx.clip]() {
@@ -65040,7 +66009,7 @@
     [_borderWidth]: core.String,
     [_bottom]: core.String,
     [_captionSide]: core.String,
-    [_clear$1]: core.String,
+    [_clear$0]: core.String,
     [_clip]: core.String,
     [_color]: core.String,
     [_content]: core.String,
@@ -84088,7 +85057,7 @@
     return value;
   }
   [dartx.clear]() {
-    return this[_clear$1]();
+    return this[_clear$0]();
   }
   [dartx.forEach](f) {
     for (let i = 0; true; i++) {
@@ -84131,7 +85100,7 @@
   [__setter__](...args) {
     return this.__setter__.apply(this, args);
   }
-  [_clear$1](...args) {
+  [_clear$0](...args) {
     return this.clear.apply(this, args);
   }
   [_getItem](...args) {
@@ -84170,7 +85139,7 @@
     [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
     [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-    [_clear$1]: dart.definiteFunctionType(dart.void, []),
+    [_clear$0]: dart.definiteFunctionType(dart.void, []),
     [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
     [_key]: dart.definiteFunctionType(core.String, [core.int]),
     [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -93180,9 +94149,6 @@
     allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
-let const$83;
-let const$84;
-let const$85;
 let const$86;
 let const$87;
 let const$88;
@@ -93190,15 +94156,18 @@
 let const$90;
 let const$91;
 let const$92;
+let const$93;
+let const$94;
+let const$95;
 html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
   static allowNavigation(uriPolicy) {
-    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['A::href', 'FORM::action'], core.String))});
   }
   static allowImages(uriPolicy) {
-    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$89 || (const$89 = dart.constList(['IMG'], core.String)), allowedAttributes: const$90 || (const$90 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$91 || (const$91 = dart.constList(['IMG::src'], core.String))});
   }
   static allowTextElements() {
-    return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+    return new html$._SimpleNodeValidator(null, {allowedElements: const$92 || (const$92 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
   }
   new(uriPolicy, opts) {
     let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
@@ -93208,9 +94177,9 @@
     this.allowedAttributes = SetOfString().new();
     this.allowedUriAttributes = SetOfString().new();
     this.uriPolicy = uriPolicy;
-    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
-    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
-    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$93 || (const$93 = dart.constList([], core.String))));
+    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$94 || (const$94 = dart.constList([], core.String));
+    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$95 || (const$95 = dart.constList([], core.String));
     let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
     let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
     this.allowedAttributes.addAll(legalAttributes);
@@ -93496,7 +94465,7 @@
   names: ['get']
 });
 const _array = Symbol('_array');
-const _current$4 = Symbol('_current');
+const _current$2 = Symbol('_current');
 html$.FixedSizeListIterator$ = dart.generic(T => {
   let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
   let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
@@ -93505,21 +94474,21 @@
       this[_array] = array;
       this[_position$1] = -1;
       this[_length$3] = array[dartx.length];
-      this[_current$4] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       let nextPosition = dart.notNull(this[_position$1]) + 1;
       if (nextPosition < dart.notNull(this[_length$3])) {
-        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_current$2] = this[_array][dartx._get](nextPosition);
         this[_position$1] = nextPosition;
         return true;
       }
-      this[_current$4] = null;
+      this[_current$2] = null;
       this[_position$1] = this[_length$3];
       return false;
     }
     get current() {
-      return this[_current$4];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(FixedSizeListIterator);
@@ -93529,7 +94498,7 @@
       [_array]: ListOfT(),
       [_length$3]: core.int,
       [_position$1]: core.int,
-      [_current$4]: T
+      [_current$2]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -93544,21 +94513,21 @@
     new(array) {
       this[_array] = array;
       this[_position$1] = -1;
-      this[_current$4] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       let nextPosition = dart.notNull(this[_position$1]) + 1;
       if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_current$2] = this[_array][dartx._get](nextPosition);
         this[_position$1] = nextPosition;
         return true;
       }
-      this[_current$4] = null;
+      this[_current$2] = null;
       this[_position$1] = this[_array][dartx.length];
       return false;
     }
     get current() {
-      return this[_current$4];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(_VariableSizeListIterator);
@@ -93567,7 +94536,7 @@
     fields: () => ({
       [_array]: ListOfT(),
       [_position$1]: core.int,
-      [_current$4]: T
+      [_current$2]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -104475,6 +105444,7 @@
   methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
 });
 dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
+dart.trackLibraries("dart_sdk", {"dart:_runtime": dart, "dart:_debugger": _debugger, "dart:_foreign_helper": _foreign_helper, "dart:_interceptors": _interceptors, "dart:_internal": _internal, "dart:_isolate_helper": _isolate_helper, "dart:_js_embedded_names": _js_embedded_names, "dart:_js_helper": _js_helper, "dart:_js_mirrors": _js_mirrors, "dart:_js_primitives": _js_primitives, "dart:_metadata": _metadata, "dart:_native_typed_data": _native_typed_data, "dart:async": async, "dart:collection": collection, "dart:convert": convert, "dart:core": core, "dart:developer": developer, "dart:io": io, "dart:isolate": isolate$, "dart:js": js, "dart:js_util": js_util, "dart:math": math, "dart:mirrors": mirrors, "dart:typed_data": typed_data, "dart:indexed_db": indexed_db, "dart:html": html$, "dart:html_common": html_common, "dart:svg": svg$, "dart:web_audio": web_audio, "dart:web_gl": web_gl, "dart:web_sql": web_sql});
 // Exports:
 exports.dart = dart;
 exports.dartx = dartx;
@@ -104495,7 +105465,7 @@
 exports.core = core;
 exports.developer = developer;
 exports.io = io;
-exports.isolate = isolate;
+exports.isolate = isolate$;
 exports.js = js;
 exports.js_util = js_util;
 exports.math = math;
diff --git a/pkg/dev_compiler/lib/js/es6/dart_sdk.js b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
index 91a48c5..3b8dcbc 100644
--- a/pkg/dev_compiler/lib/js/es6/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/es6/dart_sdk.js
@@ -17,7 +17,7 @@
 export const core = Object.create(null);
 export const developer = Object.create(null);
 export const io = Object.create(null);
-export const isolate = Object.create(null);
+export const isolate$ = Object.create(null);
 export const js = Object.create(null);
 export const js_util = Object.create(null);
 export const math = Object.create(null);
@@ -37,16 +37,14 @@
 let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
 let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
 let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
+let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
+let IterableOfNameValuePair = () => (IterableOfNameValuePair = dart.constFn(core.Iterable$(_debugger.NameValuePair)))();
 let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
 let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
 let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
 let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
 let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
-let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
 let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
-let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
-let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
-let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
 let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
 let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
 let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
@@ -55,6 +53,7 @@
 let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
 let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
 let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
+let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
 let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
 let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
 let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
@@ -68,6 +67,7 @@
 let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
 let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
 let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
+let EfficientLengthIterable = () => (EfficientLengthIterable = dart.constFn(_internal.EfficientLengthIterable$()))();
 let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
 let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
 let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
@@ -104,8 +104,8 @@
 let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
 let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
 let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
-let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
-let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
+let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate$.Capability)))();
+let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate$.SendPort)))();
 let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
 let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
 let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
@@ -136,6 +136,7 @@
 let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
 let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
 let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
+let FutureOfLibraryMirror = () => (FutureOfLibraryMirror = dart.constFn(async.Future$(mirrors.LibraryMirror)))();
 let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
 let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
 let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
@@ -147,7 +148,6 @@
 let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
 let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
 let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
-let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
 let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
 let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
 let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
@@ -169,7 +169,6 @@
 let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
 let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
 let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
-let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
 let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
 let _Future = () => (_Future = dart.constFn(async._Future$()))();
 let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
@@ -205,8 +204,9 @@
 let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
 let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
 let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
-let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
+let _StreamIterator = () => (_StreamIterator = dart.constFn(async._StreamIterator$()))();
 let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
+let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
 let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
 let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
 let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
@@ -309,7 +309,6 @@
 let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
 let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
 let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
-let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
 let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
 let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
 let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
@@ -338,8 +337,10 @@
 let List = () => (List = dart.constFn(core.List$()))();
 let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
 let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
+let ChunkedConverterOfString$ListOfint$String$ListOfint = () => (ChunkedConverterOfString$ListOfint$String$ListOfint = dart.constFn(convert.ChunkedConverter$(core.String, ListOfint(), core.String, ListOfint())))();
 let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
 let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
+let ChunkedConverterOfListOfint$String$ListOfint$String = () => (ChunkedConverterOfListOfint$String$ListOfint$String = dart.constFn(convert.ChunkedConverter$(ListOfint(), core.String, ListOfint(), core.String)))();
 let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
 let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
 let _ChunkedConversionCallbackOfListOfint = () => (_ChunkedConversionCallbackOfListOfint = dart.constFn(convert._ChunkedConversionCallback$(ListOfint())))();
@@ -350,8 +351,12 @@
 let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
 let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
 let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
+let ChunkedConverterOfString$String$String$String = () => (ChunkedConverterOfString$String$String$String = dart.constFn(convert.ChunkedConverter$(core.String, core.String, core.String, core.String)))();
+let ChunkedConverterOfObject$String$Object$String = () => (ChunkedConverterOfObject$String$Object$String = dart.constFn(convert.ChunkedConverter$(core.Object, core.String, core.Object, core.String)))();
 let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
 let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
+let ChunkedConverterOfObject$ListOfint$Object$ListOfint = () => (ChunkedConverterOfObject$ListOfint$Object$ListOfint = dart.constFn(convert.ChunkedConverter$(core.Object, ListOfint(), core.Object, ListOfint())))();
+let ChunkedConverterOfString$Object$String$Object = () => (ChunkedConverterOfString$Object$String$Object = dart.constFn(convert.ChunkedConverter$(core.String, core.Object, core.String, core.Object)))();
 let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
 let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
 let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
@@ -362,59 +367,62 @@
 let Expando = () => (Expando = dart.constFn(core.Expando$()))();
 let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
 let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
-let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
 let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
 let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
 let Set = () => (Set = dart.constFn(core.Set$()))();
 let Sink = () => (Sink = dart.constFn(core.Sink$()))();
 let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
+let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
 let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
 let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
-let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
 let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
 let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+let ListOfUint8List = () => (ListOfUint8List = dart.constFn(core.List$(typed_data.Uint8List)))();
 let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
 let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
 let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
 let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
 let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
 let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
-let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
-let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
+let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+let ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = () => (ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = dart.constFn(convert.ChunkedConverter$(ListOfint(), ListOfint(), ListOfint(), ListOfint())))();
 let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
 let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
-let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
 let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
 let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
 let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
 let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
 let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
+let StreamControllerOfFileSystemEntity = () => (StreamControllerOfFileSystemEntity = dart.constFn(async.StreamController$(io.FileSystemEntity)))();
 let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
 let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
 let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
+let CompleterOfListOfint = () => (CompleterOfListOfint = dart.constFn(async.Completer$(ListOfint())))();
 let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
 let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
 let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
-let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
+let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
 let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
 let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
 let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
 let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
 let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
 let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
-let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
 let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
 let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
 let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
 let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
 let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
 let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
+let CompleterOfSocket = () => (CompleterOfSocket = dart.constFn(async.Completer$(io.Socket)))();
 let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
 let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
-let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
 let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
+let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
+let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
 let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
 let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
+let CompleterOf_ConnectionInfo = () => (CompleterOf_ConnectionInfo = dart.constFn(async.Completer$(io._ConnectionInfo)))();
 let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
 let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
 let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
@@ -436,8 +444,7 @@
 let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
 let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
 let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
-let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
-let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
+let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
 let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
 let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
 let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
@@ -448,14 +455,16 @@
 let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
 let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
 let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
+let _CaseInsensitiveStringMapOfString = () => (_CaseInsensitiveStringMapOfString = dart.constFn(io._CaseInsensitiveStringMap$(core.String)))();
 let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
+let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
 let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
 let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
 let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
 let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
 let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
-let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
 let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
+let CompleterOfRawSecureSocket = () => (CompleterOfRawSecureSocket = dart.constFn(async.Completer$(io.RawSecureSocket)))();
 let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
 let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
 let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
@@ -464,15 +473,14 @@
 let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
 let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
 let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
+let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
 let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
-let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
 let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
 let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
-let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
-let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+let FutureOfString = () => (FutureOfString = dart.constFn(async.Future$(core.String)))();
 let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
 let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
-let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
+let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate$.Isolate)))();
 let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
 let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
 let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
@@ -593,6 +601,7 @@
 let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
 let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
 let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
+let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
 let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
 let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
 let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
@@ -638,18 +647,20 @@
 let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
 let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
 let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
-let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
-let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
+let dynamicAndSetOfNameValuePairAnddynamic__Tovoid = () => (dynamicAndSetOfNameValuePairAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair(), dart.dynamic, core.bool], {tagTypes: dart.dynamic})))();
+let NameValuePairAndNameValuePairToint = () => (NameValuePairAndNameValuePairToint = dart.constFn(dart.definiteFunctionType(core.int, [_debugger.NameValuePair, _debugger.NameValuePair])))();
+let IterableOfNameValuePairToListOfNameValuePair = () => (IterableOfNameValuePairToListOfNameValuePair = dart.constFn(dart.definiteFunctionType(ListOfNameValuePair(), [IterableOfNameValuePair()])))();
 let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
 let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
 let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
 let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
 let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
 let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
 let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
-let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
 let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
 let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
 let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
 let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
 let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
@@ -663,6 +674,8 @@
 let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
 let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
+let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
+let StringAndintToint = () => (StringAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int])))();
 let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
 let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
 let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
@@ -675,10 +688,11 @@
 let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
 let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
 let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
+let VoidTo_Future = () => (VoidTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [])))();
+let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
 let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
 let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
 let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
-let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
 let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
 let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
 let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -739,7 +753,7 @@
 let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
 let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
 let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
-let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
+let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), dynamicAndStackTraceTodynamic()])))();
 let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
 let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
 let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
@@ -777,12 +791,18 @@
 let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
 let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
 let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
+let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
+let StringAndintTovoid = () => (StringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.int])))();
+let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
 let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
 let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
-let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
 let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
-let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
 let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
+let intToUint8List = () => (intToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [core.int])))();
+let dynamicAnddynamicToUint8List = () => (dynamicAnddynamicToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [dart.dynamic, dart.dynamic])))();
+let Uint8ListAndStringAndintTovoid = () => (Uint8ListAndStringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.String, core.int])))();
+let VoidToListOfUint8List = () => (VoidToListOfUint8List = dart.constFn(dart.definiteFunctionType(ListOfUint8List(), [])))();
+let StringAndintAndint__Toint = () => (StringAndintAndint__Toint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, ListOfint()])))();
 let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
 let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
 let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -795,10 +815,11 @@
 let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
 let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
 let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
-let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
-let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
+let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort])))();
+let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.bool])))();
+let SendPortToString = () => (SendPortToString = dart.constFn(dart.definiteFunctionType(core.String, [isolate$.SendPort])))();
 let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
-let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
+let ListOfintAndintAndintTo_BufferAndStart = () => (ListOfintAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [ListOfint(), core.int, core.int])))();
 let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
 let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
 let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
@@ -817,17 +838,15 @@
 let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
 let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
 let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
-let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
-let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
 let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
+let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
 let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
 let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
 let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
 let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
-let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
+let dynamicToListOfint = () => (dynamicToListOfint = dart.constFn(dart.definiteFunctionType(ListOfint(), [dart.dynamic])))();
 let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
 let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
 let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
 let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
 let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
@@ -843,11 +862,14 @@
 let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
 let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
 let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
+let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
 let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
 let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
 let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
 let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
-let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
+let SocketToSocket = () => (SocketToSocket = dart.constFn(dart.definiteFunctionType(io.Socket, [io.Socket])))();
+let SocketTo_DetachedSocket = () => (SocketTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [io.Socket])))();
+let SocketTovoid = () => (SocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Socket])))();
 let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
 let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
 let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
@@ -861,14 +883,15 @@
 let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
 let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
 let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
+let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
 let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
 let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
 let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
 let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
-let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
-let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
-let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
+let _FileResourceInfoToMapOfString$dynamic = () => (_FileResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._FileResourceInfo])))();
+let _ProcessResourceInfoToMapOfString$dynamic = () => (_ProcessResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._ProcessResourceInfo])))();
+let _SocketResourceInfoToMapOfString$dynamic = () => (_SocketResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._SocketResourceInfo])))();
 let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
 let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
 let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
@@ -881,7 +904,6 @@
 let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
 let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
 let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
-let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
 let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
 let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
 let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
@@ -889,14 +911,13 @@
 let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
 let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
 let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
-let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
+let StringToFutureOfWebSocket = () => (StringToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [core.String])))();
 let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
-let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
 let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
 let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
 let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
 let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
-let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
+let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate$.Isolate, [core.List])))();
 let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
 let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
 let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
@@ -1461,8 +1482,8 @@
 dart.getIsNamedConstructor = function(value) {
   return value[dart.isNamedConstructor];
 };
-dart.getDartLibraryName = function(value) {
-  return value[dart_library.dartLibraryName];
+dart.getModuleName = function(value) {
+  return value[dart._moduleName];
 };
 dart.tag = function(value, t) {
   value[dart._runtimeType] = t;
@@ -1473,6 +1494,18 @@
 dart.tagLazy = function(value, compute) {
   dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
 };
+dart.getModuleNames = function() {
+  return Array.from(dart._loadedModules.keys());
+};
+dart.getModuleLibraries = function(name) {
+  let module = dart._loadedModules.get(name);
+  if (module == null) return null;
+  module[dart._moduleName] = name;
+  return module;
+};
+dart.trackLibraries = function(moduleName, libraries) {
+  dart._loadedModules.set(moduleName, libraries);
+};
 dart._warn = function(arg) {
   console.warn(arg);
 };
@@ -1615,6 +1648,9 @@
 dart.definiteFunctionType = function(returnType, args, extra) {
   return dart._functionType(true, returnType, args, extra);
 };
+dart.isType = function(obj) {
+  return dart._getRuntimeType(obj) === core.Type;
+};
 dart.typeName = function(type) {
   if (type === void 0) return "undefined type";
   if (type === null) return "null type";
@@ -2039,7 +2075,7 @@
   return name;
 };
 dart._dartSymbol = function(name) {
-  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
+  return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.PrivateSymbol(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
 };
 dart.extractNamedArgs = function(args) {
   if (args.length > 0) {
@@ -2433,6 +2469,7 @@
     return obj[dartx.toString]();
   }
   if (typeof obj == "function") {
+    if (dart.test(dart.isType(obj))) return dart.typeName(obj);
     return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
   }
   return obj.toString();
@@ -2637,12 +2674,19 @@
 dart.dartx = dartx;
 dart._runtimeType = Symbol("_runtimeType");
 dart.isNamedConstructor = Symbol("isNamedConstructor");
+dart._moduleName = Symbol("_moduleName");
 dart.defineLazy(dart, {
   get _lazyJSTypes() {
     return new Map();
   },
   set _lazyJSTypes(_) {}
 });
+dart.defineLazy(dart, {
+  get _loadedModules() {
+    return new Map();
+  },
+  set _loadedModules(_) {}
+});
 dart.metadata = Symbol("metadata");
 dart._typeObject = Symbol("typeObject");
 core.Object = class Object {
@@ -3196,9 +3240,51 @@
   names: ['getProperty', 'setProperty']
 });
 _debugger.addMetadataChildren = function(object, ret) {
-  ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
+  ret.add(new _debugger.NameValuePair({name: "[[class]]", value: dart.getReifiedType(object), config: _debugger.JsonMLConfig.asClass}));
 };
 dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
+_debugger.addPropertiesFromSignature = function(sig, properties, object, walkPrototypeChain, opts) {
+  let tagTypes = opts && 'tagTypes' in opts ? opts.tagTypes : false;
+  let skippedNames = core.Set.new();
+  skippedNames.add('hashCode');
+  while (sig != null) {
+    for (let symbol of _debugger.getOwnPropertySymbols(sig)) {
+      let dartName = _debugger.symbolName(symbol);
+      let dartXPrefix = 'dartx.';
+      if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
+        dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
+      }
+      if (dart.test(skippedNames.contains(dartName))) continue;
+      let value = _debugger.safeGetProperty(object, symbol);
+      if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+        dart.tag(value, sig[symbol]);
+      }
+      properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
+    }
+    for (let name of _debugger.getOwnPropertyNames(sig)) {
+      let value = _debugger.safeGetProperty(object, name);
+      if (dart.test(skippedNames.contains(name))) continue;
+      if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+        dart.tag(value, sig[name]);
+      }
+      properties.add(new _debugger.NameValuePair({name: name, value: value}));
+    }
+    if (!dart.test(walkPrototypeChain)) break;
+    sig = _debugger.safeGetProperty(sig, '__proto__');
+  }
+};
+dart.lazyFn(_debugger.addPropertiesFromSignature, () => dynamicAndSetOfNameValuePairAnddynamic__Tovoid());
+_debugger.sortProperties = function(properties) {
+  let sortedProperties = properties[dartx.toList]();
+  sortedProperties[dartx.sort](dart.fn((a, b) => {
+    let aPrivate = a.name[dartx.startsWith]('_');
+    let bPrivate = b.name[dartx.startsWith]('_');
+    if (aPrivate != bPrivate) return dart.test(aPrivate) ? 1 : -1;
+    return a.name[dartx.compareTo](b.name);
+  }, NameValuePairAndNameValuePairToint()));
+  return sortedProperties;
+};
+dart.lazyFn(_debugger.sortProperties, () => IterableOfNameValuePairToListOfNameValuePair());
 _debugger.getObjectTypeName = function(object) {
   let reifiedType = dart.getReifiedType(object);
   if (reifiedType == null) {
@@ -3207,7 +3293,7 @@
     }
     return '<Error getting type name>';
   }
-  return _debugger.getTypeName(core.Type._check(reifiedType));
+  return _debugger.getTypeName(reifiedType);
 };
 dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
 _debugger.getTypeName = function(type) {
@@ -3215,11 +3301,7 @@
   if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
   return name;
 };
-dart.lazyFn(_debugger.getTypeName, () => TypeToString());
-_debugger._getType = function(object) {
-  return core.Type.is(object) ? object : dart.getReifiedType(object);
-};
-dart.fn(_debugger._getType, dynamicToObject());
+dart.lazyFn(_debugger.getTypeName, () => dynamicToString());
 const _simpleFormatter = Symbol('_simpleFormatter');
 _debugger.safePreview = function(object, config) {
   try {
@@ -3259,7 +3341,9 @@
     this.hideName = hideName;
   }
   ['=='](other) {
-    return _debugger.NameValuePair.is(other) && other.name == this.name;
+    if (!_debugger.NameValuePair.is(other)) return false;
+    if (dart.test(this.hideName) || dart.test(dart.dload(other, 'hideName'))) return core.identical(this, other);
+    return dart.equals(dart.dload(other, 'name'), this.name);
   }
   get hashCode() {
     return dart.hashCode(this.name);
@@ -3452,7 +3536,7 @@
 });
 _debugger.isNativeJavaScriptObject = function(object) {
   let type = _debugger._typeof(object);
-  return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
+  return type != 'object' && type != 'function' || dart.test(dart.isJsInterop(object)) || html$.Node.is(object);
 };
 dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
 _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
@@ -3488,24 +3572,37 @@
       body.addStyle('color: rgb(196, 26, 22);');
     }
     let children = this[_simpleFormatter].children(object, config);
+    if (children == null) return body.toJsonML();
     for (let child of children) {
       let li = body.createChild('li');
-      let nameSpan = new _debugger.JsonMLElement('span');
-      nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
-      nameSpan.setStyle('color: rgb(136, 19, 145);');
+      li.setStyle("padding-left: 13px;");
+      let nameSpan = null;
+      let valueStyle = '';
+      if (!dart.test(child.hideName)) {
+        nameSpan = new _debugger.JsonMLElement('span');
+        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
+        nameSpan.setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+        valueStyle = 'margin-left: 13px';
+      }
       if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
-        nameSpan.addStyle("padding-left: 13px;");
-        li.appendChild(nameSpan);
-        let objectTag = li.createObjectTag(child.value);
-        objectTag.addAttribute('config', child.config);
-        if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
-          li.setStyle("padding-left: 13px;");
+        let valueSpan = new _debugger.JsonMLElement('span');
+        valueSpan.setStyle(valueStyle);
+        valueSpan.createObjectTag(child.value).addAttribute('config', child.config);
+        if (nameSpan != null) {
+          li.appendChild(nameSpan);
         }
+        li.appendChild(valueSpan);
       } else {
-        li.setStyle("padding-left: 13px;");
-        let _ = li.createChild('span');
-        _.appendChild(nameSpan);
-        _.createTextChild(_debugger.safePreview(child.value, child.config));
+        let line = li.createChild('span');
+        if (nameSpan != null) {
+          line.appendChild(nameSpan);
+        }
+        line.appendChild((() => {
+          let _ = new _debugger.JsonMLElement('span');
+          _.createTextChild(_debugger.safePreview(child.value, child.config));
+          _.setStyle(valueStyle);
+          return _;
+        })());
       }
     }
     return body.toJsonML();
@@ -3528,7 +3625,7 @@
 _debugger.DartFormatter = class DartFormatter extends core.Object {
   new() {
     this[_formatters] = null;
-    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
+    this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.TypeFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
   }
   preview(object, config) {
     try {
@@ -3592,42 +3689,14 @@
     return true;
   }
   children(object) {
-    let properties = LinkedHashSetOfNameValuePair().new();
-    _debugger.addMetadataChildren(object, properties);
-    let current = object;
-    let protoChain = JSArrayOfObject().of([]);
-    while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
-      protoChain[dartx.add](current);
-      current = _debugger.safeGetProperty(current, '__proto__');
-    }
-    for (current of protoChain) {
-      for (let symbol of _debugger.getOwnPropertySymbols(current)) {
-        let dartName = _debugger.symbolName(symbol);
-        if (dart.test(_debugger.hasMethod(object, dartName))) {
-          continue;
-        }
-        let dartXPrefix = 'dartx.';
-        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
-          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
-        } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
-          continue;
-        }
-        let value = _debugger.safeGetProperty(object, symbol);
-        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
-      }
-    }
-    for (current of protoChain) {
-      let className = dart.dload(dart.getReifiedType(current), 'name');
-      for (let name of _debugger.getOwnPropertyNames(current)) {
-        if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
-        if (dart.test(_debugger.hasMethod(object, name))) {
-          continue;
-        }
-        let value = _debugger.safeGetProperty(object, name);
-        properties.add(new _debugger.NameValuePair({name: name, value: value}));
-      }
-    }
-    return properties.toList();
+    let type = dart.getType(object);
+    let ret = LinkedHashSetOfNameValuePair().new();
+    let properties = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getFieldSig(type), properties, object, true);
+    _debugger.addPropertiesFromSignature(dart.getGetterSig(type), properties, object, true);
+    ret.addAll(_debugger.sortProperties(properties));
+    _debugger.addMetadataChildren(object, ret);
+    return ret.toList();
   }
 };
 dart.setSignature(_debugger.ObjectFormatter, {
@@ -3638,28 +3707,16 @@
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
   })
 });
-dart.defineLazy(_debugger.ObjectFormatter, {
-  get _customNames() {
-    return (() => {
-      let _ = SetOfString().new();
-      _.add('constructor');
-      _.add('prototype');
-      _.add('__proto__');
-      return _;
-    })();
-  },
-  set _customNames(_) {}
-});
 _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
   accept(object, config) {
-    return dart.getDartLibraryName(object) != null;
+    return dart.getModuleName(object) != null;
   }
   hasChildren(object) {
     return true;
   }
   preview(object) {
-    let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
-    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
+    let libraryNames = dart.dsend(dart.getModuleName(object), 'split', '/');
+    if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1)) && dart.equals(dart.dload(libraryNames, 'last'), dart.dindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 2)))) {
       dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
     }
     return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
@@ -3668,7 +3725,6 @@
     let children = LinkedHashSetOfNameValuePair().new();
     for (let name of _debugger.getOwnPropertyNames(object)) {
       let value = _debugger.safeGetProperty(object, name);
-      name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
       children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
     }
     return children.toList();
@@ -3698,36 +3754,16 @@
   }
   children(object) {
     let children = LinkedHashSetOfNameValuePair().new();
-    let nonGenericProperties = LinkedHashMapOfString$Object().new();
     let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
     dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
-      let genericTypeConstructor = dart.getGenericTypeCtor(value);
-      if (genericTypeConstructor != null) {
-        this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
-      } else {
-        nonGenericProperties._set(core.String._check(name), value);
-      }
+      if (dart.getGenericTypeCtor(value) != null) return;
+      children.add(_debugger.NameValuePair._check(dart.test(dart.isType(value)) ? this.classChild(core.String._check(name), value) : new _debugger.NameValuePair({name: core.String._check(name), value: value})));
     }, dynamicAnddynamicToNull()));
-    nonGenericProperties.forEach(dart.fn((name, value) => {
-      if (core.Type.is(value)) {
-        children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
-      } else {
-        children.add(new _debugger.NameValuePair({name: name, value: value}));
-      }
-    }, StringAndObjectToNull()));
     return children.toList();
   }
-  recordGenericParameters(name, genericTypeConstructor) {
-    this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
-  }
   classChild(name, child) {
-    let typeName = _debugger.getTypeName(core.Type._check(child));
-    let parameterName = dart.str`${name}\$`;
-    if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
-      typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
-      _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
-    }
-    return new _debugger.NameValuePair({name: typeName, value: child});
+    let typeName = _debugger.getTypeName(child);
+    return new _debugger.NameValuePair({name: typeName, value: child, config: _debugger.JsonMLConfig.asClass});
   }
 };
 _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -3738,7 +3774,6 @@
     hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
-    recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
     classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
   })
 });
@@ -3955,60 +3990,49 @@
 });
 _debugger.ClassFormatter = class ClassFormatter extends core.Object {
   accept(object, config) {
-    return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
+    return dart.equals(config, _debugger.JsonMLConfig.asClass);
   }
-  preview(object) {
-    let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
-    if (typeName != null) return core.String._check(typeName);
-    let type = _debugger._getType(object);
+  preview(type) {
     let implements$ = dart.getImplements(type);
-    typeName = _debugger.getTypeName(core.Type._check(type));
+    let typeName = _debugger.getTypeName(type);
     if (implements$ != null) {
       let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
       return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
     } else {
-      return core.String._check(typeName);
+      return typeName;
     }
   }
   hasChildren(object) {
     return true;
   }
-  children(object) {
-    let type = _debugger._getType(object);
-    let children = JSArrayOfNameValuePair().of([]);
-    let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
+  children(type) {
+    let ret = LinkedHashSetOfNameValuePair().new();
+    let staticProperties = SetOfNameValuePair().new();
+    let staticMethods = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getStaticFieldSig(type), staticProperties, type, false);
+    _debugger.addPropertiesFromSignature(dart.getStaticGetterSig(type), staticProperties, type, false);
+    _debugger.addPropertiesFromSignature(dart.getStaticSig(type), staticMethods, type, false);
+    if (dart.test(staticProperties.isNotEmpty) || dart.test(staticMethods.isNotEmpty)) {
+      ret.add(new _debugger.NameValuePair({value: '[[Static members]]', hideName: true}));
+      ret.addAll(_debugger.sortProperties(staticProperties));
+      ret.addAll(_debugger.sortProperties(staticMethods));
+    }
+    let instanceMethods = SetOfNameValuePair().new();
+    _debugger.addPropertiesFromSignature(dart.getMethodSig(type), instanceMethods, type.prototype, false, {tagTypes: true});
+    if (dart.test(instanceMethods.isNotEmpty)) {
+      ret.add(new _debugger.NameValuePair({value: '[[Instance Methods]]', hideName: true}));
+      ret.addAll(_debugger.sortProperties(instanceMethods));
+    }
+    let typeName = _debugger.getTypeName(type);
     let mixins = dart.getMixins(type);
     if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
-      children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+      ret.add(new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
     }
-    let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
-    for (let name of _debugger.getOwnPropertyNames(object)) {
-      if (dart.test(hiddenProperties[dartx.contains](name))) continue;
-      let value = _debugger.safeGetProperty(object, name);
-      if (value != null && dart.getIsNamedConstructor(value) != null) {
-        value = new _debugger.NamedConstructor(value);
-        name = dart.str`${typeName}.${name}`;
-      }
-      children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+    let baseProto = type.__proto__;
+    if (baseProto != null && !dart.test(dart.isJsInterop(baseProto))) {
+      ret.add(new _debugger.NameValuePair({name: "[[base class]]", value: baseProto, config: _debugger.JsonMLConfig.asClass}));
     }
-    let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
-    let prototype = object.prototype;
-    if (prototype != null) {
-      for (let name of _debugger.getOwnPropertyNames(prototype)) {
-        if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
-        let func = _debugger.safeGetProperty(prototype, name);
-        let constructor = _debugger.safeGetProperty(prototype, 'constructor');
-        let sigObj = dart.getMethodSig(constructor);
-        if (sigObj != null) {
-          let value = _debugger.safeGetProperty(sigObj, name);
-          if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
-            dart.tag(func, value);
-            children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
-          }
-        }
-      }
-    }
-    return children;
+    return ret.toList();
   }
 };
 _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -4020,11 +4044,42 @@
     children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
   })
 });
+_debugger.TypeFormatter = class TypeFormatter extends core.Object {
+  accept(object, config) {
+    return core.Type.is(object);
+  }
+  preview(object) {
+    return dart.toString(object);
+  }
+  hasChildren(object) {
+    return false;
+  }
+  children(object) {
+    return JSArrayOfNameValuePair().of([]);
+  }
+};
+_debugger.TypeFormatter[dart.implements] = () => [_debugger.Formatter];
+dart.setSignature(_debugger.TypeFormatter, {
+  methods: () => ({
+    accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+    preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+    hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+    children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+  })
+});
 _debugger.registerDevtoolsFormatter = function() {
   let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
   dart.global.devtoolsFormatters = formatters;
 };
 dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
+_debugger.getModuleNames = function() {
+  return dart.getModuleNames();
+};
+dart.fn(_debugger.getModuleNames, VoidTodynamic$());
+_debugger.getModuleLibraries = function(name) {
+  return dart.getModuleLibraries(name);
+};
+dart.lazyFn(_debugger.getModuleLibraries, () => StringTodynamic());
 _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
   if (arg0 === void 0) arg0 = null;
   if (arg1 === void 0) arg1 = null;
@@ -4358,7 +4413,7 @@
       IterableOfE()._check(iterable);
       this[dartx.checkGrowable]('insertAll');
       core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-      if (!_internal.EfficientLength.is(iterable)) {
+      if (!_internal.EfficientLengthIterable.is(iterable)) {
         iterable = iterable[dartx.toList]();
       }
       let insertionLength = iterable[dartx.length];
@@ -4631,7 +4686,7 @@
       IterableOfE()._check(replacement);
       this[dartx.checkGrowable]('replace range');
       core.RangeError.checkValidRange(start, end, this[dartx.length]);
-      if (!_internal.EfficientLength.is(replacement)) {
+      if (!_internal.EfficientLengthIterable.is(replacement)) {
         replacement = replacement[dartx.toList]();
       }
       let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6346,21 +6401,20 @@
       this[_filter](test, true);
     }
     [_filter](test, retainMatching) {
-      let source = this;
       let retained = JSArrayOfE().of([]);
-      let length = source[dartx.length];
+      let length = this[dartx.length];
       for (let i = 0; i < dart.notNull(length); i++) {
-        let element = source[dartx._get](i);
+        let element = this[dartx._get](i);
         if (dart.dcall(test, element) == retainMatching) {
           retained[dartx.add](element);
         }
-        if (length != source[dartx.length]) {
-          dart.throw(new core.ConcurrentModificationError(source));
+        if (length != this[dartx.length]) {
+          dart.throw(new core.ConcurrentModificationError(this));
         }
       }
-      if (retained[dartx.length] != source[dartx.length]) {
-        source[dartx.setRange](0, retained[dartx.length], retained);
-        source[dartx.length] = retained[dartx.length];
+      if (retained[dartx.length] != this[dartx.length]) {
+        this[dartx.setRange](0, retained[dartx.length], retained);
+        this[dartx.length] = retained[dartx.length];
       }
     }
     clear() {
@@ -6376,11 +6430,10 @@
     }
     sort(compare) {
       if (compare === void 0) compare = null;
-      if (compare == null) {
-        _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-      } else {
-        _internal.Sort.sort(E)(this, compare);
-      }
+      _internal.Sort.sort(E)(this, (compare != null ? compare : collection.ListMixin._compareAny));
+    }
+    static _compareAny(a, b) {
+      return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
     }
     shuffle(random) {
       if (random === void 0) random = null;
@@ -6460,7 +6513,7 @@
     replaceRange(start, end, newContents) {
       IterableOfE()._check(newContents);
       core.RangeError.checkValidRange(start, end, this[dartx.length]);
-      if (!_internal.EfficientLength.is(newContents)) {
+      if (!_internal.EfficientLengthIterable.is(newContents)) {
         newContents = newContents[dartx.toList]();
       }
       let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6538,7 +6591,7 @@
     insertAll(index, iterable) {
       IterableOfE()._check(iterable);
       core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-      if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
+      if (!_internal.EfficientLengthIterable.is(iterable) || core.identical(iterable, this)) {
         iterable = iterable[dartx.toList]();
       }
       let insertionLength = iterable[dartx.length];
@@ -6627,7 +6680,9 @@
       removeAt: dart.definiteFunctionType(E, [core.int]),
       insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
       setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
-    })
+    }),
+    statics: () => ({_compareAny: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])}),
+    names: ['_compareAny']
   });
   dart.defineExtensionMembers(ListMixin, [
     'elementAt',
@@ -6886,7 +6941,66 @@
   names: ['stringOf']
 });
 dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
-_internal.EfficientLength = class EfficientLength extends core.Object {};
+_internal.ExternalName = class ExternalName extends core.Object {
+  new(name) {
+    this.name = name;
+  }
+};
+dart.setSignature(_internal.ExternalName, {
+  fields: () => ({name: core.String})
+});
+_internal.hexDigitValue = function(char) {
+  dart.assert(dart.notNull(char) >= 0 && dart.notNull(char) <= 65535);
+  let digit0 = 48;
+  let a = 97;
+  let f = 102;
+  let digit = (dart.notNull(char) ^ digit0) >>> 0;
+  if (digit <= 9) return digit;
+  let letter = (dart.notNull(char) | 32) >>> 0;
+  if (a <= letter && letter <= f) return letter - (a - 10);
+  return -1;
+};
+dart.fn(_internal.hexDigitValue, intToint());
+_internal.parseHexByte = function(source, index) {
+  dart.assert(dart.notNull(index) + 2 <= dart.notNull(source[dartx.length]));
+  let digit1 = _internal.hexDigitValue(source[dartx.codeUnitAt](index));
+  let digit2 = _internal.hexDigitValue(source[dartx.codeUnitAt](dart.notNull(index) + 1));
+  return dart.notNull(digit1) * 16 + dart.notNull(digit2) - (dart.notNull(digit2) & 256);
+};
+dart.lazyFn(_internal.parseHexByte, () => StringAndintToint());
+const _name$ = Symbol('_name');
+const _nativeSymbol = Symbol('_nativeSymbol');
+_internal.PrivateSymbol = class PrivateSymbol extends core.Object {
+  new(name, nativeSymbol) {
+    this[_name$] = name;
+    this[_nativeSymbol] = nativeSymbol;
+  }
+  static getName(symbol) {
+    return _internal.PrivateSymbol.as(symbol)[_name$];
+  }
+  static getNativeSymbol(symbol) {
+    if (_internal.PrivateSymbol.is(symbol)) return symbol[_nativeSymbol];
+    return null;
+  }
+  ['=='](other) {
+    return _internal.PrivateSymbol.is(other) && core.identical(this[_nativeSymbol], other[_nativeSymbol]);
+  }
+  toString() {
+    return dart.str`Symbol("${this[_name$]}")`;
+  }
+};
+_internal.PrivateSymbol[dart.implements] = () => [core.Symbol];
+dart.setSignature(_internal.PrivateSymbol, {
+  fields: () => ({
+    [_name$]: core.String,
+    [_nativeSymbol]: core.Object
+  }),
+  statics: () => ({
+    getName: dart.definiteFunctionType(core.String, [core.Symbol]),
+    getNativeSymbol: dart.definiteFunctionType(core.Object, [core.Symbol])
+  }),
+  names: ['getName', 'getNativeSymbol']
+});
 core.Iterable$ = dart.generic(E => {
   let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
   let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
@@ -7025,7 +7139,7 @@
       return SetOfE().from(this);
     }
     get length() {
-      dart.assert(!_internal.EfficientLength.is(this));
+      dart.assert(!_internal.EfficientLengthIterable.is(this));
       let count = 0;
       let it = this[dartx.iterator];
       while (dart.test(it.moveNext())) {
@@ -7194,6 +7308,15 @@
   return Iterable;
 });
 core.Iterable = Iterable();
+_internal.EfficientLengthIterable$ = dart.generic(T => {
+  class EfficientLengthIterable extends core.Iterable$(T) {
+    new() {
+      super.new();
+    }
+  }
+  return EfficientLengthIterable;
+});
+_internal.EfficientLengthIterable = EfficientLengthIterable();
 _internal.ListIterable$ = dart.generic(E => {
   let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
   let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
@@ -7203,7 +7326,7 @@
   let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class ListIterable extends core.Iterable$(E) {
+  class ListIterable extends _internal.EfficientLengthIterable$(E) {
     new() {
       super.new();
     }
@@ -7410,7 +7533,6 @@
       return result;
     }
   }
-  ListIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(ListIterable, {
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
@@ -7609,7 +7731,7 @@
   let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
   class MappedIterable extends core.Iterable$(T) {
     static new(iterable, func) {
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
       }
       return new (MappedIterableOfS$T())._(iterable, func);
@@ -7662,12 +7784,13 @@
 });
 _internal.MappedIterable = MappedIterable();
 _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
+  let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
   class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
     new(iterable, func) {
       super._(iterable, func);
     }
   }
-  EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthMappedIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
   return EfficientLengthMappedIterable;
 });
 _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
@@ -7728,7 +7851,6 @@
       return this[_f](this[_source][dartx.elementAt](index));
     }
   }
-  MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(MappedListIterable, {
     fields: () => ({
       [_source]: IterableOfS(),
@@ -7757,6 +7879,11 @@
     get iterator() {
       return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
     }
+    map(T) {
+      return f => {
+        return new (_internal.MappedIterable$(E, T))._(this, f);
+      };
+    }
   }
   dart.setSignature(WhereIterable, {
     fields: () => ({
@@ -7765,13 +7892,12 @@
     }),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
   });
-  dart.defineExtensionMembers(WhereIterable, ['iterator']);
+  dart.defineExtensionMembers(WhereIterable, ['map', 'iterator']);
   return WhereIterable;
 });
 _internal.WhereIterable = WhereIterable();
 _internal.WhereIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-  let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
   class WhereIterator extends core.Iterator$(E) {
     new(iterator, f) {
       this[_iterator] = iterator;
@@ -7779,7 +7905,7 @@
     }
     moveNext() {
       while (dart.test(this[_iterator].moveNext())) {
-        if (dart.test(this[_f](this[_iterator].current))) {
+        if (dart.test(dart.dcall(this[_f], this[_iterator].current))) {
           return true;
         }
       }
@@ -7792,7 +7918,7 @@
   dart.setSignature(WhereIterator, {
     fields: () => ({
       [_iterator]: IteratorOfE(),
-      [_f]: _ElementPredicateOfE()
+      [_f]: _internal._ElementPredicate
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7887,7 +8013,7 @@
       if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
         dart.throw(new core.ArgumentError(takeCount));
       }
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
       }
       return new (TakeIterableOfE())._(iterable, takeCount);
@@ -7914,6 +8040,7 @@
 });
 _internal.TakeIterable = TakeIterable();
 _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
     new(iterable, takeCount) {
       super._(iterable, takeCount);
@@ -7924,7 +8051,7 @@
       return iterableLength;
     }
   }
-  EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthTakeIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
   dart.setSignature(EfficientLengthTakeIterable, {});
   dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
   return EfficientLengthTakeIterable;
@@ -8031,7 +8158,7 @@
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   class SkipIterable extends core.Iterable$(E) {
     static new(iterable, count) {
-      if (_internal.EfficientLength.is(iterable)) {
+      if (_internal.EfficientLengthIterable.is(iterable)) {
         return new (EfficientLengthSkipIterableOfE())(iterable, count);
       }
       return new (SkipIterableOfE())._(iterable, count);
@@ -8069,6 +8196,7 @@
 });
 _internal.SkipIterable = SkipIterable();
 _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
     new(iterable, skipCount) {
       super._(iterable, skipCount);
@@ -8079,7 +8207,7 @@
       return 0;
     }
   }
-  EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
+  EfficientLengthSkipIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
   dart.setSignature(EfficientLengthSkipIterable, {});
   dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
   return EfficientLengthSkipIterable;
@@ -8183,7 +8311,7 @@
   let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class EmptyIterable extends core.Iterable$(E) {
+  class EmptyIterable extends _internal.EfficientLengthIterable$(E) {
     new() {
       super.new();
     }
@@ -8279,7 +8407,6 @@
       return SetOfE().new();
     }
   }
-  EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(EmptyIterable, {
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
@@ -8668,79 +8795,6 @@
   };
 };
 dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
-_internal.Lists = class Lists extends core.Object {
-  static copy(src, srcStart, dst, dstStart, count) {
-    if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
-      for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
-        dst[dartx._set](j, src[dartx._get](i));
-      }
-    } else {
-      for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
-        dst[dartx._set](j, src[dartx._get](i));
-      }
-    }
-  }
-  static areEqual(a, b) {
-    if (core.identical(a, b)) return true;
-    if (!core.List.is(b)) return false;
-    let length = a[dartx.length];
-    if (!dart.equals(length, dart.dload(b, 'length'))) return false;
-    for (let i = 0; i < dart.notNull(length); i++) {
-      if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
-    }
-    return true;
-  }
-  static indexOf(a, element, startIndex, endIndex) {
-    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-      return -1;
-    }
-    if (dart.notNull(startIndex) < 0) {
-      startIndex = 0;
-    }
-    for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-      if (dart.equals(a[dartx._get](i), element)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-  static lastIndexOf(a, element, startIndex) {
-    if (dart.notNull(startIndex) < 0) {
-      return -1;
-    }
-    if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-      startIndex = dart.notNull(a[dartx.length]) - 1;
-    }
-    for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-      if (dart.equals(a[dartx._get](i), element)) {
-        return i;
-      }
-    }
-    return -1;
-  }
-  static indicesCheck(a, start, end) {
-    core.RangeError.checkValidRange(start, end, a[dartx.length]);
-  }
-  static rangeCheck(a, start, length) {
-    core.RangeError.checkNotNegative(length);
-    core.RangeError.checkNotNegative(start);
-    if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
-      let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
-      dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
-    }
-  }
-};
-dart.setSignature(_internal.Lists, {
-  statics: () => ({
-    copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
-    areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
-    indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-    lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-    indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
-    rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
-  }),
-  names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
-});
 _internal.printToZone = null;
 _internal.printToConsole = function(line) {
   _js_primitives.printString(dart.str`${line}`);
@@ -8986,27 +9040,18 @@
   names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
 });
 _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-const _name$ = Symbol('_name');
-const _nativeSymbol = Symbol('_nativeSymbol');
 _internal.Symbol = class Symbol extends core.Object {
   new(name) {
     this[_name$] = name;
-    this[_nativeSymbol] = null;
-  }
-  es6(name, nativeSymbol) {
-    this[_name$] = name;
-    this[_nativeSymbol] = nativeSymbol;
   }
   unvalidated(name) {
     this[_name$] = name;
-    this[_nativeSymbol] = null;
   }
   validated(name) {
     this[_name$] = _internal.Symbol.validatePublicSymbol(name);
-    this[_nativeSymbol] = null;
   }
   ['=='](other) {
-    return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+    return _internal.Symbol.is(other) && this[_name$] == other[_name$];
   }
   get hashCode() {
     let hash = this._hashCode;
@@ -9022,9 +9067,6 @@
   static getName(symbol) {
     return symbol[_name$];
   }
-  static getNativeSymbol(symbol) {
-    return symbol[_nativeSymbol];
-  }
   static validatePublicSymbol(name) {
     if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
     if (dart.test(name[dartx.startsWith]('_'))) {
@@ -9036,23 +9078,17 @@
     return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
   }
 };
-dart.defineNamedConstructor(_internal.Symbol, 'es6');
 dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
 dart.defineNamedConstructor(_internal.Symbol, 'validated');
 _internal.Symbol[dart.implements] = () => [core.Symbol];
 dart.setSignature(_internal.Symbol, {
-  fields: () => ({
-    [_name$]: core.String,
-    [_nativeSymbol]: dart.dynamic
-  }),
-  methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
+  fields: () => ({[_name$]: core.String}),
   statics: () => ({
     getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
-    getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
     validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
     isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
   }),
-  names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
+  names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
 });
 _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
 _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -9235,8 +9271,8 @@
     this.weakPorts = SetOfint().new();
     this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
     this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
-    this.pauseCapability = isolate.Capability.new();
-    this.terminateCapability = isolate.Capability.new();
+    this.pauseCapability = isolate$.Capability.new();
+    this.terminateCapability = isolate$.Capability.new();
     this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
     this.pauseTokens = SetOfCapability().new();
     this.errorPorts = SetOfSendPort().new();
@@ -9283,7 +9319,7 @@
     this.errorsAreFatal = errorsAreFatal;
   }
   handlePing(responsePort, pingType) {
-    if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+    if (pingType == isolate$.Isolate.IMMEDIATE || pingType == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
       responsePort.send(null);
       return;
     }
@@ -9291,11 +9327,7 @@
       responsePort.send(null);
     }
     dart.fn(respond, VoidTovoid$());
-    if (pingType == isolate.Isolate.AS_EVENT) {
-      _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
-      return;
-    }
-    dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
+    dart.assert(pingType == isolate$.Isolate.BEFORE_NEXT_EVENT);
     if (this[_scheduledControlEvents] == null) {
       this[_scheduledControlEvents] = collection.Queue.new();
     }
@@ -9303,15 +9335,11 @@
   }
   handleKill(authentification, priority) {
     if (!dart.equals(this.terminateCapability, authentification)) return;
-    if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+    if (priority == isolate$.Isolate.IMMEDIATE || priority == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
       this.kill();
       return;
     }
-    if (priority == isolate.Isolate.AS_EVENT) {
-      _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
-      return;
-    }
-    dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
+    dart.assert(priority == isolate$.Isolate.BEFORE_NEXT_EVENT);
     if (this[_scheduledControlEvents] == null) {
       this[_scheduledControlEvents] = collection.Queue.new();
     }
@@ -9379,47 +9407,47 @@
     switch (dart.dindex(message, 0)) {
       case "pause":
       {
-        this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
+        this.addPause(isolate$.Capability._check(dart.dindex(message, 1)), isolate$.Capability._check(dart.dindex(message, 2)));
         break;
       }
       case "resume":
       {
-        this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
+        this.removePause(isolate$.Capability._check(dart.dindex(message, 1)));
         break;
       }
       case 'add-ondone':
       {
-        this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.addDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case 'remove-ondone':
       {
-        this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.removeDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case 'set-errors-fatal':
       {
-        this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
+        this.setErrorsFatal(isolate$.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
         break;
       }
       case "ping":
       {
-        this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        this.handlePing(isolate$.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
         break;
       }
       case "kill":
       {
-        this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+        this.handleKill(isolate$.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
         break;
       }
       case "getErrors":
       {
-        this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.addErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       case "stopErrors":
       {
-        this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+        this.removeErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
         break;
       }
       default:
@@ -9462,7 +9490,7 @@
     this.errorPorts.clear();
     if (this.doneHandlers != null) {
       for (let port of core.Iterable._check(this.doneHandlers)) {
-        isolate.SendPort._check(port);
+        isolate$.SendPort._check(port);
         port.send(null);
       }
       this.doneHandlers = null;
@@ -9482,8 +9510,8 @@
     weakPorts: SetOfint(),
     isolateStatics: dart.dynamic,
     controlPort: _isolate_helper.RawReceivePortImpl,
-    pauseCapability: isolate.Capability,
-    terminateCapability: isolate.Capability,
+    pauseCapability: isolate$.Capability,
+    terminateCapability: isolate$.Capability,
     initialized: core.bool,
     isPaused: core.bool,
     delayedEvents: ListOf_IsolateEvent(),
@@ -9495,15 +9523,15 @@
     errorPorts: SetOfSendPort()
   }),
   methods: () => ({
-    addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
-    removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
-    handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
-    handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
-    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    addPause: dart.definiteFunctionType(dart.void, [isolate$.Capability, isolate$.Capability]),
+    removePause: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    addDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.bool]),
+    handlePing: dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.int]),
+    handleKill: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.int]),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
     handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
     eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
     [_setGlobals]: dart.definiteFunctionType(dart.void, []),
@@ -9704,7 +9732,7 @@
         let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
         let context = new _isolate_helper._IsolateContext();
         _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
-          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
+          _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate$.SendPort._check(replyTo));
         }, VoidToNull()), 'worker-start');
         _isolate_helper._globalState.currentContext = context;
         _isolate_helper._globalState.topEventLoop.run();
@@ -9717,7 +9745,7 @@
       }
       case 'message':
       {
-        let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
+        let port = isolate$.SendPort._check(dart.dindex(msg, 'port'));
         if (port != null) {
           dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
         }
@@ -9805,7 +9833,7 @@
     if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
       uri = dart.notNull(uri) + ".js";
     }
-    let port = isolate.ReceivePort.new();
+    let port = isolate$.ReceivePort.new();
     let completer = CompleterOfList().new();
     port.first.then(dart.dynamic)(dart.fn(msg => {
       if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
@@ -9844,7 +9872,7 @@
   }
   static get currentIsolate() {
     let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-    return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
+    return new isolate$.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
   }
   static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
     let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -9922,10 +9950,10 @@
     spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
     spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
     spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
-    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+    _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
+    _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+    _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+    _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
     workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
   }),
   names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
@@ -9952,10 +9980,10 @@
     }
   }
 };
-_isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._BaseSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._BaseSendPort, {
   fields: () => ({[_isolateId]: core.int}),
-  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
+  methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate$.SendPort])})
 });
 const _receivePort = Symbol('_receivePort');
 const _isClosed = Symbol('_isClosed');
@@ -9987,7 +10015,7 @@
     return this[_receivePort][_id];
   }
 };
-_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._NativeJsSendPort, {
   fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
   methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
@@ -10018,7 +10046,7 @@
     return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
   }
 };
-_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
+_isolate_helper._WorkerSendPort[dart.implements] = () => [isolate$.SendPort];
 dart.setSignature(_isolate_helper._WorkerSendPort, {
   fields: () => ({
     [_workerId]: core.int,
@@ -10076,14 +10104,14 @@
 };
 dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
 dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
-_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
+_isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate$.RawReceivePort];
 dart.setSignature(_isolate_helper.RawReceivePortImpl, {
   fields: () => ({
     [_id]: core.int,
     [_handler]: core.Function,
     [_isClosed]: core.bool
   }),
-  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
   setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
   methods: () => ({
     [_close]: dart.definiteFunctionType(dart.void, []),
@@ -10229,7 +10257,8 @@
         }, VoidToNull()), onCancel: dart.fn(() => {
           if (timer != null) timer.cancel();
           timer = null;
-        }, VoidToNull())});
+          return async.Future._nullFuture;
+        }, VoidTo_Future())});
       return controller.stream;
     }
     static eventTransformed(source, mapSink) {
@@ -10288,9 +10317,7 @@
               subscription.pause();
             }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidToNull()), onCancel: dart.fn(() => {
-              subscription.cancel();
-            }, VoidToNull()), sync: true});
+            }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
         }
         return controller.stream;
       };
@@ -10328,9 +10355,7 @@
               subscription.pause();
             }, VoidToNull()), onResume: dart.fn(() => {
               subscription.resume();
-            }, VoidToNull()), onCancel: dart.fn(() => {
-              subscription.cancel();
-            }, VoidToNull()), sync: true});
+            }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
         }
         return controller.stream;
       };
@@ -10861,13 +10886,13 @@
 dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
 dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
 dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
-_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
+_isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate$.ReceivePort];
 dart.setSignature(_isolate_helper.ReceivePortImpl, {
   fields: () => ({
-    [_rawPort]: isolate.RawReceivePort,
+    [_rawPort]: isolate$.RawReceivePort,
     [_controller]: async.StreamController
   }),
-  getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+  getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
   methods: () => ({
     listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     close: dart.definiteFunctionType(dart.void, [])
@@ -10980,7 +11005,7 @@
   }
 };
 dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
-_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
+_isolate_helper.CapabilityImpl[dart.implements] = () => [isolate$.Capability];
 dart.setSignature(_isolate_helper.CapabilityImpl, {
   fields: () => ({[_id]: core.int}),
   methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
@@ -11018,7 +11043,7 @@
     if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
     if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
     if (_interceptors.Interceptor.is(x)) this.unsupported(x);
-    if (isolate.RawReceivePort.is(x)) {
+    if (isolate$.RawReceivePort.is(x)) {
       this.unsupported(x, "RawReceivePorts can't be transmitted:");
     }
     if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
@@ -11296,7 +11321,7 @@
   }
   deserializeRawSendPort(x) {
     dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
-    let result = isolate.SendPort._check(dart.dindex(x, 1));
+    let result = isolate$.SendPort._check(dart.dindex(x, 1));
     this.deserializedObjects[dartx.add](result);
     return result;
   }
@@ -11348,8 +11373,8 @@
     deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
     deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
     deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
-    deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-    deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+    deserializeSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
+    deserializeRawSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
     deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
     deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
     deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
@@ -11386,6 +11411,11 @@
 _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
 _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
 _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
+dart.defineLazy(_js_helper, {
+  get _identityHashCode() {
+    return Symbol("_identityHashCode");
+  }
+});
 _js_helper._Patch = class _Patch extends core.Object {
   new() {
   }
@@ -11405,10 +11435,10 @@
     _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
   }
   static objectHashCode(object) {
-    let hash = object.$identityHash;
+    let hash = object[_js_helper._identityHashCode];
     if (hash == null) {
       hash = Math.random() * 0x3fffffff | 0;
-      object.$identityHash = hash;
+      object[_js_helper._identityHashCode] = hash;
     }
     return hash;
   }
@@ -12047,6 +12077,9 @@
   new() {
     super.new();
   }
+  toString() {
+    return super.toString();
+  }
 };
 _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
   new() {
@@ -12069,13 +12102,18 @@
   fields: () => ({message: dart.dynamic})
 });
 core.AssertionError = class AssertionError extends core.Error {
-  new() {
+  new(message) {
+    if (message === void 0) message = null;
+    this.message = message;
     super.new();
   }
   toString() {
     return "Assertion failed";
   }
 };
+dart.setSignature(core.AssertionError, {
+  fields: () => ({message: core.Object})
+});
 _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
   new(message) {
     this[_message] = message;
@@ -12680,7 +12718,7 @@
   let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-  class LinkedHashMapKeyIterable extends core.Iterable$(E) {
+  class LinkedHashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
     new(map) {
       this[_map] = map;
       super.new();
@@ -12709,7 +12747,6 @@
       }
     }
   }
-  LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(LinkedHashMapKeyIterable, {
     fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -13380,7 +13417,11 @@
 };
 dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
 _js_mirrors.getName = function(symbol) {
-  return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+  if (_internal.PrivateSymbol.is(symbol)) {
+    return _internal.PrivateSymbol.getName(symbol);
+  } else {
+    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+  }
 };
 dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
 _js_mirrors.getSymbol = function(name, library) {
@@ -13459,7 +13500,7 @@
 });
 _js_mirrors._Lazy = _Lazy();
 _js_mirrors._getESSymbol = function(symbol) {
-  return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+  return _internal.PrivateSymbol.getNativeSymbol(symbol);
 };
 dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
 _js_mirrors._getMember = function(symbol) {
@@ -13503,7 +13544,7 @@
 dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
 _js_mirrors._getSymbolForESSymbol = function(member) {
   let name = _js_mirrors._getNameForESSymbol(member);
-  return new _internal.Symbol.es6(name, member);
+  return new _internal.PrivateSymbol(name, member);
 };
 dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
 _js_mirrors._getSymbolForMember = function(member) {
@@ -13511,7 +13552,7 @@
     return core.Symbol.new(member);
   } else {
     let name = _js_mirrors._getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
+    return new _internal.PrivateSymbol(name, member);
   }
 };
 dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
@@ -13655,12 +13696,18 @@
 };
 _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
 _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
+  loadLibrary(...args) {
+    return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl('loadLibrary', args, {isMethod: true})));
+  }
   get isImport() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
   }
   get isExport() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
   }
+  get isDeferred() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isDeferred', [], {isGetter: true})));
+  }
   get sourceLibrary() {
     return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
   }
@@ -13691,6 +13738,9 @@
   setField(...args) {
     return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
   }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
 };
 _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
 const _getAccessor = Symbol('_getAccessor');
@@ -13838,7 +13888,7 @@
       let setters = _js_mirrors._getSetters(unwrapped);
       setters[dartx.forEach](dart.fn((symbol, ft) => {
         let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
-        symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+        symbol = new _internal.PrivateSymbol(name, _js_mirrors._getESSymbol(symbol));
         this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
       }, SymbolAnddynamicToNull()));
       let staticFields = _js_mirrors._getStaticFields(unwrapped);
@@ -13987,12 +14037,18 @@
   get typeVariables() {
     return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
   }
+  delegate(...args) {
+    return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+  }
   isSubclassOf(...args) {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
   }
   get isAbstract() {
     return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
   }
+  get isEnum() {
+    return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isEnum', [], {isGetter: true})));
+  }
   get instanceMembers() {
     return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
   }
@@ -16798,9 +16854,9 @@
 async._registerErrorHandler = function(R) {
   return (errorHandler, zone) => {
     if (async.ZoneBinaryCallback.is(errorHandler)) {
-      return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
+      return zone.registerBinaryCallback(R, dart.dynamic, core.StackTrace)(async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).as(errorHandler));
     } else {
-      return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
+      return zone.registerUnaryCallback(R, dart.dynamic)(async.ZoneUnaryCallback$(R, dart.dynamic).as(errorHandler));
     }
   };
 };
@@ -16954,7 +17010,6 @@
 const _waitsForCancel = Symbol('_waitsForCancel');
 const _canFire = Symbol('_canFire');
 const _cancelOnError = Symbol('_cancelOnError');
-const _incrementPauseCount = Symbol('_incrementPauseCount');
 const _sendData = Symbol('_sendData');
 const _addPending = Symbol('_addPending');
 const _sendError = Symbol('_sendError');
@@ -16999,7 +17054,7 @@
     }
     onError(handleError) {
       if (handleError == null) handleError = async._nullErrorHandler;
-      this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
+      this[_onError] = async._registerErrorHandler(dart.dynamic)(handleError, this[_zone]);
     }
     onDone(handleDone) {
       if (handleDone == null) handleDone = async._nullDoneHandler;
@@ -17032,9 +17087,11 @@
     }
     cancel() {
       this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-      if (dart.test(this[_isCanceled])) return this[_cancelFuture];
-      this[_cancel]();
-      return this[_cancelFuture];
+      if (!dart.test(this[_isCanceled])) {
+        this[_cancel]();
+      }
+      let l = this[_cancelFuture];
+      return l != null ? l : async.Future._nullFuture;
     }
     asFuture(E) {
       return futureValue => {
@@ -17044,8 +17101,14 @@
           result[_complete](futureValue);
         }, VoidToNull());
         this[_onError] = dart.fn((error, stackTrace) => {
-          this.cancel();
-          result[_completeError](error, core.StackTrace._check(stackTrace));
+          let cancelFuture = this.cancel();
+          if (!core.identical(cancelFuture, async.Future._nullFuture)) {
+            cancelFuture.whenComplete(dart.fn(() => {
+              result[_completeError](error, core.StackTrace._check(stackTrace));
+            }, VoidToNull()));
+          } else {
+            result[_completeError](error, core.StackTrace._check(stackTrace));
+          }
         }, dynamicAnddynamicToNull());
         return result;
       };
@@ -17091,9 +17154,6 @@
       if (!dart.test(this[_inCallback])) this[_pending] = null;
       this[_cancelFuture] = this[_onCancel]();
     }
-    [_incrementPauseCount]() {
-      this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-    }
     [_decrementPauseCount]() {
       dart.assert(this[_isPaused]);
       this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
@@ -17180,7 +17240,7 @@
       if (dart.test(this[_cancelOnError])) {
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
         this[_cancel]();
-        if (async.Future.is(this[_cancelFuture])) {
+        if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
           this[_cancelFuture].whenComplete(sendError);
         } else {
           sendError();
@@ -17203,7 +17263,7 @@
       dart.fn(sendDone, VoidTovoid$());
       this[_cancel]();
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-      if (async.Future.is(this[_cancelFuture])) {
+      if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
         this[_cancelFuture].whenComplete(sendDone);
       } else {
         sendDone();
@@ -17213,7 +17273,7 @@
       dart.assert(!dart.test(this[_inCallback]));
       let wasInputPaused = this[_isInputPaused];
       this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-      callback();
+      dart.dcall(callback);
       this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
       this[_checkState](wasInputPaused);
     }
@@ -17281,7 +17341,6 @@
       cancel: dart.definiteFunctionType(async.Future, []),
       asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
       [_cancel]: dart.definiteFunctionType(dart.void, []),
-      [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
       [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
       [_add$]: dart.definiteFunctionType(dart.void, [T]),
       [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
@@ -17293,7 +17352,7 @@
       [_sendData]: dart.definiteFunctionType(dart.void, [T]),
       [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
       [_sendDone]: dart.definiteFunctionType(dart.void, []),
-      [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+      [_guardCallback]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
       [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
     })
   });
@@ -17308,7 +17367,6 @@
 async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
 async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
 async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
-async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
 async._ControllerSubscription$ = dart.generic(T => {
   let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
   class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
@@ -18064,7 +18122,7 @@
             result[_completeError](error, stackTrace);
           }
         }
-        dart.fn(handleError, dynamicAnddynamicTovoid$());
+        dart.fn(handleError, dynamicAnddynamicToNull());
         try {
           for (let future of futures) {
             let pos = remaining;
@@ -18210,7 +18268,7 @@
 };
 dart.fn(async._nonNullError, ObjectToObject());
 async._FutureOnValue$ = dart.generic((S, T) => {
-  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
+  const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(async.FutureOr$(T), [S]));
   return _FutureOnValue;
 });
 async._FutureOnValue = _FutureOnValue();
@@ -18301,6 +18359,9 @@
 const _whenCompleteAction = Symbol('_whenCompleteAction');
 async._FutureListener$ = dart.generic((S, T) => {
   let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
+  let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
+  let ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = () => (ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(FutureOrOfT(), core.Object, core.StackTrace)))();
+  let dynamicToFutureOrOfT = () => (dynamicToFutureOrOfT = dart.constFn(dart.functionType(FutureOrOfT(), [dart.dynamic])))();
   let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
   class _FutureListener extends core.Object {
     then(result, onValue, errorCallback) {
@@ -18360,7 +18421,7 @@
     }
     handleValue(sourceResult) {
       S._check(sourceResult);
-      return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
+      return this[_zone].runUnary(FutureOrOfT(), S)(this[_onValue], sourceResult);
     }
     matchesErrorTest(asyncError) {
       if (!dart.test(this.hasErrorTest)) return true;
@@ -18370,10 +18431,10 @@
     handleError(asyncError) {
       dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
       if (async.ZoneBinaryCallback.is(this.errorCallback)) {
-        let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
-        return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
+        let typedErrorCallback = ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace().as(this.errorCallback);
+        return this[_zone].runBinary(FutureOrOfT(), core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
       } else {
-        return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
+        return this[_zone].runUnary(FutureOrOfT(), dart.dynamic)(dynamicToFutureOrOfT()._check(this.errorCallback), asyncError.error);
       }
     }
     handleWhenComplete() {
@@ -18406,9 +18467,9 @@
       hasErrorCallback: dart.definiteFunctionType(core.bool, [])
     }),
     methods: () => ({
-      handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
+      handleValue: dart.definiteFunctionType(async.FutureOr$(T), [S]),
       matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
-      handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
+      handleError: dart.definiteFunctionType(async.FutureOr$(T), [async.AsyncError]),
       handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
     })
   });
@@ -18509,7 +18570,7 @@
         if (!core.identical(currentZone, async._ROOT_ZONE)) {
           f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
           if (onError != null) {
-            onError = async._registerErrorHandler(T)(onError, currentZone);
+            onError = async._registerErrorHandler(E)(onError, currentZone);
           }
         }
         return this[_thenNoZoneRegistration](E)(f, onError);
@@ -18518,7 +18579,7 @@
     [_thenNoZoneRegistration](E) {
       return (f, onError) => {
         let result = new (async._Future$(E))();
-        this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
+        this[_addListener](new (async._FutureListener$(T, E)).then(result, async._FutureOnValue$(T, E)._check(f), onError));
         return result;
       };
     }
@@ -19210,10 +19271,10 @@
 });
 async.StreamTransformer = StreamTransformer();
 async.StreamIterator$ = dart.generic(T => {
-  let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
+  let _StreamIteratorOfT = () => (_StreamIteratorOfT = dart.constFn(async._StreamIterator$(T)))();
   class StreamIterator extends core.Object {
     static new(stream) {
-      return new (_StreamIteratorImplOfT())(stream);
+      return new (_StreamIteratorOfT())(stream);
     }
   }
   dart.addTypeTests(StreamIterator);
@@ -20081,36 +20142,6 @@
   return _StreamImplEvents;
 });
 async._StreamImplEvents = _StreamImplEvents();
-const _unlink = Symbol('_unlink');
-const _insertBefore = Symbol('_insertBefore');
-async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
-  new() {
-    this[_next$] = null;
-    this[_previous$] = null;
-  }
-  [_unlink]() {
-    this[_previous$][_next$] = this[_next$];
-    this[_next$][_previous$] = this[_previous$];
-    this[_next$] = this[_previous$] = this;
-  }
-  [_insertBefore](newNext) {
-    let newPrevious = newNext[_previous$];
-    newPrevious[_next$] = this;
-    newNext[_previous$] = this[_previous$];
-    this[_previous$][_next$] = newNext;
-    this[_previous$] = newPrevious;
-  }
-};
-dart.setSignature(async._BroadcastLinkedList, {
-  fields: () => ({
-    [_next$]: async._BroadcastLinkedList,
-    [_previous$]: async._BroadcastLinkedList
-  }),
-  methods: () => ({
-    [_unlink]: dart.definiteFunctionType(dart.void, []),
-    [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
-  })
-});
 async._BroadcastCallback$ = dart.generic(T => {
   const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
   return _BroadcastCallback;
@@ -20162,7 +20193,7 @@
       }
     }
     cancel() {
-      return null;
+      return async.Future._nullFuture;
     }
     asFuture(E) {
       return futureValue => {
@@ -20338,7 +20369,7 @@
     }
     cancel() {
       this[_stream][_cancelSubscription]();
-      return null;
+      return async.Future._nullFuture;
     }
     get isPaused() {
       return this[_stream][_isSubscriptionPaused];
@@ -20368,146 +20399,109 @@
   return _BroadcastSubscriptionWrapper;
 });
 async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-const _current$1 = Symbol('_current');
-const _futureOrPrefetch = Symbol('_futureOrPrefetch');
-const _clear = Symbol('_clear');
-async._StreamIteratorImpl$ = dart.generic(T => {
+const _stateData = Symbol('_stateData');
+const _initializeOrDone = Symbol('_initializeOrDone');
+async._StreamIterator$ = dart.generic(T => {
+  let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+  let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
   let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
-  class _StreamIteratorImpl extends core.Object {
+  class _StreamIterator extends core.Object {
     new(stream) {
+      this[_stateData] = stream;
       this[_subscription] = null;
-      this[_current$1] = null;
-      this[_futureOrPrefetch] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-      this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+      this[_isPaused] = false;
     }
     get current() {
-      return this[_current$1];
+      if (this[_subscription] != null && dart.test(this[_isPaused])) {
+        return T.as(this[_stateData]);
+      }
+      return null;
     }
     moveNext() {
-      if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
-        return new (_FutureOfbool()).immediate(false);
-      }
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+      if (this[_subscription] != null) {
+        if (dart.test(this[_isPaused])) {
+          let future = new (_FutureOfbool())();
+          this[_stateData] = future;
+          this[_isPaused] = false;
+          this[_subscription].resume();
+          return future;
+        }
         dart.throw(new core.StateError("Already waiting for next."));
       }
-      if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
-        this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-        this[_current$1] = null;
-        let result = new (_FutureOfbool())();
-        this[_futureOrPrefetch] = result;
-        return result;
-      } else {
-        dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
-        switch (this[_state]) {
-          case async._StreamIteratorImpl._STATE_EXTRA_DATA:
-          {
-            this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-            this[_current$1] = T.as(this[_futureOrPrefetch]);
-            this[_futureOrPrefetch] = null;
-            this[_subscription].resume();
-            return new (_FutureOfbool()).immediate(true);
-          }
-          case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
-          {
-            let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
-            this[_clear]();
-            return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
-          }
-          case async._StreamIteratorImpl._STATE_EXTRA_DONE:
-          {
-            this[_clear]();
-            return new (_FutureOfbool()).immediate(false);
-          }
-        }
-      }
+      return this[_initializeOrDone]();
     }
-    [_clear]() {
-      this[_subscription] = null;
-      this[_futureOrPrefetch] = null;
-      this[_current$1] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_DONE;
+    [_initializeOrDone]() {
+      dart.assert(this[_subscription] == null);
+      let stateData = this[_stateData];
+      if (stateData != null) {
+        let stream = StreamOfT().as(stateData);
+        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+        let future = new (_FutureOfbool())();
+        this[_stateData] = future;
+        return future;
+      }
+      return new (_FutureOfbool()).immediate(false);
     }
     cancel() {
-      let subscription = this[_subscription];
-      if (subscription == null) return null;
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_complete](false);
-      } else {
-        this[_clear]();
+      let subscription = StreamSubscriptionOfT()._check(this[_subscription]);
+      let stateData = this[_stateData];
+      this[_stateData] = null;
+      if (subscription != null) {
+        this[_subscription] = null;
+        if (!dart.test(this[_isPaused])) {
+          let future = _FutureOfbool().as(stateData);
+          future[_asyncComplete](false);
+        }
+        return subscription.cancel();
       }
-      return subscription.cancel();
+      return async.Future._nullFuture;
     }
     [_onData](data) {
       T._check(data);
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        this[_current$1] = data;
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-        hasNext[_complete](true);
-        return;
-      }
-      this[_subscription].pause();
-      dart.assert(this[_futureOrPrefetch] == null);
-      this[_futureOrPrefetch] = data;
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_stateData] = data;
+      this[_isPaused] = true;
+      moveNextFuture[_complete](true);
+      if (this[_subscription] != null && dart.test(this[_isPaused])) this[_subscription].pause();
     }
     [_onError](error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_completeError](error, stackTrace);
-        return;
-      }
-      this[_subscription].pause();
-      dart.assert(this[_futureOrPrefetch] == null);
-      this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_subscription] = null;
+      this[_stateData] = null;
+      moveNextFuture[_completeError](error, stackTrace);
     }
     [_onDone]() {
-      if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-        let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-        this[_clear]();
-        hasNext[_complete](false);
-        return;
-      }
-      this[_subscription].pause();
-      this[_futureOrPrefetch] = null;
-      this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
+      dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+      let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+      this[_subscription] = null;
+      this[_stateData] = null;
+      moveNextFuture[_complete](false);
     }
   }
-  dart.addTypeTests(_StreamIteratorImpl);
-  _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
-  dart.setSignature(_StreamIteratorImpl, {
+  dart.addTypeTests(_StreamIterator);
+  _StreamIterator[dart.implements] = () => [StreamIteratorOfT()];
+  dart.setSignature(_StreamIterator, {
     fields: () => ({
       [_subscription]: async.StreamSubscription,
-      [_current$1]: T,
-      [_futureOrPrefetch]: dart.dynamic,
-      [_state]: core.int
+      [_stateData]: core.Object,
+      [_isPaused]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({
       moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
-      [_clear]: dart.definiteFunctionType(dart.void, []),
+      [_initializeOrDone]: dart.definiteFunctionType(async.Future$(core.bool), []),
       cancel: dart.definiteFunctionType(async.Future, []),
       [_onData]: dart.definiteFunctionType(dart.void, [T]),
       [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       [_onDone]: dart.definiteFunctionType(dart.void, [])
     })
   });
-  return _StreamIteratorImpl;
+  return _StreamIterator;
 });
-async._StreamIteratorImpl = _StreamIteratorImpl();
-async._StreamIteratorImpl._STATE_FOUND = 0;
-async._StreamIteratorImpl._STATE_DONE = 1;
-async._StreamIteratorImpl._STATE_MOVING = 2;
-async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
-async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
-async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
+async._StreamIterator = _StreamIterator();
 async._EmptyStream$ = dart.generic(T => {
   let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20550,7 +20544,7 @@
 dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
 async._cancelAndError = function(subscription, future, error, stackTrace) {
   let cancelFuture = subscription.cancel();
-  if (async.Future.is(cancelFuture)) {
+  if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
     cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
   } else {
     future[_completeError](error, stackTrace);
@@ -20575,7 +20569,7 @@
 dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
 async._cancelAndValue = function(subscription, future, value) {
   let cancelFuture = subscription.cancel();
-  if (async.Future.is(cancelFuture)) {
+  if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
     cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
   } else {
     future[_complete](value);
@@ -20858,6 +20852,7 @@
 async._HandleErrorStream = _HandleErrorStream();
 const _count = Symbol('_count');
 async._TakeStream$ = dart.generic(T => {
+  let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
   let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
   let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
   let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20868,6 +20863,10 @@
       if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
     }
     [_createSubscription](onData, onError, onDone, cancelOnError) {
+      if (this[_count] == 0) {
+        this[_source$].listen(null).cancel();
+        return new (_DoneStreamSubscriptionOfT())(onDone);
+      }
       return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
     }
     [_handleData](inputEvent, sink) {
@@ -21170,7 +21169,7 @@
       if (dart.test(this[_isSubscribed])) {
         let subscription = this[_subscription];
         this[_subscription] = null;
-        subscription.cancel();
+        return subscription.cancel();
       }
       return null;
     }
@@ -22474,8 +22473,8 @@
     if (onError != null) {
       errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
         try {
-          if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
-            return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
+          if (async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).is(onError)) {
+            return self.parent.runBinary(R, dart.dynamic, core.StackTrace)(onError, error, stackTrace);
           }
           return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
         } catch (e) {
@@ -22937,7 +22936,7 @@
   let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-  class _HashMapKeyIterable extends core.Iterable$(E) {
+  class _HashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -22964,7 +22963,6 @@
       }
     }
   }
-  _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_HashMapKeyIterable, {
     fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -22980,7 +22978,7 @@
 });
 collection._HashMapKeyIterable = _HashMapKeyIterable();
 const _offset = Symbol('_offset');
-const _current$2 = Symbol('_current');
+const _current$1 = Symbol('_current');
 collection._HashMapKeyIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
@@ -22990,10 +22988,10 @@
       this[_map$0] = map;
       this[_keys] = keys;
       this[_offset] = 0;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       let keys = this[_keys];
@@ -23001,10 +22999,10 @@
       if (keys !== this[_map$0][_keys]) {
         dart.throw(new core.ConcurrentModificationError(this[_map$0]));
       } else if (dart.notNull(offset) >= keys.length) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = keys[offset];
+        this[_current$1] = keys[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -23017,7 +23015,7 @@
       [_map$0]: _HashMapOfE$dynamic(),
       [_keys]: ListOfE(),
       [_offset]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -23180,7 +23178,7 @@
 collection._Es6MapIterable$ = dart.generic(E => {
   let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-  class _Es6MapIterable extends core.Iterable$(E) {
+  class _Es6MapIterable extends _internal.EfficientLengthIterable$(E) {
     new(map, isKeys) {
       this[_map$0] = map;
       this[_isKeys] = isKeys;
@@ -23218,7 +23216,6 @@
       }
     }
   }
-  _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_Es6MapIterable, {
     fields: () => ({
       [_map$0]: dart.dynamic,
@@ -23248,7 +23245,7 @@
       this[_isKeys] = isKeys;
       this[_jsIterator$] = null;
       this[_next$0] = null;
-      this[_current$2] = null;
+      this[_current$1] = null;
       this[_done] = null;
       if (dart.test(this[_isKeys])) {
         this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
@@ -23258,7 +23255,7 @@
       this[_done] = false;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
@@ -23268,11 +23265,11 @@
       this[_next$0] = this[_jsIterator$].next();
       let done = this[_next$0].done;
       if (done) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_done] = true;
         return false;
       } else {
-        this[_current$2] = this[_next$0].value;
+        this[_current$1] = this[_next$0].value;
         return true;
       }
     }
@@ -23286,7 +23283,7 @@
       [_isKeys]: core.bool,
       [_jsIterator$]: dart.dynamic,
       [_next$0]: dart.dynamic,
-      [_current$2]: E,
+      [_current$1]: E,
       [_done]: core.bool
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -24077,10 +24074,10 @@
       this[_set] = set;
       this[_elements] = elements;
       this[_offset] = 0;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       let elements = this[_elements];
@@ -24088,10 +24085,10 @@
       if (elements !== dart.dload(this[_set], _elements)) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
       } else if (dart.notNull(offset) >= elements.length) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = elements[offset];
+        this[_current$1] = elements[offset];
         this[_offset] = dart.notNull(offset) + 1;
         return true;
       }
@@ -24104,7 +24101,7 @@
       [_set]: dart.dynamic,
       [_elements]: ListOfE(),
       [_offset]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24558,20 +24555,20 @@
       this[_set] = set;
       this[_modifications$] = modifications;
       this[_cell$] = null;
-      this[_current$2] = null;
+      this[_current$1] = null;
       this[_cell$] = this[_set][_first$];
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (this[_modifications$] != this[_set][_modifications$]) {
         dart.throw(new core.ConcurrentModificationError(this[_set]));
       } else if (this[_cell$] == null) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       } else {
-        this[_current$2] = E._check(this[_cell$][_element]);
+        this[_current$1] = E._check(this[_cell$][_element]);
         this[_cell$] = this[_cell$][_next$0];
         return true;
       }
@@ -24584,7 +24581,7 @@
       [_set]: collection._LinkedHashSet,
       [_modifications$]: core.int,
       [_cell$]: collection._LinkedHashSetCell,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24849,7 +24846,7 @@
       return SetOfE().from(this);
     }
     get length() {
-      dart.assert(!_internal.EfficientLength.is(this));
+      dart.assert(!_internal.EfficientLengthIterable.is(this));
       let count = 0;
       let it = this[dartx.iterator];
       while (dart.test(it.moveNext())) {
@@ -25277,9 +25274,9 @@
 });
 collection.LinkedHashSet = LinkedHashSet();
 const _modificationCount = Symbol('_modificationCount');
-const _insertBefore$ = Symbol('_insertBefore');
+const _insertBefore = Symbol('_insertBefore');
 const _list = Symbol('_list');
-const _unlink$ = Symbol('_unlink');
+const _unlink = Symbol('_unlink');
 collection.LinkedList$ = dart.generic(E => {
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
   let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
@@ -25293,12 +25290,12 @@
     }
     addFirst(entry) {
       E._check(entry);
-      this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+      this[_insertBefore](this[_first$], entry, {updateFirst: true});
       this[_first$] = entry;
     }
     add(entry) {
       E._check(entry);
-      this[_insertBefore$](this[_first$], entry, {updateFirst: false});
+      this[_insertBefore](this[_first$], entry, {updateFirst: false});
     }
     addAll(entries) {
       IterableOfE()._check(entries);
@@ -25307,7 +25304,7 @@
     remove(entry) {
       E._check(entry);
       if (!dart.equals(entry[_list], this)) return false;
-      this[_unlink$](entry);
+      this[_unlink](entry);
       return true;
     }
     get iterator() {
@@ -25364,7 +25361,7 @@
     get isEmpty() {
       return this[_length$1] == 0;
     }
-    [_insertBefore$](entry, newEntry, opts) {
+    [_insertBefore](entry, newEntry, opts) {
       E._check(entry);
       E._check(newEntry);
       let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
@@ -25391,7 +25388,7 @@
       }
       this[_length$1] = dart.notNull(this[_length$1]) + 1;
     }
-    [_unlink$](entry) {
+    [_unlink](entry) {
       E._check(entry);
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
       entry[_next$0][_previous$0] = entry[_previous$0];
@@ -25418,8 +25415,8 @@
       addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
       remove: dart.definiteFunctionType(core.bool, [E]),
       clear: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-      [_unlink$]: dart.definiteFunctionType(dart.void, [E])
+      [_insertBefore]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+      [_unlink]: dart.definiteFunctionType(dart.void, [E])
     })
   });
   dart.defineExtensionMembers(LinkedList, [
@@ -25445,21 +25442,21 @@
       this[_modificationCount] = list[_modificationCount];
       this[_next$0] = list[_first$];
       this[_visitedFirst] = false;
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       if (this[_modificationCount] != this[_list][_modificationCount]) {
         dart.throw(new core.ConcurrentModificationError(this));
       }
       if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
       this[_visitedFirst] = true;
-      this[_current$2] = E._check(this[_next$0]);
+      this[_current$1] = E._check(this[_next$0]);
       this[_next$0] = this[_next$0][_next$0];
       return true;
     }
@@ -25470,7 +25467,7 @@
     fields: () => ({
       [_list]: LinkedListOfE(),
       [_modificationCount]: core.int,
-      [_current$2]: E,
+      [_current$1]: E,
       [_next$0]: LinkedListEntryOfE(),
       [_visitedFirst]: core.bool
     }),
@@ -25492,23 +25489,23 @@
       return this[_list];
     }
     unlink() {
-      this[_list][_unlink$](E._check(this));
+      this[_list][_unlink](E._check(this));
     }
     get next() {
-      if (core.identical(this, this[_next$0])) return null;
+      if (this[_list] == null || core.identical(this[_list].first, this[_next$0])) return null;
       return this[_next$0];
     }
     get previous() {
-      if (core.identical(this, this[_previous$0])) return null;
+      if (this[_list] == null || core.identical(this, this[_list].first)) return null;
       return this[_previous$0];
     }
     insertAfter(entry) {
       E._check(entry);
-      this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
+      this[_list][_insertBefore](this[_next$0], entry, {updateFirst: false});
     }
     insertBefore(entry) {
       E._check(entry);
-      this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
+      this[_list][_insertBefore](E.as(this), entry, {updateFirst: true});
     }
   }
   dart.addTypeTests(LinkedListEntry);
@@ -25677,7 +25674,7 @@
 collection._MapBaseValueIterable$ = dart.generic((K, V) => {
   let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
   let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-  class _MapBaseValueIterable extends core.Iterable$(V) {
+  class _MapBaseValueIterable extends _internal.EfficientLengthIterable$(V) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -25704,7 +25701,6 @@
       return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
     }
   }
-  _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_MapBaseValueIterable, {
     fields: () => ({[_map$0]: MapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -25729,18 +25725,18 @@
     new(map) {
       this[_map$0] = map;
       this[_keys] = map[dartx.keys][dartx.iterator];
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     moveNext() {
       if (dart.test(this[_keys].moveNext())) {
-        this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
+        this[_current$1] = this[_map$0][dartx._get](this[_keys].current);
         return true;
       }
-      this[_current$2] = null;
+      this[_current$1] = null;
       return false;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
   }
   dart.addTypeTests(_MapBaseValueIterator);
@@ -25749,7 +25745,7 @@
     fields: () => ({
       [_keys]: IteratorOfK(),
       [_map$0]: MapOfK$V(),
-      [_current$2]: V
+      [_current$1]: V
     }),
     getters: () => ({current: dart.definiteFunctionType(V, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25985,7 +25981,7 @@
 });
 collection.Queue$ = dart.generic(E => {
   let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class Queue extends core.Object {
     static new() {
       return new (ListQueueOfE())();
@@ -25993,33 +25989,30 @@
     static from(elements) {
       return ListQueueOfE().from(elements);
     }
-    [Symbol.iterator]() {
-      return new dart.JsIterator(this.iterator);
-    }
   }
   dart.addTypeTests(Queue);
-  Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  Queue[dart.implements] = () => [EfficientLengthIterableOfE()];
   return Queue;
 });
 collection.Queue = Queue();
 const _previousLink = Symbol('_previousLink');
 const _nextLink = Symbol('_nextLink');
 const _link = Symbol('_link');
-collection._DoubleLink$ = dart.generic(E => {
+collection._DoubleLink$ = dart.generic(Link => {
   class _DoubleLink extends core.Object {
     new() {
       this[_previousLink] = null;
       this[_nextLink] = null;
     }
     [_link](previous, next) {
-      E._check(previous);
-      E._check(next);
+      Link._check(previous);
+      Link._check(next);
       this[_nextLink] = next;
       this[_previousLink] = previous;
       if (previous != null) previous[_nextLink] = this;
       if (next != null) next[_previousLink] = this;
     }
-    [_unlink$]() {
+    [_unlink]() {
       if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
       if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
       this[_nextLink] = null;
@@ -26029,46 +26022,34 @@
   dart.addTypeTests(_DoubleLink);
   dart.setSignature(_DoubleLink, {
     fields: () => ({
-      [_previousLink]: E,
-      [_nextLink]: E
+      [_previousLink]: Link,
+      [_nextLink]: Link
     }),
     methods: () => ({
-      [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-      [_unlink$]: dart.definiteFunctionType(dart.void, [])
+      [_link]: dart.definiteFunctionType(dart.void, [Link, Link]),
+      [_unlink]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _DoubleLink;
 });
 collection._DoubleLink = _DoubleLink();
 collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
-  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-  class DoubleLinkedQueueEntry extends core.Object {
-    static new(element) {
-      return new (_UserDoubleLinkedQueueEntryOfE())(element);
-    }
-  }
-  dart.addTypeTests(DoubleLinkedQueueEntry);
-  return DoubleLinkedQueueEntry;
-});
-collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
-collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
-  let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
   let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-  class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
+  class DoubleLinkedQueueEntry extends collection._DoubleLink {
     new(element) {
       this.element = element;
       super.new();
     }
     append(e) {
       E._check(e);
-      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
+      new (DoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
     }
     prepend(e) {
       E._check(e);
-      new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
+      new (DoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
     }
     remove() {
-      this[_unlink$]();
+      this[_unlink]();
       return this.element;
     }
     previousEntry() {
@@ -26078,8 +26059,7 @@
       return this[_nextLink];
     }
   }
-  _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-  dart.setSignature(_UserDoubleLinkedQueueEntry, {
+  dart.setSignature(DoubleLinkedQueueEntry, {
     fields: () => ({element: E}),
     methods: () => ({
       append: dart.definiteFunctionType(dart.void, [E]),
@@ -26089,22 +26069,23 @@
       nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
     })
   });
-  return _UserDoubleLinkedQueueEntry;
-}, _UserDoubleLinkedQueueEntry => {
-  dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
+  return DoubleLinkedQueueEntry;
+}, DoubleLinkedQueueEntry => {
+  dart.setBaseClass(DoubleLinkedQueueEntry, collection._DoubleLink$(DoubleLinkedQueueEntry));
 });
-collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
+collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
 const _queue = Symbol('_queue');
 const _append = Symbol('_append');
 const _prepend = Symbol('_prepend');
 const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
 collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-  class _DoubleLinkedQueueEntry extends collection._DoubleLink {
-    new(queue) {
+  class _DoubleLinkedQueueEntry extends collection.DoubleLinkedQueueEntry$(E) {
+    new(element, queue) {
       this[_queue] = queue;
-      super.new();
+      super.new(element);
     }
     [_append](e) {
       E._check(e);
@@ -26114,34 +26095,34 @@
       E._check(e);
       new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
     }
+    get [_element]() {
+      return this.element;
+    }
     nextEntry() {
-      return this[_nextLink][_asNonSentinelEntry]();
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_nextLink]);
+      return entry[_asNonSentinelEntry]();
     }
     previousEntry() {
-      return this[_previousLink][_asNonSentinelEntry]();
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_previousLink]);
+      return entry[_asNonSentinelEntry]();
     }
   }
   dart.setSignature(_DoubleLinkedQueueEntry, {
     fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
+    getters: () => ({[_element]: dart.definiteFunctionType(E, [])}),
     methods: () => ({
       [_append]: dart.definiteFunctionType(dart.void, [E]),
-      [_prepend]: dart.definiteFunctionType(dart.void, [E]),
-      nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-      previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+      [_prepend]: dart.definiteFunctionType(dart.void, [E])
     })
   });
   return _DoubleLinkedQueueEntry;
-}, _DoubleLinkedQueueEntry => {
-  dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
 });
 collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
 const _elementCount = Symbol('_elementCount');
 collection._DoubleLinkedQueueElement$ = dart.generic(E => {
-  let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
   class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
     new(element, queue) {
-      this.element = element;
-      super.new(queue);
+      super.new(element, queue);
     }
     append(e) {
       E._check(e);
@@ -26161,7 +26142,7 @@
     }
     [_remove]() {
       this[_queue] = null;
-      this[_unlink$]();
+      this[_unlink]();
       return this.element;
     }
     remove() {
@@ -26175,14 +26156,9 @@
       return this;
     }
   }
-  _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
   dart.setSignature(_DoubleLinkedQueueElement, {
-    fields: () => ({element: E}),
     methods: () => ({
-      append: dart.definiteFunctionType(dart.void, [E]),
-      prepend: dart.definiteFunctionType(dart.void, [E]),
       [_remove]: dart.definiteFunctionType(E, []),
-      remove: dart.definiteFunctionType(E, []),
       [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
     })
   });
@@ -26192,7 +26168,7 @@
 collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
   class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
     new(queue) {
-      super.new(queue);
+      super.new(null, queue);
       this[_previousLink] = this;
       this[_nextLink] = this;
     }
@@ -26202,12 +26178,11 @@
     [_remove]() {
       dart.throw(_internal.IterableElementError.noElement());
     }
-    get element() {
+    get [_element]() {
       dart.throw(_internal.IterableElementError.noElement());
     }
   }
   dart.setSignature(_DoubleLinkedQueueSentinel, {
-    getters: () => ({element: dart.definiteFunctionType(E, [])}),
     methods: () => ({
       [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       [_remove]: dart.definiteFunctionType(E, [])
@@ -26221,6 +26196,7 @@
   let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
   let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
   let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
   let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
   let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
@@ -26268,34 +26244,42 @@
       }
     }
     removeLast() {
-      let lastEntry = this[_sentinel][_previousLink];
+      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
       let result = lastEntry[_remove]();
       this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
       return result;
     }
     removeFirst() {
-      let firstEntry = this[_sentinel][_nextLink];
+      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       let result = firstEntry[_remove]();
       this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
       return result;
     }
     remove(o) {
-      let entry = this[_sentinel][_nextLink];
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        if (dart.equals(entry.element, o)) {
+        let equals = dart.equals(entry[_element], o);
+        if (!core.identical(this, entry[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        if (equals) {
           entry[_remove]();
           this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
           return true;
         }
-        entry = entry[_nextLink];
+        entry = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
       }
       return false;
     }
     [_filter](test, removeMatching) {
-      let entry = this[_sentinel][_nextLink];
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        let next = entry[_nextLink];
-        if (core.identical(removeMatching, test(entry.element))) {
+        let matches = test(entry[_element]);
+        if (!core.identical(this, entry[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        let next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+        if (core.identical(removeMatching, matches)) {
           entry[_remove]();
           this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         }
@@ -26309,26 +26293,26 @@
       this[_filter](test, false);
     }
     get first() {
-      let firstEntry = this[_sentinel][_nextLink];
-      return firstEntry.element;
+      let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+      return firstEntry[_element];
     }
     get last() {
-      let lastEntry = this[_sentinel][_previousLink];
-      return lastEntry.element;
+      let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
+      return lastEntry[_element];
     }
     get single() {
       if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
-        let entry = this[_sentinel][_nextLink];
-        return entry.element;
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+        return entry[_element];
       }
       dart.throw(_internal.IterableElementError.tooMany());
     }
-    lastEntry() {
-      return this[_sentinel].previousEntry();
-    }
     firstEntry() {
       return this[_sentinel].nextEntry();
     }
+    lastEntry() {
+      return this[_sentinel].previousEntry();
+    }
     get isEmpty() {
       return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
     }
@@ -26337,13 +26321,18 @@
       this[_sentinel][_previousLink] = this[_sentinel];
       this[_elementCount] = 0;
     }
-    forEachEntry(f) {
-      let entry = this[_sentinel][_nextLink];
+    forEachEntry(action) {
+      let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
       while (!core.identical(entry, this[_sentinel])) {
-        let nextEntry = entry[_nextLink];
         let element = _DoubleLinkedQueueElementOfE()._check(entry);
-        f(element);
-        entry = nextEntry;
+        let next = _DoubleLinkedQueueEntryOfE()._check(element[_nextLink]);
+        action(element);
+        if (core.identical(this, entry[_queue])) {
+          next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+        } else if (!core.identical(this, next[_queue])) {
+          dart.throw(new core.ConcurrentModificationError(this));
+        }
+        entry = next;
       }
     }
     get iterator() {
@@ -26371,8 +26360,8 @@
       [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
       removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
       retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+      lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
       clear: dart.definiteFunctionType(dart.void, []),
       forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
     })
@@ -26391,33 +26380,33 @@
 collection.DoubleLinkedQueue = DoubleLinkedQueue();
 const _nextEntry = Symbol('_nextEntry');
 collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
+  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-  let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
   class _DoubleLinkedQueueIterator extends core.Object {
     new(sentinel) {
       this[_sentinel] = sentinel;
-      this[_nextEntry] = sentinel[_nextLink];
-      this[_current$2] = null;
+      this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(sentinel[_nextLink]);
+      this[_current$1] = null;
     }
     moveNext() {
       if (core.identical(this[_nextEntry], this[_sentinel])) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_nextEntry] = null;
         this[_sentinel] = null;
         return false;
       }
       let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
-      if (elementEntry[_queue] == null) {
+      if (!core.identical(this[_sentinel][_queue], elementEntry[_queue])) {
         dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
       }
-      this[_current$2] = elementEntry.element;
-      this[_nextEntry] = elementEntry[_nextLink];
+      this[_current$1] = elementEntry[_element];
+      this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(elementEntry[_nextLink]);
       return true;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
   }
   dart.addTypeTests(_DoubleLinkedQueueIterator);
@@ -26426,7 +26415,7 @@
     fields: () => ({
       [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
       [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26449,7 +26438,7 @@
   let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
   let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
   let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-  class ListQueue extends core.Iterable$(E) {
+  class ListQueue extends _internal.ListIterable$(E) {
     new(initialCapacity) {
       if (initialCapacity === void 0) initialCapacity = null;
       this[_head] = 0;
@@ -26477,7 +26466,7 @@
         return queue;
       } else {
         let capacity = collection.ListQueue._INITIAL_CAPACITY;
-        if (_internal.EfficientLength.is(elements)) {
+        if (_internal.EfficientLengthIterable.is(elements)) {
           capacity = elements[dartx.length];
         }
         let result = new (ListQueueOfE())(capacity);
@@ -26726,7 +26715,6 @@
       [_tail]: core.int,
       [_modificationCount]: core.int
     }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [E]),
       addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
@@ -26779,18 +26767,18 @@
       this[_end] = queue[_tail];
       this[_modificationCount] = queue[_modificationCount];
       this[_position] = queue[_head];
-      this[_current$2] = null;
+      this[_current$1] = null;
     }
     get current() {
-      return this[_current$2];
+      return this[_current$1];
     }
     moveNext() {
       this[_queue][_checkModification](this[_modificationCount]);
       if (this[_position] == this[_end]) {
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
-      this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
+      this[_current$1] = this[_queue][_table][dartx._get](this[_position]);
       this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
       return true;
     }
@@ -26803,7 +26791,7 @@
       [_end]: core.int,
       [_modificationCount]: core.int,
       [_position]: core.int,
-      [_current$2]: E
+      [_current$1]: E
     }),
     getters: () => ({current: dart.definiteFunctionType(E, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26859,7 +26847,7 @@
 const _splayMin = Symbol('_splayMin');
 const _splayMax = Symbol('_splayMax');
 const _addNewRoot = Symbol('_addNewRoot');
-const _clear$ = Symbol('_clear');
+const _clear = Symbol('_clear');
 collection._SplayTree$ = dart.generic((K, Node) => {
   class _SplayTree extends core.Object {
     new() {
@@ -26984,7 +26972,7 @@
       this[_root] = this[_splayMax](this[_root]);
       return this[_root];
     }
-    [_clear$]() {
+    [_clear]() {
       this[_root] = null;
       this[_count$] = 0;
       this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
@@ -27007,7 +26995,7 @@
       [_splayMax]: dart.definiteFunctionType(Node, [Node]),
       [_remove]: dart.definiteFunctionType(Node, [K]),
       [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-      [_clear$]: dart.definiteFunctionType(dart.void, [])
+      [_clear]: dart.definiteFunctionType(dart.void, [])
     })
   });
   return _SplayTree;
@@ -27164,7 +27152,7 @@
       return this[_count$];
     }
     clear() {
-      this[_clear$]();
+      this[_clear]();
     }
     containsKey(key) {
       return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
@@ -27384,7 +27372,7 @@
   let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
   let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
   let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-  class _SplayTreeKeyIterable extends core.Iterable$(K) {
+  class _SplayTreeKeyIterable extends _internal.EfficientLengthIterable$(K) {
     new(tree) {
       this[_tree] = tree;
       super.new();
@@ -27405,7 +27393,6 @@
       return set;
     }
   }
-  _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_SplayTreeKeyIterable, {
     fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
@@ -27417,7 +27404,7 @@
 collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
   let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
   let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-  class _SplayTreeValueIterable extends core.Iterable$(V) {
+  class _SplayTreeValueIterable extends _internal.EfficientLengthIterable$(V) {
     new(map) {
       this[_map$0] = map;
       super.new();
@@ -27432,7 +27419,6 @@
       return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
     }
   }
-  _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
   dart.setSignature(_SplayTreeValueIterable, {
     fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
     getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -27648,7 +27634,7 @@
       return _;
     }
     clear() {
-      this[_clear$]();
+      this[_clear]();
     }
     toSet() {
       return this[_clone]();
@@ -28185,7 +28171,7 @@
 core.List$ = dart.generic(E => {
   let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
   let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-  let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+  let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
   class List extends core.Object {
     static new(length) {
       if (length === void 0) length = null;
@@ -28236,12 +28222,9 @@
       let result = ListOfE().from(elements, {growable: false});
       return _internal.makeFixedListUnmodifiable(E)(result);
     }
-    [Symbol.iterator]() {
-      return new dart.JsIterator(this[dartx.iterator]);
-    }
   }
   dart.addTypeTests(List);
-  List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+  List[dart.implements] = () => [EfficientLengthIterableOfE()];
   return List;
 });
 core.List = List();
@@ -28380,6 +28363,7 @@
   }
 };
 dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
+convert._UnicodeSubsetEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert._UnicodeSubsetEncoder, {
   fields: () => ({[_subsetMask]: core.int}),
   methods: () => ({
@@ -28462,6 +28446,7 @@
   }
 };
 dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
+convert._UnicodeSubsetDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert._UnicodeSubsetDecoder, {
   fields: () => ({
     [_allowInvalid]: core.bool,
@@ -28626,6 +28611,7 @@
 };
 dart.addSimpleTypeTests(convert.Base64Encoder);
 dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
+convert.Base64Encoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert.Base64Encoder, {
   fields: () => ({[_urlSafe]: core.bool}),
   methods: () => ({
@@ -28652,6 +28638,104 @@
   get decoder() {
     return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
   }
+  normalize(source, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
+    let percent = 37;
+    let equals = 61;
+    let buffer = null;
+    let sliceStart = start;
+    let alphabet = convert._Base64Encoder._base64Alphabet;
+    let inverseAlphabet = convert._Base64Decoder._inverseAlphabet;
+    let firstPadding = -1;
+    let firstPaddingSourceIndex = -1;
+    let paddingCount = 0;
+    for (let i = start; dart.notNull(i) < dart.notNull(end);) {
+      let sliceEnd = i;
+      let char = source[dartx.codeUnitAt]((() => {
+        let x = i;
+        i = dart.notNull(x) + 1;
+        return x;
+      })());
+      let originalChar = char;
+      if (char == percent) {
+        if (dart.notNull(i) + 2 <= dart.notNull(end)) {
+          char = _internal.parseHexByte(source, i);
+          i = dart.notNull(i) + 2;
+          if (char == percent) char = -1;
+        } else {
+          char = -1;
+        }
+      }
+      if (0 <= dart.notNull(char) && dart.notNull(char) <= 127) {
+        let value = inverseAlphabet[dartx._get](char);
+        if (dart.notNull(value) >= 0) {
+          char = alphabet[dartx.codeUnitAt](value);
+          if (char == originalChar) continue;
+        } else if (value == convert._Base64Decoder._padding) {
+          if (dart.notNull(firstPadding) < 0) {
+            firstPadding = (() => {
+              let l = dart.nullSafe(buffer, _ => _.length);
+              return l != null ? l : 0;
+            })() + (dart.notNull(sliceEnd) - dart.notNull(sliceStart));
+            firstPaddingSourceIndex = sliceEnd;
+          }
+          paddingCount = dart.notNull(paddingCount) + 1;
+          if (originalChar == equals) continue;
+        }
+        if (value != convert._Base64Decoder._invalid) {
+          let t = buffer;
+          t == null ? buffer = new core.StringBuffer() : t;
+          buffer.write(source[dartx.substring](sliceStart, sliceEnd));
+          buffer.writeCharCode(char);
+          sliceStart = i;
+          continue;
+        }
+      }
+      dart.throw(new core.FormatException("Invalid base64 data", source, sliceEnd));
+    }
+    if (buffer != null) {
+      buffer.write(source[dartx.substring](sliceStart, end));
+      if (dart.notNull(firstPadding) >= 0) {
+        convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, buffer.length);
+      } else {
+        let endLength = (dart.notNull(buffer.length) - 1)[dartx['%']](4) + 1;
+        if (endLength == 1) {
+          dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+        }
+        while (dart.notNull(endLength) < 4) {
+          buffer.write("=");
+          endLength = dart.notNull(endLength) + 1;
+        }
+      }
+      return source[dartx.replaceRange](start, end, dart.toString(buffer));
+    }
+    let length = dart.notNull(end) - dart.notNull(start);
+    if (dart.notNull(firstPadding) >= 0) {
+      convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, length);
+    } else {
+      let endLength = length[dartx['%']](4);
+      if (endLength == 1) {
+        dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+      }
+      if (dart.notNull(endLength) > 1) {
+        source = source[dartx.replaceRange](end, end, endLength == 2 ? "==" : "=");
+      }
+    }
+    return source;
+  }
+  static _checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, length) {
+    if (length[dartx['%']](4) != 0) {
+      dart.throw(new core.FormatException("Invalid base64 padding, padded length must be multiple of four, " + dart.str`is ${length}`, source, sourceEnd));
+    }
+    if (dart.notNull(firstPadding) + dart.notNull(paddingCount) != length) {
+      dart.throw(new core.FormatException("Invalid base64 padding, '=' not at the end", source, sourceIndex));
+    }
+    if (dart.notNull(paddingCount) > 2) {
+      dart.throw(new core.FormatException("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
+    }
+  }
 };
 dart.addSimpleTypeTests(convert.Base64Codec);
 dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
@@ -28660,7 +28744,10 @@
   getters: () => ({
     encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
     decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
-  })
+  }),
+  methods: () => ({normalize: dart.definiteFunctionType(core.String, [core.String], [core.int, core.int])}),
+  statics: () => ({_checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, core.int, core.int])}),
+  names: ['_checkPadding']
 });
 convert.BASE64 = dart.const(new convert.Base64Codec());
 convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
@@ -28924,6 +29011,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Base64Decoder);
+convert.Base64Decoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert.Base64Decoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -29452,6 +29540,7 @@
 });
 convert._InvertedCodec = _InvertedCodec();
 convert._FusedConverter$ = dart.generic((S, M, T) => {
+  let ChunkedConverterOfS$T$S$T = () => (ChunkedConverterOfS$T$S$T = dart.constFn(convert.ChunkedConverter$(S, T, S, T)))();
   let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
   let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
   let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
@@ -29470,6 +29559,7 @@
       return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
     }
   }
+  _FusedConverter[dart.implements] = () => [ChunkedConverterOfS$T$S$T()];
   dart.setSignature(_FusedConverter, {
     fields: () => ({
       [_first$0]: ConverterOfS$M(),
@@ -29604,6 +29694,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.HtmlEscape);
+convert.HtmlEscape[dart.implements] = () => [ChunkedConverterOfString$String$String$String()];
 dart.setSignature(convert.HtmlEscape, {
   fields: () => ({mode: convert.HtmlEscapeMode}),
   methods: () => ({
@@ -29763,6 +29854,7 @@
 };
 dart.addSimpleTypeTests(convert.JsonEncoder);
 dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
+convert.JsonEncoder[dart.implements] = () => [ChunkedConverterOfObject$String$Object$String()];
 dart.setSignature(convert.JsonEncoder, {
   fields: () => ({
     indent: core.String,
@@ -29835,6 +29927,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
+convert.JsonUtf8Encoder[dart.implements] = () => [ChunkedConverterOfObject$ListOfint$Object$ListOfint()];
 dart.setSignature(convert.JsonUtf8Encoder, {
   fields: () => ({
     [_indent]: ListOfint(),
@@ -29942,6 +30035,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.JsonDecoder);
+convert.JsonDecoder[dart.implements] = () => [ChunkedConverterOfString$Object$String$Object()];
 dart.setSignature(convert.JsonDecoder, {
   fields: () => ({[_reviver]: convert._Reviver}),
   methods: () => ({
@@ -31070,6 +31164,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Utf8Encoder);
+convert.Utf8Encoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(convert.Utf8Encoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -31282,7 +31377,7 @@
     let buffer = new core.StringBuffer();
     let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
     decoder.convert(codeUnits, start, end);
-    decoder.close();
+    decoder.flush(codeUnits, end);
     return buffer.toString();
   }
   startChunkedConversion(sink) {
@@ -31307,6 +31402,7 @@
   }
 };
 dart.addSimpleTypeTests(convert.Utf8Decoder);
+convert.Utf8Decoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(convert.Utf8Decoder, {
   fields: () => ({[_allowMalformed]: core.bool}),
   methods: () => ({
@@ -31356,10 +31452,12 @@
   close() {
     this.flush();
   }
-  flush() {
+  flush(source, offset) {
+    if (source === void 0) source = null;
+    if (offset === void 0) offset = null;
     if (dart.test(this.hasPartialInput)) {
       if (!dart.test(this[_allowMalformed])) {
-        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
+        dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence", source, offset));
       }
       this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
       this[_value] = 0;
@@ -31403,7 +31501,7 @@
               if ((dart.notNull(unit) & 192) != 128) {
                 expectedUnits = 0;
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, i));
                 }
                 this[_isFirstCharacter] = false;
                 this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
@@ -31416,14 +31514,14 @@
             } while (dart.notNull(expectedUnits) > 0);
             if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
               }
               expectedUnits = extraUnits = 0;
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             }
             if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
               }
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             }
@@ -31447,7 +31545,7 @@
           })());
           if (dart.notNull(unit) < 0) {
             if (!dart.test(this[_allowMalformed])) {
-              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
+              dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
             }
             this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
           } else {
@@ -31468,7 +31566,7 @@
               continue loop;
             }
             if (!dart.test(this[_allowMalformed])) {
-              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+              dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
             }
             value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
             expectedUnits = extraUnits = 0;
@@ -31497,7 +31595,7 @@
   getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
   methods: () => ({
     close: dart.definiteFunctionType(dart.void, []),
-    flush: dart.definiteFunctionType(dart.void, []),
+    flush: dart.definiteFunctionType(dart.void, [], [ListOfint(), core.int]),
     convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
   })
 });
@@ -31534,6 +31632,7 @@
 };
 core.proxy = dart.const(new core._Proxy());
 dart.defineExtensionNames([
+  'hashCode',
   'toString'
 ]);
 core.bool = class bool extends core.Object {
@@ -31541,6 +31640,9 @@
     let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
     dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
   }
+  get [dartx.hashCode]() {
+    return super.hashCode;
+  }
   [dartx.toString]() {
     return this ? "true" : "false";
   }
@@ -32677,108 +32779,42 @@
   return _Generator;
 });
 core._Generator = _Generator();
-const _end$ = Symbol('_end');
-const _start$0 = Symbol('_start');
 const _generator$ = Symbol('_generator');
 core._GeneratorIterable$ = dart.generic(E => {
   let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-  let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
-  let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-  let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-  class _GeneratorIterable extends core.Iterable$(E) {
-    new(end, generator) {
-      this[_end$] = end;
-      this[_start$0] = 0;
+  class _GeneratorIterable extends _internal.ListIterable$(E) {
+    get length() {
+      return this[length$];
+    }
+    set length(value) {
+      super.length = value;
+    }
+    new(length, generator) {
+      this[length$] = length;
       this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
       super.new();
     }
-    slice(start, end, generator) {
-      this[_start$0] = start;
-      this[_end$] = end;
-      this[_generator$] = generator;
-      super.new();
-    }
-    get iterator() {
-      return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
-    }
-    get length() {
-      return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
-    }
-    skip(count) {
-      core.RangeError.checkNotNegative(count, "count");
-      if (count == 0) return this;
-      let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
-      if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
-      return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
-    }
-    take(count) {
-      core.RangeError.checkNotNegative(count, "count");
-      if (count == 0) return new (EmptyIterableOfE())();
-      let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
-      if (newEnd >= dart.notNull(this[_end$])) return this;
-      return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
+    elementAt(index) {
+      core.RangeError.checkValidIndex(index, this);
+      return this[_generator$](index);
     }
     static _id(n) {
       return n;
     }
   }
-  dart.defineNamedConstructor(_GeneratorIterable, 'slice');
-  _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
+  const length$ = Symbol("_GeneratorIterable.length");
   dart.setSignature(_GeneratorIterable, {
     fields: () => ({
-      [_start$0]: core.int,
-      [_end$]: core.int,
+      length: core.int,
       [_generator$]: _GeneratorOfE()
     }),
-    getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
     statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
     names: ['_id']
   });
-  dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
+  dart.defineExtensionMembers(_GeneratorIterable, ['elementAt', 'length']);
   return _GeneratorIterable;
 });
 core._GeneratorIterable = _GeneratorIterable();
-const _index$1 = Symbol('_index');
-const _current$3 = Symbol('_current');
-core._GeneratorIterator$ = dart.generic(E => {
-  let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-  let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-  class _GeneratorIterator extends core.Object {
-    new(index, end, generator) {
-      this[_index$1] = index;
-      this[_end$] = end;
-      this[_generator$] = generator;
-      this[_current$3] = null;
-    }
-    moveNext() {
-      if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
-        this[_current$3] = this[_generator$](this[_index$1]);
-        this[_index$1] = dart.notNull(this[_index$1]) + 1;
-        return true;
-      } else {
-        this[_current$3] = null;
-        return false;
-      }
-    }
-    get current() {
-      return this[_current$3];
-    }
-  }
-  dart.addTypeTests(_GeneratorIterator);
-  _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
-  dart.setSignature(_GeneratorIterator, {
-    fields: () => ({
-      [_end$]: core.int,
-      [_generator$]: _GeneratorOfE(),
-      [_index$1]: core.int,
-      [_current$3]: E
-    }),
-    getters: () => ({current: dart.definiteFunctionType(E, [])}),
-    methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-  });
-  return _GeneratorIterator;
-});
-core._GeneratorIterator = _GeneratorIterator();
 core.BidirectionalIterator$ = dart.generic(E => {
   let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
   class BidirectionalIterator extends core.Object {}
@@ -32820,6 +32856,9 @@
   static _uninstantiable() {
     dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
   }
+  get hashCode() {
+    return super.hashCode;
+  }
   toString() {
     return "null";
   }
@@ -32855,7 +32894,7 @@
 core.RegExp[dart.implements] = () => [core.Pattern];
 core.Set$ = dart.generic(E => {
   let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-  class Set extends core.Iterable$(E) {
+  class Set extends _internal.EfficientLengthIterable$(E) {
     static new() {
       return LinkedHashSetOfE().new();
     }
@@ -32866,7 +32905,6 @@
       return LinkedHashSetOfE().from(elements);
     }
   }
-  Set[dart.implements] = () => [_internal.EfficientLength];
   return Set;
 });
 core.Set = Set();
@@ -32899,41 +32937,38 @@
 dart.setSignature(core._StringStackTrace, {
   fields: () => ({[_stackTrace]: core.String})
 });
+const _start$0 = Symbol('_start');
 const _stop = Symbol('_stop');
 core.Stopwatch = class Stopwatch extends core.Object {
+  new() {
+    this[_start$0] = 0;
+    this[_stop] = 0;
+    if (core.Stopwatch._frequency == null) core.Stopwatch._initTicker();
+  }
   get frequency() {
     return core.Stopwatch._frequency;
   }
-  new() {
-    this[_start$0] = null;
-    this[_stop] = null;
-    core.Stopwatch._initTicker();
-  }
   start() {
-    if (dart.test(this.isRunning)) return;
-    if (this[_start$0] == null) {
-      this[_start$0] = core.Stopwatch._now();
-    } else {
-      this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
+    if (this[_stop] != null) {
+      this[_start$0] = dart.notNull(this[_start$0]) + (dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_stop]));
       this[_stop] = null;
     }
   }
   stop() {
-    if (!dart.test(this.isRunning)) return;
-    this[_stop] = core.Stopwatch._now();
+    let t = this[_stop];
+    t == null ? this[_stop] = core.Stopwatch._now() : t;
   }
   reset() {
-    if (this[_start$0] == null) return;
-    this[_start$0] = core.Stopwatch._now();
-    if (this[_stop] != null) {
-      this[_stop] = this[_start$0];
-    }
+    this[_start$0] = (() => {
+      let l = this[_stop];
+      return l != null ? l : core.Stopwatch._now();
+    })();
   }
   get elapsedTicks() {
-    if (this[_start$0] == null) {
-      return 0;
-    }
-    return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
+    return dart.notNull((() => {
+      let l = this[_stop];
+      return l != null ? l : core.Stopwatch._now();
+    })()) - dart.notNull(this[_start$0]);
   }
   get elapsed() {
     return new core.Duration({microseconds: this.elapsedMicroseconds});
@@ -32945,7 +32980,7 @@
     return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
   }
   get isRunning() {
-    return this[_start$0] != null && this[_stop] == null;
+    return this[_stop] == null;
   }
   static _initTicker() {
     _js_helper.Primitives.initTicker();
@@ -33221,37 +33256,471 @@
     return new _internal.Symbol(name);
   }
 };
+core._SPACE = 32;
+core._PERCENT = 37;
+core._AMPERSAND = 38;
+core._PLUS = 43;
+core._DOT = 46;
+core._SLASH = 47;
+core._COLON = 58;
+core._EQUALS = 61;
+core._UPPER_CASE_A = 65;
+core._UPPER_CASE_Z = 90;
+core._LEFT_BRACKET = 91;
+core._BACKSLASH = 92;
+core._RIGHT_BRACKET = 93;
+core._LOWER_CASE_A = 97;
+core._LOWER_CASE_F = 102;
+core._LOWER_CASE_Z = 122;
+core._hexDigits = "0123456789ABCDEF";
+core.Uri = class Uri extends core.Object {
+  static get base() {
+    let uri = _js_helper.Primitives.currentUri();
+    if (uri != null) return core.Uri.parse(uri);
+    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+  }
+  static new(opts) {
+    return core._Uri.new(opts);
+  }
+  static http(authority, unencodedPath, queryParameters) {
+    return core._Uri.http(authority, unencodedPath, queryParameters);
+  }
+  static https(authority, unencodedPath, queryParameters) {
+    return core._Uri.https(authority, unencodedPath, queryParameters);
+  }
+  static file(path, opts) {
+    return core._Uri.file(path, opts);
+  }
+  static directory(path, opts) {
+    return core._Uri.directory(path, opts);
+  }
+  static dataFromString(content, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let base64 = opts && 'base64' in opts ? opts.base64 : false;
+    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
+    return data.uri;
+  }
+  static dataFromBytes(bytes, opts) {
+    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
+    return data.uri;
+  }
+  get hasScheme() {
+    return this.scheme[dartx.isNotEmpty];
+  }
+  static parse(uri, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    let t = end;
+    t == null ? end = uri[dartx.length] : t;
+    if (dart.notNull(end) >= dart.notNull(start) + 5) {
+      let dataDelta = core._startsWithData(uri, start);
+      if (dataDelta == 0) {
+        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) uri = uri[dartx.substring](start, end);
+        return core.UriData._parse(uri, 5, null).uri;
+      } else if (dataDelta == 32) {
+        return core.UriData._parse(uri[dartx.substring](dart.notNull(start) + 5, end), 0, null).uri;
+      }
+    }
+    let indices = ListOfint().new(8);
+    indices[dartx._set](0, 0);
+    indices[dartx._set](core._schemeEndIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._hostStartIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._notSimpleIndex, dart.notNull(start) - 1);
+    indices[dartx._set](core._portStartIndex, start);
+    indices[dartx._set](core._pathStartIndex, start);
+    indices[dartx._set](core._queryStartIndex, end);
+    indices[dartx._set](core._fragmentStartIndex, end);
+    let state = core._scan(uri, start, end, core._uriStart, indices);
+    if (dart.notNull(state) >= core._nonSimpleEndStates) {
+      indices[dartx._set](core._notSimpleIndex, end);
+    }
+    let schemeEnd = indices[dartx._get](core._schemeEndIndex);
+    if (dart.notNull(schemeEnd) >= dart.notNull(start)) {
+      state = core._scan(uri, start, schemeEnd, core._schemeStart, indices);
+      if (state == core._schemeStart) {
+        indices[dartx._set](core._notSimpleIndex, schemeEnd);
+      }
+    }
+    let hostStart = dart.notNull(indices[dartx._get](core._hostStartIndex)) + 1;
+    let portStart = indices[dartx._get](core._portStartIndex);
+    let pathStart = indices[dartx._get](core._pathStartIndex);
+    let queryStart = indices[dartx._get](core._queryStartIndex);
+    let fragmentStart = indices[dartx._get](core._fragmentStartIndex);
+    let scheme = null;
+    if (dart.notNull(fragmentStart) < dart.notNull(queryStart)) queryStart = fragmentStart;
+    if (dart.notNull(pathStart) < dart.notNull(hostStart) || dart.notNull(pathStart) <= dart.notNull(schemeEnd)) {
+      pathStart = queryStart;
+    }
+    if (dart.notNull(portStart) < dart.notNull(hostStart)) portStart = pathStart;
+    dart.assert(hostStart == start || dart.notNull(schemeEnd) <= dart.notNull(hostStart));
+    dart.assert(dart.notNull(hostStart) <= dart.notNull(portStart));
+    dart.assert(dart.notNull(schemeEnd) <= dart.notNull(pathStart));
+    dart.assert(dart.notNull(portStart) <= dart.notNull(pathStart));
+    dart.assert(dart.notNull(pathStart) <= dart.notNull(queryStart));
+    dart.assert(dart.notNull(queryStart) <= dart.notNull(fragmentStart));
+    let isSimple = dart.notNull(indices[dartx._get](core._notSimpleIndex)) < dart.notNull(start);
+    if (isSimple) {
+      if (dart.notNull(hostStart) > dart.notNull(schemeEnd) + 3) {
+        isSimple = false;
+      } else if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 1 == pathStart) {
+        isSimple = false;
+      } else if (dart.notNull(queryStart) < dart.notNull(end) && queryStart == dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("..", pathStart)) || dart.notNull(queryStart) > dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("/..", dart.notNull(queryStart) - 3))) {
+        isSimple = false;
+      } else {
+        if (schemeEnd == dart.notNull(start) + 4) {
+          if (dart.test(uri[dartx.startsWith]("file", start))) {
+            scheme = "file";
+            if (dart.notNull(hostStart) <= dart.notNull(start)) {
+              let schemeAuth = "file://";
+              let delta = 2;
+              if (!dart.test(uri[dartx.startsWith]("/", pathStart))) {
+                schemeAuth = "file:///";
+                delta = 3;
+              }
+              uri = schemeAuth + dart.notNull(uri[dartx.substring](pathStart, end));
+              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+              hostStart = 7;
+              portStart = 7;
+              pathStart = 7;
+              queryStart = dart.notNull(queryStart) + (delta - dart.notNull(start));
+              fragmentStart = dart.notNull(fragmentStart) + (delta - dart.notNull(start));
+              start = 0;
+              end = uri[dartx.length];
+            } else if (pathStart == queryStart) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](pathStart, queryStart, "/");
+                queryStart = dart.notNull(queryStart) + 1;
+                fragmentStart = dart.notNull(fragmentStart) + 1;
+                end = dart.notNull(end) + 1;
+              } else {
+                uri = dart.str`${uri[dartx.substring](start, pathStart)}/` + dart.str`${uri[dartx.substring](queryStart, end)}`;
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - dart.notNull(start);
+                queryStart = dart.notNull(queryStart) + (1 - dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) + (1 - dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          } else if (dart.test(uri[dartx.startsWith]("http", start))) {
+            scheme = "http";
+            if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 3 == pathStart && dart.test(uri[dartx.startsWith]("80", dart.notNull(portStart) + 1))) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                pathStart = dart.notNull(pathStart) - 3;
+                queryStart = dart.notNull(queryStart) - 3;
+                fragmentStart = dart.notNull(fragmentStart) - 3;
+                end = dart.notNull(end) - 3;
+              } else {
+                uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - (3 + dart.notNull(start));
+                queryStart = dart.notNull(queryStart) - (3 + dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) - (3 + dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          }
+        } else if (schemeEnd == dart.notNull(start) + 5 && dart.test(uri[dartx.startsWith]("https", start))) {
+          scheme = "https";
+          if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 4 == pathStart && dart.test(uri[dartx.startsWith]("443", dart.notNull(portStart) + 1))) {
+            if (start == 0 && end == uri[dartx.length]) {
+              uri = uri[dartx.replaceRange](portStart, pathStart, "");
+              pathStart = dart.notNull(pathStart) - 4;
+              queryStart = dart.notNull(queryStart) - 4;
+              fragmentStart = dart.notNull(fragmentStart) - 4;
+              end = dart.notNull(end) - 3;
+            } else {
+              uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+              schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+              hostStart = dart.notNull(hostStart) - dart.notNull(start);
+              portStart = dart.notNull(portStart) - dart.notNull(start);
+              pathStart = dart.notNull(pathStart) - (4 + dart.notNull(start));
+              queryStart = dart.notNull(queryStart) - (4 + dart.notNull(start));
+              fragmentStart = dart.notNull(fragmentStart) - (4 + dart.notNull(start));
+              start = 0;
+              end = uri[dartx.length];
+            }
+          }
+        }
+      }
+    }
+    if (isSimple) {
+      if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) {
+        uri = uri[dartx.substring](start, end);
+        schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+        hostStart = dart.notNull(hostStart) - dart.notNull(start);
+        portStart = dart.notNull(portStart) - dart.notNull(start);
+        pathStart = dart.notNull(pathStart) - dart.notNull(start);
+        queryStart = dart.notNull(queryStart) - dart.notNull(start);
+        fragmentStart = dart.notNull(fragmentStart) - dart.notNull(start);
+      }
+      return new core._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+    }
+    return core._Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+  }
+  static encodeComponent(component) {
+    return core._Uri._uriEncode(core._Uri._unreserved2396Table, component, convert.UTF8, false);
+  }
+  static encodeQueryComponent(component, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core._Uri._uriEncode(core._Uri._unreservedTable, component, encoding, true);
+  }
+  static decodeComponent(encodedComponent) {
+    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
+  }
+  static decodeQueryComponent(encodedComponent, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
+  }
+  static encodeFull(uri) {
+    return core._Uri._uriEncode(core._Uri._encodeFullTable, uri, convert.UTF8, false);
+  }
+  static decodeFull(uri) {
+    return core._Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
+  }
+  static splitQueryString(query, opts) {
+    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
+      let index = element[dartx.indexOf]("=");
+      if (index == -1) {
+        if (element != "") {
+          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
+        }
+      } else if (index != 0) {
+        let key = element[dartx.substring](0, index);
+        let value = element[dartx.substring](dart.notNull(index) + 1);
+        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
+      }
+      return map;
+    }, MapOfString$StringAndStringToMapOfString$String()));
+  }
+  static parseIPv4Address(host) {
+    return core.Uri._parseIPv4Address(host, 0, host[dartx.length]);
+  }
+  static _parseIPv4Address(host, start, end) {
+    function error(msg, position) {
+      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`, host, position));
+    }
+    dart.fn(error, StringAndintTovoid());
+    let result = typed_data.Uint8List.new(4);
+    let partIndex = 0;
+    let partStart = start;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = host[dartx.codeUnitAt](i);
+      if (char != core._DOT) {
+        if ((dart.notNull(char) ^ 48) >>> 0 > 9) {
+          error("invalid character", i);
+        }
+      } else {
+        if (partIndex == 3) {
+          error('IPv4 address should contain exactly 4 parts', i);
+        }
+        let part = core.int.parse(host[dartx.substring](partStart, i));
+        if (dart.notNull(part) > 255) {
+          error("each part must be in the range 0..255", partStart);
+        }
+        result[dartx._set](partIndex++, part);
+        partStart = dart.notNull(i) + 1;
+      }
+    }
+    if (partIndex != 3) {
+      error('IPv4 address should contain exactly 4 parts', end);
+    }
+    let part = core.int.parse(host[dartx.substring](partStart, end));
+    if (dart.notNull(part) > 255) {
+      error("each part must be in the range 0..255", partStart);
+    }
+    result[dartx._set](partIndex, part);
+    return result;
+  }
+  static parseIPv6Address(host, start, end) {
+    if (start === void 0) start = 0;
+    if (end === void 0) end = null;
+    if (end == null) end = host[dartx.length];
+    function error(msg, position) {
+      if (position === void 0) position = null;
+      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
+    }
+    dart.fn(error, String__Tovoid());
+    function parseHex(start, end) {
+      if (dart.notNull(end) - dart.notNull(start) > 4) {
+        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
+      }
+      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
+      if (dart.notNull(value) < 0 || dart.notNull(value) > 65535) {
+        error('each part must be in the range of `0x0..0xFFFF`', start);
+      }
+      return value;
+    }
+    dart.fn(parseHex, intAndintToint());
+    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
+    let parts = JSArrayOfint().of([]);
+    let wildcardSeen = false;
+    let seenDot = false;
+    let partStart = start;
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = host[dartx.codeUnitAt](i);
+      if (char == core._COLON) {
+        if (i == start) {
+          i = dart.notNull(i) + 1;
+          if (host[dartx.codeUnitAt](i) != core._COLON) {
+            error('invalid start colon.', i);
+          }
+          partStart = i;
+        }
+        if (i == partStart) {
+          if (wildcardSeen) {
+            error('only one wildcard `::` is allowed', i);
+          }
+          wildcardSeen = true;
+          parts[dartx.add](-1);
+        } else {
+          parts[dartx.add](parseHex(partStart, i));
+        }
+        partStart = dart.notNull(i) + 1;
+      } else if (char == core._DOT) {
+        seenDot = true;
+      }
+    }
+    if (parts[dartx.length] == 0) error('too few parts');
+    let atEnd = partStart == end;
+    let isLastWildcard = parts[dartx.last] == -1;
+    if (atEnd && !isLastWildcard) {
+      error('expected a part after last `:`', end);
+    }
+    if (!atEnd) {
+      if (!seenDot) {
+        parts[dartx.add](parseHex(partStart, end));
+      } else {
+        let last = core.Uri._parseIPv4Address(host, partStart, end);
+        parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
+        parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
+      }
+    }
+    if (wildcardSeen) {
+      if (dart.notNull(parts[dartx.length]) > 7) {
+        error('an address with a wildcard must have less than 7 parts');
+      }
+    } else if (parts[dartx.length] != 8) {
+      error('an address without a wildcard must contain exactly 8 parts');
+    }
+    let bytes = typed_data.Uint8List.new(16);
+    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
+      let value = parts[dartx._get](i);
+      if (value == -1) {
+        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
+        for (let j = 0; j < wildCardLength; j++) {
+          bytes[dartx._set](index, 0);
+          bytes[dartx._set](index + 1, 0);
+          index = index + 2;
+        }
+      } else {
+        bytes[dartx._set](index, value[dartx['>>']](8));
+        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
+        index = index + 2;
+      }
+    }
+    return bytes;
+  }
+};
+dart.setSignature(core.Uri, {
+  getters: () => ({hasScheme: dart.definiteFunctionType(core.bool, [])}),
+  statics: () => ({
+    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
+    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+    _parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String, core.int, core.int]),
+    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int])
+  }),
+  names: ['parse', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', 'parseIPv4Address', '_parseIPv4Address', 'parseIPv6Address']
+});
 const _userInfo = Symbol('_userInfo');
 const _host = Symbol('_host');
 const _port = Symbol('_port');
-const _path = Symbol('_path');
 const _query = Symbol('_query');
 const _fragment = Symbol('_fragment');
 const _pathSegments = Symbol('_pathSegments');
+const _text = Symbol('_text');
+const _hashCodeCache = Symbol('_hashCodeCache');
 const _queryParameters = Symbol('_queryParameters');
 const _queryParameterLists = Symbol('_queryParameterLists');
 const _writeAuthority = Symbol('_writeAuthority');
 let const$51;
 const _mergePaths = Symbol('_mergePaths');
-const _toWindowsFilePath = Symbol('_toWindowsFilePath');
 const _toFilePath = Symbol('_toFilePath');
 const _isPathAbsolute = Symbol('_isPathAbsolute');
-core.Uri = class Uri extends core.Object {
+const _initializeText = Symbol('_initializeText');
+core._Uri = class _Uri extends core.Object {
   _internal(scheme, userInfo, host, port, path, query, fragment) {
     this.scheme = scheme;
     this[_userInfo] = userInfo;
     this[_host] = host;
     this[_port] = port;
-    this[_path] = path;
+    this.path = path;
     this[_query] = query;
     this[_fragment] = fragment;
     this[_pathSegments] = null;
+    this[_text] = null;
+    this[_hashCodeCache] = null;
     this[_queryParameters] = null;
     this[_queryParameterLists] = null;
   }
+  static notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme) {
+    if (scheme == null) {
+      scheme = "";
+      if (dart.notNull(schemeEnd) > dart.notNull(start)) {
+        scheme = core._Uri._makeScheme(uri, start, schemeEnd);
+      } else if (schemeEnd == start) {
+        core._Uri._fail(uri, start, "Invalid empty scheme");
+      }
+    }
+    let userInfo = "";
+    let host = null;
+    let port = null;
+    if (dart.notNull(hostStart) > dart.notNull(start)) {
+      let userInfoStart = dart.notNull(schemeEnd) + 3;
+      if (userInfoStart < dart.notNull(hostStart)) {
+        userInfo = core._Uri._makeUserInfo(uri, userInfoStart, dart.notNull(hostStart) - 1);
+      }
+      host = core._Uri._makeHost(uri, hostStart, portStart, false);
+      if (dart.notNull(portStart) + 1 < dart.notNull(pathStart)) {
+        port = core.int.parse(uri[dartx.substring](dart.notNull(portStart) + 1, pathStart), {onError: dart.fn(_ => {
+            dart.throw(new core.FormatException("Invalid port", uri, dart.notNull(portStart) + 1));
+          }, StringToNull())});
+        port = core._Uri._makePort(port, scheme);
+      }
+    }
+    let path = core._Uri._makePath(uri, pathStart, queryStart, null, scheme, host != null);
+    let query = null;
+    if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
+      query = core._Uri._makeQuery(uri, dart.notNull(queryStart) + 1, fragmentStart, null);
+    }
+    let fragment = null;
+    if (dart.notNull(fragmentStart) < dart.notNull(end)) {
+      fragment = core._Uri._makeFragment(uri, dart.notNull(fragmentStart) + 1, end);
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
   static new(opts) {
-    let scheme = opts && 'scheme' in opts ? opts.scheme : "";
-    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
+    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
     let host = opts && 'host' in opts ? opts.host : null;
     let port = opts && 'port' in opts ? opts.port : null;
     let path = opts && 'path' in opts ? opts.path : null;
@@ -33259,33 +33728,37 @@
     let query = opts && 'query' in opts ? opts.query : null;
     let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
     let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-    scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
-    userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
-    host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
+    scheme = core._Uri._makeScheme(scheme, 0, core._stringOrNullLength(scheme));
+    userInfo = core._Uri._makeUserInfo(userInfo, 0, core._stringOrNullLength(userInfo));
+    host = core._Uri._makeHost(host, 0, core._stringOrNullLength(host), false);
     if (query == "") query = null;
-    query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-    fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
-    port = core.Uri._makePort(port, scheme);
+    query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+    fragment = core._Uri._makeFragment(fragment, 0, core._stringOrNullLength(fragment));
+    port = core._Uri._makePort(port, scheme);
     let isFile = scheme == "file";
     if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
       host = "";
     }
     let hasAuthority = host != null;
-    path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
     if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
-      path = core.Uri._normalizeRelativePath(path);
+      let allowScheme = dart.test(scheme[dartx.isNotEmpty]) || host != null;
+      path = core._Uri._normalizeRelativePath(path, allowScheme);
     } else {
-      path = core.Uri._removeDotSegments(path);
+      path = core._Uri._removeDotSegments(path);
     }
-    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    if (host == null && dart.test(path[dartx.startsWith]("//"))) {
+      host = "";
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
   }
   static http(authority, unencodedPath, queryParameters) {
     if (queryParameters === void 0) queryParameters = null;
-    return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+    return core._Uri._check(core._Uri._makeHttpUri("http", authority, unencodedPath, queryParameters));
   }
   static https(authority, unencodedPath, queryParameters) {
     if (queryParameters === void 0) queryParameters = null;
-    return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+    return core._Uri._check(core._Uri._makeHttpUri("https", authority, unencodedPath, queryParameters));
   }
   get authority() {
     if (!dart.test(this.hasAuthority)) return "";
@@ -33304,7 +33777,7 @@
     return this[_host];
   }
   get port() {
-    if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
+    if (this[_port] == null) return core._Uri._defaultPort(this.scheme);
     return this[_port];
   }
   static _defaultPort(scheme) {
@@ -33312,181 +33785,34 @@
     if (scheme == "https") return 443;
     return 0;
   }
-  get path() {
-    return this[_path];
-  }
   get query() {
-    return this[_query] == null ? "" : this[_query];
+    return this[_query] != null ? this[_query] : "";
   }
   get fragment() {
-    return this[_fragment] == null ? "" : this[_fragment];
+    return this[_fragment] != null ? this[_fragment] : "";
   }
-  static parse(uri, start, end) {
-    if (start === void 0) start = 0;
-    if (end === void 0) end = null;
-    let EOI = -1;
-    let scheme = "";
-    let userinfo = "";
-    let host = null;
-    let port = null;
-    let path = null;
-    let query = null;
-    let fragment = null;
-    if (end == null) end = uri[dartx.length];
-    let index = start;
-    let pathStart = start;
-    let char = EOI;
-    function parseAuth() {
-      if (index == end) {
-        char = EOI;
-        return;
-      }
-      let authStart = index;
-      let lastColon = -1;
-      let lastAt = -1;
-      char = uri[dartx.codeUnitAt](index);
-      while (dart.notNull(index) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          break;
-        }
-        if (char == core.Uri._AT_SIGN) {
-          lastAt = index;
-          lastColon = -1;
-        } else if (char == core.Uri._COLON) {
-          lastColon = index;
-        } else if (char == core.Uri._LEFT_BRACKET) {
-          lastColon = -1;
-          let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
-          if (endBracket == -1) {
-            index = end;
-            char = EOI;
-            break;
-          } else {
-            index = endBracket;
+  isScheme(scheme) {
+    let thisScheme = this.scheme;
+    if (scheme == null) return thisScheme[dartx.isEmpty];
+    if (scheme[dartx.length] != thisScheme[dartx.length]) return false;
+    return core._Uri._compareScheme(scheme, thisScheme);
+  }
+  static _compareScheme(scheme, uri) {
+    for (let i = 0; i < dart.notNull(scheme[dartx.length]); i++) {
+      let schemeChar = scheme[dartx.codeUnitAt](i);
+      let uriChar = uri[dartx.codeUnitAt](i);
+      let delta = (dart.notNull(schemeChar) ^ dart.notNull(uriChar)) >>> 0;
+      if (delta != 0) {
+        if (delta == 32) {
+          let lowerChar = (dart.notNull(uriChar) | delta) >>> 0;
+          if (97 <= lowerChar && lowerChar <= 122) {
+            continue;
           }
         }
-        index = dart.notNull(index) + 1;
-        char = EOI;
-      }
-      let hostStart = authStart;
-      let hostEnd = index;
-      if (dart.notNull(lastAt) >= 0) {
-        userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
-        hostStart = dart.notNull(lastAt) + 1;
-      }
-      if (dart.notNull(lastColon) >= 0) {
-        let portNumber = null;
-        if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
-          portNumber = 0;
-          for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
-            let digit = uri[dartx.codeUnitAt](i);
-            if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
-              core.Uri._fail(uri, i, "Invalid port number");
-            }
-            portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
-          }
-        }
-        port = core.Uri._makePort(portNumber, scheme);
-        hostEnd = lastColon;
-      }
-      host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
-      if (dart.notNull(index) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
+        return false;
       }
     }
-    dart.fn(parseAuth, VoidTovoid$());
-    let NOT_IN_PATH = 0;
-    let IN_PATH = 1;
-    let ALLOW_AUTH = 2;
-    let state = NOT_IN_PATH;
-    let i = index;
-    while (dart.notNull(i) < dart.notNull(end)) {
-      char = uri[dartx.codeUnitAt](i);
-      if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-        state = NOT_IN_PATH;
-        break;
-      }
-      if (char == core.Uri._SLASH) {
-        state = i == start ? ALLOW_AUTH : IN_PATH;
-        break;
-      }
-      if (char == core.Uri._COLON) {
-        if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
-        scheme = core.Uri._makeScheme(uri, start, i);
-        i = dart.notNull(i) + 1;
-        pathStart = i;
-        if (i == end) {
-          char = EOI;
-          state = NOT_IN_PATH;
-        } else {
-          char = uri[dartx.codeUnitAt](i);
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            state = NOT_IN_PATH;
-          } else if (char == core.Uri._SLASH) {
-            state = ALLOW_AUTH;
-          } else {
-            state = IN_PATH;
-          }
-        }
-        break;
-      }
-      i = dart.notNull(i) + 1;
-      char = EOI;
-    }
-    index = i;
-    if (state == ALLOW_AUTH) {
-      dart.assert(char == core.Uri._SLASH);
-      index = dart.notNull(index) + 1;
-      if (index == end) {
-        char = EOI;
-        state = NOT_IN_PATH;
-      } else {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._SLASH) {
-          index = dart.notNull(index) + 1;
-          parseAuth();
-          pathStart = index;
-        }
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
-          state = NOT_IN_PATH;
-        } else {
-          state = IN_PATH;
-        }
-      }
-    }
-    dart.assert(state == IN_PATH || state == NOT_IN_PATH);
-    if (state == IN_PATH) {
-      while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](index);
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          break;
-        }
-        char = EOI;
-      }
-      state = NOT_IN_PATH;
-    }
-    dart.assert(state == NOT_IN_PATH);
-    let hasAuthority = host != null;
-    path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
-    if (char == core.Uri._QUESTION) {
-      let numberSignIndex = -1;
-      for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
-        if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
-          numberSignIndex = i;
-          break;
-        }
-      }
-      if (numberSignIndex < 0) {
-        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
-      } else {
-        query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
-        fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
-      }
-    } else if (char == core.Uri._NUMBER_SIGN) {
-      fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
-    }
-    return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
+    return true;
   }
   static _fail(uri, index, message) {
     dart.throw(new core.FormatException(message, uri, index));
@@ -33499,7 +33825,8 @@
       let hostStart = 0;
       let hasUserInfo = false;
       for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
-        if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
+        let atSign = 64;
+        if (authority[dartx.codeUnitAt](i) == atSign) {
           hasUserInfo = true;
           userInfo = authority[dartx.substring](0, i);
           hostStart = i + 1;
@@ -33507,22 +33834,22 @@
         }
       }
       let hostEnd = hostStart;
-      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
+      if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core._LEFT_BRACKET) {
         for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
+          if (authority[dartx.codeUnitAt](hostEnd) == core._RIGHT_BRACKET) break;
         }
         if (hostEnd == authority[dartx.length]) {
           dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
         }
         core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
         hostEnd++;
-        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
+        if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core._COLON) {
           dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
         }
       }
       let hasPort = false;
       for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-        if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
+        if (authority[dartx.codeUnitAt](hostEnd) == core._COLON) {
           let portString = authority[dartx.substring](hostEnd + 1);
           if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
           break;
@@ -33534,33 +33861,13 @@
   }
   static file(path, opts) {
     let windows = opts && 'windows' in opts ? opts.windows : null;
-    windows = windows == null ? core.Uri._isWindows : windows;
-    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
+    windows = windows == null ? core._Uri._isWindows : windows;
+    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, false) : core._Uri._makeFileUri(path, false));
   }
   static directory(path, opts) {
     let windows = opts && 'windows' in opts ? opts.windows : null;
-    windows = windows == null ? core.Uri._isWindows : windows;
-    return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
-  }
-  static dataFromString(content, opts) {
-    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-    let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-    let base64 = opts && 'base64' in opts ? opts.base64 : false;
-    let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
-    return data.uri;
-  }
-  static dataFromBytes(bytes, opts) {
-    let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-    let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-    let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-    let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
-    return data.uri;
-  }
-  static get base() {
-    let uri = _js_helper.Primitives.currentUri();
-    if (uri != null) return core.Uri.parse(uri);
-    dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+    windows = windows == null ? core._Uri._isWindows : windows;
+    return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, true) : core._Uri._makeFileUri(path, true));
   }
   static get _isWindows() {
     return false;
@@ -33589,7 +33896,7 @@
     }
   }
   static _checkWindowsDriveLetter(charCode, argumentError) {
-    if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
+    if (core._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._UPPER_CASE_Z || core._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._LOWER_CASE_Z) {
       return;
     }
     if (dart.test(argumentError)) {
@@ -33616,7 +33923,7 @@
         path = path[dartx.replaceRange](0, 7, '\\');
       } else {
         path = path[dartx.substring](4);
-        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+        if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core._COLON || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
           dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
         }
       }
@@ -33624,16 +33931,16 @@
       path = path[dartx.replaceAll]("/", '\\');
     }
     let sep = '\\';
-    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
-      core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
-      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+    if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core._COLON) {
+      core._Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
+      if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
         dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
       }
       let pathSegments = path[dartx.split](sep);
       if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
         pathSegments[dartx.add]("");
       }
-      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
       return core.Uri.new({scheme: "file", pathSegments: pathSegments});
     }
     if (dart.test(path[dartx.startsWith](sep))) {
@@ -33642,7 +33949,7 @@
         let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
         let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
         let pathSegments = pathPart[dartx.split](sep);
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
@@ -33652,12 +33959,12 @@
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         return core.Uri.new({scheme: "file", pathSegments: pathSegments});
       }
     } else {
       let pathSegments = path[dartx.split](sep);
-      core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+      core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
       if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
         pathSegments[dartx.add]("");
       }
@@ -33676,27 +33983,27 @@
     let fragment = opts && 'fragment' in opts ? opts.fragment : null;
     let schemeChanged = false;
     if (scheme != null) {
-      scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
-      schemeChanged = true;
+      scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+      schemeChanged = scheme != this.scheme;
     } else {
       scheme = this.scheme;
     }
     let isFile = scheme == "file";
     if (userInfo != null) {
-      userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
     } else {
       userInfo = this[_userInfo];
     }
     if (port != null) {
-      port = core.Uri._makePort(port, scheme);
+      port = core._Uri._makePort(port, scheme);
     } else {
       port = this[_port];
       if (schemeChanged) {
-        port = core.Uri._makePort(port, scheme);
+        port = core._Uri._makePort(port, scheme);
       }
     }
     if (host != null) {
-      host = core.Uri._makeHost(host, 0, host[dartx.length], false);
+      host = core._Uri._makeHost(host, 0, host[dartx.length], false);
     } else if (dart.test(this.hasAuthority)) {
       host = this[_host];
     } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
@@ -33704,34 +34011,34 @@
     }
     let hasAuthority = host != null;
     if (path != null || pathSegments != null) {
-      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
     } else {
-      path = this[_path];
+      path = this.path;
       if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
         path = "/" + dart.notNull(path);
       }
     }
     if (query != null || queryParameters != null) {
-      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
     } else {
       query = this[_query];
     }
     if (fragment != null) {
-      fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+      fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
     } else {
       fragment = this[_fragment];
     }
-    return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
   }
   removeFragment() {
     if (!dart.test(this.hasFragment)) return this;
-    return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
+    return new core._Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this.path, this[_query], null);
   }
   get pathSegments() {
     let result = this[_pathSegments];
     if (result != null) return result;
     let pathToSplit = this.path;
-    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
+    if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core._SLASH) {
       pathToSplit = pathToSplit[dartx.substring](1);
     }
     result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
@@ -33746,7 +34053,7 @@
   }
   get queryParametersAll() {
     if (this[_queryParameterLists] == null) {
-      let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
+      let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
       for (let key of queryParameterLists[dartx.keys]) {
         queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
       }
@@ -33755,36 +34062,36 @@
     return this[_queryParameterLists];
   }
   normalizePath() {
-    let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
-    if (core.identical(path, this[_path])) return this;
+    let path = core._Uri._normalizePath(this.path, this.scheme, this.hasAuthority);
+    if (core.identical(path, this.path)) return this;
     return this.replace({path: path});
   }
   static _makePort(port, scheme) {
-    if (port != null && port == core.Uri._defaultPort(scheme)) return null;
+    if (port != null && port == core._Uri._defaultPort(scheme)) return null;
     return port;
   }
   static _makeHost(host, start, end, strictIPv6) {
     if (host == null) return null;
     if (start == end) return "";
-    if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
-      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
-        core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+    if (host[dartx.codeUnitAt](start) == core._LEFT_BRACKET) {
+      if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core._RIGHT_BRACKET) {
+        core._Uri._fail(host, start, 'Missing end `]` to match `[` in host');
       }
       core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
       return host[dartx.substring](start, end)[dartx.toLowerCase]();
     }
     if (!dart.test(strictIPv6)) {
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+        if (host[dartx.codeUnitAt](i) == core._COLON) {
           core.Uri.parseIPv6Address(host, start, end);
           return dart.str`[${host}]`;
         }
       }
     }
-    return core.Uri._normalizeRegName(host, start, end);
+    return core._Uri._normalizeRegName(host, start, end);
   }
   static _isRegNameChar(char) {
-    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
   }
   static _normalizeRegName(host, start, end) {
     let buffer = null;
@@ -33793,8 +34100,8 @@
     let isNormalized = true;
     while (dart.notNull(index) < dart.notNull(end)) {
       let char = host[dartx.codeUnitAt](index);
-      if (char == core.Uri._PERCENT) {
-        let replacement = core.Uri._normalizeEscape(host, index, true);
+      if (char == core._PERCENT) {
+        let replacement = core._Uri._normalizeEscape(host, index, true);
         if (replacement == null && isNormalized) {
           index = dart.notNull(index) + 3;
           continue;
@@ -33814,8 +34121,8 @@
         index = dart.notNull(index) + sourceLength;
         sectionStart = index;
         isNormalized = true;
-      } else if (dart.test(core.Uri._isRegNameChar(char))) {
-        if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
+      } else if (dart.test(core._Uri._isRegNameChar(char))) {
+        if (isNormalized && core._UPPER_CASE_A <= dart.notNull(char) && core._UPPER_CASE_Z >= dart.notNull(char)) {
           if (buffer == null) buffer = new core.StringBuffer();
           if (dart.notNull(sectionStart) < dart.notNull(index)) {
             buffer.write(host[dartx.substring](sectionStart, index));
@@ -33824,8 +34131,8 @@
           isNormalized = false;
         }
         index = dart.notNull(index) + 1;
-      } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-        core.Uri._fail(host, index, "Invalid character");
+      } else if (dart.test(core._Uri._isGeneralDelimiter(char))) {
+        core._Uri._fail(host, index, "Invalid character");
       } else {
         let sourceLength = 1;
         if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
@@ -33839,7 +34146,7 @@
         let slice = host[dartx.substring](sectionStart, index);
         if (!isNormalized) slice = slice[dartx.toLowerCase]();
         buffer.write(slice);
-        buffer.write(core.Uri._escapeChar(char));
+        buffer.write(core._Uri._escapeChar(char));
         index = dart.notNull(index) + sourceLength;
         sectionStart = index;
       }
@@ -33855,26 +34162,33 @@
   static _makeScheme(scheme, start, end) {
     if (start == end) return "";
     let firstCodeUnit = scheme[dartx.codeUnitAt](start);
-    if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
-      core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
+    if (!dart.test(core._Uri._isAlphabeticCharacter(firstCodeUnit))) {
+      core._Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
     }
     let containsUpperCase = false;
     for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
       let codeUnit = scheme[dartx.codeUnitAt](i);
-      if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
-        core.Uri._fail(scheme, i, "Illegal scheme character");
+      if (!dart.test(core._Uri._isSchemeCharacter(codeUnit))) {
+        core._Uri._fail(scheme, i, "Illegal scheme character");
       }
-      if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
+      if (core._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core._UPPER_CASE_Z) {
         containsUpperCase = true;
       }
     }
     scheme = scheme[dartx.substring](start, end);
     if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
+    return core._Uri._canonicalizeScheme(scheme);
+  }
+  static _canonicalizeScheme(scheme) {
+    if (scheme == "http") return "http";
+    if (scheme == "file") return "file";
+    if (scheme == "https") return "https";
+    if (scheme == "package") return "package";
     return scheme;
   }
   static _makeUserInfo(userInfo, start, end) {
     if (userInfo == null) return "";
-    return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+    return core._Uri._normalizeOrSubstring(userInfo, start, end, core._Uri._userinfoTable);
   }
   static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
     let isFile = scheme == "file";
@@ -33885,30 +34199,32 @@
     }
     let result = null;
     if (path != null) {
-      result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
+      result = core._Uri._normalizeOrSubstring(path, start, end, core._Uri._pathCharOrSlashTable);
     } else {
-      result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
+      result = pathSegments[dartx.map](core.String)(dart.fn(s => core._Uri._uriEncode(core._Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
     }
     if (dart.test(dart.dload(result, 'isEmpty'))) {
       if (isFile) return "/";
     } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
       result = "/" + dart.notNull(core.String._check(result));
     }
-    result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
+    result = core._Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
     return core.String._check(result);
   }
   static _normalizePath(path, scheme, hasAuthority) {
     if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
-      return core.Uri._normalizeRelativePath(path);
+      return core._Uri._normalizeRelativePath(path, dart.test(scheme[dartx.isNotEmpty]) || dart.test(hasAuthority));
     }
-    return core.Uri._removeDotSegments(path);
+    return core._Uri._removeDotSegments(path);
   }
   static _makeQuery(query, start, end, queryParameters) {
-    if (query == null && queryParameters == null) return null;
-    if (query != null && queryParameters != null) {
-      dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+    if (query != null) {
+      if (queryParameters != null) {
+        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+      }
+      return core._Uri._normalizeOrSubstring(query, start, end, core._Uri._queryCharTable);
     }
-    if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
+    if (queryParameters == null) return null;
     let result = new core.StringBuffer();
     let separator = "";
     function writeParameter(key, value) {
@@ -33936,52 +34252,40 @@
   }
   static _makeFragment(fragment, start, end) {
     if (fragment == null) return null;
-    return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
-  }
-  static _stringOrNullLength(s) {
-    return s == null ? 0 : s[dartx.length];
+    return core._Uri._normalizeOrSubstring(fragment, start, end, core._Uri._queryCharTable);
   }
   static _normalizeEscape(source, index, lowerCase) {
-    dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
+    dart.assert(source[dartx.codeUnitAt](index) == core._PERCENT);
     if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
       return "%";
     }
     let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
     let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
-    let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
-    let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
+    let firstDigitValue = _internal.hexDigitValue(firstDigit);
+    let secondDigitValue = _internal.hexDigitValue(secondDigit);
     if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
       return "%";
     }
     let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
-    if (dart.test(core.Uri._isUnreservedChar(value))) {
-      if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
+    if (dart.test(core._Uri._isUnreservedChar(value))) {
+      if (dart.test(lowerCase) && core._UPPER_CASE_A <= value && core._UPPER_CASE_Z >= value) {
         value = (value | 32) >>> 0;
       }
       return core.String.fromCharCode(value);
     }
-    if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
+    if (dart.notNull(firstDigit) >= core._LOWER_CASE_A || dart.notNull(secondDigit) >= core._LOWER_CASE_A) {
       return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
     }
     return null;
   }
-  static _parseHexDigit(char) {
-    let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
-    if (digit <= 9) return digit;
-    let lowerCase = (dart.notNull(char) | 32) >>> 0;
-    if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
-      return lowerCase - (core.Uri._LOWER_CASE_A - 10);
-    }
-    return -1;
-  }
   static _escapeChar(char) {
     dart.assert(dart.notNull(char) <= 1114111);
     let codeUnits = null;
     if (dart.notNull(char) < 128) {
       codeUnits = ListOfint().new(3);
-      codeUnits[dartx._set](0, core.Uri._PERCENT);
-      codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
-      codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
+      codeUnits[dartx._set](0, core._PERCENT);
+      codeUnits[dartx._set](1, core._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
+      codeUnits[dartx._set](2, core._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
     } else {
       let flag = 192;
       let encodedBytes = 2;
@@ -33997,16 +34301,21 @@
       let index = 0;
       while (--encodedBytes >= 0) {
         let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
-        codeUnits[dartx._set](index, core.Uri._PERCENT);
-        codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-        codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
+        codeUnits[dartx._set](index, core._PERCENT);
+        codeUnits[dartx._set](index + 1, core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        codeUnits[dartx._set](index + 2, core._hexDigits[dartx.codeUnitAt](byte & 15));
         index = index + 3;
         flag = 128;
       }
     }
     return core.String.fromCharCodes(codeUnits);
   }
-  static _normalize(component, start, end, charTable) {
+  static _normalizeOrSubstring(component, start, end, charTable) {
+    let l = core._Uri._normalize(component, start, end, charTable);
+    return l != null ? l : component[dartx.substring](start, end);
+  }
+  static _normalize(component, start, end, charTable, opts) {
+    let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
     let buffer = null;
     let sectionStart = start;
     let index = start;
@@ -34017,8 +34326,8 @@
       } else {
         let replacement = null;
         let sourceLength = null;
-        if (char == core.Uri._PERCENT) {
-          replacement = core.Uri._normalizeEscape(component, index, false);
+        if (char == core._PERCENT) {
+          replacement = core._Uri._normalizeEscape(component, index, false);
           if (replacement == null) {
             index = dart.notNull(index) + 3;
             continue;
@@ -34029,8 +34338,8 @@
           } else {
             sourceLength = 3;
           }
-        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-          core.Uri._fail(component, index, "Invalid character");
+        } else if (!dart.test(escapeDelimiters) && dart.test(core._Uri._isGeneralDelimiter(char))) {
+          core._Uri._fail(component, index, "Invalid character");
         } else {
           sourceLength = 1;
           if ((dart.notNull(char) & 64512) == 55296) {
@@ -34042,7 +34351,7 @@
               }
             }
           }
-          replacement = core.Uri._escapeChar(char);
+          replacement = core._Uri._escapeChar(char);
         }
         if (buffer == null) buffer = new core.StringBuffer();
         buffer.write(component[dartx.substring](sectionStart, index));
@@ -34052,7 +34361,7 @@
       }
     }
     if (buffer == null) {
-      return component[dartx.substring](start, end);
+      return null;
     }
     if (dart.notNull(sectionStart) < dart.notNull(end)) {
       buffer.write(component[dartx.substring](sectionStart, end));
@@ -34060,10 +34369,10 @@
     return dart.toString(buffer);
   }
   static _isSchemeCharacter(ch) {
-    return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+    return dart.notNull(ch) < 128 && (dart.notNull(core._Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
   }
   static _isGeneralDelimiter(ch) {
-    return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+    return dart.notNull(ch) <= core._RIGHT_BRACKET && (dart.notNull(core._Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
   }
   get isAbsolute() {
     return this.scheme != "" && this.fragment == "";
@@ -34082,7 +34391,7 @@
         break;
       }
       let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
-      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
+      if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core._DOT)) {
         break;
       }
       baseEnd = newEnd;
@@ -34096,7 +34405,7 @@
     return index != -1;
   }
   static _removeDotSegments(path) {
-    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    if (!dart.test(core._Uri._mayContainDotSegments(path))) return path;
     dart.assert(path[dartx.isNotEmpty]);
     let output = JSArrayOfString().of([]);
     let appendSlash = false;
@@ -34119,9 +34428,12 @@
     if (appendSlash) output[dartx.add]("");
     return output[dartx.join]("/");
   }
-  static _normalizeRelativePath(path) {
+  static _normalizeRelativePath(path, allowScheme) {
     dart.assert(!dart.test(path[dartx.startsWith]('/')));
-    if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+    if (!dart.test(core._Uri._mayContainDotSegments(path))) {
+      if (!dart.test(allowScheme)) path = core._Uri._escapeScheme(path);
+      return path;
+    }
     dart.assert(path[dartx.isNotEmpty]);
     let output = JSArrayOfString().of([]);
     let appendSlash = false;
@@ -34144,8 +34456,23 @@
       return "./";
     }
     if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
+    if (!dart.test(allowScheme)) output[dartx._set](0, core._Uri._escapeScheme(output[dartx._get](0)));
     return output[dartx.join]("/");
   }
+  static _escapeScheme(path) {
+    if (dart.notNull(path[dartx.length]) >= 2 && dart.test(core._Uri._isAlphabeticCharacter(path[dartx.codeUnitAt](0)))) {
+      for (let i = 1; i < dart.notNull(path[dartx.length]); i++) {
+        let char = path[dartx.codeUnitAt](i);
+        if (char == core._COLON) {
+          return dart.str`${path[dartx.substring](0, i)}%3A${path[dartx.substring](i + 1)}`;
+        }
+        if (dart.notNull(char) > 127 || (dart.notNull(core._Uri._schemeTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) == 0) {
+          break;
+        }
+      }
+    }
+    return path;
+  }
   resolve(reference) {
     return this.resolveUri(core.Uri.parse(reference));
   }
@@ -34163,7 +34490,7 @@
         targetHost = reference.host;
         targetPort = dart.test(reference.hasPort) ? reference.port : null;
       }
-      targetPath = core.Uri._removeDotSegments(reference.path);
+      targetPath = core._Uri._removeDotSegments(reference.path);
       if (dart.test(reference.hasQuery)) {
         targetQuery = reference.query;
       }
@@ -34172,15 +34499,15 @@
       if (dart.test(reference.hasAuthority)) {
         targetUserInfo = reference.userInfo;
         targetHost = reference.host;
-        targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
-        targetPath = core.Uri._removeDotSegments(reference.path);
+        targetPort = core._Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
+        targetPath = core._Uri._removeDotSegments(reference.path);
         if (dart.test(reference.hasQuery)) targetQuery = reference.query;
       } else {
         targetUserInfo = this[_userInfo];
         targetHost = this[_host];
         targetPort = this[_port];
         if (reference.path == "") {
-          targetPath = this[_path];
+          targetPath = this.path;
           if (dart.test(reference.hasQuery)) {
             targetQuery = reference.query;
           } else {
@@ -34188,20 +34515,24 @@
           }
         } else {
           if (dart.test(reference.hasAbsolutePath)) {
-            targetPath = core.Uri._removeDotSegments(reference.path);
+            targetPath = core._Uri._removeDotSegments(reference.path);
           } else {
             if (dart.test(this.hasEmptyPath)) {
-              if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
-                targetPath = reference.path;
+              if (!dart.test(this.hasAuthority)) {
+                if (!dart.test(this.hasScheme)) {
+                  targetPath = reference.path;
+                } else {
+                  targetPath = core._Uri._removeDotSegments(reference.path);
+                }
               } else {
-                targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
+                targetPath = core._Uri._removeDotSegments("/" + dart.notNull(reference.path));
               }
             } else {
-              let mergedPath = this[_mergePaths](this[_path], reference.path);
+              let mergedPath = this[_mergePaths](this.path, reference.path);
               if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
-                targetPath = core.Uri._removeDotSegments(mergedPath);
+                targetPath = core._Uri._removeDotSegments(mergedPath);
               } else {
-                targetPath = core.Uri._normalizeRelativePath(mergedPath);
+                targetPath = core._Uri._normalizeRelativePath(mergedPath, dart.test(this.hasScheme) || dart.test(this.hasAuthority));
               }
             }
           }
@@ -34210,7 +34541,7 @@
       }
     }
     let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
-    return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
+    return new core._Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
   }
   get hasScheme() {
     return this.scheme[dartx.isNotEmpty];
@@ -34228,18 +34559,21 @@
     return this[_fragment] != null;
   }
   get hasEmptyPath() {
-    return this[_path][dartx.isEmpty];
+    return this.path[dartx.isEmpty];
   }
   get hasAbsolutePath() {
-    return this[_path][dartx.startsWith]('/');
+    return this.path[dartx.startsWith]('/');
   }
   get origin() {
-    if (this.scheme == "" || this[_host] == null || this[_host] == "") {
+    if (this.scheme == "") {
       dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
     }
     if (this.scheme != "http" && this.scheme != "https") {
       dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
     }
+    if (this[_host] == null || this[_host] == "") {
+      dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+    }
     if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
     return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
   }
@@ -34254,43 +34588,46 @@
     if (this.fragment != "") {
       dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
     }
-    if (windows == null) windows = core.Uri._isWindows;
-    return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
+    if (windows == null) windows = core._Uri._isWindows;
+    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
   }
   [_toFilePath]() {
-    if (this.host != "") {
+    if (dart.test(this.hasAuthority) && this.host != "") {
       dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
     }
-    core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
+    let pathSegments = this.pathSegments;
+    core._Uri._checkNonWindowsPathReservedCharacters(pathSegments, false);
     let result = new core.StringBuffer();
-    if (dart.test(this[_isPathAbsolute])) result.write("/");
-    result.writeAll(this.pathSegments, "/");
+    if (dart.test(this.hasAbsolutePath)) result.write("/");
+    result.writeAll(pathSegments, "/");
     return result.toString();
   }
-  [_toWindowsFilePath]() {
+  static _toWindowsFilePath(uri) {
     let hasDriveLetter = false;
-    let segments = this.pathSegments;
-    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
-      core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
-      core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
+    let segments = uri.pathSegments;
+    if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core._COLON) {
+      core._Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
+      core._Uri._checkWindowsPathReservedCharacters(segments, false, 1);
       hasDriveLetter = true;
     } else {
-      core.Uri._checkWindowsPathReservedCharacters(segments, false);
+      core._Uri._checkWindowsPathReservedCharacters(segments, false, 0);
     }
     let result = new core.StringBuffer();
-    if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
-    if (this.host != "") {
-      result.write("\\");
-      result.write(this.host);
-      result.write("\\");
+    if (dart.test(uri.hasAbsolutePath) && !hasDriveLetter) result.write("\\");
+    if (dart.test(uri.hasAuthority)) {
+      let host = uri.host;
+      if (dart.test(host[dartx.isNotEmpty])) {
+        result.write("\\");
+        result.write(host);
+        result.write("\\");
+      }
     }
     result.writeAll(segments, "\\");
     if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
     return result.toString();
   }
   get [_isPathAbsolute]() {
-    if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
-    return this.path[dartx.startsWith]('/');
+    return this.path != null && dart.test(this.path[dartx.startsWith]('/'));
   }
   [_writeAuthority](ss) {
     if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
@@ -34307,9 +34644,17 @@
     return this.scheme == "data" ? core.UriData.fromUri(this) : null;
   }
   toString() {
+    let t = this[_text];
+    return t == null ? this[_text] = this[_initializeText]() : t;
+  }
+  [_initializeText]() {
+    dart.assert(this[_text] == null);
     let sb = new core.StringBuffer();
-    core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
-    if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
+    if (dart.test(this.scheme[dartx.isNotEmpty])) {
+      sb.write(this.scheme);
+      sb.write(":");
+    }
+    if (dart.test(this.hasAuthority) || this.scheme == "file") {
       sb.write("//");
       this[_writeAuthority](sb);
     }
@@ -34325,58 +34670,16 @@
     return sb.toString();
   }
   ['=='](other) {
-    if (!core.Uri.is(other)) return false;
-    let uri = core.Uri._check(other);
-    return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+    if (core.identical(this, other)) return true;
+    if (core.Uri.is(other)) {
+      let uri = other;
+      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+    }
+    return false;
   }
   get hashCode() {
-    function combine(part, current) {
-      return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
-    }
-    dart.fn(combine, dynamicAnddynamicToint());
-    return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
-  }
-  static _addIfNonEmpty(sb, test, first, second) {
-    if ("" != test) {
-      sb.write(first);
-      sb.write(second);
-    }
-  }
-  static encodeComponent(component) {
-    return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
-  }
-  static encodeQueryComponent(component, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
-  }
-  static decodeComponent(encodedComponent) {
-    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
-  }
-  static decodeQueryComponent(encodedComponent, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
-  }
-  static encodeFull(uri) {
-    return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
-  }
-  static decodeFull(uri) {
-    return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
-  }
-  static splitQueryString(query, opts) {
-    let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
-      let index = element[dartx.indexOf]("=");
-      if (index == -1) {
-        if (element != "") {
-          map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
-        }
-      } else if (index != 0) {
-        let key = element[dartx.substring](0, index);
-        let value = element[dartx.substring](dart.notNull(index) + 1);
-        map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
-      }
-      return map;
-    }, MapOfString$StringAndStringToMapOfString$String()));
+    let t = this[_hashCodeCache];
+    return t == null ? this[_hashCodeCache] = dart.hashCode(this.toString()) : t;
   }
   static _createList() {
     return [];
@@ -34392,22 +34695,20 @@
       let value = null;
       if (start == end) return;
       if (dart.notNull(equalsIndex) < 0) {
-        key = core.Uri._uriDecode(query, start, end, encoding, true);
+        key = core._Uri._uriDecode(query, start, end, encoding, true);
         value = "";
       } else {
-        key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
-        value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
+        key = core._Uri._uriDecode(query, start, equalsIndex, encoding, true);
+        value = core._Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
       }
-      dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
+      dart.dsend(result[dartx.putIfAbsent](key, core._Uri._createList), 'add', value);
     }
     dart.fn(parsePair, intAndintAndintTovoid());
-    let _equals = 61;
-    let _ampersand = 38;
     while (i < dart.notNull(query[dartx.length])) {
       let char = query[dartx.codeUnitAt](i);
-      if (char == _equals) {
+      if (char == core._EQUALS) {
         if (equalsIndex < 0) equalsIndex = i;
-      } else if (char == _ampersand) {
+      } else if (char == core._AMPERSAND) {
         parsePair(start, equalsIndex, i);
         start = i + 1;
         equalsIndex = -1;
@@ -34417,125 +34718,17 @@
     parsePair(start, equalsIndex, i);
     return result;
   }
-  static parseIPv4Address(host) {
-    function error(msg) {
-      dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
-    }
-    dart.fn(error, StringTovoid$());
-    let bytes = host[dartx.split]('.');
-    if (bytes[dartx.length] != 4) {
-      error('IPv4 address should contain exactly 4 parts');
-    }
-    return bytes[dartx.map](core.int)(dart.fn(byteString => {
-      let byte = core.int.parse(byteString);
-      if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-        error('each part must be in the range of `0..255`');
-      }
-      return byte;
-    }, StringToint$()))[dartx.toList]();
-  }
-  static parseIPv6Address(host, start, end) {
-    if (start === void 0) start = 0;
-    if (end === void 0) end = null;
-    if (end == null) end = host[dartx.length];
-    function error(msg, position) {
-      if (position === void 0) position = null;
-      dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
-    }
-    dart.fn(error, String__Tovoid());
-    function parseHex(start, end) {
-      if (dart.notNull(end) - dart.notNull(start) > 4) {
-        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-      }
-      let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
-      if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
-        error('each part must be in the range of `0x0..0xFFFF`', start);
-      }
-      return value;
-    }
-    dart.fn(parseHex, intAndintToint());
-    if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
-    let parts = JSArrayOfint().of([]);
-    let wildcardSeen = false;
-    let partStart = start;
-    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-      if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-        if (i == start) {
-          i = dart.notNull(i) + 1;
-          if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
-            error('invalid start colon.', i);
-          }
-          partStart = i;
-        }
-        if (i == partStart) {
-          if (wildcardSeen) {
-            error('only one wildcard `::` is allowed', i);
-          }
-          wildcardSeen = true;
-          parts[dartx.add](-1);
-        } else {
-          parts[dartx.add](parseHex(partStart, i));
-        }
-        partStart = dart.notNull(i) + 1;
-      }
-    }
-    if (parts[dartx.length] == 0) error('too few parts');
-    let atEnd = partStart == end;
-    let isLastWildcard = parts[dartx.last] == -1;
-    if (atEnd && !isLastWildcard) {
-      error('expected a part after last `:`', end);
-    }
-    if (!atEnd) {
-      try {
-        parts[dartx.add](parseHex(partStart, end));
-      } catch (e) {
-        try {
-          let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
-          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
-          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
-        } catch (e) {
-          error('invalid end of IPv6 address.', partStart);
-        }
-
-      }
-
-    }
-    if (wildcardSeen) {
-      if (dart.notNull(parts[dartx.length]) > 7) {
-        error('an address with a wildcard must have less than 7 parts');
-      }
-    } else if (parts[dartx.length] != 8) {
-      error('an address without a wildcard must contain exactly 8 parts');
-    }
-    let bytes = typed_data.Uint8List.new(16);
-    for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
-      let value = parts[dartx._get](i);
-      if (value == -1) {
-        let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
-        for (let j = 0; j < wildCardLength; j++) {
-          bytes[dartx._set](index, 0);
-          bytes[dartx._set](index + 1, 0);
-          index = index + 2;
-        }
-      } else {
-        bytes[dartx._set](index, value[dartx['>>']](8));
-        bytes[dartx._set](index + 1, dart.notNull(value) & 255);
-        index = index + 2;
-      }
-    }
-    return bytes;
-  }
   static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
-    if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
+    if (core.identical(encoding, convert.UTF8) && dart.test(core._Uri._needsNoEncoding.hasMatch(text))) {
       return text;
     }
-    let result = new core.StringBuffer();
+    let result = new core.StringBuffer('');
     let bytes = encoding.encode(text);
     for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
       let byte = bytes[dartx._get](i);
       if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
         result.writeCharCode(byte);
-      } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
+      } else if (dart.test(spaceToPlus) && byte == core._SPACE) {
         result.write('+');
       } else {
         let hexDigits = '0123456789ABCDEF';
@@ -34571,7 +34764,7 @@
     let simple = true;
     for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
       let codeUnit = text[dartx.codeUnitAt](i);
-      if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+      if (dart.notNull(codeUnit) > 127 || codeUnit == core._PERCENT || dart.test(plusToSpace) && codeUnit == core._PLUS) {
         simple = false;
         break;
       }
@@ -34590,14 +34783,14 @@
         if (dart.notNull(codeUnit) > 127) {
           dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
         }
-        if (codeUnit == core.Uri._PERCENT) {
+        if (codeUnit == core._PERCENT) {
           if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
             dart.throw(new core.ArgumentError('Truncated URI'));
           }
-          bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
+          bytes[dartx.add](core._Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
           i = dart.notNull(i) + 2;
-        } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-          bytes[dartx.add](core.Uri._SPACE);
+        } else if (dart.test(plusToSpace) && codeUnit == core._PLUS) {
+          bytes[dartx.add](core._SPACE);
         } else {
           bytes[dartx.add](codeUnit);
         }
@@ -34607,23 +34800,26 @@
   }
   static _isAlphabeticCharacter(codeUnit) {
     let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
-    return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
+    return core._LOWER_CASE_A <= lowerCase && lowerCase <= core._LOWER_CASE_Z;
   }
   static _isUnreservedChar(char) {
-    return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+    return dart.notNull(char) < 127 && (dart.notNull(core._Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
   }
 };
-dart.defineNamedConstructor(core.Uri, '_internal');
-dart.setSignature(core.Uri, {
+dart.defineNamedConstructor(core._Uri, '_internal');
+core._Uri[dart.implements] = () => [core.Uri];
+dart.setSignature(core._Uri, {
   fields: () => ({
     scheme: core.String,
     [_userInfo]: core.String,
     [_host]: core.String,
     [_port]: core.int,
-    [_path]: core.String,
+    path: core.String,
     [_query]: core.String,
     [_fragment]: core.String,
     [_pathSegments]: ListOfString(),
+    [_text]: core.String,
+    [_hashCodeCache]: core.int,
     [_queryParameters]: MapOfString$String(),
     [_queryParameterLists]: MapOfString$ListOfString()
   }),
@@ -34632,7 +34828,6 @@
     userInfo: dart.definiteFunctionType(core.String, []),
     host: dart.definiteFunctionType(core.String, []),
     port: dart.definiteFunctionType(core.int, []),
-    path: dart.definiteFunctionType(core.String, []),
     query: dart.definiteFunctionType(core.String, []),
     fragment: dart.definiteFunctionType(core.String, []),
     pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
@@ -34651,6 +34846,7 @@
     data: dart.definiteFunctionType(core.UriData, [])
   }),
   methods: () => ({
+    isScheme: dart.definiteFunctionType(core.bool, [core.String]),
     replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
     removeFragment: dart.definiteFunctionType(core.Uri, []),
     normalizePath: dart.definiteFunctionType(core.Uri, []),
@@ -34659,12 +34855,12 @@
     resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
     toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
     [_toFilePath]: dart.definiteFunctionType(core.String, []),
-    [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
-    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
+    [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink]),
+    [_initializeText]: dart.definiteFunctionType(core.String, [])
   }),
   statics: () => ({
     _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
-    parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+    _compareScheme: dart.definiteFunctionType(core.bool, [core.String, core.String]),
     _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
     _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
     _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
@@ -34677,85 +34873,50 @@
     _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
     _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
     _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+    _canonicalizeScheme: dart.definiteFunctionType(core.String, [core.String]),
     _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
     _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
     _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
     _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
     _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-    _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
     _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
-    _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
     _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
-    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+    _normalizeOrSubstring: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+    _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()], {escapeDelimiters: core.bool}),
     _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
     _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
     _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
     _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
-    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
-    _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
-    encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-    encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-    decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-    decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-    encodeFull: dart.definiteFunctionType(core.String, [core.String]),
-    decodeFull: dart.definiteFunctionType(core.String, [core.String]),
-    splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+    _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String, core.bool]),
+    _escapeScheme: dart.definiteFunctionType(core.String, [core.String]),
+    _toWindowsFilePath: dart.definiteFunctionType(core.String, [core.Uri]),
     _createList: dart.definiteFunctionType(core.List, []),
     _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
-    parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-    parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
     _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
     _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
     _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
     _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
     _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
   }),
-  names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
+  names: ['_defaultPort', '_compareScheme', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_canonicalizeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_normalizeEscape', '_escapeChar', '_normalizeOrSubstring', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_escapeScheme', '_toWindowsFilePath', '_createList', '_splitQueryStringAll', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
 });
-core.Uri._SPACE = 32;
-core.Uri._DOUBLE_QUOTE = 34;
-core.Uri._NUMBER_SIGN = 35;
-core.Uri._PERCENT = 37;
-core.Uri._ASTERISK = 42;
-core.Uri._PLUS = 43;
-core.Uri._DOT = 46;
-core.Uri._SLASH = 47;
-core.Uri._ZERO = 48;
-core.Uri._NINE = 57;
-core.Uri._COLON = 58;
-core.Uri._LESS = 60;
-core.Uri._GREATER = 62;
-core.Uri._QUESTION = 63;
-core.Uri._AT_SIGN = 64;
-core.Uri._UPPER_CASE_A = 65;
-core.Uri._UPPER_CASE_F = 70;
-core.Uri._UPPER_CASE_Z = 90;
-core.Uri._LEFT_BRACKET = 91;
-core.Uri._BACKSLASH = 92;
-core.Uri._RIGHT_BRACKET = 93;
-core.Uri._LOWER_CASE_A = 97;
-core.Uri._LOWER_CASE_F = 102;
-core.Uri._LOWER_CASE_Z = 122;
-core.Uri._BAR = 124;
-core.Uri._hexDigits = "0123456789ABCDEF";
-core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
-core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
-core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
-core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
-core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
-core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
-core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
-core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
-core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
-core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
-core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
-core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
-dart.defineLazy(core.Uri, {
+core._Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
+core._Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
+core._Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
+core._Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
+core._Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
+core._Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
+core._Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
+core._Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
+core._Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
+core._Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
+core._Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
+core._Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
+dart.defineLazy(core._Uri, {
   get _needsNoEncoding() {
     return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
   }
 });
-const _text = Symbol('_text');
 const _separatorIndices = Symbol('_separatorIndices');
 const _uriCache = Symbol('_uriCache');
 core.UriData = class UriData extends core.Object {
@@ -34839,9 +35000,9 @@
       if (dart.notNull(slashIndex) < 0) {
         dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
       }
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
       buffer.write("/");
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
     }
     if (charsetName != null) {
       if (indices != null) {
@@ -34849,7 +35010,7 @@
         indices[dartx.add](dart.notNull(buffer.length) + 8);
       }
       buffer.write(";charset=");
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
     }
     dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
       if (dart.test(key[dartx.isEmpty])) {
@@ -34860,17 +35021,17 @@
       }
       if (indices != null) indices[dartx.add](buffer.length);
       buffer.write(';');
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
       if (indices != null) indices[dartx.add](buffer.length);
       buffer.write('=');
-      buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
+      buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
     }, StringAndStringToNull())));
   }
   static _validateMimeType(mimeType) {
     let slashIndex = -1;
     for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
       let char = mimeType[dartx.codeUnitAt](i);
-      if (char != core.Uri._SLASH) continue;
+      if (char != core._SLASH) continue;
       if (slashIndex < 0) {
         slashIndex = i;
         continue;
@@ -34880,10 +35041,16 @@
     return slashIndex;
   }
   static parse(uri) {
-    if (!dart.test(uri[dartx.startsWith]("data:"))) {
-      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
+    if (dart.notNull(uri[dartx.length]) >= 5) {
+      let dataDelta = core._startsWithData(uri, 0);
+      if (dataDelta == 0) {
+        return core.UriData._parse(uri, 5, null);
+      }
+      if (dataDelta == 32) {
+        return core.UriData._parse(uri[dartx.substring](5), 0, null);
+      }
     }
-    return core.UriData._parse(uri, 5, null);
+    dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
   }
   get uri() {
     if (this[_uriCache] != null) return this[_uriCache];
@@ -34891,20 +35058,20 @@
     let query = null;
     let colonIndex = this[_separatorIndices][dartx._get](0);
     let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
-    let end = null;
+    let end = this[_text][dartx.length];
     if (dart.notNull(queryIndex) >= 0) {
-      query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
+      query = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(queryIndex) + 1, end, core._Uri._queryCharTable);
       end = queryIndex;
     }
-    path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
-    this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
+    path = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(colonIndex) + 1, end, core._Uri._pathCharOrSlashTable);
+    this[_uriCache] = new core._DataUri(this, path, query);
     return this[_uriCache];
   }
   get mimeType() {
     let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
     let end = this[_separatorIndices][dartx._get](1);
     if (start == end) return "text/plain";
-    return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
+    return core._Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
   }
   get charset() {
     let parameterStart = 1;
@@ -34916,7 +35083,7 @@
       let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
       let keyEnd = this[_separatorIndices][dartx._get](i + 1);
       if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
-        return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
+        return core._Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
       }
     }
     return "US-ASCII";
@@ -34954,10 +35121,8 @@
         result[dartx._set](index++, codeUnit);
       } else {
         if (i + 2 < dart.notNull(text[dartx.length])) {
-          let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
-          let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
-          if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
-            let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
+          let byte = _internal.parseHexByte(text, i + 1);
+          if (dart.notNull(byte) >= 0) {
             result[dartx._set](index++, byte);
             i = i + 2;
             continue;
@@ -34984,7 +35149,7 @@
       let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
       return converter.convert(text[dartx.substring](start));
     }
-    return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
+    return core._Uri._uriDecode(text, start, text[dartx.length], encoding, false);
   }
   get parameters() {
     let result = dart.map({}, core.String, core.String);
@@ -34992,8 +35157,8 @@
       let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
       let equals = this[_separatorIndices][dartx._get](i - 1);
       let end = this[_separatorIndices][dartx._get](i);
-      let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
-      let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
+      let key = core._Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
+      let value = core._Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
       result[dartx._set](key, value);
     }
     return result;
@@ -35046,6 +35211,15 @@
       }
     }
     indices[dartx.add](i);
+    let isBase64 = indices[dartx.length][dartx.isOdd];
+    if (dart.test(isBase64)) {
+      text = convert.BASE64.normalize(text, dart.notNull(i) + 1, text[dartx.length]);
+    } else {
+      let data = core._Uri._normalize(text, dart.notNull(i) + 1, text[dartx.length], core.UriData._uricTable, {escapeDelimiters: true});
+      if (data != null) {
+        text = text[dartx.replaceRange](dart.notNull(i) + 1, text[dartx.length], data);
+      }
+    }
     return new core.UriData._(text, indices, sourceUri);
   }
   static _uriEncodeBytes(canonicalTable, bytes, buffer) {
@@ -35056,9 +35230,9 @@
       if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
         buffer.writeCharCode(byte);
       } else {
-        buffer.writeCharCode(core.Uri._PERCENT);
-        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-        buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+        buffer.writeCharCode(core._PERCENT);
+        buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+        buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
       }
     }
     if ((dart.notNull(byteOr) & ~255) != 0) {
@@ -35104,7 +35278,667 @@
 });
 core.UriData._noScheme = -1;
 core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
-core.UriData._uricTable = core.Uri._queryCharTable;
+core.UriData._uricTable = core._Uri._queryCharTable;
+core.UriData._base64Table = dart.constList([0, 0, 34816, 1023, 65534, 2047, 65534, 2047], core.int);
+core._schemeEndIndex = 1;
+core._hostStartIndex = 2;
+core._portStartIndex = 3;
+core._pathStartIndex = 4;
+core._queryStartIndex = 5;
+core._fragmentStartIndex = 6;
+core._notSimpleIndex = 7;
+core._uriStart = 0;
+core._nonSimpleEndStates = 14;
+core._schemeStart = 20;
+dart.defineLazy(core, {
+  get _scannerTables() {
+    return core._createTables();
+  }
+});
+core._createTables = function() {
+  let stateCount = 22;
+  let schemeOrPath = 1;
+  let authOrPath = 2;
+  let authOrPathSlash = 3;
+  let uinfoOrHost0 = 4;
+  let uinfoOrHost = 5;
+  let uinfoOrPort0 = 6;
+  let uinfoOrPort = 7;
+  let ipv6Host = 8;
+  let relPathSeg = 9;
+  let pathSeg = 10;
+  let path = 11;
+  let query = 12;
+  let fragment = 13;
+  let schemeOrPathDot = 14;
+  let schemeOrPathDot2 = 15;
+  let relPathSegDot = 16;
+  let relPathSegDot2 = 17;
+  let pathSegDot = 18;
+  let pathSegDot2 = 19;
+  let scheme0 = core._schemeStart;
+  let scheme = 21;
+  let schemeEnd = core._schemeEndIndex << 5;
+  let hostStart = core._hostStartIndex << 5;
+  let portStart = core._portStartIndex << 5;
+  let pathStart = core._pathStartIndex << 5;
+  let queryStart = core._queryStartIndex << 5;
+  let fragmentStart = core._fragmentStartIndex << 5;
+  let notSimple = core._notSimpleIndex << 5;
+  let unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
+  let subDelims = "!$&'()*+,;=";
+  let pchar = dart.str`${unreserved}${subDelims}`;
+  let tables = ListOfUint8List().generate(stateCount, dart.fn(_ => typed_data.Uint8List.new(96), intToUint8List()));
+  function build(state, defaultTransition) {
+    return (() => {
+      let _ = tables[dartx._get](core.int._check(state));
+      _[dartx.fillRange](0, 96, core.int._check(defaultTransition));
+      return _;
+    })();
+  }
+  dart.fn(build, dynamicAnddynamicToUint8List());
+  function setChars(target, chars, transition) {
+    for (let i = 0; i < dart.notNull(chars[dartx.length]); i++) {
+      let char = chars[dartx.codeUnitAt](i);
+      target[dartx._set]((dart.notNull(char) ^ 96) >>> 0, transition);
+    }
+  }
+  dart.fn(setChars, Uint8ListAndStringAndintTovoid());
+  function setRange(target, range, transition) {
+    for (let i = range[dartx.codeUnitAt](0), n = range[dartx.codeUnitAt](1); dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1) {
+      target[dartx._set]((dart.notNull(i) ^ 96) >>> 0, transition);
+    }
+  }
+  dart.fn(setRange, Uint8ListAndStringAndintTovoid());
+  let b = null;
+  b = build(core._uriStart, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot);
+  setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", authOrPathSlash);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPathDot, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot2);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPathDot2, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), "%", (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(schemeOrPath, (schemeOrPath | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+  setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(authOrPath, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, (path | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (authOrPathSlash | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ".", (pathSegDot | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(authOrPathSlash, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrHost0, (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "[", (ipv6Host | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrHost, (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+  setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrPort0, (uinfoOrPort | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "19", uinfoOrPort);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(uinfoOrPort, (uinfoOrPort | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "09", uinfoOrPort);
+  setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(ipv6Host, ipv6Host);
+  setChars(typed_data.Uint8List._check(b), "]", uinfoOrHost);
+  b = build(relPathSeg, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(relPathSegDot, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", relPathSegDot2);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(relPathSegDot2, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSeg, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSegDot, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), ".", pathSegDot2);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(pathSegDot2, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(path, (path | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, path);
+  setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+  setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(query, (query | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, query);
+  setChars(typed_data.Uint8List._check(b), "?", query);
+  setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+  b = build(fragment, (fragment | notSimple) >>> 0);
+  setChars(typed_data.Uint8List._check(b), pchar, fragment);
+  setChars(typed_data.Uint8List._check(b), "?", fragment);
+  b = build(scheme0, (scheme | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "az", scheme);
+  b = build(scheme, (scheme | notSimple) >>> 0);
+  setRange(typed_data.Uint8List._check(b), "az", scheme);
+  setRange(typed_data.Uint8List._check(b), "09", scheme);
+  setChars(typed_data.Uint8List._check(b), "+-.", scheme);
+  return tables;
+};
+dart.lazyFn(core._createTables, () => VoidToListOfUint8List());
+core._scan = function(uri, start, end, state, indices) {
+  let tables = core._scannerTables;
+  dart.assert(dart.notNull(end) <= dart.notNull(uri[dartx.length]));
+  for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+    let table = tables[dartx._get](state);
+    let char = (dart.notNull(uri[dartx.codeUnitAt](i)) ^ 96) >>> 0;
+    if (char > 95) char = 31;
+    let transition = table[dartx._get](char);
+    state = dart.notNull(transition) & 31;
+    indices[dartx._set](transition[dartx['>>']](5), i);
+  }
+  return state;
+};
+dart.fn(core._scan, StringAndintAndint__Toint());
+const _uri = Symbol('_uri');
+const _schemeEnd = Symbol('_schemeEnd');
+const _hostStart = Symbol('_hostStart');
+const _portStart = Symbol('_portStart');
+const _pathStart = Symbol('_pathStart');
+const _queryStart = Symbol('_queryStart');
+const _fragmentStart = Symbol('_fragmentStart');
+const _schemeCache = Symbol('_schemeCache');
+const _isFile = Symbol('_isFile');
+const _isHttp = Symbol('_isHttp');
+const _isHttps = Symbol('_isHttps');
+const _isPackage = Symbol('_isPackage');
+const _isScheme = Symbol('_isScheme');
+let const$52;
+let const$53;
+let const$54;
+const _isPort = Symbol('_isPort');
+const _simpleMerge = Symbol('_simpleMerge');
+const _toNonSimple = Symbol('_toNonSimple');
+core._SimpleUri = class _SimpleUri extends core.Object {
+  new(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, schemeCache) {
+    this[_uri] = uri;
+    this[_schemeEnd] = schemeEnd;
+    this[_hostStart] = hostStart;
+    this[_portStart] = portStart;
+    this[_pathStart] = pathStart;
+    this[_queryStart] = queryStart;
+    this[_fragmentStart] = fragmentStart;
+    this[_schemeCache] = schemeCache;
+    this[_hashCodeCache] = null;
+  }
+  get hasScheme() {
+    return dart.notNull(this[_schemeEnd]) > 0;
+  }
+  get hasAuthority() {
+    return dart.notNull(this[_hostStart]) > 0;
+  }
+  get hasUserInfo() {
+    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 4;
+  }
+  get hasPort() {
+    return dart.notNull(this[_hostStart]) > 0 && dart.notNull(this[_portStart]) + 1 < dart.notNull(this[_pathStart]);
+  }
+  get hasQuery() {
+    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]);
+  }
+  get hasFragment() {
+    return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]);
+  }
+  get [_isFile]() {
+    return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("file"));
+  }
+  get [_isHttp]() {
+    return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("http"));
+  }
+  get [_isHttps]() {
+    return this[_schemeEnd] == 5 && dart.test(this[_uri][dartx.startsWith]("https"));
+  }
+  get [_isPackage]() {
+    return this[_schemeEnd] == 7 && dart.test(this[_uri][dartx.startsWith]("package"));
+  }
+  [_isScheme](scheme) {
+    return this[_schemeEnd] == scheme[dartx.length] && dart.test(this[_uri][dartx.startsWith](scheme));
+  }
+  get hasAbsolutePath() {
+    return this[_uri][dartx.startsWith]("/", this[_pathStart]);
+  }
+  get hasEmptyPath() {
+    return this[_pathStart] == this[_queryStart];
+  }
+  get isAbsolute() {
+    return dart.test(this.hasScheme) && !dart.test(this.hasFragment);
+  }
+  isScheme(scheme) {
+    if (scheme == null || dart.test(scheme[dartx.isEmpty])) return dart.notNull(this[_schemeEnd]) < 0;
+    if (scheme[dartx.length] != this[_schemeEnd]) return false;
+    return core._Uri._compareScheme(scheme, this[_uri]);
+  }
+  get scheme() {
+    if (dart.notNull(this[_schemeEnd]) <= 0) return "";
+    if (this[_schemeCache] != null) return this[_schemeCache];
+    if (dart.test(this[_isHttp])) {
+      this[_schemeCache] = "http";
+    } else if (dart.test(this[_isHttps])) {
+      this[_schemeCache] = "https";
+    } else if (dart.test(this[_isFile])) {
+      this[_schemeCache] = "file";
+    } else if (dart.test(this[_isPackage])) {
+      this[_schemeCache] = "package";
+    } else {
+      this[_schemeCache] = this[_uri][dartx.substring](0, this[_schemeEnd]);
+    }
+    return this[_schemeCache];
+  }
+  get authority() {
+    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_pathStart]) : "";
+  }
+  get userInfo() {
+    return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 3 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, dart.notNull(this[_hostStart]) - 1) : "";
+  }
+  get host() {
+    return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](this[_hostStart], this[_portStart]) : "";
+  }
+  get port() {
+    if (dart.test(this.hasPort)) return core.int.parse(this[_uri][dartx.substring](dart.notNull(this[_portStart]) + 1, this[_pathStart]));
+    if (dart.test(this[_isHttp])) return 80;
+    if (dart.test(this[_isHttps])) return 443;
+    return 0;
+  }
+  get path() {
+    return this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+  }
+  get query() {
+    return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]) ? this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]) : "";
+  }
+  get fragment() {
+    return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]) ? this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1) : "";
+  }
+  get origin() {
+    let isHttp = this[_isHttp];
+    if (dart.notNull(this[_schemeEnd]) < 0) {
+      dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
+    }
+    if (!dart.test(isHttp) && !dart.test(this[_isHttps])) {
+      dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
+    }
+    if (this[_hostStart] == this[_portStart]) {
+      dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+    }
+    if (this[_hostStart] == dart.notNull(this[_schemeEnd]) + 3) {
+      return this[_uri][dartx.substring](0, this[_pathStart]);
+    }
+    return dart.notNull(this[_uri][dartx.substring](0, dart.notNull(this[_schemeEnd]) + 3)) + dart.notNull(this[_uri][dartx.substring](this[_hostStart], this[_pathStart]));
+  }
+  get pathSegments() {
+    let start = this[_pathStart];
+    let end = this[_queryStart];
+    if (dart.test(this[_uri][dartx.startsWith]("/", start))) {
+      start = dart.notNull(start) + 1;
+    }
+    if (start == end) return const$52 || (const$52 = dart.constList([], core.String));
+    let parts = JSArrayOfString().of([]);
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let char = this[_uri][dartx.codeUnitAt](i);
+      if (char == core._SLASH) {
+        parts[dartx.add](this[_uri][dartx.substring](start, i));
+        start = dart.notNull(i) + 1;
+      }
+    }
+    parts[dartx.add](this[_uri][dartx.substring](start, end));
+    return ListOfString().unmodifiable(parts);
+  }
+  get queryParameters() {
+    if (!dart.test(this.hasQuery)) return const$53 || (const$53 = dart.const(dart.map({}, core.String, core.String)));
+    return new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
+  }
+  get queryParametersAll() {
+    if (!dart.test(this.hasQuery)) return const$54 || (const$54 = dart.const(dart.map({}, core.String, ListOfString())));
+    let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
+    for (let key of queryParameterLists[dartx.keys]) {
+      queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+    }
+    return MapOfString$ListOfString().unmodifiable(queryParameterLists);
+  }
+  [_isPort](port) {
+    let portDigitStart = dart.notNull(this[_portStart]) + 1;
+    return portDigitStart + dart.notNull(port[dartx.length]) == this[_pathStart] && dart.test(this[_uri][dartx.startsWith](port, portDigitStart));
+  }
+  normalizePath() {
+    return this;
+  }
+  removeFragment() {
+    if (!dart.test(this.hasFragment)) return this;
+    return new core._SimpleUri(this[_uri][dartx.substring](0, this[_fragmentStart]), this[_schemeEnd], this[_hostStart], this[_portStart], this[_pathStart], this[_queryStart], this[_fragmentStart], this[_schemeCache]);
+  }
+  replace(opts) {
+    let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+    let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
+    let host = opts && 'host' in opts ? opts.host : null;
+    let port = opts && 'port' in opts ? opts.port : null;
+    let path = opts && 'path' in opts ? opts.path : null;
+    let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+    let query = opts && 'query' in opts ? opts.query : null;
+    let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+    let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+    let schemeChanged = false;
+    if (scheme != null) {
+      scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+      schemeChanged = !dart.test(this[_isScheme](scheme));
+    } else {
+      scheme = this.scheme;
+    }
+    let isFile = scheme == "file";
+    if (userInfo != null) {
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+    } else if (dart.notNull(this[_hostStart]) > 0) {
+      userInfo = this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_hostStart]);
+    } else {
+      userInfo = "";
+    }
+    if (port != null) {
+      port = core._Uri._makePort(port, scheme);
+    } else {
+      port = dart.test(this.hasPort) ? this.port : null;
+      if (schemeChanged) {
+        port = core._Uri._makePort(port, scheme);
+      }
+    }
+    if (host != null) {
+      host = core._Uri._makeHost(host, 0, host[dartx.length], false);
+    } else if (dart.notNull(this[_hostStart]) > 0) {
+      host = this[_uri][dartx.substring](this[_hostStart], this[_portStart]);
+    } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
+      host = "";
+    }
+    let hasAuthority = host != null;
+    if (path != null || pathSegments != null) {
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+    } else {
+      path = this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+      if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
+        path = "/" + dart.notNull(path);
+      }
+    }
+    if (query != null || queryParameters != null) {
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+    } else if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+      query = this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]);
+    }
+    if (fragment != null) {
+      fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+    } else if (dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length])) {
+      fragment = this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1);
+    }
+    return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+  }
+  resolve(reference) {
+    return this.resolveUri(core.Uri.parse(reference));
+  }
+  resolveUri(reference) {
+    if (core._SimpleUri.is(reference)) {
+      return this[_simpleMerge](this, reference);
+    }
+    return this[_toNonSimple]().resolveUri(reference);
+  }
+  [_simpleMerge](base, ref) {
+    if (dart.test(ref.hasScheme)) return ref;
+    if (dart.test(ref.hasAuthority)) {
+      if (!dart.test(base.hasScheme)) return ref;
+      let isSimple = true;
+      if (dart.test(base[_isFile])) {
+        isSimple = !dart.test(ref.hasEmptyPath);
+      } else if (dart.test(base[_isHttp])) {
+        isSimple = !dart.test(ref[_isPort]("80"));
+      } else if (dart.test(base[_isHttps])) {
+        isSimple = !dart.test(ref[_isPort]("443"));
+      }
+      if (isSimple) {
+        let delta = dart.notNull(base[_schemeEnd]) + 1;
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, dart.notNull(base[_schemeEnd]) + 1)) + dart.notNull(ref[_uri][dartx.substring](dart.notNull(ref[_schemeEnd]) + 1));
+        return new core._SimpleUri(newUri, base[_schemeEnd], dart.notNull(ref[_hostStart]) + delta, dart.notNull(ref[_portStart]) + delta, dart.notNull(ref[_pathStart]) + delta, dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      } else {
+        return this[_toNonSimple]().resolveUri(ref);
+      }
+    }
+    if (dart.test(ref.hasEmptyPath)) {
+      if (dart.test(ref.hasQuery)) {
+        let delta = dart.notNull(base[_queryStart]) - dart.notNull(ref[_queryStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_queryStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_queryStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      if (dart.test(ref.hasFragment)) {
+        let delta = dart.notNull(base[_fragmentStart]) - dart.notNull(ref[_fragmentStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_fragmentStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_fragmentStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], base[_queryStart], dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      return base.removeFragment();
+    }
+    if (dart.test(ref.hasAbsolutePath)) {
+      let delta = dart.notNull(base[_pathStart]) - dart.notNull(ref[_pathStart]);
+      let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_pathStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_pathStart]));
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    if (dart.test(base.hasEmptyPath) && dart.test(base.hasAuthority)) {
+      let refStart = ref[_pathStart];
+      while (dart.test(ref[_uri][dartx.startsWith]("../", refStart))) {
+        refStart = dart.notNull(refStart) + 3;
+      }
+      let delta = dart.notNull(base[_pathStart]) - dart.notNull(refStart) + 1;
+      let newUri = dart.str`${base[_uri][dartx.substring](0, base[_pathStart])}/` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    let baseUri = base[_uri];
+    let refUri = ref[_uri];
+    let baseStart = base[_pathStart];
+    let baseEnd = base[_queryStart];
+    while (dart.test(baseUri[dartx.startsWith]("../", baseStart))) {
+      baseStart = dart.notNull(baseStart) + 3;
+    }
+    let refStart = ref[_pathStart];
+    let refEnd = ref[_queryStart];
+    let backCount = 0;
+    while (dart.notNull(refStart) + 3 <= dart.notNull(refEnd) && dart.test(refUri[dartx.startsWith]("../", refStart))) {
+      refStart = dart.notNull(refStart) + 3;
+      backCount = backCount + 1;
+    }
+    let insert = "";
+    while (dart.notNull(baseEnd) > dart.notNull(baseStart)) {
+      baseEnd = dart.notNull(baseEnd) - 1;
+      let char = baseUri[dartx.codeUnitAt](baseEnd);
+      if (char == core._SLASH) {
+        insert = "/";
+        if (backCount == 0) break;
+        backCount--;
+      }
+    }
+    if (baseEnd == baseStart && !dart.test(base.hasScheme) && !dart.test(base.hasAbsolutePath)) {
+      insert = "";
+      refStart = dart.notNull(refStart) - backCount * 3;
+    }
+    let delta = dart.notNull(baseEnd) - dart.notNull(refStart) + dart.notNull(insert[dartx.length]);
+    let newUri = dart.str`${base[_uri][dartx.substring](0, baseEnd)}${insert}` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+    return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+  }
+  toFilePath(opts) {
+    let windows = opts && 'windows' in opts ? opts.windows : null;
+    if (dart.notNull(this[_schemeEnd]) >= 0 && !dart.test(this[_isFile])) {
+      dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
+    }
+    if (dart.notNull(this[_queryStart]) < dart.notNull(this[_uri][dartx.length])) {
+      if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
+      }
+      dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
+    }
+    if (windows == null) windows = core._Uri._isWindows;
+    return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
+  }
+  [_toFilePath]() {
+    if (dart.notNull(this[_hostStart]) < dart.notNull(this[_portStart])) {
+      dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
+    }
+    return this.path;
+  }
+  get data() {
+    dart.assert(this.scheme != "data");
+    return null;
+  }
+  get hashCode() {
+    return (() => {
+      let t = this[_hashCodeCache];
+      return t == null ? this[_hashCodeCache] = dart.hashCode(this[_uri]) : t;
+    })();
+  }
+  ['=='](other) {
+    if (core.identical(this, other)) return true;
+    if (core.Uri.is(other)) return this[_uri] == dart.toString(other);
+    return false;
+  }
+  [_toNonSimple]() {
+    return new core._Uri._internal(this.scheme, this.userInfo, dart.test(this.hasAuthority) ? this.host : null, dart.test(this.hasPort) ? this.port : null, this.path, dart.test(this.hasQuery) ? this.query : null, dart.test(this.hasFragment) ? this.fragment : null);
+  }
+  toString() {
+    return this[_uri];
+  }
+};
+core._SimpleUri[dart.implements] = () => [core.Uri];
+dart.setSignature(core._SimpleUri, {
+  fields: () => ({
+    [_uri]: core.String,
+    [_schemeEnd]: core.int,
+    [_hostStart]: core.int,
+    [_portStart]: core.int,
+    [_pathStart]: core.int,
+    [_queryStart]: core.int,
+    [_fragmentStart]: core.int,
+    [_schemeCache]: core.String,
+    [_hashCodeCache]: core.int
+  }),
+  getters: () => ({
+    hasScheme: dart.definiteFunctionType(core.bool, []),
+    hasAuthority: dart.definiteFunctionType(core.bool, []),
+    hasUserInfo: dart.definiteFunctionType(core.bool, []),
+    hasPort: dart.definiteFunctionType(core.bool, []),
+    hasQuery: dart.definiteFunctionType(core.bool, []),
+    hasFragment: dart.definiteFunctionType(core.bool, []),
+    [_isFile]: dart.definiteFunctionType(core.bool, []),
+    [_isHttp]: dart.definiteFunctionType(core.bool, []),
+    [_isHttps]: dart.definiteFunctionType(core.bool, []),
+    [_isPackage]: dart.definiteFunctionType(core.bool, []),
+    hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
+    hasEmptyPath: dart.definiteFunctionType(core.bool, []),
+    isAbsolute: dart.definiteFunctionType(core.bool, []),
+    scheme: dart.definiteFunctionType(core.String, []),
+    authority: dart.definiteFunctionType(core.String, []),
+    userInfo: dart.definiteFunctionType(core.String, []),
+    host: dart.definiteFunctionType(core.String, []),
+    port: dart.definiteFunctionType(core.int, []),
+    path: dart.definiteFunctionType(core.String, []),
+    query: dart.definiteFunctionType(core.String, []),
+    fragment: dart.definiteFunctionType(core.String, []),
+    origin: dart.definiteFunctionType(core.String, []),
+    pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
+    queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+    queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
+    data: dart.definiteFunctionType(core.UriData, [])
+  }),
+  methods: () => ({
+    [_isScheme]: dart.definiteFunctionType(core.bool, [core.String]),
+    isScheme: dart.definiteFunctionType(core.bool, [core.String]),
+    [_isPort]: dart.definiteFunctionType(core.bool, [core.String]),
+    normalizePath: dart.definiteFunctionType(core.Uri, []),
+    removeFragment: dart.definiteFunctionType(core.Uri, []),
+    replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+    resolve: dart.definiteFunctionType(core.Uri, [core.String]),
+    resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
+    [_simpleMerge]: dart.definiteFunctionType(core.Uri, [core._SimpleUri, core._SimpleUri]),
+    toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
+    [_toFilePath]: dart.definiteFunctionType(core.String, []),
+    '==': dart.definiteFunctionType(core.bool, [core.Object]),
+    [_toNonSimple]: dart.definiteFunctionType(core.Uri, [])
+  })
+});
+const _data$ = Symbol('_data');
+core._DataUri = class _DataUri extends core._Uri {
+  new(data, path, query) {
+    this[_data$] = data;
+    super._internal("data", null, null, null, path, query, null);
+  }
+  get data() {
+    return this[_data$];
+  }
+};
+dart.setSignature(core._DataUri, {
+  fields: () => ({[_data$]: core.UriData})
+});
+core._startsWithData = function(text, start) {
+  let delta = ((dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 4)) ^ core._COLON) >>> 0) * 3;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](start)) ^ 100) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 1)) ^ 97) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 2)) ^ 116) >>> 0;
+  delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 3)) ^ 97) >>> 0;
+  return delta;
+};
+dart.fn(core._startsWithData, StringAndintToint());
+core._stringOrNullLength = function(s) {
+  return s == null ? 0 : s[dartx.length];
+};
+dart.fn(core._stringOrNullLength, StringToint$());
 developer.debugger = function(opts) {
   let when = opts && 'when' in opts ? opts.when : true;
   let message = opts && 'message' in opts ? opts.message : null;
@@ -35134,6 +35968,49 @@
   }
 });
 developer._clockValue = 0;
+developer._FakeUserTag = class _FakeUserTag extends core.Object {
+  real(label) {
+    this.label = label;
+  }
+  static new(label) {
+    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+    if (existingTag != null) {
+      return developer._FakeUserTag._check(existingTag);
+    }
+    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+    }
+    let instance = new developer._FakeUserTag.real(label);
+    developer._FakeUserTag._instances[dartx._set](label, instance);
+    return instance;
+  }
+  makeCurrent() {
+    let old = developer._currentTag;
+    developer._currentTag = this;
+    return old;
+  }
+};
+dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+dart.setSignature(developer._FakeUserTag, {
+  fields: () => ({label: core.String}),
+  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
+});
+dart.defineLazy(developer._FakeUserTag, {
+  get _instances() {
+    return dart.map();
+  },
+  set _instances(_) {},
+  get _defaultTag() {
+    return developer._FakeUserTag.new('Default');
+  }
+});
+dart.defineLazy(developer, {
+  get _currentTag() {
+    return developer._FakeUserTag._defaultTag;
+  },
+  set _currentTag(_) {}
+});
 const _result = Symbol('_result');
 const _errorCode = Symbol('_errorCode');
 const _errorDetail = Symbol('_errorDetail');
@@ -35255,7 +36132,7 @@
 dart.fn(developer.postEvent, StringAndMapTovoid());
 developer._postEvent = function(eventKind, eventData) {
 };
-dart.fn(developer._postEvent, StringAndStringTodynamic());
+dart.fn(developer._postEvent, StringAndStringTovoid$());
 developer._lookupExtension = function(method) {
   return developer._extensions[dartx._get](method);
 };
@@ -35273,49 +36150,6 @@
   }
 };
 developer.UserTag.MAX_USER_TAGS = 64;
-developer._FakeUserTag = class _FakeUserTag extends core.Object {
-  real(label) {
-    this.label = label;
-  }
-  static new(label) {
-    let existingTag = developer._FakeUserTag._instances[dartx._get](label);
-    if (existingTag != null) {
-      return developer._FakeUserTag._check(existingTag);
-    }
-    if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
-      dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
-    }
-    let instance = new developer._FakeUserTag.real(label);
-    developer._FakeUserTag._instances[dartx._set](label, instance);
-    return instance;
-  }
-  makeCurrent() {
-    let old = developer._currentTag;
-    developer._currentTag = this;
-    return old;
-  }
-};
-dart.defineNamedConstructor(developer._FakeUserTag, 'real');
-developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
-dart.setSignature(developer._FakeUserTag, {
-  fields: () => ({label: core.String}),
-  methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
-});
-dart.defineLazy(developer._FakeUserTag, {
-  get _instances() {
-    return dart.map();
-  },
-  set _instances(_) {},
-  get _defaultTag() {
-    return developer._FakeUserTag.new('Default');
-  }
-});
-dart.defineLazy(developer, {
-  get _currentTag() {
-    return developer._FakeUserTag._defaultTag;
-  },
-  set _currentTag(_) {}
-});
 developer.getCurrentTag = function() {
   return developer._currentTag;
 };
@@ -35748,7 +36582,7 @@
 developer.Service = class Service extends core.Object {
   static getInfo() {
     return dart.async(function*() {
-      let receivePort = isolate.RawReceivePort.new();
+      let receivePort = isolate$.RawReceivePort.new();
       let uriCompleter = CompleterOfUri().new();
       receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
       developer._getServerInfo(receivePort.sendPort);
@@ -35763,7 +36597,7 @@
       if (!(typeof enable == 'boolean')) {
         dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
       }
-      let receivePort = isolate.RawReceivePort.new();
+      let receivePort = isolate$.RawReceivePort.new();
       let uriCompleter = CompleterOfUri().new();
       receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
       developer._webServerControl(receivePort.sendPort, enable);
@@ -35772,20 +36606,27 @@
       return new developer.ServiceProtocolInfo(uri);
     }, developer.ServiceProtocolInfo, opts);
   }
+  static getIsolateID(isolate) {
+    if (!isolate$.Isolate.is(isolate)) {
+      dart.throw(new core.ArgumentError.value(isolate, 'isolate', 'Must be an Isolate'));
+    }
+    return developer._getIsolateIDFromSendPort(isolate.controlPort);
+  }
 };
 dart.setSignature(developer.Service, {
   statics: () => ({
     getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
-    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+    controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool}),
+    getIsolateID: dart.definiteFunctionType(core.String, [isolate$.Isolate])
   }),
-  names: ['getInfo', 'controlWebServer']
+  names: ['getInfo', 'controlWebServer', 'getIsolateID']
 });
-developer._getServerInfo = function(sp) {
-  sp.send(null);
+developer._getServerInfo = function(sendPort) {
+  sendPort.send(null);
 };
 dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
-developer._webServerControl = function(sp, enable) {
-  sp.send(null);
+developer._webServerControl = function(sendPort, enable) {
+  sendPort.send(null);
 };
 dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
 developer._getServiceMajorVersion = function() {
@@ -35796,6 +36637,10 @@
   return 0;
 };
 dart.fn(developer._getServiceMinorVersion, VoidToint());
+developer._getIsolateIDFromSendPort = function(sendPort) {
+  return null;
+};
+dart.lazyFn(developer._getIsolateIDFromSendPort, () => SendPortToString());
 io.BytesBuilder = class BytesBuilder extends core.Object {
   static new(opts) {
     let copy = opts && 'copy' in opts ? opts.copy : true;
@@ -35806,27 +36651,21 @@
     }
   }
 };
-const _length$2 = Symbol('_length');
 const _buffer$ = Symbol('_buffer');
-const _pow2roundup = Symbol('_pow2roundup');
+const _length$2 = Symbol('_length');
+const _grow$ = Symbol('_grow');
 io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
-  new() {
+  new(initialCapacity) {
+    if (initialCapacity === void 0) initialCapacity = 0;
+    this[_buffer$] = dart.notNull(initialCapacity) <= 0 ? io._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(io._CopyingBytesBuilder._pow2roundup(initialCapacity));
     this[_length$2] = 0;
-    this[_buffer$] = null;
   }
   add(bytes) {
     let bytesLength = bytes[dartx.length];
     if (bytesLength == 0) return;
     let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
-    if (this[_buffer$] == null) {
-      let size = this[_pow2roundup](required);
-      size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-      this[_buffer$] = typed_data.Uint8List.new(size);
-    } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
-      let size = dart.notNull(this[_pow2roundup](required)) * 2;
-      let newBuffer = typed_data.Uint8List.new(size);
-      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
-      this[_buffer$] = newBuffer;
+    if (dart.notNull(this[_buffer$][dartx.length]) < required) {
+      this[_grow$](required);
     }
     dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
     if (typed_data.Uint8List.is(bytes)) {
@@ -35839,16 +36678,32 @@
     this[_length$2] = required;
   }
   addByte(byte) {
-    this.add(JSArrayOfint().of([byte]));
+    if (this[_buffer$][dartx.length] == this[_length$2]) {
+      this[_grow$](this[_length$2]);
+    }
+    dart.assert(dart.notNull(this[_buffer$][dartx.length]) > dart.notNull(this[_length$2]));
+    this[_buffer$][dartx._set](this[_length$2], byte);
+    this[_length$2] = dart.notNull(this[_length$2]) + 1;
+  }
+  [_grow$](required) {
+    let newSize = dart.notNull(required) * 2;
+    if (dart.notNull(newSize) < io._CopyingBytesBuilder._INIT_SIZE) {
+      newSize = io._CopyingBytesBuilder._INIT_SIZE;
+    } else {
+      newSize = io._CopyingBytesBuilder._pow2roundup(newSize);
+    }
+    let newBuffer = typed_data.Uint8List.new(newSize);
+    newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+    this[_buffer$] = newBuffer;
   }
   takeBytes() {
-    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
     this.clear();
     return buffer;
   }
   toBytes() {
-    if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
   }
   get length() {
@@ -35862,9 +36717,10 @@
   }
   clear() {
     this[_length$2] = 0;
-    this[_buffer$] = null;
+    this[_buffer$] = io._CopyingBytesBuilder._emptyList;
   }
-  [_pow2roundup](x) {
+  static _pow2roundup(x) {
+    dart.assert(dart.notNull(x) > 0);
     x = dart.notNull(x) - 1;
     x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
     x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
@@ -35888,33 +36744,48 @@
   methods: () => ({
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addByte: dart.definiteFunctionType(dart.void, [core.int]),
+    [_grow$]: dart.definiteFunctionType(dart.void, [core.int]),
     takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
     toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-    clear: dart.definiteFunctionType(dart.void, []),
-    [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
-  })
+    clear: dart.definiteFunctionType(dart.void, [])
+  }),
+  statics: () => ({_pow2roundup: dart.definiteFunctionType(core.int, [core.int])}),
+  names: ['_pow2roundup']
 });
 io._CopyingBytesBuilder._INIT_SIZE = 1024;
+dart.defineLazy(io._CopyingBytesBuilder, {
+  get _emptyList() {
+    return typed_data.Uint8List.new(0);
+  }
+});
 const _chunks = Symbol('_chunks');
 io._BytesBuilder = class _BytesBuilder extends core.Object {
   new() {
-    this[_chunks] = JSArrayOfListOfint().of([]);
+    this[_chunks] = JSArrayOfUint8List().of([]);
     this[_length$2] = 0;
   }
   add(bytes) {
-    if (!typed_data.Uint8List.is(bytes)) {
-      bytes = typed_data.Uint8List.fromList(bytes);
+    let typedBytes = null;
+    if (typed_data.Uint8List.is(bytes)) {
+      typedBytes = bytes;
+    } else {
+      typedBytes = typed_data.Uint8List.fromList(bytes);
     }
-    this[_chunks][dartx.add](bytes);
-    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
+    this[_chunks][dartx.add](typedBytes);
+    this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(typedBytes[dartx.length]);
   }
   addByte(byte) {
-    this.add(JSArrayOfint().of([byte]));
+    this[_chunks][dartx.add]((() => {
+      let _ = typed_data.Uint8List.new(1);
+      _[dartx._set](0, byte);
+      return _;
+    })());
+    this[_length$2] = dart.notNull(this[_length$2]) + 1;
   }
   takeBytes() {
-    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     if (this[_chunks][dartx.length] == 1) {
-      let buffer = this[_chunks][dartx.single];
+      let buffer = this[_chunks][dartx._get](0);
       this.clear();
       return buffer;
     }
@@ -35928,7 +36799,7 @@
     return buffer;
   }
   toBytes() {
-    if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+    if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
     let buffer = typed_data.Uint8List.new(this[_length$2]);
     let offset = 0;
     for (let chunk of this[_chunks]) {
@@ -35955,7 +36826,7 @@
 dart.setSignature(io._BytesBuilder, {
   fields: () => ({
     [_length$2]: core.int,
-    [_chunks]: ListOfListOfint()
+    [_chunks]: ListOfUint8List()
   }),
   getters: () => ({
     length: dart.definiteFunctionType(core.int, []),
@@ -35986,7 +36857,7 @@
   switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
     case io._ILLEGAL_ARGUMENT_RESPONSE:
     {
-      return new core.ArgumentError();
+      return new core.ArgumentError(dart.str`${message}: ${path}`);
     }
     case io._OSERROR_RESPONSE:
     {
@@ -36049,7 +36920,7 @@
 };
 dart.setSignature(io._BufferAndStart, {
   fields: () => ({
-    buffer: core.List,
+    buffer: ListOfint(),
     start: core.int
   })
 });
@@ -36061,7 +36932,7 @@
   let newBuffer = typed_data.Uint8List.new(length);
   let j = start;
   for (let i = 0; i < length; i++) {
-    let value = core.int._check(buffer[dartx._get](j));
+    let value = buffer[dartx._get](j);
     if (!(typeof value == 'number')) {
       dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
     }
@@ -36070,7 +36941,7 @@
   }
   return new io._BufferAndStart(newBuffer, 0);
 };
-dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
+dart.fn(io._ensureFastAndSerializableByteData, ListOfintAndintAndintTo_BufferAndStart());
 io._IOCrypto = class _IOCrypto extends core.Object {
   static getRandomBytes(count) {
     dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
@@ -36236,13 +37107,13 @@
   }
   close() {
     if (dart.test(this[_digestCalled])) {
-      return ListOfint()._check(this[_resultAsBytes]());
+      return this[_resultAsBytes]();
     }
     this[_digestCalled] = true;
     this[_finalizeData]();
     this[_iterate]();
     dart.assert(this[_pendingData][dartx.length] == 0);
-    return ListOfint()._check(this[_resultAsBytes]());
+    return this[_resultAsBytes]();
   }
   get blockSize() {
     return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
@@ -36258,9 +37129,9 @@
     return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
   }
   [_resultAsBytes]() {
-    let result = [];
+    let result = JSArrayOfint().of([]);
     for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
-      result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
+      result[dartx.addAll](this[_wordToBytes](this[_h][dartx._get](i)));
     }
     return result;
   }
@@ -36311,11 +37182,11 @@
     let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
     dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
     if (dart.test(this[_bigEndianWords])) {
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+      this[_pendingData][dartx.addAll](this[_wordToBytes](0));
+      this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
     } else {
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-      this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+      this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
+      this[_pendingData][dartx.addAll](this[_wordToBytes](0));
     }
   }
 };
@@ -36337,9 +37208,9 @@
     [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
     [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
     [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-    [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
+    [_resultAsBytes]: dart.definiteFunctionType(core.List$(core.int), []),
     [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
-    [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+    [_wordToBytes]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
     [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
     [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
   })
@@ -36621,6 +37492,7 @@
   }
 };
 dart.addSimpleTypeTests(io.ZLibEncoder);
+io.ZLibEncoder[dart.implements] = () => [ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint()];
 dart.setSignature(io.ZLibEncoder, {
   fields: () => ({
     gzip: core.bool,
@@ -36703,7 +37575,7 @@
 const _filter$ = Symbol('_filter');
 const _closed = Symbol('_closed');
 const _empty = Symbol('_empty');
-let const$52;
+let const$55;
 io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
   new(sink, filter) {
     this[_sink$0] = sink;
@@ -36722,10 +37594,10 @@
     try {
       this[_empty] = false;
       let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-      this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      this[_filter$].process(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
       let out = null;
       while ((out = this[_filter$].processed({flush: false})) != null) {
-        this[_sink$0].add(ListOfint()._check(out));
+        this[_sink$0].add(out);
       }
     } catch (e) {
       this[_closed] = true;
@@ -36736,11 +37608,11 @@
   }
   close() {
     if (dart.test(this[_closed])) return;
-    if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
+    if (dart.test(this[_empty])) this[_filter$].process(const$55 || (const$55 = dart.constList([], core.int)), 0, 0);
     try {
       let out = null;
       while ((out = this[_filter$].processed({end: true})) != null) {
-        this[_sink$0].add(ListOfint()._check(out));
+        this[_sink$0].add(out);
       }
     } catch (e) {
       this[_closed] = true;
@@ -36807,9 +37679,9 @@
   }
 };
 dart.fn(io._validateZLibMemLevel, intTovoid());
-let const$53;
+let const$56;
 io._validateZLibStrategy = function(strategy) {
-  let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+  let strategies = const$56 || (const$56 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
   if (strategies[dartx.indexOf](strategy) == -1) {
     dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
   }
@@ -36839,7 +37711,6 @@
 const _isErrorResponse = Symbol('_isErrorResponse');
 const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
 const _absolutePath = Symbol('_absolutePath');
-const _computeExistingIndex = Symbol('_computeExistingIndex');
 const _delete = Symbol('_delete');
 const _deleteSync = Symbol('_deleteSync');
 const _type = Symbol('_type');
@@ -36860,6 +37731,12 @@
     io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
     return core.String._check(result);
   }
+  stat() {
+    return io.FileStat.stat(this.path);
+  }
+  statSync() {
+    return io.FileStat.statSync(this.path);
+  }
   delete(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     return this[_delete]({recursive: recursive});
@@ -37023,6 +37900,8 @@
   methods: () => ({
     resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
     resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
+    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+    statSync: dart.definiteFunctionType(io.FileStat, []),
     delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
     deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
@@ -37128,33 +38007,6 @@
   get absolute() {
     return io.Directory.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
-  [_computeExistingIndex](dirsToCreate) {
-    let future = null;
-    let notFound = dirsToCreate[dartx.length];
-    for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
-      if (future == null) {
-        future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-      } else {
-        future = dart.dsend(future, 'then', dart.fn(index => {
-          if (!dart.equals(index, notFound)) {
-            return async.Future.value(index);
-          }
-          return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        }, dynamicTodynamic$()));
-      }
-    }
-    if (future == null) {
-      return FutureOfint().value(notFound);
-    } else {
-      return FutureOfint()._check(future);
-    }
-  }
   create(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     if (dart.test(recursive)) {
@@ -37265,7 +38117,7 @@
   list(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-    return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
+    return new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream;
   }
   listSync(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
@@ -37309,9 +38161,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
-    [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
     create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
@@ -37357,7 +38206,7 @@
     this.nextRunning = false;
     this.closed = false;
     this[_ops] = null;
-    this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
+    this.controller = StreamControllerOfFileSystemEntity().new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
   }
   [_pointer]() {
     return this[_ops] == null ? null : this[_ops].getPointer();
@@ -37484,14 +38333,14 @@
     path: core.String,
     recursive: core.bool,
     followLinks: core.bool,
-    controller: async.StreamController,
+    controller: StreamControllerOfFileSystemEntity(),
     canceled: core.bool,
     nextRunning: core.bool,
     closed: core.bool,
     [_ops]: io._AsyncDirectoryListerOps,
     closeCompleter: async.Completer
   }),
-  getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
+  getters: () => ({stream: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [])}),
   methods: () => ({
     [_pointer]: dart.definiteFunctionType(core.int, []),
     onListen: dart.definiteFunctionType(dart.void, []),
@@ -37518,7 +38367,7 @@
   }
 };
 dart.setSignature(io._EventHandler, {
-  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
+  statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate$.SendPort, core.int])}),
   names: ['_sendData']
 });
 const _mode = Symbol('_mode');
@@ -37560,7 +38409,9 @@
   toString() {
     return {
       0: "FileLock.SHARED",
-      1: "FileLock.EXCLUSIVE"
+      1: "FileLock.EXCLUSIVE",
+      2: "FileLock.BLOCKING_SHARED",
+      3: "FileLock.BLOCKING_EXCLUSIVE"
     }[this.index];
   }
 };
@@ -37569,7 +38420,9 @@
 });
 dart.defineEnumValues(io.FileLock, [
   'SHARED',
-  'EXCLUSIVE'
+  'EXCLUSIVE',
+  'BLOCKING_SHARED',
+  'BLOCKING_EXCLUSIVE'
 ]);
 io.File = class File extends core.Object {
   static new(path) {
@@ -37622,9 +38475,9 @@
 });
 io._BLOCK_SIZE = 64 * 1024;
 const _closeCompleter = Symbol('_closeCompleter');
-const _path$ = Symbol('_path');
+const _path = Symbol('_path');
 const _position$0 = Symbol('_position');
-const _end$0 = Symbol('_end');
+const _end$ = Symbol('_end');
 const _controller$0 = Symbol('_controller');
 const _openedFile = Symbol('_openedFile');
 const _unsubscribed = Symbol('_unsubscribed');
@@ -37637,9 +38490,9 @@
 io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
   new(path, position, end) {
     this[_closeCompleter] = async.Completer.new();
-    this[_path$] = path;
+    this[_path] = path;
     this[_position$0] = position;
-    this[_end$0] = end;
+    this[_end$] = end;
     this[_controller$0] = null;
     this[_openedFile] = null;
     this[_unsubscribed] = false;
@@ -37653,9 +38506,9 @@
     this[_closeCompleter] = async.Completer.new();
     this[_position$0] = 0;
     this[_controller$0] = null;
-    this[_path$] = null;
+    this[_path] = null;
     this[_openedFile] = null;
-    this[_end$0] = null;
+    this[_end$] = null;
     this[_unsubscribed] = false;
     this[_readInProgress] = true;
     this[_closed] = false;
@@ -37696,12 +38549,12 @@
     }
     this[_readInProgress] = true;
     let readBytes = io._BLOCK_SIZE;
-    if (this[_end$0] != null) {
-      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
+    if (this[_end$] != null) {
+      readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$]) - dart.notNull(this[_position$0]));
       if (dart.notNull(readBytes) < 0) {
         this[_readInProgress] = false;
         if (!dart.test(this[_unsubscribed])) {
-          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
+          this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$]}`));
           this[_closeFile]();
           this[_unsubscribed] = true;
         }
@@ -37715,7 +38568,7 @@
         return;
       }
       this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
-      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
+      if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$] != null && this[_position$0] == this[_end$]) {
         this[_atEnd] = true;
       }
       if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
@@ -37764,8 +38617,8 @@
       this[_closeCompleter].complete();
     }).bind(this);
     dart.fn(openFailed, dynamicAnddynamicTovoid$());
-    if (this[_path$] != null) {
-      io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+    if (this[_path] != null) {
+      io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
     } else {
       try {
         onOpenFile(io._File._openStdioSync(0));
@@ -37782,10 +38635,10 @@
 dart.setSignature(io._FileStream, {
   fields: () => ({
     [_controller$0]: StreamControllerOfListOfint(),
-    [_path$]: core.String,
+    [_path]: core.String,
     [_openedFile]: io.RandomAccessFile,
     [_position$0]: core.int,
-    [_end$0]: core.int,
+    [_end$]: core.int,
     [_closeCompleter]: async.Completer,
     [_unsubscribed]: core.bool,
     [_readInProgress]: core.bool,
@@ -37857,8 +38710,8 @@
   })
 });
 const _tryDecode = Symbol('_tryDecode');
-let const$54;
-let const$55;
+let const$57;
+let const$58;
 io._File = class _File extends io.FileSystemEntity {
   new(path) {
     this.path = path;
@@ -37885,12 +38738,6 @@
   get absolute() {
     return io.File.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
   create(opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
@@ -38007,6 +38854,41 @@
     io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
     return core.int._check(result);
   }
+  lastAccessed() {
+    return io._IOService._dispatch(io._FILE_LAST_ACCESSED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot retrieve access time", this.path));
+      }
+      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
+    }, dynamicToDateTime()));
+  }
+  static _lastAccessed(path) {
+    dart.throw(new core.UnsupportedError("File._lastAccessed"));
+  }
+  lastAccessedSync() {
+    let ms = io._File._lastAccessed(this.path);
+    io._File.throwIfError(ms, "Cannot retrieve access time", this.path);
+    return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
+  }
+  setLastAccessed(time) {
+    let millis = time.millisecondsSinceEpoch;
+    return io._IOService._dispatch(io._FILE_SET_LAST_ACCESSED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot set access time", this.path));
+      }
+      return null;
+    }, dynamicToNull$()));
+  }
+  static _setLastAccessed(path, millis) {
+    dart.throw(new core.UnsupportedError("File._setLastAccessed"));
+  }
+  setLastAccessedSync(time) {
+    let millis = time.millisecondsSinceEpoch;
+    let result = io._File._setLastAccessed(this.path, millis);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Failed to set file access time", this.path, result));
+    }
+  }
   lastModified() {
     return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
       if (dart.test(io._isErrorResponse(response))) {
@@ -38023,6 +38905,25 @@
     io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
     return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
   }
+  setLastModified(time) {
+    let millis = time.millisecondsSinceEpoch;
+    return io._IOService._dispatch(io._FILE_SET_LAST_MODIFIED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+      if (dart.test(io._isErrorResponse(response))) {
+        dart.throw(io._exceptionFromResponse(response, "Cannot set modification time", this.path));
+      }
+      return null;
+    }, dynamicToNull$()));
+  }
+  static _setLastModified(path, millis) {
+    dart.throw(new core.UnsupportedError("File._setLastModified"));
+  }
+  setLastModifiedSync(time) {
+    let millis = time.millisecondsSinceEpoch;
+    let result = io._File._setLastModified(this.path, millis);
+    if (io.OSError.is(result)) {
+      dart.throw(new io.FileSystemException("Failed to set file modification time", this.path, result));
+    }
+  }
   static _open(path, mode) {
     dart.throw(new core.UnsupportedError("File._open"));
   }
@@ -38062,22 +38963,22 @@
   readAsBytes() {
     function readDataChunked(file) {
       let builder = io.BytesBuilder.new({copy: false});
-      let completer = async.Completer.new();
+      let completer = CompleterOfListOfint().new();
       function read() {
-        dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
-          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
-            builder.add(ListOfint()._check(data));
+        file.read(io._BLOCK_SIZE).then(dart.dynamic)(dart.fn(data => {
+          if (dart.notNull(data[dartx.length]) > 0) {
+            builder.add(data);
             read();
           } else {
             completer.complete(builder.takeBytes());
           }
-        }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
+        }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError')});
       }
       dart.fn(read, VoidTovoid$());
       read();
-      return FutureOfListOfint()._check(completer.future);
+      return completer.future;
     }
-    dart.fn(readDataChunked, dynamicToFutureOfListOfint());
+    dart.fn(readDataChunked, RandomAccessFileToFutureOfListOfint());
     return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
       if (length == 0) {
         return readDataChunked(file);
@@ -38094,13 +38995,13 @@
         let builder = io.BytesBuilder.new({copy: false});
         do {
           data = opened.readSync(io._BLOCK_SIZE);
-          if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
-        } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
+          if (dart.notNull(data[dartx.length]) > 0) builder.add(data);
+        } while (dart.notNull(data[dartx.length]) > 0);
         data = builder.takeBytes();
       } else {
         data = opened.readSync(length);
       }
-      return ListOfint()._check(data);
+      return data;
     } finally {
       opened.closeSync();
     }
@@ -38123,11 +39024,11 @@
   }
   readAsLines(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
+    return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$57 || (const$57 = dart.const(new convert.LineSplitter())), 'convert'));
   }
   readAsLinesSync(opts) {
     let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-    return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+    return (const$58 || (const$58 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
   }
   writeAsBytes(bytes, opts) {
     let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
@@ -38181,8 +39082,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
     create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
     [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
@@ -38194,8 +39093,14 @@
     open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
     length: dart.definiteFunctionType(async.Future$(core.int), []),
     lengthSync: dart.definiteFunctionType(core.int, []),
+    lastAccessed: dart.definiteFunctionType(async.Future$(core.DateTime), []),
+    lastAccessedSync: dart.definiteFunctionType(core.DateTime, []),
+    setLastAccessed: dart.definiteFunctionType(async.Future, [core.DateTime]),
+    setLastAccessedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
     lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
     lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
+    setLastModified: dart.definiteFunctionType(async.Future, [core.DateTime]),
+    setLastModifiedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
     openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
     openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
     openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
@@ -38222,26 +39127,49 @@
     _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
     _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
     _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _lastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _setLastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
+    _setLastModified: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
     _openStdio: dart.definiteFunctionType(core.int, [core.int]),
     _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
     throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
   }),
-  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
+  names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastAccessed', '_setLastAccessed', '_lastModified', '_setLastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
 });
 io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
   static new(pointer) {
     dart.throw(new core.UnsupportedError("RandomAccessFile"));
   }
 };
+io._FileTranslation = class _FileTranslation extends core.Object {
+  new(index) {
+    this.index = index;
+  }
+  toString() {
+    return {
+      0: "_FileTranslation.text",
+      1: "_FileTranslation.binary"
+    }[this.index];
+  }
+};
+dart.setSignature(io._FileTranslation, {
+  fields: () => ({index: core.int})
+});
+dart.defineEnumValues(io._FileTranslation, [
+  'text',
+  'binary'
+]);
 const _asyncDispatched = Symbol('_asyncDispatched');
 const _fileService = Symbol('_fileService');
 const _resourceInfo = Symbol('_resourceInfo');
+const _translation = Symbol('_translation');
 const _maybeConnectHandler = Symbol('_maybeConnectHandler');
 const _maybePerformCleanup = Symbol('_maybePerformCleanup');
 const _dispatch = Symbol('_dispatch');
 const _checkAvailable = Symbol('_checkAvailable');
+const _fileLockValue = Symbol('_fileLockValue');
 io._RandomAccessFile = class _RandomAccessFile extends core.Object {
   new(pointer, path) {
     this.path = path;
@@ -38249,9 +39177,11 @@
     this[_fileService] = null;
     this[_resourceInfo] = null;
     this[_ops] = null;
+    this[_translation] = null;
     this.closed = false;
     this[_ops] = io._RandomAccessFileOps.new(pointer);
     this[_resourceInfo] = new io._FileResourceInfo(this);
+    this[_translation] = io._FileTranslation.binary;
     this[_maybeConnectHandler]();
   }
   [_maybePerformCleanup]() {
@@ -38313,8 +39243,8 @@
         dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
       }
       this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
-      return FutureOrOfListOfint()._check(dart.dindex(response, 1));
-    }, dynamicToFutureOrOfListOfint()));
+      return ListOfint().as(dart.dindex(response, 1));
+    }, dynamicToListOfint()));
   }
   readSync(bytes) {
     this[_checkAvailable]();
@@ -38326,7 +39256,7 @@
       dart.throw(new io.FileSystemException("readSync failed", this.path, result));
     }
     this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
-    return ListOfint()._check(result);
+    return ListOfint().as(result);
   }
   readInto(buffer, start, end) {
     if (start === void 0) start = 0;
@@ -38344,8 +39274,8 @@
         dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
       }
       let read = dart.dindex(response, 1);
-      let data = dart.dindex(response, 2);
-      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
+      let data = ListOfint().as(dart.dindex(response, 2));
+      buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), data);
       this[_resourceInfo].addRead(core.int._check(read));
       return FutureOrOfint()._check(read);
     }, dynamicToFutureOrOfint()));
@@ -38434,7 +39364,7 @@
       return;
     }
     let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
-    let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+    let result = this[_ops].writeFrom(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
     if (io.OSError.is(result)) {
       dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
     }
@@ -38533,6 +39463,30 @@
       dart.throw(new io.FileSystemException("flush failed", this.path, result));
     }
   }
+  [_fileLockValue](fl) {
+    switch (fl) {
+      case io.FileLock.SHARED:
+      {
+        return io._RandomAccessFile.LOCK_SHARED;
+      }
+      case io.FileLock.EXCLUSIVE:
+      {
+        return io._RandomAccessFile.LOCK_EXCLUSIVE;
+      }
+      case io.FileLock.BLOCKING_SHARED:
+      {
+        return io._RandomAccessFile.LOCK_BLOCKING_SHARED;
+      }
+      case io.FileLock.BLOCKING_EXCLUSIVE:
+      {
+        return io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE;
+      }
+      default:
+      {
+        return -1;
+      }
+    }
+  }
   lock(mode, start, end) {
     if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
     if (start === void 0) start = 0;
@@ -38543,7 +39497,7 @@
     if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
       dart.throw(new core.ArgumentError());
     }
-    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    let lock = this[_fileLockValue](mode);
     return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
       if (dart.test(io._isErrorResponse(response))) {
         dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
@@ -38578,7 +39532,7 @@
     if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
       dart.throw(new core.ArgumentError());
     }
-    let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+    let lock = this[_fileLockValue](mode);
     let result = this[_ops].lock(lock, start, end);
     if (io.OSError.is(result)) {
       dart.throw(new io.FileSystemException('lock failed', this.path, result));
@@ -38599,6 +39553,15 @@
       dart.throw(new io.FileSystemException('unlock failed', this.path, result));
     }
   }
+  get translation() {
+    return this[_translation];
+  }
+  set translation(translation) {
+    if (!dart.equals(this[_translation], translation)) {
+      this[_ops].setTranslation(translation.index);
+      this[_translation] = translation;
+    }
+  }
   [_pointer]() {
     return this[_ops].getPointer();
   }
@@ -38634,11 +39597,14 @@
   fields: () => ({
     path: core.String,
     [_asyncDispatched]: core.bool,
-    [_fileService]: isolate.SendPort,
+    [_fileService]: isolate$.SendPort,
     [_resourceInfo]: io._FileResourceInfo,
     [_ops]: io._RandomAccessFileOps,
+    [_translation]: io._FileTranslation,
     closed: core.bool
   }),
+  getters: () => ({translation: dart.definiteFunctionType(io._FileTranslation, [])}),
+  setters: () => ({translation: dart.definiteFunctionType(dart.void, [io._FileTranslation])}),
   methods: () => ({
     [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
     [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
@@ -38666,6 +39632,7 @@
     lengthSync: dart.definiteFunctionType(core.int, []),
     flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
     flushSync: dart.definiteFunctionType(dart.void, []),
+    [_fileLockValue]: dart.definiteFunctionType(core.int, [io.FileLock]),
     lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
     unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
     lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
@@ -38679,7 +39646,9 @@
 io._RandomAccessFile.LOCK_UNLOCK = 0;
 io._RandomAccessFile.LOCK_SHARED = 1;
 io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-let const$56;
+io._RandomAccessFile.LOCK_BLOCKING_SHARED = 3;
+io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE = 4;
+let const$59;
 io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
   _internal(type) {
     this[_type] = type;
@@ -38688,7 +39657,7 @@
     return io.FileSystemEntityType._typeList[dartx._get](type);
   }
   toString() {
-    return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+    return (const$59 || (const$59 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
   }
 };
 dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
@@ -38714,7 +39683,7 @@
     return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
   }
 });
-let const$57;
+let const$60;
 io.FileStat = class FileStat extends core.Object {
   _internal(changed, modified, accessed, type, mode, size) {
     this.changed = changed;
@@ -38760,7 +39729,7 @@
   }
   modeString() {
     let permissions = dart.notNull(this.mode) & 4095;
-    let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+    let codes = const$60 || (const$60 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
     let result = [];
     if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
     if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
@@ -39260,19 +40229,19 @@
   }),
   getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
 });
-let const$58;
-let const$59;
-let const$60;
 let const$61;
 let const$62;
 let const$63;
 let const$64;
 let const$65;
 let const$66;
+let const$67;
+let const$68;
+let const$69;
 io.HttpDate = class HttpDate extends core.Object {
   static format(date) {
-    let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkday = const$61 || (const$61 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let month = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
     let d = date.toUtc();
     let sb = new core.StringBuffer();
     sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
@@ -39294,12 +40263,12 @@
   }
   static parse(date) {
     let SP = 32;
-    let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-    let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-    let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-    let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-    let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-    let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let wkdays = const$63 || (const$63 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+    let weekdays = const$64 || (const$64 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+    let months = const$65 || (const$65 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+    let wkdaysLowerCase = const$66 || (const$66 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+    let weekdaysLowerCase = const$67 || (const$67 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+    let monthsLowerCase = const$68 || (const$68 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let formatRfc1123 = 0;
     let formatRfc850 = 1;
     let formatAsctime = 2;
@@ -39415,7 +40384,7 @@
     return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
   }
   static _parseCookieDate(date) {
-    let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+    let monthsLowerCase = const$69 || (const$69 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
     let position = 0;
     function error() {
       dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
@@ -39549,7 +40518,7 @@
 const _addIfModifiedSince = Symbol('_addIfModifiedSince');
 const _foldHeader = Symbol('_foldHeader');
 const _finalize = Symbol('_finalize');
-const _write = Symbol('_write');
+const _build = Symbol('_build');
 const _parseCookies = Symbol('_parseCookies');
 io._HttpHeaders = class _HttpHeaders extends core.Object {
   new(protocolVersion, opts) {
@@ -39985,81 +40954,32 @@
   [_finalize]() {
     this[_mutable] = false;
   }
-  [_write](buffer, offset) {
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
+  [_build](builder) {
     for (let name of this[_headers][dartx.keys]) {
       let values = this[_headers][dartx._get](name);
       let fold = core.bool._check(this[_foldHeader](name));
       let nameData = name[dartx.codeUnits];
-      write(nameData);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.COLON);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
+      builder.add(nameData);
+      builder.addByte(io._CharCode.COLON);
+      builder.addByte(io._CharCode.SP);
       for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
         if (i > 0) {
           if (dart.test(fold)) {
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.COMMA);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.SP);
+            builder.addByte(io._CharCode.COMMA);
+            builder.addByte(io._CharCode.SP);
           } else {
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.CR);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.LF);
-            write(nameData);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.COLON);
-            buffer[dartx._set]((() => {
-              let x = offset;
-              offset = dart.notNull(x) + 1;
-              return x;
-            })(), io._CharCode.SP);
+            builder.addByte(io._CharCode.CR);
+            builder.addByte(io._CharCode.LF);
+            builder.add(nameData);
+            builder.addByte(io._CharCode.COLON);
+            builder.addByte(io._CharCode.SP);
           }
         }
-        write(values[dartx._get](i)[dartx.codeUnits]);
+        builder.add(values[dartx._get](i)[dartx.codeUnits]);
       }
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      builder.addByte(io._CharCode.CR);
+      builder.addByte(io._CharCode.LF);
     }
-    return offset;
   }
   toString() {
     let sb = new core.StringBuffer();
@@ -40234,7 +41154,7 @@
     [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
     [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
     [_finalize]: dart.definiteFunctionType(dart.void, []),
-    [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
+    [_build]: dart.definiteFunctionType(dart.void, [io.BytesBuilder]),
     [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
   }),
   statics: () => ({
@@ -40383,7 +41303,7 @@
           return;
         }
         let value = parseParameterValue();
-        if (name == 'charset' && io._ContentType.is(this)) {
+        if (name == 'charset' && io._ContentType.is(this) && value != null) {
           value = value[dartx.toLowerCase]();
         }
         parameters._set(name, value);
@@ -40494,7 +41414,7 @@
 });
 const _validate = Symbol('_validate');
 const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-let const$67;
+let const$70;
 io._Cookie = class _Cookie extends core.Object {
   new(name, value) {
     if (name === void 0) name = null;
@@ -40633,7 +41553,7 @@
     return sb.toString();
   }
   [_validate]() {
-    let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+    let SEPERATORS = const$70 || (const$70 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
     for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
       let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
       if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
@@ -40667,6 +41587,7 @@
   })
 });
 io._OUTGOING_BUFFER_SIZE = 8 * 1024;
+io._BytesConsumer = dart.typedef('_BytesConsumer', () => dart.functionType(dart.void, [ListOfint()]));
 const _transferLength = Symbol('_transferLength');
 const _dataCompleter = Symbol('_dataCompleter');
 const _stream$ = Symbol('_stream');
@@ -40965,7 +41886,7 @@
     let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
     if (dart.test(this[_incoming].upgraded)) {
       this[_httpRequest][_httpClientConnection].destroy();
-      return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
+      return StreamOfListOfint().empty().listen(null, {onDone: onDone});
     }
     let stream = this[_incoming];
     if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
@@ -41087,7 +42008,7 @@
     [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
   })
 });
-const _uri = Symbol('_uri');
+const _uri$ = Symbol('_uri');
 const _outgoing = Symbol('_outgoing');
 const _encodingSet = Symbol('_encodingSet');
 const _bufferOutput = Symbol('_bufferOutput');
@@ -41315,7 +42236,7 @@
   class _HttpOutboundMessage extends io._IOSinkImpl {
     new(uri, protocolVersion, outgoing, opts) {
       let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-      this[_uri] = uri;
+      this[_uri$] = uri;
       this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
       this[_outgoing] = outgoing;
       this[_encodingSet] = false;
@@ -41378,7 +42299,7 @@
     fields: () => ({
       [_encodingSet]: core.bool,
       [_bufferOutput]: core.bool,
-      [_uri]: core.Uri,
+      [_uri$]: core.Uri,
       [_outgoing]: io._HttpOutgoing,
       headers: io._HttpHeaders
     }),
@@ -41475,43 +42396,18 @@
     }, VoidToNull()));
   }
   [_writeHeader]() {
-    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-    let offset = 0;
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
+    let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
     if (this.headers.protocolVersion == "1.1") {
-      write(io._Const.HTTP11);
+      buffer.add(io._Const.HTTP11);
     } else {
-      write(io._Const.HTTP10);
+      buffer.add(io._Const.HTTP10);
     }
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(dart.toString(this.statusCode)[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(this.reasonPhrase[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(dart.toString(this.statusCode)[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(this.reasonPhrase[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
     let session = this[_httpRequest][_session];
     if (session != null && !dart.test(session[_destroyed])) {
       session[_isNew] = false;
@@ -41540,18 +42436,11 @@
       }, CookieToNull()));
     }
     this.headers[_finalize]();
-    offset = this.headers[_write](buffer, offset);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
-    this[_outgoing].setHeader(buffer, offset);
+    this.headers[_build](buffer);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
+    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+    this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
   }
   [_findReasonPhrase](statusCode) {
     if (this[_reasonPhrase] != null) {
@@ -41856,39 +42745,14 @@
     }
   }
   [_writeHeader]() {
-    let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-    let offset = 0;
-    function write(bytes) {
-      let len = bytes[dartx.length];
-      for (let i = 0; i < dart.notNull(len); i++) {
-        buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-      }
-      offset = dart.notNull(offset) + dart.notNull(len);
-    }
-    dart.fn(write, ListOfintTovoid());
-    write(this.method[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(this[_requestUri]()[dartx.codeUnits]);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.SP);
-    write(io._Const.HTTP11);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
+    let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
+    buffer.add(this.method[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(this[_requestUri]()[dartx.codeUnits]);
+    buffer.addByte(io._CharCode.SP);
+    buffer.add(io._Const.HTTP11);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
     if (!dart.test(this.cookies[dartx.isEmpty])) {
       let sb = new core.StringBuffer();
       for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
@@ -41900,18 +42764,11 @@
       this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
     }
     this.headers[_finalize]();
-    offset = this.headers[_write](buffer, offset);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.CR);
-    buffer[dartx._set]((() => {
-      let x = offset;
-      offset = dart.notNull(x) + 1;
-      return x;
-    })(), io._CharCode.LF);
-    this[_outgoing].setHeader(buffer, offset);
+    this.headers[_build](buffer);
+    buffer.addByte(io._CharCode.CR);
+    buffer.addByte(io._CharCode.LF);
+    let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+    this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
   }
 };
 dart.addSimpleTypeTests(io._HttpClientRequest);
@@ -41955,19 +42812,19 @@
     super.new();
   }
   add(chunk) {
-    dart.dcall(this[_consume], chunk);
+    this[_consume](chunk);
   }
   addSlice(chunk, start, end, isLast) {
     if (typed_data.Uint8List.is(chunk)) {
-      dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+      this[_consume](typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
     } else {
-      dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
+      this[_consume](chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
     }
   }
   close() {}
 };
 dart.setSignature(io._HttpGZipSink, {
-  fields: () => ({[_consume]: core.Function}),
+  fields: () => ({[_consume]: io._BytesConsumer}),
   methods: () => ({
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
@@ -41987,10 +42844,10 @@
 const _addChunk$ = Symbol('_addChunk');
 const _chunkHeader = Symbol('_chunkHeader');
 const _ignoreError = Symbol('_ignoreError');
-let const$68;
+let const$71;
 io._HttpOutgoing = class _HttpOutgoing extends core.Object {
   new(socket) {
-    this[_doneCompleter] = async.Completer.new();
+    this[_doneCompleter] = CompleterOfSocket().new();
     this.socket = socket;
     this.ignoreBody = false;
     this.headersWritten = false;
@@ -42012,16 +42869,6 @@
   writeHeaders(opts) {
     let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
     let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
-    const write = (function() {
-      try {
-        this.outbound[_writeHeader]();
-      } catch (_) {
-        return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
-      }
-
-      return null;
-    }).bind(this);
-    dart.fn(write, VoidToFuture());
     if (dart.test(this.headersWritten)) return null;
     this.headersWritten = true;
     let drainFuture = null;
@@ -42043,22 +42890,22 @@
     } else {
       drainRequest = false;
     }
-    if (dart.test(this.ignoreBody)) {
-      return write();
-    }
-    if (dart.test(setOutgoing)) {
-      let contentLength = this.outbound.headers.contentLength;
-      if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-        this.chunked = true;
-        if (gzip) this.gzip = true;
-      } else if (dart.notNull(contentLength) >= 0) {
-        this.contentLength = contentLength;
+    if (!dart.test(this.ignoreBody)) {
+      if (dart.test(setOutgoing)) {
+        let contentLength = this.outbound.headers.contentLength;
+        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+          this.chunked = true;
+          if (gzip) this.gzip = true;
+        } else if (dart.notNull(contentLength) >= 0) {
+          this.contentLength = contentLength;
+        }
+      }
+      if (drainFuture != null) {
+        return drainFuture.then(dart.void)(dart.fn(_ => this.outbound[_writeHeader](), dynamicTovoid$()));
       }
     }
-    if (drainFuture != null) {
-      return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
-    }
-    return write();
+    this.outbound[_writeHeader]();
+    return null;
   }
   addStream(stream) {
     if (dart.test(this[_socketError])) {
@@ -42075,10 +42922,10 @@
       return this.close();
     }
     let sub = null;
-    let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
+    let controller = StreamControllerOfListOfint().new({onPause: dart.fn(() => sub.pause(), VoidTovoid$()), onResume: dart.fn(() => sub.resume(), VoidTovoid$()), sync: true});
     const onData = (function(data) {
       if (dart.test(this[_socketError])) return;
-      if (dart.equals(dart.dload(data, 'length'), 0)) return;
+      if (data[dartx.length] == 0) return;
       if (dart.test(this.chunked)) {
         if (dart.test(this[_gzip])) {
           this[_gzipAdd] = dart.bind(controller, 'add');
@@ -42086,28 +42933,28 @@
           this[_gzipAdd] = null;
           return;
         }
-        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+        this[_addChunk$](this[_chunkHeader](data[dartx.length]), dart.bind(controller, 'add'));
         this[_pendingChunkedFooter] = 2;
       } else {
         if (this.contentLength != null) {
-          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
+          this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(data[dartx.length]);
           if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
-            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
+            controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(data)}]`));
             return;
           }
         }
       }
       this[_addChunk$](data, dart.bind(controller, 'add'));
     }).bind(this);
-    dart.fn(onData, dynamicTovoid$());
+    dart.fn(onData, ListOfintTovoid());
     sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
     if (!dart.test(this.headersWritten)) {
       let future = this.writeHeaders();
       if (future != null) {
-        dart.dsend(sub, 'pause', future);
+        sub.pause(future);
       }
     }
-    return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+    return this.socket.addStream(controller.stream).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
         if (dart.test(this[_gzip])) this[_gzipSink].close();
         this[_socketError] = true;
         this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
@@ -42127,14 +42974,14 @@
         this.outbound.headers.chunkedTransferEncoding = false;
         this.outbound.headers.contentLength = 0;
       } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
-        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
+        let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri$]});
         this[_doneCompleter].completeError(error);
         return this[_closeFuture] = async.Future.error(error);
       }
     }
     if (this.contentLength != null) {
       if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
-        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
+        let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri$]});
         this[_doneCompleter].completeError(error);
         return this[_closeFuture] = async.Future.error(error);
       }
@@ -42180,7 +43027,6 @@
   }
   setHeader(data, length) {
     dart.assert(this[_length$2] == 0);
-    dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
     this[_buffer$] = typed_data.Uint8List._check(data);
     this[_length$2] = length;
   }
@@ -42191,10 +43037,10 @@
       dart.assert(this[_gzipSink] == null);
       this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
         if (this[_gzipAdd] == null) return;
-        this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
+        this[_addChunk$](this[_chunkHeader](data[dartx.length]), this[_gzipAdd]);
         this[_pendingChunkedFooter] = 2;
-        this[_addChunk$](data, _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
-      }, dynamicToNull$())));
+        this[_addChunk$](data, this[_gzipAdd]);
+      }, ListOfintToNull())));
     }
   }
   [_ignoreError](error) {
@@ -42202,19 +43048,19 @@
   }
   [_addGZipChunk](chunk, add) {
     if (!dart.test(this.outbound.bufferOutput)) {
-      add(ListOfint()._check(chunk));
+      add(chunk);
       return;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
+    if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])) {
       add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
       this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
       this[_gzipBufferLength] = 0;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-      add(ListOfint()._check(chunk));
+    if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+      add(chunk);
     } else {
-      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+      this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]), chunk);
+      this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]);
     }
   }
   [_addChunk$](chunk, add) {
@@ -42224,23 +43070,23 @@
         this[_buffer$] = null;
         this[_length$2] = 0;
       }
-      add(ListOfint()._check(chunk));
+      add(chunk);
       return;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+    if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])) {
       add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
       this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
       this[_length$2] = 0;
     }
-    if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-      add(ListOfint()._check(chunk));
+    if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+      add(chunk);
     } else {
-      this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+      this[_buffer$][dartx.setRange](this[_length$2], dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]), chunk);
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]);
     }
   }
   [_chunkHeader](length) {
-    let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+    let hexDigits = const$71 || (const$71 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
     if (length == 0) {
       if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
       return io._HttpOutgoing._chunk0Length;
@@ -42269,7 +43115,7 @@
 io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
 dart.setSignature(io._HttpOutgoing, {
   fields: () => ({
-    [_doneCompleter]: async.Completer,
+    [_doneCompleter]: CompleterOfSocket(),
     socket: io.Socket,
     ignoreBody: core.bool,
     headersWritten: core.bool,
@@ -42282,13 +43128,13 @@
     [_bytesWritten]: core.int,
     [_gzip]: core.bool,
     [_gzipSink]: convert.ByteConversionSink,
-    [_gzipAdd]: core.Function,
+    [_gzipAdd]: io._BytesConsumer,
     [_gzipBuffer]: typed_data.Uint8List,
     [_gzipBufferLength]: core.int,
     [_socketError]: core.bool,
     outbound: io._HttpOutboundMessage
   }),
-  getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+  getters: () => ({done: dart.definiteFunctionType(async.Future$(io.Socket), [])}),
   setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
   methods: () => ({
     writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
@@ -42296,8 +43142,8 @@
     close: dart.definiteFunctionType(async.Future, []),
     setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
     [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
-    [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
+    [_addGZipChunk]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
+    [_addChunk$]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
     [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
   })
 });
@@ -42405,7 +43251,7 @@
       }
     }
     this[_httpParser].isHead = method == "HEAD";
-    this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
+    this[_streamFuture] = outgoing.done.then(io.Socket)(dart.fn(s => {
       this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
       this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
         this[_currentUri] = null;
@@ -42448,13 +43294,13 @@
       }, dynamicAnddynamicToNull()));
       this[_subscription$].resume();
       return s;
-    }, dynamicTodynamic$()), {onError: dart.fn(e => {
+    }, SocketToSocket()), {onError: dart.fn(e => {
         this.destroy();
       }, dynamicToNull$())});
     return request;
   }
   detachSocket() {
-    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
+    return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), SocketTo_DetachedSocket()));
   }
   destroy() {
     this.closed = true;
@@ -42464,12 +43310,12 @@
   close() {
     this.closed = true;
     this[_httpClient][_connectionClosed](this);
-    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
+    this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), SocketTovoid()));
   }
   createProxyTunnel(host, port, proxy, callback) {
-    let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
-    if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
-      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
+    let request = this.send(core.Uri.new({host: host, port: port}), port, "CONNECT", proxy);
+    if (dart.test(proxy.isAuthenticated)) {
+      let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
       request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
     }
     return request.close().then(io.SecureSocket)(dart.fn(response => {
@@ -42477,9 +43323,9 @@
         dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
       }
       let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
-      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
+      return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: callback});
     }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
-      let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
+      let key = core.String._check(io._HttpClientConnection.makeKey(true, host, port));
       return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
     }, SecureSocketTo_HttpClientConnection()));
   }
@@ -42517,7 +43363,7 @@
     closed: core.bool,
     [_currentUri]: core.Uri,
     [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
-    [_streamFuture]: async.Future
+    [_streamFuture]: FutureOfSocket()
   }),
   getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
   methods: () => ({
@@ -42525,7 +43371,7 @@
     detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
     destroy: dart.definiteFunctionType(dart.void, []),
     close: dart.definiteFunctionType(dart.void, []),
-    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+    createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [core.String, core.int, io._Proxy, X509CertificateTobool()]),
     stopTimer: dart.definiteFunctionType(dart.void, []),
     startTimer: dart.definiteFunctionType(dart.void, [])
   }),
@@ -42619,11 +43465,11 @@
       return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
     }
     if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
-      let completer = async.Completer.new();
+      let completer = CompleterOf_ConnectionInfo().new();
       this[_pending$].add(dart.fn(() => {
-        this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
+        completer.complete(this.connect(uriHost, uriPort, proxy, client));
       }, VoidToNull()));
-      return FutureOf_ConnectionInfo()._check(completer.future);
+      return completer.future;
     }
     let currentBadCertificateCallback = client[_badCertificateCallback];
     function callback(certificate) {
@@ -42683,7 +43529,7 @@
 });
 io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
 const _idleTimeout = Symbol('_idleTimeout');
-let const$69;
+let const$72;
 const _connectionTargets = Symbol('_connectionTargets');
 const _credentials = Symbol('_credentials');
 const _closing = Symbol('_closing');
@@ -42691,7 +43537,7 @@
 const _findProxy = Symbol('_findProxy');
 const _openUrl = Symbol('_openUrl');
 const _closeConnections = Symbol('_closeConnections');
-let const$70;
+let const$73;
 const _getConnection = Symbol('_getConnection');
 io._HttpClient = class _HttpClient extends core.Object {
   get idleTimeout() {
@@ -42708,7 +43554,7 @@
     this[_authenticate] = null;
     this[_authenticateProxy] = null;
     this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-    this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
+    this[_idleTimeout] = const$72 || (const$72 = dart.const(new core.Duration({seconds: 15})));
     this[_badCertificateCallback] = null;
     this.maxConnectionsPerHost = null;
     this.autoUncompress = true;
@@ -42826,7 +43672,7 @@
     if (port == 0) {
       port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
     }
-    let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
+    let proxyConf = const$73 || (const$73 = dart.const(new io._ProxyConfiguration.direct()));
     if (this[_findProxy] != null) {
       try {
         proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
@@ -43122,7 +43968,7 @@
     }
 
     io._HttpConnection._connections[dartx._set](this[_serviceId], this);
-    this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
+    this[_httpParser].listenToStream(io.Socket.as(this[_socket]));
     this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
       this[_httpServer][_markActive](this);
       incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
@@ -43144,7 +43990,7 @@
         } else {
           this.destroy();
         }
-      }, dynamicToNull$()), {onError: dart.fn(_ => {
+      }, SocketToNull()), {onError: dart.fn(_ => {
           this.destroy();
         }, dynamicToNull$())});
       outgoing.ignoreBody = request.method == "HEAD";
@@ -43175,7 +44021,7 @@
     let detachedIncoming = this[_httpParser].detachIncoming();
     return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
       io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-      return new io._DetachedSocket(this[_socket], detachedIncoming);
+      return new io._DetachedSocket(io.Socket._check(this[_socket]), detachedIncoming);
     }, dynamicTo_DetachedSocket()));
   }
   get connectionInfo() {
@@ -43285,8 +44131,8 @@
 const _idleConnections = Symbol('_idleConnections');
 const _serverSocket = Symbol('_serverSocket');
 const _closeServer = Symbol('_closeServer');
-let const$71;
-let const$72;
+let const$74;
+let const$75;
 io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
   static bind(address, port, backlog, v6Only, shared) {
     return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
@@ -43309,7 +44155,7 @@
     this[_controller$0] = null;
     super.new();
     this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
+    this.idleTimeout = const$74 || (const$74 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     dart.dput(this[_serverSocket], _owner, this);
   }
@@ -43328,7 +44174,7 @@
     this[_controller$0] = null;
     super.new();
     this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-    this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
+    this.idleTimeout = const$75 || (const$75 = dart.const(new core.Duration({seconds: 120})));
     io._HttpServer._servers[dartx._set](this[_serviceId], this);
     try {
       dart.dput(this[_serverSocket], _owner, this);
@@ -43572,8 +44418,8 @@
   }),
   getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
 });
-let const$73;
-let const$74;
+let const$76;
+let const$77;
 io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
   new(configuration) {
     this.proxies = ListOf_Proxy().new();
@@ -43628,7 +44474,7 @@
     }, StringToNull()));
   }
   direct() {
-    this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
+    this.proxies = const$77 || (const$77 = dart.constList([const$76 || (const$76 = dart.const(new io._Proxy.direct()))], io._Proxy));
   }
 };
 dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
@@ -43680,61 +44526,61 @@
     return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
   }
   get encoding() {
-    return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
+    return this[_socket].encoding;
   }
   set encoding(value) {
-    dart.dput(this[_socket], 'encoding', value);
+    this[_socket].encoding = value;
   }
   write(obj) {
-    dart.dsend(this[_socket], 'write', obj);
+    this[_socket].write(obj);
   }
   writeln(obj) {
     if (obj === void 0) obj = "";
-    dart.dsend(this[_socket], 'writeln', obj);
+    this[_socket].writeln(obj);
   }
   writeCharCode(charCode) {
-    dart.dsend(this[_socket], 'writeCharCode', charCode);
+    this[_socket].writeCharCode(charCode);
   }
   writeAll(objects, separator) {
     if (separator === void 0) separator = "";
-    dart.dsend(this[_socket], 'writeAll', objects, separator);
+    this[_socket].writeAll(objects, separator);
   }
   add(bytes) {
-    dart.dsend(this[_socket], 'add', bytes);
+    this[_socket].add(bytes);
   }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
-    return dart.dsend(this[_socket], 'addError', error, stackTrace);
+    return this[_socket].addError(error, stackTrace);
   }
   addStream(stream) {
-    return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
+    return this[_socket].addStream(stream);
   }
   destroy() {
-    dart.dsend(this[_socket], 'destroy');
+    this[_socket].destroy();
   }
   flush() {
-    return async.Future._check(dart.dsend(this[_socket], 'flush'));
+    return this[_socket].flush();
   }
   close() {
-    return async.Future._check(dart.dsend(this[_socket], 'close'));
+    return this[_socket].close();
   }
   get done() {
-    return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
+    return this[_socket].done;
   }
   get port() {
-    return core.int._check(dart.dload(this[_socket], 'port'));
+    return this[_socket].port;
   }
   get address() {
-    return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
+    return this[_socket].address;
   }
   get remoteAddress() {
-    return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
+    return this[_socket].remoteAddress;
   }
   get remotePort() {
-    return core.int._check(dart.dload(this[_socket], 'remotePort'));
+    return this[_socket].remotePort;
   }
   setOption(option, enabled) {
-    return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
+    return this[_socket].setOption(option, enabled);
   }
   [_toJSON$](ref) {
     return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
@@ -43748,7 +44594,7 @@
 dart.setSignature(io._DetachedSocket, {
   fields: () => ({
     [_incoming]: StreamOfListOfint(),
-    [_socket]: dart.dynamic
+    [_socket]: io.Socket
   }),
   getters: () => ({
     encoding: dart.definiteFunctionType(convert.Encoding, []),
@@ -43770,10 +44616,10 @@
     writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-    addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
+    addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
     destroy: dart.definiteFunctionType(dart.void, []),
     flush: dart.definiteFunctionType(async.Future, []),
-    close: dart.definiteFunctionType(async.Future, []),
+    close: dart.definiteFunctionType(async.Future$(io.Socket), []),
     setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
     [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
   })
@@ -44214,23 +45060,21 @@
       this.subscription.onError(onError);
       this.subscription.onDone(onDone);
       if (this.bufferedData == null) {
-        return StreamSubscriptionOfListOfint()._check(((() => {
-          this.subscription.resume();
-          return this.subscription;
-        })()));
+        this.subscription.resume();
+        return this.subscription;
       }
-      let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
+      let _ = new io._HttpDetachedStreamSubscription(this.subscription, this.bufferedData, onData);
       _.resume();
       return _;
     } else {
-      return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+      return StreamOfListOfint().fromIterable(JSArrayOfListOfint().of([this.bufferedData])).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
   }
 };
 dart.addSimpleTypeTests(io._HttpDetachedIncoming);
 dart.setSignature(io._HttpDetachedIncoming, {
   fields: () => ({
-    subscription: async.StreamSubscription,
+    subscription: StreamSubscriptionOfListOfint(),
     bufferedData: ListOfint()
   }),
   methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [_ChunkedConversionCallbackOfListOfint()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
@@ -44241,7 +45085,7 @@
 const _headerValue = Symbol('_headerValue');
 const _requestParser = Symbol('_requestParser');
 const _parserCalled = Symbol('_parserCalled');
-const _index$2 = Symbol('_index');
+const _index$1 = Symbol('_index');
 const _httpVersionIndex = Symbol('_httpVersionIndex');
 const _messageType = Symbol('_messageType');
 const _statusCodeLength = Symbol('_statusCodeLength');
@@ -44282,7 +45126,7 @@
     this[_requestParser] = requestParser;
     this[_parserCalled] = false;
     this[_buffer$] = null;
-    this[_index$2] = null;
+    this[_index$1] = null;
     this[_state$1] = null;
     this[_httpVersionIndex] = null;
     this[_messageType] = null;
@@ -44394,14 +45238,14 @@
     if (this[_state$1] == io._State.FAILURE) {
       dart.throw(new io.HttpException("Data on failed connection"));
     }
-    while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
+    while (this[_buffer$] != null && dart.notNull(this[_index$1]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
       if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
         this[_parserCalled] = false;
         return;
       }
       let byte = this[_buffer$][dartx._get]((() => {
-        let x = this[_index$2];
-        this[_index$2] = dart.notNull(x) + 1;
+        let x = this[_index$1];
+        this[_index$1] = dart.notNull(x) + 1;
         return x;
       })());
       switch (this[_state$1]) {
@@ -44582,7 +45426,7 @@
             this[_state$1] = io._State.HEADER_ENDING;
           } else if (byte == io._CharCode.LF) {
             this[_state$1] = io._State.HEADER_ENDING;
-            this[_index$2] = dart.notNull(this[_index$2]) - 1;
+            this[_index$1] = dart.notNull(this[_index$1]) - 1;
           } else {
             this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
             this[_state$1] = io._State.HEADER_FIELD;
@@ -44657,7 +45501,7 @@
               this[_state$1] = io._State.HEADER_ENDING;
             } else if (byte == io._CharCode.LF) {
               this[_state$1] = io._State.HEADER_ENDING;
-              this[_index$2] = dart.notNull(this[_index$2]) - 1;
+              this[_index$1] = dart.notNull(this[_index$1]) - 1;
             } else {
               this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
               this[_state$1] = io._State.HEADER_FIELD;
@@ -44731,17 +45575,17 @@
         }
         case io._State.BODY:
         {
-          this[_index$2] = dart.notNull(this[_index$2]) - 1;
-          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
+          this[_index$1] = dart.notNull(this[_index$1]) - 1;
+          let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$1]);
           if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
             dataAvailable = this[_remainingContent];
           }
-          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
+          let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$1]), dataAvailable);
           this[_bodyController].add(data);
           if (this[_remainingContent] != -1) {
             this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
           }
-          this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
+          this[_index$1] = dart.notNull(this[_index$1]) + dart.notNull(data[dartx.length]);
           if (this[_remainingContent] == 0) {
             if (!dart.test(this[_chunked])) {
               this[_reset]();
@@ -44765,7 +45609,7 @@
       }
     }
     this[_parserCalled] = false;
-    if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
+    if (this[_buffer$] != null && this[_index$1] == this[_buffer$][dartx.length]) {
       this[_releaseBuffer]();
       if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
         this[_socketSubscription].resume();
@@ -44776,7 +45620,7 @@
     this[_socketSubscription].pause();
     dart.assert(this[_buffer$] == null);
     this[_buffer$] = typed_data.Uint8List._check(buffer);
-    this[_index$2] = 0;
+    this[_index$1] = 0;
     this[_parse]();
   }
   [_onDone$]() {
@@ -44849,8 +45693,8 @@
   }
   readUnparsedData() {
     if (this[_buffer$] == null) return null;
-    if (this[_index$2] == this[_buffer$][dartx.length]) return null;
-    let result = this[_buffer$][dartx.sublist](this[_index$2]);
+    if (this[_index$1] == this[_buffer$][dartx.length]) return null;
+    let result = this[_buffer$][dartx.sublist](this[_index$1]);
     this[_releaseBuffer]();
     return result;
   }
@@ -44875,7 +45719,7 @@
   }
   [_releaseBuffer]() {
     this[_buffer$] = null;
-    this[_index$2] = null;
+    this[_index$1] = null;
   }
   static _isTokenChar(byte) {
     return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
@@ -44995,7 +45839,7 @@
   fields: () => ({
     [_parserCalled]: core.bool,
     [_buffer$]: typed_data.Uint8List,
-    [_index$2]: core.int,
+    [_index$1]: core.int,
     [_requestParser]: core.bool,
     [_state$1]: core.int,
     [_httpVersionIndex]: core.int,
@@ -45015,7 +45859,7 @@
     [_remainingContent]: core.int,
     [_headers]: io._HttpHeaders,
     [_incoming]: io._HttpIncoming,
-    [_socketSubscription]: async.StreamSubscription,
+    [_socketSubscription]: StreamSubscriptionOfListOfint(),
     [_paused]: core.bool,
     [_bodyPaused]: core.bool,
     [_controller$0]: StreamControllerOf_HttpIncoming(),
@@ -45058,7 +45902,7 @@
   names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
 });
 io._DART_SESSION_ID = "DARTSESSID";
-const _data$ = Symbol('_data');
+const _data$0 = Symbol('_data');
 const _lastSeen = Symbol('_lastSeen');
 const _timeoutCallback = Symbol('_timeoutCallback');
 const _prev = Symbol('_prev');
@@ -45068,7 +45912,7 @@
 const _bumpToEnd = Symbol('_bumpToEnd');
 io._HttpSession = class _HttpSession extends core.Object {
   new(sessionManager, id) {
-    this[_data$] = collection.HashMap.new();
+    this[_data$0] = collection.HashMap.new();
     this[_sessionManager] = sessionManager;
     this.id = id;
     this[_lastSeen] = new core.DateTime.now();
@@ -45097,50 +45941,50 @@
     this[_timeoutCallback] = callback;
   }
   containsValue(value) {
-    return this[_data$][dartx.containsValue](value);
+    return this[_data$0][dartx.containsValue](value);
   }
   containsKey(key) {
-    return this[_data$][dartx.containsKey](key);
+    return this[_data$0][dartx.containsKey](key);
   }
   _get(key) {
-    return this[_data$][dartx._get](key);
+    return this[_data$0][dartx._get](key);
   }
   _set(key, value) {
-    this[_data$][dartx._set](key, value);
+    this[_data$0][dartx._set](key, value);
     return value;
   }
   putIfAbsent(key, ifAbsent) {
-    return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+    return this[_data$0][dartx.putIfAbsent](key, ifAbsent);
   }
   addAll(other) {
-    return this[_data$][dartx.addAll](other);
+    return this[_data$0][dartx.addAll](other);
   }
   remove(key) {
-    return this[_data$][dartx.remove](key);
+    return this[_data$0][dartx.remove](key);
   }
   clear() {
-    this[_data$][dartx.clear]();
+    this[_data$0][dartx.clear]();
   }
   forEach(f) {
-    this[_data$][dartx.forEach](f);
+    this[_data$0][dartx.forEach](f);
   }
   get keys() {
-    return this[_data$][dartx.keys];
+    return this[_data$0][dartx.keys];
   }
   get values() {
-    return this[_data$][dartx.values];
+    return this[_data$0][dartx.values];
   }
   get length() {
-    return this[_data$][dartx.length];
+    return this[_data$0][dartx.length];
   }
   get isEmpty() {
-    return this[_data$][dartx.isEmpty];
+    return this[_data$0][dartx.isEmpty];
   }
   get isNotEmpty() {
-    return this[_data$][dartx.isNotEmpty];
+    return this[_data$0][dartx.isNotEmpty];
   }
   toString() {
-    return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+    return dart.str`HttpSession id:${this.id} ${this[_data$0]}`;
   }
 };
 io._HttpSession[dart.implements] = () => [io.HttpSession];
@@ -45154,7 +45998,7 @@
     [_prev]: io._HttpSession,
     [_next$1]: io._HttpSession,
     id: core.String,
-    [_data$]: core.Map
+    [_data$0]: core.Map
   }),
   getters: () => ({
     lastSeen: dart.definiteFunctionType(core.DateTime, []),
@@ -45325,7 +46169,7 @@
     this.id = io._IOResourceInfo.getNextID();
   }
   get referenceValueMap() {
-    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
+    return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.Object);
   }
   static getNextID() {
     return (() => {
@@ -45340,7 +46184,7 @@
     type: core.String,
     id: core.int
   }),
-  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
   names: ['getNextID']
 });
@@ -45381,7 +46225,7 @@
     super.new(type);
   }
   get fullValueMap() {
-    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
+    return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.Object);
   }
 };
 dart.setSignature(io._ReadWriteResourceInfo, {
@@ -45393,7 +46237,7 @@
     lastRead: core.double,
     lastWrite: core.double
   }),
-  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   methods: () => ({
     addRead: dart.definiteFunctionType(dart.void, [core.int]),
     didRead: dart.definiteFunctionType(dart.void, []),
@@ -45415,7 +46259,7 @@
     io._FileResourceInfo.openFiles[dartx.remove](info.id);
   }
   static getOpenFilesList() {
-    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$dynamic())));
   }
   static getOpenFiles(func, params) {
     dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
@@ -45424,8 +46268,7 @@
     return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
   }
   getFileInfoMap() {
-    let result = this.fullValueMap;
-    return result;
+    return this.fullValueMap;
   }
   static getFileInfoMapByID(func, params) {
     dart.assert(dart.dsend(params, 'containsKey', 'id'));
@@ -45441,7 +46284,7 @@
 dart.setSignature(io._FileResourceInfo, {
   fields: () => ({file: dart.dynamic}),
   getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({
     FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
     FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
@@ -45468,13 +46311,13 @@
     io._ProcessResourceInfo.ProcessStarted(this);
   }
   get name() {
-    return core.String._check(dart.dload(this.process, _path$));
+    return core.String._check(dart.dload(this.process, _path));
   }
   stopped() {
     io._ProcessResourceInfo.ProcessStopped(this);
   }
   get fullValueMap() {
-    return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+    return dart.map({type: this.type, id: this.id, name: this.name, pid: dart.dload(this.process, 'pid'), startedAt: this.startedAt, arguments: dart.dload(this.process, _arguments$0), workingDirectory: dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory)}, core.String, core.Object);
   }
   static ProcessStarted(info) {
     dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
@@ -45485,7 +46328,7 @@
     io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
   }
   static getStartedProcessesList() {
-    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$dynamic())));
   }
   static getStartedProcesses(func, params) {
     dart.assert(func == 'ext.dart.io.getProcesses');
@@ -45507,7 +46350,7 @@
   }),
   getters: () => ({
     name: dart.definiteFunctionType(core.String, []),
-    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+    fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])
   }),
   methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
   statics: () => ({
@@ -45547,18 +46390,18 @@
     return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
   }
   static getOpenSocketsList() {
-    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
+    return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$dynamic())));
   }
   getSocketInfoMap() {
     let result = this.fullValueMap;
     result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
-    result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
-    result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
-    result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
+    result[dartx._set]('listening', dart.dload(this.socket, 'isListening'));
+    result[dartx._set]('host', dart.dload(dart.dload(this.socket, 'address'), 'host'));
+    result[dartx._set]('port', dart.dload(this.socket, 'port'));
     if (!dart.test(dart.dload(this.socket, 'isListening'))) {
       try {
-        result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
-        result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
+        result[dartx._set]('remoteHost', dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host'));
+        result[dartx._set]('remotePort', dart.dload(this.socket, 'remotePort'));
       } catch (e) {
         result[dartx._set]('remotePort', 'NA');
         result[dartx._set]('remoteHost', 'NA');
@@ -45568,7 +46411,7 @@
       result[dartx._set]('remotePort', 'NA');
       result[dartx._set]('remoteHost', 'NA');
     }
-    result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
+    result[dartx._set]('addressType', dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name'));
     return result;
   }
   static getSocketInfoMapByID(func, params) {
@@ -45596,7 +46439,7 @@
 dart.setSignature(io._SocketResourceInfo, {
   fields: () => ({socket: dart.dynamic}),
   getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+  methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
   statics: () => ({
     getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
     getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
@@ -45638,33 +46481,36 @@
 io._FILE_TRUNCATE = 10;
 io._FILE_LENGTH = 11;
 io._FILE_LENGTH_FROM_PATH = 12;
-io._FILE_LAST_MODIFIED = 13;
-io._FILE_FLUSH = 14;
-io._FILE_READ_BYTE = 15;
-io._FILE_WRITE_BYTE = 16;
-io._FILE_READ = 17;
-io._FILE_READ_INTO = 18;
-io._FILE_WRITE_FROM = 19;
-io._FILE_CREATE_LINK = 20;
-io._FILE_DELETE_LINK = 21;
-io._FILE_RENAME_LINK = 22;
-io._FILE_LINK_TARGET = 23;
-io._FILE_TYPE = 24;
-io._FILE_IDENTICAL = 25;
-io._FILE_STAT = 26;
-io._FILE_LOCK = 27;
-io._SOCKET_LOOKUP = 28;
-io._SOCKET_LIST_INTERFACES = 29;
-io._SOCKET_REVERSE_LOOKUP = 30;
-io._DIRECTORY_CREATE = 31;
-io._DIRECTORY_DELETE = 32;
-io._DIRECTORY_EXISTS = 33;
-io._DIRECTORY_CREATE_TEMP = 34;
-io._DIRECTORY_LIST_START = 35;
-io._DIRECTORY_LIST_NEXT = 36;
-io._DIRECTORY_LIST_STOP = 37;
-io._DIRECTORY_RENAME = 38;
-io._SSL_PROCESS_FILTER = 39;
+io._FILE_LAST_ACCESSED = 13;
+io._FILE_SET_LAST_ACCESSED = 14;
+io._FILE_LAST_MODIFIED = 15;
+io._FILE_SET_LAST_MODIFIED = 16;
+io._FILE_FLUSH = 17;
+io._FILE_READ_BYTE = 18;
+io._FILE_WRITE_BYTE = 19;
+io._FILE_READ = 20;
+io._FILE_READ_INTO = 21;
+io._FILE_WRITE_FROM = 22;
+io._FILE_CREATE_LINK = 23;
+io._FILE_DELETE_LINK = 24;
+io._FILE_RENAME_LINK = 25;
+io._FILE_LINK_TARGET = 26;
+io._FILE_TYPE = 27;
+io._FILE_IDENTICAL = 28;
+io._FILE_STAT = 29;
+io._FILE_LOCK = 30;
+io._SOCKET_LOOKUP = 31;
+io._SOCKET_LIST_INTERFACES = 32;
+io._SOCKET_REVERSE_LOOKUP = 33;
+io._DIRECTORY_CREATE = 34;
+io._DIRECTORY_DELETE = 35;
+io._DIRECTORY_EXISTS = 36;
+io._DIRECTORY_CREATE_TEMP = 37;
+io._DIRECTORY_LIST_START = 38;
+io._DIRECTORY_LIST_NEXT = 39;
+io._DIRECTORY_LIST_STOP = 40;
+io._DIRECTORY_RENAME = 41;
+io._SSL_PROCESS_FILTER = 42;
 io._IOService = class _IOService extends core.Object {
   static _dispatch(request, data) {
     dart.throw(new core.UnsupportedError("_IOService._dispatch"));
@@ -45704,12 +46550,6 @@
   get absolute() {
     return io.Link.new(this[_absolutePath]);
   }
-  stat() {
-    return io.FileStat.stat(this.path);
-  }
-  statSync() {
-    return io.FileStat.statSync(this.path);
-  }
   create(target, opts) {
     let recursive = opts && 'recursive' in opts ? opts.recursive : false;
     if (dart.test(io.Platform.isWindows)) {
@@ -45833,8 +46673,6 @@
   methods: () => ({
     exists: dart.definiteFunctionType(async.Future$(core.bool), []),
     existsSync: dart.definiteFunctionType(core.bool, []),
-    stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-    statSync: dart.definiteFunctionType(io.FileStat, []),
     create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
     createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
     [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
@@ -45920,6 +46758,9 @@
   },
   get isIOS() {
     return io.Platform._operatingSystem == "ios";
+  },
+  get isFuchsia() {
+    return io.Platform._operatingSystem == "fuchsia";
   }
 });
 io._Platform = class _Platform extends core.Object {
@@ -45981,14 +46822,17 @@
       let env = io._Platform._environment();
       if (!io.OSError.is(env)) {
         let isWindows = io._Platform.operatingSystem == 'windows';
-        let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
+        let result = isWindows ? new (_CaseInsensitiveStringMapOfString())() : MapOfString$String().new();
         for (let str of core.Iterable._check(env)) {
+          if (str == null) {
+            continue;
+          }
           let equalsIndex = dart.dsend(str, 'indexOf', '=');
           if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
-            result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
+            result[dartx._set](core.String._check(dart.dsend(str, 'substring', 0, equalsIndex)), core.String._check(dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1))));
           }
         }
-        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
+        io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(result);
       } else {
         io._Platform._environmentCache = env;
       }
@@ -45996,7 +46840,7 @@
     if (io.OSError.is(io._Platform._environmentCache)) {
       dart.throw(io._Platform._environmentCache);
     } else {
-      return MapOfString$String()._check(io._Platform._environmentCache);
+      return MapOfString$String().as(io._Platform._environmentCache);
     }
   }
   static get version() {
@@ -46044,6 +46888,7 @@
   let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
   let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
   let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
+  let StringAndVToV = () => (StringAndVToV = dart.constFn(dart.definiteFunctionType(V, [core.String, V])))();
   class _CaseInsensitiveStringMap extends core.Object {
     new() {
       this[_map$1] = MapOfString$V().new();
@@ -46067,7 +46912,8 @@
       return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
     }
     addAll(other) {
-      other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
+      MapOfString$V()._check(other);
+      other[dartx.forEach](dart.fn((key, value) => this._set(key[dartx.toUpperCase](), value), StringAndVToV()));
     }
     remove(key) {
       return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
@@ -46114,7 +46960,7 @@
       _get: dart.definiteFunctionType(V, [core.Object]),
       _set: dart.definiteFunctionType(dart.void, [core.String, V]),
       putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
-      addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+      addAll: dart.definiteFunctionType(dart.void, [MapOfString$V()]),
       remove: dart.definiteFunctionType(V, [core.Object]),
       clear: dart.definiteFunctionType(dart.void, []),
       forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
@@ -46222,9 +47068,6 @@
   'DETACHED_WITH_STDIO'
 ]);
 io.Process = class Process extends core.Object {
-  new() {
-    this.exitCode = null;
-  }
   static start(executable, arguments$, opts) {
     let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
     let environment = opts && 'environment' in opts ? opts.environment : null;
@@ -46257,7 +47100,6 @@
   }
 };
 dart.setSignature(io.Process, {
-  fields: () => ({exitCode: FutureOfint()}),
   statics: () => ({
     start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
     run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
@@ -46453,22 +47295,14 @@
     let host = opts && 'host' in opts ? opts.host : null;
     let context = opts && 'context' in opts ? opts.context : null;
     let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-    let completer = async.Completer.new();
-    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull$()));
-    return FutureOfSecureSocket()._check(completer.future);
+    return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket.as(dart.dindex(detachedRaw, 0)), {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
   }
   static secureServer(socket, context, opts) {
     let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
     let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
     let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
     let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-    let completer = async.Completer.new();
-    dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-      completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-    }, dynamicToNull$()));
-    return FutureOfSecureSocket()._check(completer.future);
+    return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket.as(dart.dindex(detachedRaw, 0)), context, {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
   }
 };
 io.SecureSocket[dart.implements] = () => [io.Socket];
@@ -46564,8 +47398,8 @@
 dart.setSignature(io.RawSecureSocket, {
   statics: () => ({
     connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+    secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: StreamSubscriptionOfRawSocketEvent(), host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
   }),
   names: ['connect', 'secure', 'secureServer']
 });
@@ -46736,13 +47570,13 @@
 const _pushAllFilterStages = Symbol('_pushAllFilterStages');
 const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
 const _sendReadEvent = Symbol('_sendReadEvent');
-let const$75;
+let const$78;
 io.RawSocketEvent = class RawSocketEvent extends core.Object {
   _(value) {
     this[_value$1] = value;
   }
   toString() {
-    return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
+    return (const$78 || (const$78 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
   }
 };
 dart.defineNamedConstructor(io.RawSocketEvent, '_');
@@ -46783,12 +47617,12 @@
     if (host != null) {
       address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
     }
-    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+    return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, subscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
   }
   new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
     this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
     this[_status] = io._RawSecureSocket.HANDSHAKE;
-    this[_closeCompleter] = async.Completer.new();
+    this[_closeCompleter] = CompleterOfRawSecureSocket().new();
     this[_filterStatus] = new io._FilterStatus();
     this[_secureFilter] = io._SecureFilter.new();
     this.address = address;
@@ -46898,7 +47732,7 @@
   }
   close() {
     this.shutdown(io.SocketDirection.BOTH);
-    return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+    return this[_closeCompleter].future;
   }
   [_completeCloseCompleter](dummy) {
     if (dummy === void 0) dummy = null;
@@ -47344,7 +48178,7 @@
     [_socketClosedWrite]: core.bool,
     [_closedRead]: core.bool,
     [_closedWrite]: core.bool,
-    [_closeCompleter]: async.Completer,
+    [_closeCompleter]: CompleterOfRawSecureSocket(),
     [_filterStatus]: io._FilterStatus,
     [_connectPending]: core.bool,
     [_filterPending]: core.bool,
@@ -47370,7 +48204,7 @@
     listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     available: dart.definiteFunctionType(core.int, []),
     close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
-    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+    [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [io.RawSocket]),
     [_close$0]: dart.definiteFunctionType(dart.void, []),
     shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
     read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
@@ -47400,7 +48234,7 @@
   }),
   statics: () => ({
     _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
-    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+    connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
     _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
   }),
   names: ['_isBufferEncrypted', 'connect', '_verifyFields']
@@ -47506,7 +48340,7 @@
     while (true) {
       let toWrite = this.linearLength;
       if (toWrite == 0) return false;
-      let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
+      let bytes = socket.write(this.data, this.start, toWrite);
       this.advanceStart(bytes);
       if (dart.notNull(bytes) < dart.notNull(toWrite)) {
         return true;
@@ -47516,7 +48350,7 @@
 };
 dart.setSignature(io._ExternalBuffer, {
   fields: () => ({
-    data: core.List,
+    data: ListOfint(),
     start: core.int,
     end: core.int,
     size: dart.dynamic
@@ -47980,7 +48814,7 @@
     let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
     let CR = 13;
     let LF = 10;
-    let line = [];
+    let line = JSArrayOfint().of([]);
     let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
     if (dart.test(retainNewlines)) {
       let byte = null;
@@ -48023,7 +48857,7 @@
           line[dartx.add](byte);
         }
     }
-    return encoding.decode(ListOfint()._check(line));
+    return encoding.decode(line);
   }
   set echoMode(enabled) {
     dart.throw(new core.UnsupportedError("Stdin.echoMode"));
@@ -48060,9 +48894,11 @@
 const _hasTerminal = Symbol('_hasTerminal');
 const _terminalColumns = Symbol('_terminalColumns');
 const _terminalLines = Symbol('_terminalLines');
-io._StdSink = class _StdSink extends core.Object {
-  new(sink) {
+const _isTranslatable = Symbol('_isTranslatable');
+io._StdSinkHelper = class _StdSinkHelper extends core.Object {
+  new(sink, isTranslatable) {
     this[_sink$0] = sink;
+    this[_isTranslatable] = isTranslatable;
   }
   get encoding() {
     return this[_sink$0].encoding;
@@ -48070,18 +48906,29 @@
   set encoding(encoding) {
     this[_sink$0].encoding = encoding;
   }
+  set [_translation](t) {
+    if (dart.test(this[_isTranslatable])) {
+      let sink = io._IOSinkImpl._check(this[_sink$0]);
+      let target = io._StdConsumer._check(sink[_target$]);
+      dart.dput(target[_file], 'translation', t);
+    }
+  }
   write(object) {
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].write(object);
   }
   writeln(object) {
     if (object === void 0) object = "";
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeln(object);
   }
   writeAll(objects, sep) {
     if (sep === void 0) sep = "";
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeAll(objects, sep);
   }
   add(data) {
+    this[_translation] = io._FileTranslation.binary;
     this[_sink$0].add(data);
   }
   addError(error, stackTrace) {
@@ -48089,9 +48936,11 @@
     this[_sink$0].addError(error, stackTrace);
   }
   writeCharCode(charCode) {
+    this[_translation] = io._FileTranslation.text;
     this[_sink$0].writeCharCode(charCode);
   }
   addStream(stream) {
+    this[_translation] = io._FileTranslation.binary;
     return this[_sink$0].addStream(stream);
   }
   flush() {
@@ -48104,14 +48953,20 @@
     return this[_sink$0].done;
   }
 };
-io._StdSink[dart.implements] = () => [io.IOSink];
-dart.setSignature(io._StdSink, {
-  fields: () => ({[_sink$0]: io.IOSink}),
+io._StdSinkHelper[dart.implements] = () => [io.IOSink];
+dart.setSignature(io._StdSinkHelper, {
+  fields: () => ({
+    [_sink$0]: io.IOSink,
+    [_isTranslatable]: core.bool
+  }),
   getters: () => ({
     encoding: dart.definiteFunctionType(convert.Encoding, []),
     done: dart.definiteFunctionType(async.Future, [])
   }),
-  setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+  setters: () => ({
+    encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
+    [_translation]: dart.definiteFunctionType(dart.void, [io._FileTranslation])
+  }),
   methods: () => ({
     write: dart.definiteFunctionType(dart.void, [core.Object]),
     writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
@@ -48124,7 +48979,12 @@
     close: dart.definiteFunctionType(async.Future, [])
   })
 });
-io.Stdout = class Stdout extends io._StdSink {
+io._StdFileSink = class _StdFileSink extends io._StdSinkHelper {
+  new(sink) {
+    super.new(sink, true);
+  }
+};
+io.Stdout = class Stdout extends io._StdFileSink {
   _(sink, fd) {
     this[_fd] = fd;
     this[_nonBlocking] = null;
@@ -48191,6 +49051,23 @@
     osError: io.OSError
   })
 });
+io.StdinException = class StdinException extends core.Object {
+  new(message, osError) {
+    if (osError === void 0) osError = null;
+    this.message = message;
+    this.osError = osError;
+  }
+  toString() {
+    return dart.str`StdinException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
+  }
+};
+io.StdinException[dart.implements] = () => [io.IOException];
+dart.setSignature(io.StdinException, {
+  fields: () => ({
+    message: core.String,
+    osError: io.OSError
+  })
+});
 io._StdConsumer = class _StdConsumer extends core.Object {
   new(fd) {
     this[_file] = io._File._openStdioSync(fd);
@@ -48223,6 +49100,11 @@
     close: dart.definiteFunctionType(async.Future, [])
   })
 });
+io._StdSocketSink = class _StdSocketSink extends io._StdSinkHelper {
+  new(sink) {
+    super.new(sink, false);
+  }
+};
 io.StdioType = class StdioType extends core.Object {
   _(name) {
     this.name = name;
@@ -48351,10 +49233,10 @@
   }),
   names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
 });
-let const$76;
-let const$77;
-let const$78;
 let const$79;
+let const$80;
+let const$81;
+let const$82;
 io.SystemEncoding = class SystemEncoding extends convert.Encoding {
   new() {
     super.new();
@@ -48370,16 +49252,16 @@
   }
   get encoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+      return const$79 || (const$79 = dart.const(new io._WindowsCodePageEncoder()));
     } else {
-      return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
+      return const$80 || (const$80 = dart.const(new convert.Utf8Encoder()));
     }
   }
   get decoder() {
     if (io.Platform.operatingSystem == "windows") {
-      return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+      return const$81 || (const$81 = dart.const(new io._WindowsCodePageDecoder()));
     } else {
-      return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
+      return const$82 || (const$82 = dart.const(new convert.Utf8Decoder()));
     }
   }
 };
@@ -48410,6 +49292,7 @@
   }
 };
 dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
+io._WindowsCodePageEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
 dart.setSignature(io._WindowsCodePageEncoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
@@ -48462,6 +49345,7 @@
   }
 };
 dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
+io._WindowsCodePageDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
 dart.setSignature(io._WindowsCodePageDecoder, {
   methods: () => ({
     convert: dart.definiteFunctionType(core.String, [ListOfint()]),
@@ -48690,6 +49574,14 @@
 io._WebSocketOpcode.RESERVED_D = 13;
 io._WebSocketOpcode.RESERVED_E = 14;
 io._WebSocketOpcode.RESERVED_F = 15;
+io._EncodedString = class _EncodedString extends core.Object {
+  new(bytes) {
+    this.bytes = bytes;
+  }
+};
+dart.setSignature(io._EncodedString, {
+  fields: () => ({bytes: ListOfint()})
+});
 io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
   new(headerValue, maxWindowBits) {
     if (headerValue === void 0) headerValue = null;
@@ -49029,7 +49921,7 @@
     this[_unmaskingIndex] = 0;
   }
 };
-io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
+io._WebSocketProtocolTransformer[dart.implements] = () => [EventSinkOfListOfint(), StreamTransformerOfListOfint$dynamic()];
 dart.setSignature(io._WebSocketProtocolTransformer, {
   fields: () => ({
     [_state$1]: core.int,
@@ -49052,7 +49944,7 @@
     [_deflate]: io._WebSocketPerMessageDeflate
   }),
   methods: () => ({
-    bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
+    bind: dart.definiteFunctionType(async.Stream, [StreamOfListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
     close: dart.definiteFunctionType(dart.void, []),
     add: dart.definiteFunctionType(dart.void, [ListOfint()]),
@@ -49096,6 +49988,7 @@
 dart.setSignature(io._WebSocketPong, {
   fields: () => ({payload: ListOfint()})
 });
+io._ProtocolSelector = dart.typedef('_ProtocolSelector', () => dart.functionType(dart.dynamic, [ListOfString()]));
 const _protocolSelector = Symbol('_protocolSelector');
 const _compression = Symbol('_compression');
 io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
@@ -49133,24 +50026,24 @@
       }
       let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
       response.headers.contentLength = 0;
-      return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
+      return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
     }
-    dart.fn(upgrade, StringToFuture());
+    dart.fn(upgrade, StringToFutureOfWebSocket());
     let protocols = request.headers._get('Sec-WebSocket-Protocol');
     if (protocols != null && _protocolSelector != null) {
       protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-      return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
-        if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
+      return FutureOfString().new(dart.fn(() => _protocolSelector(protocols), VoidTodynamic$())).then(core.String)(dart.fn(protocol => {
+        if (dart.notNull(protocols[dartx.indexOf](protocol)) < 0) {
           dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
         }
         return protocol;
-      }, dynamicTodynamic$())).catchError(dart.fn(error => {
+      }, StringToString$())).catchError(dart.fn(error => {
         response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
         response.close();
         dart.throw(error);
       }, dynamicToNull$())).then(io.WebSocket)(upgrade);
     } else {
-      return FutureOfWebSocket()._check(upgrade(null));
+      return upgrade(null);
     }
   }
   static _negotiateCompression(request, response, compression) {
@@ -49199,12 +50092,12 @@
 dart.setSignature(io._WebSocketTransformerImpl, {
   fields: () => ({
     [_controller$0]: StreamControllerOfWebSocket(),
-    [_protocolSelector]: core.Function,
+    [_protocolSelector]: io._ProtocolSelector,
     [_compression]: io.CompressionOptions
   }),
   methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
   statics: () => ({
-    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
+    _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, io._ProtocolSelector, io.CompressionOptions]),
     _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
     _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
   }),
@@ -49212,7 +50105,7 @@
 });
 const _ensureDecoder = Symbol('_ensureDecoder');
 const _ensureEncoder = Symbol('_ensureEncoder');
-let const$80;
+let const$83;
 io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
   new(opts) {
     let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
@@ -49240,25 +50133,24 @@
   }
   processIncomingMessage(msg) {
     this[_ensureDecoder]();
-    let data = [];
+    let data = JSArrayOfint().of([]);
     data[dartx.addAll](msg);
-    data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
-    this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
-    let result = [];
+    data[dartx.addAll](const$83 || (const$83 = dart.constList([0, 0, 255, 255], core.int)));
+    this.decoder.process(data, 0, data[dartx.length]);
+    let result = JSArrayOfint().of([]);
     let out = null;
     while ((out = this.decoder.processed()) != null) {
-      result[dartx.addAll](core.Iterable._check(out));
+      result[dartx.addAll](out);
     }
     if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.decoder = null;
     }
-    return typed_data.Uint8List.fromList(ListOfint()._check(result));
+    return typed_data.Uint8List.fromList(result);
   }
   processOutgoingMessage(msg) {
     this[_ensureEncoder]();
-    let result = [];
+    let result = JSArrayOfint().of([]);
     let buffer = null;
-    let out = null;
     if (!typed_data.Uint8List.is(msg)) {
       for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
         if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
@@ -49270,8 +50162,9 @@
       buffer = typed_data.Uint8List._check(msg);
     }
     this.encoder.process(buffer, 0, buffer[dartx.length]);
+    let out = null;
     while ((out = this.encoder.processed()) != null) {
-      result[dartx.addAll](core.Iterable._check(out));
+      result[dartx.addAll](out);
     }
     if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
       this.encoder = null;
@@ -49279,7 +50172,7 @@
     if (dart.notNull(result[dartx.length]) > 4) {
       result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
     }
-    return ListOfint()._check(result);
+    return result;
   }
 };
 dart.setSignature(io._WebSocketPerMessageDeflate, {
@@ -49333,13 +50226,14 @@
       if (typeof message == 'string') {
         opcode = io._WebSocketOpcode.TEXT;
         data = convert.UTF8.encode(message);
+      } else if (ListOfint().is(message)) {
+        opcode = io._WebSocketOpcode.BINARY;
+        data = message;
+      } else if (io._EncodedString.is(message)) {
+        opcode = io._WebSocketOpcode.TEXT;
+        data = message.bytes;
       } else {
-        if (ListOfint().is(message)) {
-          data = message;
-          opcode = io._WebSocketOpcode.BINARY;
-        } else {
-          dart.throw(new core.ArgumentError(message));
-        }
+        dart.throw(new core.ArgumentError(message));
       }
       if (this[_deflateHelper] != null) {
         data = this[_deflateHelper].processOutgoingMessage(data);
@@ -49369,7 +50263,7 @@
     this[_eventSink$].close();
   }
   addFrame(opcode, data) {
-    return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
+    io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
       this[_eventSink$].add(e);
     }, ListOfintToNull()));
   }
@@ -49561,7 +50455,7 @@
     this[_ensureController]();
     const closeSocket = (function() {
       return this.socket.close().catchError(dart.fn(_ => {
-      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+      }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, SocketTo_WebSocketImpl()));
     }).bind(this);
     dart.fn(closeSocket, VoidToFuture());
     this[_controller$0].close();
@@ -49611,7 +50505,7 @@
 const _pingTimer = Symbol('_pingTimer');
 const _consumer = Symbol('_consumer');
 const _closeTimer = Symbol('_closeTimer');
-let const$81;
+let const$84;
 io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
   static connect(url, protocols, headers, opts) {
     let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
@@ -49808,6 +50702,12 @@
   add(data) {
     this[_sink$0].add(data);
   }
+  addUtf8Text(bytes) {
+    if (!ListOfint().is(bytes)) {
+      dart.throw(new core.ArgumentError.value(bytes, "bytes", "Is not a list of bytes"));
+    }
+    this[_sink$0].add(new io._EncodedString(bytes));
+  }
   addError(error, stackTrace) {
     if (stackTrace === void 0) stackTrace = null;
     this[_sink$0].addError(error, stackTrace);
@@ -49833,7 +50733,7 @@
         this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
       }
       if (this[_closeTimer] == null) {
-        this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
+        this[_closeTimer] = async.Timer.new(const$84 || (const$84 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
           this[_closeCode] = this[_outCloseCode];
           this[_closeReason] = this[_outCloseReason];
           if (this[_subscription$] != null) this[_subscription$].cancel();
@@ -49917,6 +50817,7 @@
   methods: () => ({
     listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
     add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+    addUtf8Text: dart.definiteFunctionType(dart.void, [ListOfint()]),
     addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
     addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
     close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
@@ -49941,7 +50842,7 @@
     return io.HttpClient.new();
   }
 });
-isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
+isolate$.IsolateSpawnException = class IsolateSpawnException extends core.Object {
   new(message) {
     this.message = message;
   }
@@ -49949,12 +50850,12 @@
     return dart.str`IsolateSpawnException: ${this.message}`;
   }
 };
-isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
-dart.setSignature(isolate.IsolateSpawnException, {
+isolate$.IsolateSpawnException[dart.implements] = () => [core.Exception];
+dart.setSignature(isolate$.IsolateSpawnException, {
   fields: () => ({message: core.String})
 });
 const _pause = Symbol('_pause');
-isolate.Isolate = class Isolate extends core.Object {
+isolate$.Isolate = class Isolate extends core.Object {
   new(controlPort, opts) {
     let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
     let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
@@ -49963,12 +50864,48 @@
     this.terminateCapability = terminateCapability;
   }
   static get current() {
-    return isolate.Isolate._currentIsolateCache;
+    return isolate$.Isolate._currentIsolateCache;
+  }
+  static get packageRoot() {
+    dart.throw(new core.UnsupportedError("Isolate.packageRoot"));
+  }
+  static get packageConfig() {
+    dart.throw(new core.UnsupportedError("Isolate.packageConfig"));
+  }
+  static resolvePackageUri(packageUri) {
+    return dart.async(function*(packageUri) {
+      if (packageUri.scheme != 'package') return packageUri;
+      return isolate$.Isolate._packageBase.resolveUri(packageUri.replace({scheme: ''}));
+    }, core.Uri, packageUri);
   }
   static spawn(entryPoint, message, opts) {
     let paused = opts && 'paused' in opts ? opts.paused : false;
+    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let forcePause = errorsAreFatal != null || onExit != null || onError != null;
     try {
-      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+      if (!isolate$._UnaryFunction.is(entryPoint)) {
+        dart.throw(new core.ArgumentError(entryPoint));
+      }
+      return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+        let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!dart.test(paused)) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      }, ListToIsolate()));
     } catch (e) {
       let st = dart.stackTrace(e);
       return FutureOfIsolate().error(e, st);
@@ -49977,10 +50914,20 @@
   }
   static spawnUri(uri, args, message, opts) {
     let paused = opts && 'paused' in opts ? opts.paused : false;
+    let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+    let onError = opts && 'onError' in opts ? opts.onError : null;
+    let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+    let checked = opts && 'checked' in opts ? opts.checked : null;
+    let environment = opts && 'environment' in opts ? opts.environment : null;
     let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
+    let packageConfig = opts && 'packageConfig' in opts ? opts.packageConfig : null;
+    let automaticPackageResolution = opts && 'automaticPackageResolution' in opts ? opts.automaticPackageResolution : false;
+    if (environment != null) dart.throw(new core.UnimplementedError("environment"));
     if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
+    if (packageConfig != null) dart.throw(new core.UnimplementedError("packageConfig"));
+    let forcePause = errorsAreFatal != null || onExit != null || onError != null;
     try {
-      if (core.List.is(args)) {
+      if (ListOfString().is(args)) {
         for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
           if (!(typeof args[dartx._get](i) == 'string')) {
             dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
@@ -49989,7 +50936,24 @@
       } else if (args != null) {
         dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
       }
-      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+      return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+        let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+        if (forcePause) {
+          if (errorsAreFatal != null) {
+            isolate.setErrorsFatal(errorsAreFatal);
+          }
+          if (onExit != null) {
+            isolate.addOnExitListener(onExit);
+          }
+          if (onError != null) {
+            isolate.addErrorListener(onError);
+          }
+          if (!dart.test(paused)) {
+            isolate.resume(isolate.pauseCapability);
+          }
+        }
+        return isolate;
+      }, ListToIsolate()));
     } catch (e) {
       let st = dart.stackTrace(e);
       return FutureOfIsolate().error(e, st);
@@ -49998,7 +50962,8 @@
   }
   pause(resumeCapability) {
     if (resumeCapability === void 0) resumeCapability = null;
-    if (resumeCapability == null) resumeCapability = isolate.Capability.new();
+    let t = resumeCapability;
+    t == null ? resumeCapability = isolate$.Capability.new() : t;
     this[_pause](resumeCapability);
     return resumeCapability;
   }
@@ -50015,10 +50980,12 @@
     message[dartx._set](1, resumeCapability);
     this.controlPort.send(message);
   }
-  addOnExitListener(responsePort) {
-    let message = core.List.new(2);
+  addOnExitListener(responsePort, opts) {
+    let response = opts && 'response' in opts ? opts.response : null;
+    let message = core.List.new(3);
     message[dartx._set](0, "add-ondone");
     message[dartx._set](1, responsePort);
+    message[dartx._set](2, response);
     this.controlPort.send(message);
   }
   removeOnExitListener(responsePort) {
@@ -50034,16 +51001,18 @@
     message[dartx._set](2, errorsAreFatal);
     this.controlPort.send(message);
   }
-  kill(priority) {
-    if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
+  kill(opts) {
+    let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.BEFORE_NEXT_EVENT;
     this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
   }
-  ping(responsePort, pingType) {
-    if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
-    let message = core.List.new(3);
+  ping(responsePort, opts) {
+    let response = opts && 'response' in opts ? opts.response : null;
+    let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.IMMEDIATE;
+    let message = core.List.new(4);
     message[dartx._set](0, "ping");
     message[dartx._set](1, responsePort);
-    message[dartx._set](2, pingType);
+    message[dartx._set](2, priority);
+    message[dartx._set](3, response);
     this.controlPort.send(message);
   }
   addErrorListener(port) {
@@ -50064,12 +51033,12 @@
     function handleError(message) {
       let errorDescription = core.String._check(dart.dindex(message, 0));
       let stackDescription = core.String._check(dart.dindex(message, 1));
-      let error = new isolate.RemoteError(errorDescription, stackDescription);
+      let error = new isolate$.RemoteError(errorDescription, stackDescription);
       controller.addError(error, error.stackTrace);
     }
     dart.fn(handleError, dynamicTovoid$());
     controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
-        port = isolate.RawReceivePort.new(handleError);
+        port = isolate$.RawReceivePort.new(handleError);
         this.addErrorListener(port.sendPort);
       }, VoidToNull()), onCancel: dart.fn(() => {
         this.removeErrorListener(port.sendPort);
@@ -50079,42 +51048,46 @@
     return controller.stream;
   }
 };
-dart.setSignature(isolate.Isolate, {
+dart.setSignature(isolate$.Isolate, {
   fields: () => ({
-    controlPort: isolate.SendPort,
-    pauseCapability: isolate.Capability,
-    terminateCapability: isolate.Capability
+    controlPort: isolate$.SendPort,
+    pauseCapability: isolate$.Capability,
+    terminateCapability: isolate$.Capability
   }),
   getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
   methods: () => ({
-    pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
-    [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+    pause: dart.definiteFunctionType(isolate$.Capability, [], [isolate$.Capability]),
+    [_pause]: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    resume: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+    addOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object}),
+    removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
     setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
-    kill: dart.definiteFunctionType(dart.void, [], [core.int]),
-    ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
-    addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
+    kill: dart.definiteFunctionType(dart.void, [], {priority: core.int}),
+    ping: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object, priority: core.int}),
+    addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+    removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort])
   }),
   statics: () => ({
-    spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
-    spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
+    resolvePackageUri: dart.definiteFunctionType(async.Future$(core.Uri), [core.Uri]),
+    spawn: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool, errorsAreFatal: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort}),
+    spawnUri: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort, errorsAreFatal: core.bool, checked: core.bool, environment: MapOfString$String(), packageRoot: core.Uri, packageConfig: core.Uri, automaticPackageResolution: core.bool})
   }),
-  names: ['spawn', 'spawnUri']
+  names: ['resolvePackageUri', 'spawn', 'spawnUri']
 });
-isolate.Isolate.IMMEDIATE = 0;
-isolate.Isolate.BEFORE_NEXT_EVENT = 1;
-isolate.Isolate.AS_EVENT = 2;
-dart.defineLazy(isolate.Isolate, {
+isolate$.Isolate.IMMEDIATE = 0;
+isolate$.Isolate.BEFORE_NEXT_EVENT = 1;
+dart.defineLazy(isolate$.Isolate, {
   get _currentIsolateCache() {
     return _isolate_helper.IsolateNatives.currentIsolate;
-  }
+  },
+  get _packageBase() {
+    return core.Uri.base.resolve(core.String._check(dart.dload(_isolate_helper.IsolateNatives, 'packagesBase')));
+  },
+  set _packageBase(_) {}
 });
-isolate.SendPort = class SendPort extends core.Object {};
-isolate.SendPort[dart.implements] = () => [isolate.Capability];
-isolate.ReceivePort = class ReceivePort extends core.Object {
+isolate$.SendPort = class SendPort extends core.Object {};
+isolate$.SendPort[dart.implements] = () => [isolate$.Capability];
+isolate$.ReceivePort = class ReceivePort extends core.Object {
   static new() {
     return new _isolate_helper.ReceivePortImpl();
   }
@@ -50122,62 +51095,32 @@
     return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
   }
 };
-isolate.ReceivePort[dart.implements] = () => [async.Stream];
-isolate.RawReceivePort = class RawReceivePort extends core.Object {
+isolate$.ReceivePort[dart.implements] = () => [async.Stream];
+isolate$.RawReceivePort = class RawReceivePort extends core.Object {
   static new(handler) {
     if (handler === void 0) handler = null;
     return new _isolate_helper.RawReceivePortImpl(handler);
   }
 };
-isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
-  new(message, source, stackTrace) {
-    this.message = message;
-    this.source = source;
-    this.stackTrace = stackTrace;
-  }
-  toString() {
-    return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
-  }
-};
-isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
-dart.setSignature(isolate._IsolateUnhandledException, {
-  fields: () => ({
-    message: dart.dynamic,
-    source: dart.dynamic,
-    stackTrace: core.StackTrace
-  })
-});
 const _description = Symbol('_description');
-isolate.RemoteError = class RemoteError extends core.Object {
+isolate$.RemoteError = class RemoteError extends core.Object {
   new(description, stackDescription) {
     this[_description] = description;
-    this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
+    this.stackTrace = core.StackTrace.fromString(stackDescription);
   }
   toString() {
     return this[_description];
   }
 };
-isolate.RemoteError[dart.implements] = () => [core.Error];
-dart.setSignature(isolate.RemoteError, {
+isolate$.RemoteError[dart.implements] = () => [core.Error];
+dart.setSignature(isolate$.RemoteError, {
   fields: () => ({
     [_description]: core.String,
     stackTrace: core.StackTrace
   })
 });
-const _trace$ = Symbol('_trace');
-isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
-  new(trace) {
-    this[_trace$] = trace;
-  }
-  toString() {
-    return this[_trace$];
-  }
-};
-isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
-dart.setSignature(isolate._RemoteStackTrace, {
-  fields: () => ({[_trace$]: core.String})
-});
-isolate.Capability = class Capability extends core.Object {
+isolate$._UnaryFunction = dart.typedef('_UnaryFunction', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+isolate$.Capability = class Capability extends core.Object {
   static new() {
     return new _isolate_helper.CapabilityImpl();
   }
@@ -50694,13 +51637,40 @@
 math.SQRT2 = 1.4142135623730951;
 math.min = function(T) {
   return (a, b) => {
-    return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
+    if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+    if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+    if (dart.notNull(a) > dart.notNull(b)) return b;
+    if (dart.notNull(a) < dart.notNull(b)) return a;
+    if (typeof b == 'number') {
+      if (typeof a == 'number') {
+        if (a == 0.0) {
+          return (dart.notNull(a) + dart.notNull(b)) * dart.notNull(a) * dart.notNull(b);
+        }
+      }
+      if (a == 0 && dart.test(b[dartx.isNegative]) || dart.test(b[dartx.isNaN])) return b;
+      return a;
+    }
+    return a;
   };
 };
 dart.fn(math.min, TAndTToT());
 math.max = function(T) {
   return (a, b) => {
-    return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
+    if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+    if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+    if (dart.notNull(a) > dart.notNull(b)) return a;
+    if (dart.notNull(a) < dart.notNull(b)) return b;
+    if (typeof b == 'number') {
+      if (typeof a == 'number') {
+        if (a == 0.0) {
+          return dart.notNull(a) + dart.notNull(b);
+        }
+      }
+      if (dart.test(b[dartx.isNaN])) return b;
+      return a;
+    }
+    if (b == 0 && dart.test(a[dartx.isNegative])) return b;
+    return a;
   };
 };
 dart.fn(math.max, TAndTToT$());
@@ -51053,11 +52023,11 @@
   return Point;
 });
 math.Point = Point$();
-let const$82;
+let const$85;
 math.Random = class Random extends core.Object {
   static new(seed) {
     if (seed === void 0) seed = null;
-    return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
+    return seed == null ? const$85 || (const$85 = dart.const(new math._JSRandom())) : new math._Random(seed);
   }
   static secure() {
     return math.Random._secureRandom;
@@ -51101,8 +52071,7 @@
     }
     ['=='](other) {
       if (!RectangleOfnum().is(other)) return false;
-      let otherRect = RectangleOfnum().as(other);
-      return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
+      return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.right], dart.dload(other, 'right')) && dart.equals(this[dartx.bottom], dart.dload(other, 'bottom'));
     }
     get hashCode() {
       return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
@@ -52412,7 +53381,7 @@
 });
 dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
 const _add$3 = Symbol('_add');
-const _clear$0 = Symbol('_clear');
+const _clear$ = Symbol('_clear');
 const _put = Symbol('_put');
 const _createIndex = Symbol('_createIndex');
 const _add_1 = Symbol('_add_1');
@@ -52460,7 +53429,7 @@
   }
   [dartx.clear]() {
     try {
-      return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
+      return indexed_db._completeRequest(dart.dynamic)(this[_clear$]());
     } catch (e) {
       let stacktrace = dart.stackTrace(e);
       return async.Future.error(e, stacktrace);
@@ -52581,7 +53550,7 @@
   [_add_2](...args) {
     return this.add.apply(this, args);
   }
-  [_clear$0](...args) {
+  [_clear$](...args) {
     return this.clear.apply(this, args);
   }
   [_count$0](...args) {
@@ -52680,7 +53649,7 @@
     [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
     [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
     [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-    [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+    [_clear$]: dart.definiteFunctionType(indexed_db.Request, []),
     [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
     [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
     [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
@@ -59469,7 +60438,7 @@
 const _borderWidth = Symbol('_borderWidth');
 const _bottom = Symbol('_bottom');
 const _captionSide = Symbol('_captionSide');
-const _clear$1 = Symbol('_clear');
+const _clear$0 = Symbol('_clear');
 const _clip = Symbol('_clip');
 const _color = Symbol('_color');
 const _content = Symbol('_content');
@@ -64284,15 +65253,15 @@
     this.captionSide = value;
   }
   get [dartx.clear]() {
-    return this[_clear$1];
+    return this[_clear$0];
   }
   set [dartx.clear](value) {
-    this[_clear$1] = value == null ? '' : value;
+    this[_clear$0] = value == null ? '' : value;
   }
-  get [_clear$1]() {
+  get [_clear$0]() {
     return this.clear;
   }
-  set [_clear$1](value) {
+  set [_clear$0](value) {
     this.clear = value;
   }
   get [dartx.clip]() {
@@ -65039,7 +66008,7 @@
     [_borderWidth]: core.String,
     [_bottom]: core.String,
     [_captionSide]: core.String,
-    [_clear$1]: core.String,
+    [_clear$0]: core.String,
     [_clip]: core.String,
     [_color]: core.String,
     [_content]: core.String,
@@ -84087,7 +85056,7 @@
     return value;
   }
   [dartx.clear]() {
-    return this[_clear$1]();
+    return this[_clear$0]();
   }
   [dartx.forEach](f) {
     for (let i = 0; true; i++) {
@@ -84130,7 +85099,7 @@
   [__setter__](...args) {
     return this.__setter__.apply(this, args);
   }
-  [_clear$1](...args) {
+  [_clear$0](...args) {
     return this.clear.apply(this, args);
   }
   [_getItem](...args) {
@@ -84169,7 +85138,7 @@
     [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
     [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
     [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-    [_clear$1]: dart.definiteFunctionType(dart.void, []),
+    [_clear$0]: dart.definiteFunctionType(dart.void, []),
     [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
     [_key]: dart.definiteFunctionType(core.String, [core.int]),
     [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -93179,9 +94148,6 @@
     allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
   })
 });
-let const$83;
-let const$84;
-let const$85;
 let const$86;
 let const$87;
 let const$88;
@@ -93189,15 +94155,18 @@
 let const$90;
 let const$91;
 let const$92;
+let const$93;
+let const$94;
+let const$95;
 html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
   static allowNavigation(uriPolicy) {
-    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['A::href', 'FORM::action'], core.String))});
   }
   static allowImages(uriPolicy) {
-    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
+    return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$89 || (const$89 = dart.constList(['IMG'], core.String)), allowedAttributes: const$90 || (const$90 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$91 || (const$91 = dart.constList(['IMG::src'], core.String))});
   }
   static allowTextElements() {
-    return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+    return new html$._SimpleNodeValidator(null, {allowedElements: const$92 || (const$92 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
   }
   new(uriPolicy, opts) {
     let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
@@ -93207,9 +94176,9 @@
     this.allowedAttributes = SetOfString().new();
     this.allowedUriAttributes = SetOfString().new();
     this.uriPolicy = uriPolicy;
-    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
-    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
-    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+    this.allowedElements.addAll((allowedElements != null ? allowedElements : const$93 || (const$93 = dart.constList([], core.String))));
+    allowedAttributes = allowedAttributes != null ? allowedAttributes : const$94 || (const$94 = dart.constList([], core.String));
+    allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$95 || (const$95 = dart.constList([], core.String));
     let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
     let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
     this.allowedAttributes.addAll(legalAttributes);
@@ -93495,7 +94464,7 @@
   names: ['get']
 });
 const _array = Symbol('_array');
-const _current$4 = Symbol('_current');
+const _current$2 = Symbol('_current');
 html$.FixedSizeListIterator$ = dart.generic(T => {
   let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
   let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
@@ -93504,21 +94473,21 @@
       this[_array] = array;
       this[_position$1] = -1;
       this[_length$3] = array[dartx.length];
-      this[_current$4] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       let nextPosition = dart.notNull(this[_position$1]) + 1;
       if (nextPosition < dart.notNull(this[_length$3])) {
-        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_current$2] = this[_array][dartx._get](nextPosition);
         this[_position$1] = nextPosition;
         return true;
       }
-      this[_current$4] = null;
+      this[_current$2] = null;
       this[_position$1] = this[_length$3];
       return false;
     }
     get current() {
-      return this[_current$4];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(FixedSizeListIterator);
@@ -93528,7 +94497,7 @@
       [_array]: ListOfT(),
       [_length$3]: core.int,
       [_position$1]: core.int,
-      [_current$4]: T
+      [_current$2]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -93543,21 +94512,21 @@
     new(array) {
       this[_array] = array;
       this[_position$1] = -1;
-      this[_current$4] = null;
+      this[_current$2] = null;
     }
     moveNext() {
       let nextPosition = dart.notNull(this[_position$1]) + 1;
       if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-        this[_current$4] = this[_array][dartx._get](nextPosition);
+        this[_current$2] = this[_array][dartx._get](nextPosition);
         this[_position$1] = nextPosition;
         return true;
       }
-      this[_current$4] = null;
+      this[_current$2] = null;
       this[_position$1] = this[_array][dartx.length];
       return false;
     }
     get current() {
-      return this[_current$4];
+      return this[_current$2];
     }
   }
   dart.addTypeTests(_VariableSizeListIterator);
@@ -93566,7 +94535,7 @@
     fields: () => ({
       [_array]: ListOfT(),
       [_position$1]: core.int,
-      [_current$4]: T
+      [_current$2]: T
     }),
     getters: () => ({current: dart.definiteFunctionType(T, [])}),
     methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -104474,3 +105443,4 @@
   methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
 });
 dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
+dart.trackLibraries("dart_sdk", {"dart:_runtime": dart, "dart:_debugger": _debugger, "dart:_foreign_helper": _foreign_helper, "dart:_interceptors": _interceptors, "dart:_internal": _internal, "dart:_isolate_helper": _isolate_helper, "dart:_js_embedded_names": _js_embedded_names, "dart:_js_helper": _js_helper, "dart:_js_mirrors": _js_mirrors, "dart:_js_primitives": _js_primitives, "dart:_metadata": _metadata, "dart:_native_typed_data": _native_typed_data, "dart:async": async, "dart:collection": collection, "dart:convert": convert, "dart:core": core, "dart:developer": developer, "dart:io": io, "dart:isolate": isolate$, "dart:js": js, "dart:js_util": js_util, "dart:math": math, "dart:mirrors": mirrors, "dart:typed_data": typed_data, "dart:indexed_db": indexed_db, "dart:html": html$, "dart:html_common": html_common, "dart:svg": svg$, "dart:web_audio": web_audio, "dart:web_gl": web_gl, "dart:web_sql": web_sql});
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_library.js b/pkg/dev_compiler/lib/js/legacy/dart_library.js
index 585b7a4..bb6ab02 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_library.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_library.js
@@ -17,9 +17,6 @@
     throw Error(message);
   }
 
-  const dartLibraryName = Symbol('dartLibraryName');
-  dart_library.dartLibraryName = dartLibraryName;
-
   const libraryImports = Symbol('libraryImports');
   dart_library.libraryImports = libraryImports;
 
@@ -95,7 +92,7 @@
       // Load the library
       let loader = this;
       let library = this._library;
-      library[dartLibraryName] = this._name;
+
       library[libraryImports] = this._imports;
       library[loadedModule] = library;
       args.unshift(library);
@@ -187,9 +184,6 @@
     if (_bootstrapped) return;
     _bootstrapped = true;
 
-    // Force import of core.
-    var dart_sdk = import_('dart_sdk');
-
     // This import is only needed for chrome debugging. We should provide an
     // option to compile without it.
     dart_sdk._debugger.registerDevtoolsFormatter();
diff --git a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
index 175f986..b0a5605 100644
--- a/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
+++ b/pkg/dev_compiler/lib/js/legacy/dart_sdk.js
@@ -20,7 +20,7 @@
   const core = Object.create(null);
   const developer = Object.create(null);
   const io = Object.create(null);
-  const isolate = Object.create(null);
+  const isolate$ = Object.create(null);
   const js = Object.create(null);
   const js_util = Object.create(null);
   const math = Object.create(null);
@@ -40,16 +40,14 @@
   let MapOfString$_MethodStats = () => (MapOfString$_MethodStats = dart.constFn(core.Map$(core.String, dart._MethodStats)))();
   let ListOfString = () => (ListOfString = dart.constFn(core.List$(core.String)))();
   let SetOfNameValuePair = () => (SetOfNameValuePair = dart.constFn(core.Set$(_debugger.NameValuePair)))();
+  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
+  let IterableOfNameValuePair = () => (IterableOfNameValuePair = dart.constFn(core.Iterable$(_debugger.NameValuePair)))();
   let JSArrayOfNameValuePair = () => (JSArrayOfNameValuePair = dart.constFn(_interceptors.JSArray$(_debugger.NameValuePair)))();
   let MapOfdynamic$Object = () => (MapOfdynamic$Object = dart.constFn(core.Map$(dart.dynamic, core.Object)))();
   let JSArrayOfFormatter = () => (JSArrayOfFormatter = dart.constFn(_interceptors.JSArray$(_debugger.Formatter)))();
   let ListOfFormatter = () => (ListOfFormatter = dart.constFn(core.List$(_debugger.Formatter)))();
   let LinkedHashSetOfNameValuePair = () => (LinkedHashSetOfNameValuePair = dart.constFn(collection.LinkedHashSet$(_debugger.NameValuePair)))();
-  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
   let HashMapOfString$String = () => (HashMapOfString$String = dart.constFn(collection.HashMap$(core.String, core.String)))();
-  let LinkedHashMapOfString$Object = () => (LinkedHashMapOfString$Object = dart.constFn(collection.LinkedHashMap$(core.String, core.Object)))();
-  let ListOfNameValuePair = () => (ListOfNameValuePair = dart.constFn(core.List$(_debugger.NameValuePair)))();
-  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
   let JSArrayOfJsonMLFormatter = () => (JSArrayOfJsonMLFormatter = dart.constFn(_interceptors.JSArray$(_debugger.JsonMLFormatter)))();
   let JSIndexable = () => (JSIndexable = dart.constFn(_interceptors.JSIndexable$()))();
   let JSArray = () => (JSArray = dart.constFn(_interceptors.JSArray$()))();
@@ -58,6 +56,7 @@
   let JSExtendableArray = () => (JSExtendableArray = dart.constFn(_interceptors.JSExtendableArray$()))();
   let JSUnmodifiableArray = () => (JSUnmodifiableArray = dart.constFn(_interceptors.JSUnmodifiableArray$()))();
   let ArrayIterator = () => (ArrayIterator = dart.constFn(_interceptors.ArrayIterator$()))();
+  let JSArrayOfString = () => (JSArrayOfString = dart.constFn(_interceptors.JSArray$(core.String)))();
   let JSIndexableOfString = () => (JSIndexableOfString = dart.constFn(_interceptors.JSIndexable$(core.String)))();
   let MatchToString = () => (MatchToString = dart.constFn(dart.functionType(core.String, [core.Match])))();
   let StringToString = () => (StringToString = dart.constFn(dart.functionType(core.String, [core.String])))();
@@ -71,6 +70,7 @@
   let UnmodifiableListBase = () => (UnmodifiableListBase = dart.constFn(_internal.UnmodifiableListBase$()))();
   let StringToint = () => (StringToint = dart.constFn(dart.functionType(core.int, [core.String])))();
   let Iterable = () => (Iterable = dart.constFn(core.Iterable$()))();
+  let EfficientLengthIterable = () => (EfficientLengthIterable = dart.constFn(_internal.EfficientLengthIterable$()))();
   let ListIterable = () => (ListIterable = dart.constFn(_internal.ListIterable$()))();
   let SubListIterable = () => (SubListIterable = dart.constFn(_internal.SubListIterable$()))();
   let ListIterator = () => (ListIterator = dart.constFn(_internal.ListIterator$()))();
@@ -107,8 +107,8 @@
   let MapOfint$RawReceivePortImpl = () => (MapOfint$RawReceivePortImpl = dart.constFn(core.Map$(core.int, _isolate_helper.RawReceivePortImpl)))();
   let SetOfint = () => (SetOfint = dart.constFn(core.Set$(core.int)))();
   let JSArrayOf_IsolateEvent = () => (JSArrayOf_IsolateEvent = dart.constFn(_interceptors.JSArray$(_isolate_helper._IsolateEvent)))();
-  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate.Capability)))();
-  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate.SendPort)))();
+  let SetOfCapability = () => (SetOfCapability = dart.constFn(core.Set$(isolate$.Capability)))();
+  let SetOfSendPort = () => (SetOfSendPort = dart.constFn(core.Set$(isolate$.SendPort)))();
   let ListOf_IsolateEvent = () => (ListOf_IsolateEvent = dart.constFn(core.List$(_isolate_helper._IsolateEvent)))();
   let QueueOf_IsolateEvent = () => (QueueOf_IsolateEvent = dart.constFn(collection.Queue$(_isolate_helper._IsolateEvent)))();
   let CompleterOfList = () => (CompleterOfList = dart.constFn(async.Completer$(core.List)))();
@@ -139,6 +139,7 @@
   let _Lazy = () => (_Lazy = dart.constFn(_js_mirrors._Lazy$()))();
   let ListOfSymbol = () => (ListOfSymbol = dart.constFn(core.List$(core.Symbol)))();
   let ListOfInstanceMirror = () => (ListOfInstanceMirror = dart.constFn(core.List$(mirrors.InstanceMirror)))();
+  let FutureOfLibraryMirror = () => (FutureOfLibraryMirror = dart.constFn(async.Future$(mirrors.LibraryMirror)))();
   let ListOfCombinatorMirror = () => (ListOfCombinatorMirror = dart.constFn(core.List$(mirrors.CombinatorMirror)))();
   let MapOfSymbol$DeclarationMirror = () => (MapOfSymbol$DeclarationMirror = dart.constFn(core.Map$(core.Symbol, mirrors.DeclarationMirror)))();
   let ListOfTypeMirror = () => (ListOfTypeMirror = dart.constFn(core.List$(mirrors.TypeMirror)))();
@@ -150,7 +151,6 @@
   let ListOfParameterMirror = () => (ListOfParameterMirror = dart.constFn(core.List$(mirrors.ParameterMirror)))();
   let IterableOfdouble = () => (IterableOfdouble = dart.constFn(core.Iterable$(core.double)))();
   let IterableOfint = () => (IterableOfint = dart.constFn(core.Iterable$(core.int)))();
-  let ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = () => (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace = dart.constFn(async.ZoneBinaryCallback$(dart.dynamic, dart.dynamic, core.StackTrace)))();
   let _StreamImpl = () => (_StreamImpl = dart.constFn(async._StreamImpl$()))();
   let _ControllerStream = () => (_ControllerStream = dart.constFn(async._ControllerStream$()))();
   let _BroadcastStream = () => (_BroadcastStream = dart.constFn(async._BroadcastStream$()))();
@@ -172,7 +172,6 @@
   let _Completer = () => (_Completer = dart.constFn(async._Completer$()))();
   let _AsyncCompleter = () => (_AsyncCompleter = dart.constFn(async._AsyncCompleter$()))();
   let _SyncCompleter = () => (_SyncCompleter = dart.constFn(async._SyncCompleter$()))();
-  let ZoneBinaryCallbackOfObject$Object$StackTrace = () => (ZoneBinaryCallbackOfObject$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(core.Object, core.Object, core.StackTrace)))();
   let _FutureListener = () => (_FutureListener = dart.constFn(async._FutureListener$()))();
   let _Future = () => (_Future = dart.constFn(async._Future$()))();
   let StreamSubscription = () => (StreamSubscription = dart.constFn(async.StreamSubscription$()))();
@@ -208,8 +207,9 @@
   let _DoneStreamSubscription = () => (_DoneStreamSubscription = dart.constFn(async._DoneStreamSubscription$()))();
   let _AsBroadcastStream = () => (_AsBroadcastStream = dart.constFn(async._AsBroadcastStream$()))();
   let _BroadcastSubscriptionWrapper = () => (_BroadcastSubscriptionWrapper = dart.constFn(async._BroadcastSubscriptionWrapper$()))();
-  let _StreamIteratorImpl = () => (_StreamIteratorImpl = dart.constFn(async._StreamIteratorImpl$()))();
+  let _StreamIterator = () => (_StreamIterator = dart.constFn(async._StreamIterator$()))();
   let _EmptyStream = () => (_EmptyStream = dart.constFn(async._EmptyStream$()))();
+  let dynamicAndStackTraceTodynamic = () => (dynamicAndStackTraceTodynamic = dart.constFn(dart.functionType(dart.dynamic, [dart.dynamic, core.StackTrace])))();
   let _ForwardingStream = () => (_ForwardingStream = dart.constFn(async._ForwardingStream$()))();
   let _ForwardingStreamSubscription = () => (_ForwardingStreamSubscription = dart.constFn(async._ForwardingStreamSubscription$()))();
   let _Predicate = () => (_Predicate = dart.constFn(async._Predicate$()))();
@@ -312,7 +312,6 @@
   let Queue = () => (Queue = dart.constFn(collection.Queue$()))();
   let _DoubleLink = () => (_DoubleLink = dart.constFn(collection._DoubleLink$()))();
   let DoubleLinkedQueueEntry = () => (DoubleLinkedQueueEntry = dart.constFn(collection.DoubleLinkedQueueEntry$()))();
-  let _UserDoubleLinkedQueueEntry = () => (_UserDoubleLinkedQueueEntry = dart.constFn(collection._UserDoubleLinkedQueueEntry$()))();
   let _DoubleLinkedQueueEntry = () => (_DoubleLinkedQueueEntry = dart.constFn(collection._DoubleLinkedQueueEntry$()))();
   let _DoubleLinkedQueueElement = () => (_DoubleLinkedQueueElement = dart.constFn(collection._DoubleLinkedQueueElement$()))();
   let _DoubleLinkedQueueSentinel = () => (_DoubleLinkedQueueSentinel = dart.constFn(collection._DoubleLinkedQueueSentinel$()))();
@@ -341,8 +340,10 @@
   let List = () => (List = dart.constFn(core.List$()))();
   let StreamOfListOfint = () => (StreamOfListOfint = dart.constFn(async.Stream$(ListOfint())))();
   let Converter = () => (Converter = dart.constFn(convert.Converter$()))();
+  let ChunkedConverterOfString$ListOfint$String$ListOfint = () => (ChunkedConverterOfString$ListOfint$String$ListOfint = dart.constFn(convert.ChunkedConverter$(core.String, ListOfint(), core.String, ListOfint())))();
   let SinkOfListOfint = () => (SinkOfListOfint = dart.constFn(core.Sink$(ListOfint())))();
   let StreamOfString = () => (StreamOfString = dart.constFn(async.Stream$(core.String)))();
+  let ChunkedConverterOfListOfint$String$ListOfint$String = () => (ChunkedConverterOfListOfint$String$ListOfint$String = dart.constFn(convert.ChunkedConverter$(ListOfint(), core.String, ListOfint(), core.String)))();
   let SinkOfString = () => (SinkOfString = dart.constFn(core.Sink$(core.String)))();
   let ChunkedConversionSink = () => (ChunkedConversionSink = dart.constFn(convert.ChunkedConversionSink$()))();
   let _ChunkedConversionCallbackOfListOfint = () => (_ChunkedConversionCallbackOfListOfint = dart.constFn(convert._ChunkedConversionCallback$(ListOfint())))();
@@ -353,8 +354,12 @@
   let _FusedCodec = () => (_FusedCodec = dart.constFn(convert._FusedCodec$()))();
   let _InvertedCodec = () => (_InvertedCodec = dart.constFn(convert._InvertedCodec$()))();
   let _FusedConverter = () => (_FusedConverter = dart.constFn(convert._FusedConverter$()))();
+  let ChunkedConverterOfString$String$String$String = () => (ChunkedConverterOfString$String$String$String = dart.constFn(convert.ChunkedConverter$(core.String, core.String, core.String, core.String)))();
+  let ChunkedConverterOfObject$String$Object$String = () => (ChunkedConverterOfObject$String$Object$String = dart.constFn(convert.ChunkedConverter$(core.Object, core.String, core.Object, core.String)))();
   let StreamOfObject = () => (StreamOfObject = dart.constFn(async.Stream$(core.Object)))();
   let JSArrayOfListOfint = () => (JSArrayOfListOfint = dart.constFn(_interceptors.JSArray$(ListOfint())))();
+  let ChunkedConverterOfObject$ListOfint$Object$ListOfint = () => (ChunkedConverterOfObject$ListOfint$Object$ListOfint = dart.constFn(convert.ChunkedConverter$(core.Object, ListOfint(), core.Object, ListOfint())))();
+  let ChunkedConverterOfString$Object$String$Object = () => (ChunkedConverterOfString$Object$String$Object = dart.constFn(convert.ChunkedConverter$(core.String, core.Object, core.String, core.Object)))();
   let Uint8ListAndintAndintTovoid = () => (Uint8ListAndintAndintTovoid = dart.constFn(dart.functionType(dart.void, [typed_data.Uint8List, core.int, core.int])))();
   let EventSinkOfString = () => (EventSinkOfString = dart.constFn(async.EventSink$(core.String)))();
   let StreamTransformerOfString$String = () => (StreamTransformerOfString$String = dart.constFn(async.StreamTransformer$(core.String, core.String)))();
@@ -365,59 +370,62 @@
   let Expando = () => (Expando = dart.constFn(core.Expando$()))();
   let _Generator = () => (_Generator = dart.constFn(core._Generator$()))();
   let _GeneratorIterable = () => (_GeneratorIterable = dart.constFn(core._GeneratorIterable$()))();
-  let _GeneratorIterator = () => (_GeneratorIterator = dart.constFn(core._GeneratorIterator$()))();
   let BidirectionalIterator = () => (BidirectionalIterator = dart.constFn(core.BidirectionalIterator$()))();
   let Map$ = () => (Map$ = dart.constFn(core.Map$()))();
   let Set = () => (Set = dart.constFn(core.Set$()))();
   let Sink = () => (Sink = dart.constFn(core.Sink$()))();
   let BidirectionalIteratorOfint = () => (BidirectionalIteratorOfint = dart.constFn(core.BidirectionalIterator$(core.int)))();
+  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let UnmodifiableMapViewOfString$String = () => (UnmodifiableMapViewOfString$String = dart.constFn(collection.UnmodifiableMapView$(core.String, core.String)))();
   let MapOfString$ListOfString = () => (MapOfString$ListOfString = dart.constFn(core.Map$(core.String, ListOfString())))();
-  let MapOfString$String = () => (MapOfString$String = dart.constFn(core.Map$(core.String, core.String)))();
   let IterableOfString = () => (IterableOfString = dart.constFn(core.Iterable$(core.String)))();
   let MapOfString$dynamic = () => (MapOfString$dynamic = dart.constFn(core.Map$(core.String, dart.dynamic)))();
+  let ListOfUint8List = () => (ListOfUint8List = dart.constFn(core.List$(typed_data.Uint8List)))();
   let MapOfString$ServiceExtensionHandler = () => (MapOfString$ServiceExtensionHandler = dart.constFn(core.Map$(core.String, developer.ServiceExtensionHandler)))();
   let MapOfString$Metric = () => (MapOfString$Metric = dart.constFn(core.Map$(core.String, developer.Metric)))();
   let ListOf_SyncBlock = () => (ListOf_SyncBlock = dart.constFn(core.List$(developer._SyncBlock)))();
   let JSArrayOf_AsyncBlock = () => (JSArrayOf_AsyncBlock = dart.constFn(_interceptors.JSArray$(developer._AsyncBlock)))();
   let ListOf_AsyncBlock = () => (ListOf_AsyncBlock = dart.constFn(core.List$(developer._AsyncBlock)))();
   let CompleterOfUri = () => (CompleterOfUri = dart.constFn(async.Completer$(core.Uri)))();
-  let ListOfListOfint = () => (ListOfListOfint = dart.constFn(core.List$(ListOfint())))();
-  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
+  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+  let ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = () => (ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint = dart.constFn(convert.ChunkedConverter$(ListOfint(), ListOfint(), ListOfint(), ListOfint())))();
   let FutureOfDirectory = () => (FutureOfDirectory = dart.constFn(async.Future$(io.Directory)))();
   let FutureOrOfDirectory = () => (FutureOrOfDirectory = dart.constFn(async.FutureOr$(io.Directory)))();
-  let StreamOfFileSystemEntity = () => (StreamOfFileSystemEntity = dart.constFn(async.Stream$(io.FileSystemEntity)))();
   let JSArrayOfFileSystemEntity = () => (JSArrayOfFileSystemEntity = dart.constFn(_interceptors.JSArray$(io.FileSystemEntity)))();
   let FutureOrOfString = () => (FutureOrOfString = dart.constFn(async.FutureOr$(core.String)))();
   let FutureOrOfbool = () => (FutureOrOfbool = dart.constFn(async.FutureOr$(core.bool)))();
   let FutureOrOfint = () => (FutureOrOfint = dart.constFn(async.FutureOr$(core.int)))();
   let ListOfFileSystemEntity = () => (ListOfFileSystemEntity = dart.constFn(core.List$(io.FileSystemEntity)))();
+  let StreamControllerOfFileSystemEntity = () => (StreamControllerOfFileSystemEntity = dart.constFn(async.StreamController$(io.FileSystemEntity)))();
   let StreamControllerOfListOfint = () => (StreamControllerOfListOfint = dart.constFn(async.StreamController$(ListOfint())))();
   let FutureOfRandomAccessFile = () => (FutureOfRandomAccessFile = dart.constFn(async.Future$(io.RandomAccessFile)))();
   let CompleterOfFile = () => (CompleterOfFile = dart.constFn(async.Completer$(io.File)))();
+  let CompleterOfListOfint = () => (CompleterOfListOfint = dart.constFn(async.Completer$(ListOfint())))();
   let FutureOfListOfint = () => (FutureOfListOfint = dart.constFn(async.Future$(ListOfint())))();
   let FutureOrOfFile = () => (FutureOrOfFile = dart.constFn(async.FutureOr$(io.File)))();
   let FutureOfFile = () => (FutureOfFile = dart.constFn(async.Future$(io.File)))();
-  let FutureOrOfListOfint = () => (FutureOrOfListOfint = dart.constFn(async.FutureOr$(ListOfint())))();
+  let FutureOfint = () => (FutureOfint = dart.constFn(async.Future$(core.int)))();
   let StreamOfHttpRequest = () => (StreamOfHttpRequest = dart.constFn(async.Stream$(io.HttpRequest)))();
   let ListOfRedirectInfo = () => (ListOfRedirectInfo = dart.constFn(core.List$(io.RedirectInfo)))();
   let HashMapOfString$ListOfString = () => (HashMapOfString$ListOfString = dart.constFn(collection.HashMap$(core.String, ListOfString())))();
   let ListOfCookie = () => (ListOfCookie = dart.constFn(core.List$(io.Cookie)))();
   let StringAndListOfStringTovoid = () => (StringAndListOfStringTovoid = dart.constFn(dart.functionType(dart.void, [core.String, ListOfString()])))();
   let FutureOfHttpClientResponse = () => (FutureOfHttpClientResponse = dart.constFn(async.Future$(io.HttpClientResponse)))();
-  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
   let FutureOrOfHttpClientResponse = () => (FutureOrOfHttpClientResponse = dart.constFn(async.FutureOr$(io.HttpClientResponse)))();
   let _StreamSinkImpl = () => (_StreamSinkImpl = dart.constFn(io._StreamSinkImpl$()))();
   let _HttpOutboundMessage = () => (_HttpOutboundMessage = dart.constFn(io._HttpOutboundMessage$()))();
   let CompleterOfHttpClientResponse = () => (CompleterOfHttpClientResponse = dart.constFn(async.Completer$(io.HttpClientResponse)))();
   let JSArrayOfRedirectInfo = () => (JSArrayOfRedirectInfo = dart.constFn(_interceptors.JSArray$(io.RedirectInfo)))();
   let JSArrayOfFuture = () => (JSArrayOfFuture = dart.constFn(_interceptors.JSArray$(async.Future)))();
+  let CompleterOfSocket = () => (CompleterOfSocket = dart.constFn(async.Completer$(io.Socket)))();
   let StreamConsumerOfListOfint = () => (StreamConsumerOfListOfint = dart.constFn(async.StreamConsumer$(ListOfint())))();
   let CompleterOf_HttpIncoming = () => (CompleterOf_HttpIncoming = dart.constFn(async.Completer$(io._HttpIncoming)))();
-  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
   let FutureOfSecureSocket = () => (FutureOfSecureSocket = dart.constFn(async.Future$(io.SecureSocket)))();
+  let X509CertificateTobool = () => (X509CertificateTobool = dart.constFn(dart.functionType(core.bool, [io.X509Certificate])))();
+  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
   let HashSetOf_HttpClientConnection = () => (HashSetOf_HttpClientConnection = dart.constFn(collection.HashSet$(io._HttpClientConnection)))();
   let FutureOf_ConnectionInfo = () => (FutureOf_ConnectionInfo = dart.constFn(async.Future$(io._ConnectionInfo)))();
+  let CompleterOf_ConnectionInfo = () => (CompleterOf_ConnectionInfo = dart.constFn(async.Completer$(io._ConnectionInfo)))();
   let FutureOrOf_ConnectionInfo = () => (FutureOrOf_ConnectionInfo = dart.constFn(async.FutureOr$(io._ConnectionInfo)))();
   let SetOf_HttpClientConnection = () => (SetOf_HttpClientConnection = dart.constFn(core.Set$(io._HttpClientConnection)))();
   let HashMapOfString$_ConnectionTarget = () => (HashMapOfString$_ConnectionTarget = dart.constFn(collection.HashMap$(core.String, io._ConnectionTarget)))();
@@ -439,8 +447,7 @@
   let HttpRequestTovoid = () => (HttpRequestTovoid = dart.constFn(dart.functionType(dart.void, [io.HttpRequest])))();
   let MapOfint$_HttpServer = () => (MapOfint$_HttpServer = dart.constFn(core.Map$(core.int, io._HttpServer)))();
   let ListOf_Proxy = () => (ListOf_Proxy = dart.constFn(core.List$(io._Proxy)))();
-  let FutureOfSocket = () => (FutureOfSocket = dart.constFn(async.Future$(io.Socket)))();
-  let StreamOfint = () => (StreamOfint = dart.constFn(async.Stream$(core.int)))();
+  let StreamSubscriptionOfListOfint = () => (StreamSubscriptionOfListOfint = dart.constFn(async.StreamSubscription$(ListOfint())))();
   let StreamControllerOf_HttpIncoming = () => (StreamControllerOf_HttpIncoming = dart.constFn(async.StreamController$(io._HttpIncoming)))();
   let _HttpIncomingTovoid = () => (_HttpIncomingTovoid = dart.constFn(dart.functionType(dart.void, [io._HttpIncoming])))();
   let MapOfString$_HttpSession = () => (MapOfString$_HttpSession = dart.constFn(core.Map$(core.String, io._HttpSession)))();
@@ -451,14 +458,16 @@
   let MapOfint$_SocketResourceInfo = () => (MapOfint$_SocketResourceInfo = dart.constFn(core.Map$(core.int, io._SocketResourceInfo)))();
   let StreamSinkOfListOfint = () => (StreamSinkOfListOfint = dart.constFn(async.StreamSink$(ListOfint())))();
   let FutureOfLink = () => (FutureOfLink = dart.constFn(async.Future$(io.Link)))();
+  let _CaseInsensitiveStringMapOfString = () => (_CaseInsensitiveStringMapOfString = dart.constFn(io._CaseInsensitiveStringMap$(core.String)))();
   let _CaseInsensitiveStringMap = () => (_CaseInsensitiveStringMap = dart.constFn(io._CaseInsensitiveStringMap$()))();
+  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
   let FutureOfRawSecureSocket = () => (FutureOfRawSecureSocket = dart.constFn(async.Future$(io.RawSecureSocket)))();
   let SecureSocketTovoid = () => (SecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.SecureSocket])))();
   let StreamControllerOfRawSecureSocket = () => (StreamControllerOfRawSecureSocket = dart.constFn(async.StreamController$(io.RawSecureSocket)))();
   let RawSecureSocketTovoid = () => (RawSecureSocketTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSecureSocket])))();
   let StreamSubscriptionOfRawSocket = () => (StreamSubscriptionOfRawSocket = dart.constFn(async.StreamSubscription$(io.RawSocket)))();
-  let StreamSubscriptionOfRawSocketEvent = () => (StreamSubscriptionOfRawSocketEvent = dart.constFn(async.StreamSubscription$(io.RawSocketEvent)))();
   let CompleterOf_RawSecureSocket = () => (CompleterOf_RawSecureSocket = dart.constFn(async.Completer$(io._RawSecureSocket)))();
+  let CompleterOfRawSecureSocket = () => (CompleterOfRawSecureSocket = dart.constFn(async.Completer$(io.RawSecureSocket)))();
   let StreamControllerOfRawSocketEvent = () => (StreamControllerOfRawSocketEvent = dart.constFn(async.StreamController$(io.RawSocketEvent)))();
   let RawSocketEventTovoid = () => (RawSocketEventTovoid = dart.constFn(dart.functionType(dart.void, [io.RawSocketEvent])))();
   let StreamOfRawSocketEvent = () => (StreamOfRawSocketEvent = dart.constFn(async.Stream$(io.RawSocketEvent)))();
@@ -467,15 +476,14 @@
   let StreamOfSocket = () => (StreamOfSocket = dart.constFn(async.Stream$(io.Socket)))();
   let StreamTransformerOfHttpRequest$WebSocket = () => (StreamTransformerOfHttpRequest$WebSocket = dart.constFn(async.StreamTransformer$(io.HttpRequest, io.WebSocket)))();
   let ListOfStringTodynamic = () => (ListOfStringTodynamic = dart.constFn(dart.functionType(dart.dynamic, [ListOfString()])))();
+  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
   let StreamTransformerOfListOfint$dynamic = () => (StreamTransformerOfListOfint$dynamic = dart.constFn(async.StreamTransformer$(ListOfint(), dart.dynamic)))();
-  let EventSinkOfUint8List = () => (EventSinkOfUint8List = dart.constFn(async.EventSink$(typed_data.Uint8List)))();
   let StreamControllerOfWebSocket = () => (StreamControllerOfWebSocket = dart.constFn(async.StreamController$(io.WebSocket)))();
   let FutureOfWebSocket = () => (FutureOfWebSocket = dart.constFn(async.Future$(io.WebSocket)))();
-  let EventSinkOfListOfint = () => (EventSinkOfListOfint = dart.constFn(async.EventSink$(ListOfint())))();
-  let JSArrayOfUint8List = () => (JSArrayOfUint8List = dart.constFn(_interceptors.JSArray$(typed_data.Uint8List)))();
+  let FutureOfString = () => (FutureOfString = dart.constFn(async.Future$(core.String)))();
   let StreamTransformerOfdynamic$ListOfint = () => (StreamTransformerOfdynamic$ListOfint = dart.constFn(async.StreamTransformer$(dart.dynamic, ListOfint())))();
   let MapOfint$_WebSocketImpl = () => (MapOfint$_WebSocketImpl = dart.constFn(core.Map$(core.int, io._WebSocketImpl)))();
-  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate.Isolate)))();
+  let FutureOfIsolate = () => (FutureOfIsolate = dart.constFn(async.Future$(isolate$.Isolate)))();
   let JsArray = () => (JsArray = dart.constFn(js.JsArray$()))();
   let ExpandoOfFunction = () => (ExpandoOfFunction = dart.constFn(core.Expando$(core.Function)))();
   let PointOfnum = () => (PointOfnum = dart.constFn(math.Point$(core.num)))();
@@ -596,6 +604,7 @@
   let ElementListOfElement = () => (ElementListOfElement = dart.constFn(html$.ElementList$(html$.Element)))();
   let ListOfRectangleOfnum = () => (ListOfRectangleOfnum = dart.constFn(core.List$(RectangleOfnum())))();
   let ListOfGamepad = () => (ListOfGamepad = dart.constFn(core.List$(html$.Gamepad)))();
+  let SetOfString = () => (SetOfString = dart.constFn(core.Set$(core.String)))();
   let ListOfCssClassSetImpl = () => (ListOfCssClassSetImpl = dart.constFn(core.List$(html_common.CssClassSetImpl)))();
   let LinkedHashSetOfString = () => (LinkedHashSetOfString = dart.constFn(collection.LinkedHashSet$(core.String)))();
   let StringTobool = () => (StringTobool = dart.constFn(dart.functionType(core.bool, [core.String])))();
@@ -641,18 +650,20 @@
   let dynamicToListOfString = () => (dynamicToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [dart.dynamic])))();
   let dynamicToList = () => (dynamicToList = dart.constFn(dart.definiteFunctionType(core.List, [dart.dynamic])))();
   let dynamicAndSetOfNameValuePairTovoid = () => (dynamicAndSetOfNameValuePairTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair()])))();
-  let TypeToString = () => (TypeToString = dart.constFn(dart.definiteFunctionType(core.String, [core.Type])))();
-  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
+  let dynamicAndSetOfNameValuePairAnddynamic__Tovoid = () => (dynamicAndSetOfNameValuePairAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, SetOfNameValuePair(), dart.dynamic, core.bool], {tagTypes: dart.dynamic})))();
+  let NameValuePairAndNameValuePairToint = () => (NameValuePairAndNameValuePairToint = dart.constFn(dart.definiteFunctionType(core.int, [_debugger.NameValuePair, _debugger.NameValuePair])))();
+  let IterableOfNameValuePairToListOfNameValuePair = () => (IterableOfNameValuePairToListOfNameValuePair = dart.constFn(dart.definiteFunctionType(ListOfNameValuePair(), [IterableOfNameValuePair()])))();
   let dynamicAnddynamicToString = () => (dynamicAnddynamicToString = dart.constFn(dart.definiteFunctionType(core.String, [dart.dynamic, dart.dynamic])))();
   let dynamicAndStringTobool = () => (dynamicAndStringTobool = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic, core.String])))();
   let intAnddynamicToNull = () => (intAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.int, dart.dynamic])))();
   let ObjectAndObjectToObject = () => (ObjectAndObjectToObject = dart.constFn(dart.definiteFunctionType(core.Object, [core.Object, core.Object])))();
   let StringTobool$ = () => (StringTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [core.String])))();
+  let dynamicToObject = () => (dynamicToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic])))();
   let dynamicTobool$ = () => (dynamicTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [dart.dynamic])))();
   let dynamicAnddynamicToNull = () => (dynamicAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, dart.dynamic])))();
-  let StringAndObjectToNull = () => (StringAndObjectToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.Object])))();
   let StringToNameValuePair = () => (StringToNameValuePair = dart.constFn(dart.definiteFunctionType(_debugger.NameValuePair, [core.String])))();
   let VoidTodynamic$ = () => (VoidTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [])))();
+  let StringTodynamic = () => (StringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String])))();
   let StringAndString__Todynamic = () => (StringAndString__Todynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.String, core.String], [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic])))();
   let VoidToIsolateContext = () => (VoidToIsolateContext = dart.constFn(dart.definiteFunctionType(_foreign_helper.IsolateContext, [])))();
   let dynamicAndFunctionTodynamic = () => (dynamicAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.Function])))();
@@ -666,6 +677,8 @@
   let TypeAndStringTodynamic = () => (TypeAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [core.Type, core.String])))();
   let dynamicAnddynamicTodynamic$ = () => (dynamicAnddynamicTodynamic$ = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicToint = () => (dynamicAnddynamicToint = dart.constFn(dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])))();
+  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
+  let StringAndintToint = () => (StringAndintToint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int])))();
   let ListOfEToListOfE = () => (ListOfEToListOfE = dart.constFn(dart.definiteFunctionType(E => [core.List$(E), [core.List$(E)]])))();
   let StringTovoid$ = () => (StringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String])))();
   let _IsolateContextAndFunctionTodynamic = () => (_IsolateContextAndFunctionTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [_isolate_helper._IsolateContext, core.Function])))();
@@ -678,10 +691,11 @@
   let StringToNull = () => (StringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String])))();
   let dynamicToNull$ = () => (dynamicToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic])))();
   let TimerToNull = () => (TimerToNull = dart.constFn(dart.definiteFunctionType(core.Null, [async.Timer])))();
+  let VoidTo_Future = () => (VoidTo_Future = dart.constFn(dart.definiteFunctionType(async._Future, [])))();
+  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let dynamicToFuture = () => (dynamicToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [dart.dynamic])))();
   let boolToNull = () => (boolToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.bool])))();
   let dynamicAndStackTraceTovoid = () => (dynamicAndStackTraceTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace])))();
-  let VoidToFuture = () => (VoidToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [])))();
   let VoidToint = () => (VoidToint = dart.constFn(dart.definiteFunctionType(core.int, [])))();
   let dynamicAnddynamicToError = () => (dynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic])))();
   let dynamicAnddynamicAnddynamicToError = () => (dynamicAnddynamicAnddynamicToError = dart.constFn(dart.definiteFunctionType(core.Error, [dart.dynamic, dart.dynamic, dart.dynamic])))();
@@ -742,7 +756,7 @@
   let _NotificationHandlerToFuture = () => (_NotificationHandlerToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [async._NotificationHandler])))();
   let dynamicAndStackTraceToNull = () => (dynamicAndStackTraceToNull = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic, core.StackTrace])))();
   let dynamic__Tovoid = () => (dynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace])))();
-  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), ZoneBinaryCallbackOfdynamic$dynamic$StackTrace()])))();
+  let FnAndFnAndFnTodynamic = () => (FnAndFnAndFnTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [VoidTodynamic(), dynamicTodynamic(), dynamicAndStackTraceTodynamic()])))();
   let StreamSubscriptionAnd_FutureAnddynamic__Tovoid = () => (StreamSubscriptionAnd_FutureAnddynamic__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic, core.StackTrace])))();
   let StreamSubscriptionAnd_FutureTo_ErrorCallback = () => (StreamSubscriptionAnd_FutureTo_ErrorCallback = dart.constFn(dart.definiteFunctionType(async._ErrorCallback, [async.StreamSubscription, async._Future])))();
   let StreamSubscriptionAnd_FutureAnddynamicTovoid = () => (StreamSubscriptionAnd_FutureAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [async.StreamSubscription, async._Future, dart.dynamic])))();
@@ -780,12 +794,18 @@
   let ObjectAndObjectTobool = () => (ObjectAndObjectTobool = dart.constFn(dart.definiteFunctionType(core.bool, [core.Object, core.Object])))();
   let ObjectToint = () => (ObjectToint = dart.constFn(dart.definiteFunctionType(core.int, [core.Object])))();
   let ObjectTovoid = () => (ObjectTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Object])))();
+  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
+  let StringAndintTovoid = () => (StringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.int])))();
+  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
   let StringAndStringTovoid$ = () => (StringAndStringTovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, core.String])))();
   let StringAnddynamicToNull = () => (StringAnddynamicToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, dart.dynamic])))();
-  let MapOfString$StringAndStringToMapOfString$String = () => (MapOfString$StringAndStringToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [MapOfString$String(), core.String])))();
   let intAndintAndintTovoid = () => (intAndintAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.int])))();
-  let String__Tovoid = () => (String__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], [dart.dynamic])))();
   let StringAndStringToNull = () => (StringAndStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, core.String])))();
+  let intToUint8List = () => (intToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [core.int])))();
+  let dynamicAnddynamicToUint8List = () => (dynamicAnddynamicToUint8List = dart.constFn(dart.definiteFunctionType(typed_data.Uint8List, [dart.dynamic, dart.dynamic])))();
+  let Uint8ListAndStringAndintTovoid = () => (Uint8ListAndStringAndintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [typed_data.Uint8List, core.String, core.int])))();
+  let VoidToListOfUint8List = () => (VoidToListOfUint8List = dart.constFn(dart.definiteFunctionType(ListOfUint8List(), [])))();
+  let StringAndintAndint__Toint = () => (StringAndintAndint__Toint = dart.constFn(dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, ListOfint()])))();
   let __Tobool = () => (__Tobool = dart.constFn(dart.definiteFunctionType(core.bool, [], {when: core.bool, message: core.String})))();
   let String__Tovoid$ = () => (String__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.String], {time: core.DateTime, sequenceNumber: core.int, level: core.int, name: core.String, zone: async.Zone, error: core.Object, stackTrace: core.StackTrace})))();
   let StringAndServiceExtensionHandlerTovoid = () => (StringAndServiceExtensionHandlerTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, developer.ServiceExtensionHandler])))();
@@ -798,10 +818,11 @@
   let intAndintAndString__Tovoid$ = () => (intAndintAndString__Tovoid$ = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.int, core.String, core.String, core.String])))();
   let intAndStringAndString__Tovoid = () => (intAndStringAndString__Tovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int, core.String, core.String, core.String])))();
   let UriTovoid = () => (UriTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.Uri])))();
-  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort])))();
-  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate.SendPort, core.bool])))();
+  let SendPortTovoid = () => (SendPortTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort])))();
+  let SendPortAndboolTovoid = () => (SendPortAndboolTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.bool])))();
+  let SendPortToString = () => (SendPortToString = dart.constFn(dart.definiteFunctionType(core.String, [isolate$.SendPort])))();
   let dynamicAndStringAndStringTodynamic = () => (dynamicAndStringAndStringTodynamic = dart.constFn(dart.definiteFunctionType(dart.dynamic, [dart.dynamic, core.String, core.String])))();
-  let ListAndintAndintTo_BufferAndStart = () => (ListAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [core.List, core.int, core.int])))();
+  let ListOfintAndintAndintTo_BufferAndStart = () => (ListOfintAndintAndintTo_BufferAndStart = dart.constFn(dart.definiteFunctionType(io._BufferAndStart, [ListOfint(), core.int, core.int])))();
   let intTovoid = () => (intTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.int])))();
   let DirectoryToFutureOfDirectory = () => (DirectoryToFutureOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOfDirectory(), [io.Directory])))();
   let boolToFutureOrOfDirectory = () => (boolToFutureOrOfDirectory = dart.constFn(dart.definiteFunctionType(FutureOrOfDirectory(), [core.bool])))();
@@ -820,17 +841,15 @@
   let dynamicToFile = () => (dynamicToFile = dart.constFn(dart.definiteFunctionType(io.File, [dart.dynamic])))();
   let dynamicTo_RandomAccessFile = () => (dynamicTo_RandomAccessFile = dart.constFn(dart.definiteFunctionType(io._RandomAccessFile, [dart.dynamic])))();
   let dynamicToDateTime = () => (dynamicToDateTime = dart.constFn(dart.definiteFunctionType(core.DateTime, [dart.dynamic])))();
-  let dynamicToFutureOfListOfint = () => (dynamicToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [dart.dynamic])))();
-  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
   let RandomAccessFileToFutureOfListOfint = () => (RandomAccessFileToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [io.RandomAccessFile])))();
+  let intToFutureOfListOfint = () => (intToFutureOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOfListOfint(), [core.int])))();
   let ListOfintToString = () => (ListOfintToString = dart.constFn(dart.definiteFunctionType(core.String, [ListOfint()])))();
   let RandomAccessFileTo_File = () => (RandomAccessFileTo_File = dart.constFn(dart.definiteFunctionType(io._File, [io.RandomAccessFile])))();
   let RandomAccessFileToObject = () => (RandomAccessFileToObject = dart.constFn(dart.definiteFunctionType(core.Object, [io.RandomAccessFile])))();
   let RandomAccessFileToFutureOrOfFile = () => (RandomAccessFileToFutureOrOfFile = dart.constFn(dart.definiteFunctionType(FutureOrOfFile(), [io.RandomAccessFile])))();
-  let dynamicToFutureOrOfListOfint = () => (dynamicToFutureOrOfListOfint = dart.constFn(dart.definiteFunctionType(FutureOrOfListOfint(), [dart.dynamic])))();
+  let dynamicToListOfint = () => (dynamicToListOfint = dart.constFn(dart.definiteFunctionType(ListOfint(), [dart.dynamic])))();
   let dynamicToFileStat = () => (dynamicToFileStat = dart.constFn(dart.definiteFunctionType(io.FileStat, [dart.dynamic])))();
   let StringAndListOfStringToListOfString = () => (StringAndListOfStringToListOfString = dart.constFn(dart.definiteFunctionType(ListOfString(), [core.String, ListOfString()])))();
-  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
   let StringAndListOfStringToNull = () => (StringAndListOfStringToNull = dart.constFn(dart.definiteFunctionType(core.Null, [core.String, ListOfString()])))();
   let CookieToString = () => (CookieToString = dart.constFn(dart.definiteFunctionType(core.String, [io.Cookie])))();
   let CookieTobool = () => (CookieTobool = dart.constFn(dart.definiteFunctionType(core.bool, [io.Cookie])))();
@@ -846,11 +865,14 @@
   let ListToFutureOrOfHttpClientResponse = () => (ListToFutureOrOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOrOfHttpClientResponse(), [core.List])))();
   let HttpClientResponseTovoid = () => (HttpClientResponseTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.HttpClientResponse])))();
   let dynamicToIterable = () => (dynamicToIterable = dart.constFn(dart.definiteFunctionType(core.Iterable, [dart.dynamic])))();
+  let ListOfintTovoid = () => (ListOfintTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint()])))();
   let dynamicTo_HttpOutboundMessage = () => (dynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic])))();
   let dynamicAnddynamicTo_HttpOutboundMessage = () => (dynamicAnddynamicTo_HttpOutboundMessage = dart.constFn(dart.definiteFunctionType(io._HttpOutboundMessage, [dart.dynamic, dart.dynamic])))();
   let dynamic__ToNull$ = () => (dynamic__ToNull$ = dart.constFn(dart.definiteFunctionType(core.Null, [dart.dynamic], [core.StackTrace])))();
   let _HttpIncomingToNull = () => (_HttpIncomingToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpIncoming])))();
-  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
+  let SocketToSocket = () => (SocketToSocket = dart.constFn(dart.definiteFunctionType(io.Socket, [io.Socket])))();
+  let SocketTo_DetachedSocket = () => (SocketTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [io.Socket])))();
+  let SocketTovoid = () => (SocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.Socket])))();
   let SecureSocketTo_HttpClientConnection = () => (SecureSocketTo_HttpClientConnection = dart.constFn(dart.definiteFunctionType(io._HttpClientConnection, [io.SecureSocket])))();
   let HttpClientResponseToFutureOfSecureSocket = () => (HttpClientResponseToFutureOfSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfSecureSocket(), [io.HttpClientResponse])))();
   let X509CertificateTobool$ = () => (X509CertificateTobool$ = dart.constFn(dart.definiteFunctionType(core.bool, [io.X509Certificate])))();
@@ -864,14 +886,15 @@
   let dynamicToFutureOf_ConnectionInfo = () => (dynamicToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [dart.dynamic])))();
   let VoidToFutureOf_ConnectionInfo = () => (VoidToFutureOf_ConnectionInfo = dart.constFn(dart.definiteFunctionType(FutureOf_ConnectionInfo(), [])))();
   let _SiteCredentialsAnd_CredentialsTo_SiteCredentials = () => (_SiteCredentialsAnd_CredentialsTo_SiteCredentials = dart.constFn(dart.definiteFunctionType(io._SiteCredentials, [io._SiteCredentials, io._Credentials])))();
+  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
+  let dynamicTo_DetachedSocket = () => (dynamicTo_DetachedSocket = dart.constFn(dart.definiteFunctionType(io._DetachedSocket, [dart.dynamic])))();
   let ServerSocketTo_HttpServer = () => (ServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.ServerSocket])))();
   let SecureServerSocketTo_HttpServer = () => (SecureServerSocketTo_HttpServer = dart.constFn(dart.definiteFunctionType(io._HttpServer, [io.SecureServerSocket])))();
-  let SocketToNull = () => (SocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.Socket])))();
   let _HttpConnectionToNull = () => (_HttpConnectionToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._HttpConnection])))();
   let _HttpConnectionToMap = () => (_HttpConnectionToMap = dart.constFn(dart.definiteFunctionType(core.Map, [io._HttpConnection])))();
-  let _FileResourceInfoToMapOfString$String = () => (_FileResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._FileResourceInfo])))();
-  let _ProcessResourceInfoToMapOfString$String = () => (_ProcessResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._ProcessResourceInfo])))();
-  let _SocketResourceInfoToMapOfString$String = () => (_SocketResourceInfoToMapOfString$String = dart.constFn(dart.definiteFunctionType(MapOfString$String(), [io._SocketResourceInfo])))();
+  let _FileResourceInfoToMapOfString$dynamic = () => (_FileResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._FileResourceInfo])))();
+  let _ProcessResourceInfoToMapOfString$dynamic = () => (_ProcessResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._ProcessResourceInfo])))();
+  let _SocketResourceInfoToMapOfString$dynamic = () => (_SocketResourceInfoToMapOfString$dynamic = dart.constFn(dart.definiteFunctionType(MapOfString$dynamic(), [io._SocketResourceInfo])))();
   let dynamicTo_Link = () => (dynamicTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [dart.dynamic])))();
   let FileSystemEntityToFutureOfLink = () => (FileSystemEntityToFutureOfLink = dart.constFn(dart.definiteFunctionType(FutureOfLink(), [io.FileSystemEntity])))();
   let FileSystemEntityTo_Link = () => (FileSystemEntityTo_Link = dart.constFn(dart.definiteFunctionType(io._Link, [io.FileSystemEntity])))();
@@ -884,7 +907,6 @@
   let RawSecureSocketToNull = () => (RawSecureSocketToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.RawSecureSocket])))();
   let RawSocketToFutureOfRawSecureSocket = () => (RawSocketToFutureOfRawSecureSocket = dart.constFn(dart.definiteFunctionType(FutureOfRawSecureSocket(), [io.RawSocket])))();
   let _FilterStatusToNull = () => (_FilterStatusToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io._FilterStatus])))();
-  let intToint = () => (intToint = dart.constFn(dart.definiteFunctionType(core.int, [core.int])))();
   let dynamicTo_FilterStatus = () => (dynamicTo_FilterStatus = dart.constFn(dart.definiteFunctionType(io._FilterStatus, [dart.dynamic])))();
   let ListOfintAndStringTovoid = () => (ListOfintAndStringTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [ListOfint(), core.String])))();
   let dynamicToStdioType = () => (dynamicToStdioType = dart.constFn(dart.definiteFunctionType(io.StdioType, [dart.dynamic])))();
@@ -892,14 +914,13 @@
   let WebSocketTovoid = () => (WebSocketTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [io.WebSocket])))();
   let HttpRequestToNull = () => (HttpRequestToNull = dart.constFn(dart.definiteFunctionType(core.Null, [io.HttpRequest])))();
   let SocketTo_WebSocketImpl = () => (SocketTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [io.Socket])))();
-  let StringToFuture = () => (StringToFuture = dart.constFn(dart.definiteFunctionType(async.Future, [core.String])))();
+  let StringToFutureOfWebSocket = () => (StringToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [core.String])))();
   let EventSinkOfListOfintTo_WebSocketOutgoingTransformer = () => (EventSinkOfListOfintTo_WebSocketOutgoingTransformer = dart.constFn(dart.definiteFunctionType(io._WebSocketOutgoingTransformer, [EventSinkOfListOfint()])))();
-  let dynamicTo_WebSocketImpl = () => (dynamicTo_WebSocketImpl = dart.constFn(dart.definiteFunctionType(io._WebSocketImpl, [dart.dynamic])))();
   let HttpClientResponseToFutureOfWebSocket = () => (HttpClientResponseToFutureOfWebSocket = dart.constFn(dart.definiteFunctionType(FutureOfWebSocket(), [io.HttpClientResponse])))();
   let StringAnddynamicTovoid = () => (StringAnddynamicTovoid = dart.constFn(dart.definiteFunctionType(dart.void, [core.String, dart.dynamic])))();
   let HttpClientRequestToFutureOfHttpClientResponse = () => (HttpClientRequestToFutureOfHttpClientResponse = dart.constFn(dart.definiteFunctionType(FutureOfHttpClientResponse(), [io.HttpClientRequest])))();
   let dynamicToMap = () => (dynamicToMap = dart.constFn(dart.definiteFunctionType(core.Map, [dart.dynamic])))();
-  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate.Isolate, [core.List])))();
+  let ListToIsolate = () => (ListToIsolate = dart.constFn(dart.definiteFunctionType(isolate$.Isolate, [core.List])))();
   let dynamicTo_DartObject = () => (dynamicTo_DartObject = dart.constFn(dart.definiteFunctionType(js._DartObject, [dart.dynamic])))();
   let dynamicAnddynamicAndFnToObject = () => (dynamicAnddynamicAndFnToObject = dart.constFn(dart.definiteFunctionType(core.Object, [dart.dynamic, dart.dynamic, dynamicTodynamic()])))();
   let FToF = () => (FToF = dart.constFn(dart.definiteFunctionType(F => [F, [F]])))();
@@ -1464,8 +1485,8 @@
   dart.getIsNamedConstructor = function(value) {
     return value[dart.isNamedConstructor];
   };
-  dart.getDartLibraryName = function(value) {
-    return value[dart_library.dartLibraryName];
+  dart.getModuleName = function(value) {
+    return value[dart._moduleName];
   };
   dart.tag = function(value, t) {
     value[dart._runtimeType] = t;
@@ -1476,6 +1497,18 @@
   dart.tagLazy = function(value, compute) {
     dart.defineLazyProperty(value, dart._runtimeType, {get: compute});
   };
+  dart.getModuleNames = function() {
+    return Array.from(dart._loadedModules.keys());
+  };
+  dart.getModuleLibraries = function(name) {
+    let module = dart._loadedModules.get(name);
+    if (module == null) return null;
+    module[dart._moduleName] = name;
+    return module;
+  };
+  dart.trackLibraries = function(moduleName, libraries) {
+    dart._loadedModules.set(moduleName, libraries);
+  };
   dart._warn = function(arg) {
     console.warn(arg);
   };
@@ -1618,6 +1651,9 @@
   dart.definiteFunctionType = function(returnType, args, extra) {
     return dart._functionType(true, returnType, args, extra);
   };
+  dart.isType = function(obj) {
+    return dart._getRuntimeType(obj) === core.Type;
+  };
   dart.typeName = function(type) {
     if (type === void 0) return "undefined type";
     if (type === null) return "null type";
@@ -2042,7 +2078,7 @@
     return name;
   };
   dart._dartSymbol = function(name) {
-    return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.Symbol.es6(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
+    return core.Symbol._check(typeof name === "symbol" ? dart.const(new _internal.PrivateSymbol(dart._toSymbolName(name), name)) : dart.const(core.Symbol.new(dart._toDisplayName(name))));
   };
   dart.extractNamedArgs = function(args) {
     if (args.length > 0) {
@@ -2436,6 +2472,7 @@
       return obj[dartx.toString]();
     }
     if (typeof obj == "function") {
+      if (dart.test(dart.isType(obj))) return dart.typeName(obj);
       return "Closure: " + dart.getReifiedType(obj) + " from: " + obj;
     }
     return obj.toString();
@@ -2640,12 +2677,19 @@
   dart.dartx = dartx;
   dart._runtimeType = Symbol("_runtimeType");
   dart.isNamedConstructor = Symbol("isNamedConstructor");
+  dart._moduleName = Symbol("_moduleName");
   dart.defineLazy(dart, {
     get _lazyJSTypes() {
       return new Map();
     },
     set _lazyJSTypes(_) {}
   });
+  dart.defineLazy(dart, {
+    get _loadedModules() {
+      return new Map();
+    },
+    set _loadedModules(_) {}
+  });
   dart.metadata = Symbol("metadata");
   dart._typeObject = Symbol("typeObject");
   core.Object = class Object {
@@ -3199,9 +3243,51 @@
     names: ['getProperty', 'setProperty']
   });
   _debugger.addMetadataChildren = function(object, ret) {
-    ret.add(new _debugger.NameValuePair({name: _debugger.getTypeName(core.Type._check(_debugger._getType(object))), value: object, config: _debugger.JsonMLConfig.asClass}));
+    ret.add(new _debugger.NameValuePair({name: "[[class]]", value: dart.getReifiedType(object), config: _debugger.JsonMLConfig.asClass}));
   };
   dart.lazyFn(_debugger.addMetadataChildren, () => dynamicAndSetOfNameValuePairTovoid());
+  _debugger.addPropertiesFromSignature = function(sig, properties, object, walkPrototypeChain, opts) {
+    let tagTypes = opts && 'tagTypes' in opts ? opts.tagTypes : false;
+    let skippedNames = core.Set.new();
+    skippedNames.add('hashCode');
+    while (sig != null) {
+      for (let symbol of _debugger.getOwnPropertySymbols(sig)) {
+        let dartName = _debugger.symbolName(symbol);
+        let dartXPrefix = 'dartx.';
+        if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
+          dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
+        }
+        if (dart.test(skippedNames.contains(dartName))) continue;
+        let value = _debugger.safeGetProperty(object, symbol);
+        if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+          dart.tag(value, sig[symbol]);
+        }
+        properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
+      }
+      for (let name of _debugger.getOwnPropertyNames(sig)) {
+        let value = _debugger.safeGetProperty(object, name);
+        if (dart.test(skippedNames.contains(name))) continue;
+        if (dart.test(tagTypes) && _debugger._typeof(value) == 'function') {
+          dart.tag(value, sig[name]);
+        }
+        properties.add(new _debugger.NameValuePair({name: name, value: value}));
+      }
+      if (!dart.test(walkPrototypeChain)) break;
+      sig = _debugger.safeGetProperty(sig, '__proto__');
+    }
+  };
+  dart.lazyFn(_debugger.addPropertiesFromSignature, () => dynamicAndSetOfNameValuePairAnddynamic__Tovoid());
+  _debugger.sortProperties = function(properties) {
+    let sortedProperties = properties[dartx.toList]();
+    sortedProperties[dartx.sort](dart.fn((a, b) => {
+      let aPrivate = a.name[dartx.startsWith]('_');
+      let bPrivate = b.name[dartx.startsWith]('_');
+      if (aPrivate != bPrivate) return dart.test(aPrivate) ? 1 : -1;
+      return a.name[dartx.compareTo](b.name);
+    }, NameValuePairAndNameValuePairToint()));
+    return sortedProperties;
+  };
+  dart.lazyFn(_debugger.sortProperties, () => IterableOfNameValuePairToListOfNameValuePair());
   _debugger.getObjectTypeName = function(object) {
     let reifiedType = dart.getReifiedType(object);
     if (reifiedType == null) {
@@ -3210,7 +3296,7 @@
       }
       return '<Error getting type name>';
     }
-    return _debugger.getTypeName(core.Type._check(reifiedType));
+    return _debugger.getTypeName(reifiedType);
   };
   dart.lazyFn(_debugger.getObjectTypeName, () => dynamicToString());
   _debugger.getTypeName = function(type) {
@@ -3218,11 +3304,7 @@
     if (name == 'JSArray<dynamic>' || name == 'JSObject<Array>') return 'List<dynamic>';
     return name;
   };
-  dart.lazyFn(_debugger.getTypeName, () => TypeToString());
-  _debugger._getType = function(object) {
-    return core.Type.is(object) ? object : dart.getReifiedType(object);
-  };
-  dart.fn(_debugger._getType, dynamicToObject());
+  dart.lazyFn(_debugger.getTypeName, () => dynamicToString());
   const _simpleFormatter = Symbol('_simpleFormatter');
   _debugger.safePreview = function(object, config) {
     try {
@@ -3262,7 +3344,9 @@
       this.hideName = hideName;
     }
     ['=='](other) {
-      return _debugger.NameValuePair.is(other) && other.name == this.name;
+      if (!_debugger.NameValuePair.is(other)) return false;
+      if (dart.test(this.hideName) || dart.test(dart.dload(other, 'hideName'))) return core.identical(this, other);
+      return dart.equals(dart.dload(other, 'name'), this.name);
     }
     get hashCode() {
       return dart.hashCode(this.name);
@@ -3455,7 +3539,7 @@
   });
   _debugger.isNativeJavaScriptObject = function(object) {
     let type = _debugger._typeof(object);
-    return type != 'object' && type != 'function' || dart.JSObject.is(object) || html$.Node.is(object);
+    return type != 'object' && type != 'function' || dart.test(dart.isJsInterop(object)) || html$.Node.is(object);
   };
   dart.lazyFn(_debugger.isNativeJavaScriptObject, () => dynamicTobool$());
   _debugger.JsonMLFormatter = class JsonMLFormatter extends core.Object {
@@ -3491,24 +3575,37 @@
         body.addStyle('color: rgb(196, 26, 22);');
       }
       let children = this[_simpleFormatter].children(object, config);
+      if (children == null) return body.toJsonML();
       for (let child of children) {
         let li = body.createChild('li');
-        let nameSpan = new _debugger.JsonMLElement('span');
-        nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
-        nameSpan.setStyle('color: rgb(136, 19, 145);');
+        li.setStyle("padding-left: 13px;");
+        let nameSpan = null;
+        let valueStyle = '';
+        if (!dart.test(child.hideName)) {
+          nameSpan = new _debugger.JsonMLElement('span');
+          nameSpan.createTextChild(dart.test(child.displayName[dartx.isNotEmpty]) ? dart.str`${child.displayName}: ` : '');
+          nameSpan.setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+          valueStyle = 'margin-left: 13px';
+        }
         if (_debugger._typeof(child.value) == 'object' || _debugger._typeof(child.value) == 'function') {
-          nameSpan.addStyle("padding-left: 13px;");
-          li.appendChild(nameSpan);
-          let objectTag = li.createObjectTag(child.value);
-          objectTag.addAttribute('config', child.config);
-          if (!dart.test(this[_simpleFormatter].hasChildren(child.value, child.config))) {
-            li.setStyle("padding-left: 13px;");
+          let valueSpan = new _debugger.JsonMLElement('span');
+          valueSpan.setStyle(valueStyle);
+          valueSpan.createObjectTag(child.value).addAttribute('config', child.config);
+          if (nameSpan != null) {
+            li.appendChild(nameSpan);
           }
+          li.appendChild(valueSpan);
         } else {
-          li.setStyle("padding-left: 13px;");
-          let _ = li.createChild('span');
-          _.appendChild(nameSpan);
-          _.createTextChild(_debugger.safePreview(child.value, child.config));
+          let line = li.createChild('span');
+          if (nameSpan != null) {
+            line.appendChild(nameSpan);
+          }
+          line.appendChild((() => {
+            let _ = new _debugger.JsonMLElement('span');
+            _.createTextChild(_debugger.safePreview(child.value, child.config));
+            _.setStyle(valueStyle);
+            return _;
+          })());
         }
       }
       return body.toJsonML();
@@ -3531,7 +3628,7 @@
   _debugger.DartFormatter = class DartFormatter extends core.Object {
     new() {
       this[_formatters] = null;
-      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
+      this[_formatters] = JSArrayOfFormatter().of([new _debugger.ClassFormatter(), new _debugger.TypeFormatter(), new _debugger.NamedConstructorFormatter(), new _debugger.MapFormatter(), new _debugger.IterableFormatter(), new _debugger.IterableSpanFormatter(), new _debugger.MapEntryFormatter(), new _debugger.StackTraceFormatter(), new _debugger.FunctionFormatter(), new _debugger.HeritageClauseFormatter(), new _debugger.LibraryModuleFormatter(), new _debugger.LibraryFormatter(), new _debugger.ObjectFormatter()]);
     }
     preview(object, config) {
       try {
@@ -3595,42 +3692,14 @@
       return true;
     }
     children(object) {
-      let properties = LinkedHashSetOfNameValuePair().new();
-      _debugger.addMetadataChildren(object, properties);
-      let current = object;
-      let protoChain = JSArrayOfObject().of([]);
-      while (current != null && !dart.test(_debugger.isNativeJavaScriptObject(current)) && current !== Object.prototype) {
-        protoChain[dartx.add](current);
-        current = _debugger.safeGetProperty(current, '__proto__');
-      }
-      for (current of protoChain) {
-        for (let symbol of _debugger.getOwnPropertySymbols(current)) {
-          let dartName = _debugger.symbolName(symbol);
-          if (dart.test(_debugger.hasMethod(object, dartName))) {
-            continue;
-          }
-          let dartXPrefix = 'dartx.';
-          if (dart.test(dartName[dartx.startsWith](dartXPrefix))) {
-            dartName = dartName[dartx.substring](dartXPrefix[dartx.length]);
-          } else if (!dart.test(dartName[dartx.startsWith]('_'))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, symbol);
-          properties.add(new _debugger.NameValuePair({name: dartName, value: value}));
-        }
-      }
-      for (current of protoChain) {
-        let className = dart.dload(dart.getReifiedType(current), 'name');
-        for (let name of _debugger.getOwnPropertyNames(current)) {
-          if (dart.test(_debugger.ObjectFormatter._customNames.contains(name)) || dart.equals(name, className)) continue;
-          if (dart.test(_debugger.hasMethod(object, name))) {
-            continue;
-          }
-          let value = _debugger.safeGetProperty(object, name);
-          properties.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }
-      return properties.toList();
+      let type = dart.getType(object);
+      let ret = LinkedHashSetOfNameValuePair().new();
+      let properties = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getFieldSig(type), properties, object, true);
+      _debugger.addPropertiesFromSignature(dart.getGetterSig(type), properties, object, true);
+      ret.addAll(_debugger.sortProperties(properties));
+      _debugger.addMetadataChildren(object, ret);
+      return ret.toList();
     }
   };
   dart.setSignature(_debugger.ObjectFormatter, {
@@ -3641,28 +3710,16 @@
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
     })
   });
-  dart.defineLazy(_debugger.ObjectFormatter, {
-    get _customNames() {
-      return (() => {
-        let _ = SetOfString().new();
-        _.add('constructor');
-        _.add('prototype');
-        _.add('__proto__');
-        return _;
-      })();
-    },
-    set _customNames(_) {}
-  });
   _debugger.LibraryModuleFormatter = class LibraryModuleFormatter extends core.Object {
     accept(object, config) {
-      return dart.getDartLibraryName(object) != null;
+      return dart.getModuleName(object) != null;
     }
     hasChildren(object) {
       return true;
     }
     preview(object) {
-      let libraryNames = dart.dsend(dart.getDartLibraryName(object), 'split', '/');
-      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1))) {
+      let libraryNames = dart.dsend(dart.getModuleName(object), 'split', '/');
+      if (dart.test(dart.dsend(dart.dload(libraryNames, 'length'), '>', 1)) && dart.equals(dart.dload(libraryNames, 'last'), dart.dindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 2)))) {
         dart.dsetindex(libraryNames, dart.dsend(dart.dload(libraryNames, 'length'), '-', 1), '');
       }
       return dart.str`Library Module: ${dart.dsend(libraryNames, 'join', '/')}`;
@@ -3671,7 +3728,6 @@
       let children = LinkedHashSetOfNameValuePair().new();
       for (let name of _debugger.getOwnPropertyNames(object)) {
         let value = _debugger.safeGetProperty(object, name);
-        name = dart.str`${name[dartx.replaceAll]("__", "/")}.dart`;
         children.add(new _debugger.NameValuePair({name: name, value: new _debugger.Library(name, value), hideName: true}));
       }
       return children.toList();
@@ -3701,36 +3757,16 @@
     }
     children(object) {
       let children = LinkedHashSetOfNameValuePair().new();
-      let nonGenericProperties = LinkedHashMapOfString$Object().new();
       let objectProperties = _debugger.safeProperties(dart.dload(object, 'object'));
       dart.dsend(objectProperties, 'forEach', dart.fn((name, value) => {
-        let genericTypeConstructor = dart.getGenericTypeCtor(value);
-        if (genericTypeConstructor != null) {
-          this.recordGenericParameters(core.String._check(name), genericTypeConstructor);
-        } else {
-          nonGenericProperties._set(core.String._check(name), value);
-        }
+        if (dart.getGenericTypeCtor(value) != null) return;
+        children.add(_debugger.NameValuePair._check(dart.test(dart.isType(value)) ? this.classChild(core.String._check(name), value) : new _debugger.NameValuePair({name: core.String._check(name), value: value})));
       }, dynamicAnddynamicToNull()));
-      nonGenericProperties.forEach(dart.fn((name, value) => {
-        if (core.Type.is(value)) {
-          children.add(_debugger.NameValuePair._check(this.classChild(name, value)));
-        } else {
-          children.add(new _debugger.NameValuePair({name: name, value: value}));
-        }
-      }, StringAndObjectToNull()));
       return children.toList();
     }
-    recordGenericParameters(name, genericTypeConstructor) {
-      this.genericParameters._set(name, genericTypeConstructor.toString()[dartx.split](' =>')[dartx.first][dartx.replaceAll](core.RegExp.new('[(|)]'), ''));
-    }
     classChild(name, child) {
-      let typeName = _debugger.getTypeName(core.Type._check(child));
-      let parameterName = dart.str`${name}\$`;
-      if (dart.test(this.genericParameters.keys[dartx.contains](parameterName))) {
-        typeName = dart.str`${typeName}<${this.genericParameters._get(parameterName)}>`;
-        _debugger.JSNative.setProperty(child, 'genericTypeName', typeName);
-      }
-      return new _debugger.NameValuePair({name: typeName, value: child});
+      let typeName = _debugger.getTypeName(child);
+      return new _debugger.NameValuePair({name: typeName, value: child, config: _debugger.JsonMLConfig.asClass});
     }
   };
   _debugger.LibraryFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -3741,7 +3777,6 @@
       hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
       preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic]),
-      recordGenericParameters: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object]),
       classChild: dart.definiteFunctionType(dart.dynamic, [core.String, core.Object])
     })
   });
@@ -3958,60 +3993,49 @@
   });
   _debugger.ClassFormatter = class ClassFormatter extends core.Object {
     accept(object, config) {
-      return core.Type.is(object) || dart.equals(config, _debugger.JsonMLConfig.asClass);
+      return dart.equals(config, _debugger.JsonMLConfig.asClass);
     }
-    preview(object) {
-      let typeName = _debugger.safeGetProperty(object, 'genericTypeName');
-      if (typeName != null) return core.String._check(typeName);
-      let type = _debugger._getType(object);
+    preview(type) {
       let implements$ = dart.getImplements(type);
-      typeName = _debugger.getTypeName(core.Type._check(type));
+      let typeName = _debugger.getTypeName(type);
       if (implements$ != null) {
         let typeNames = dart.dsend(dart.dcall(implements$), 'map', _debugger.getTypeName);
         return dart.str`${typeName} implements ${dart.dsend(typeNames, 'join', ", ")}`;
       } else {
-        return core.String._check(typeName);
+        return typeName;
       }
     }
     hasChildren(object) {
       return true;
     }
-    children(object) {
-      let type = _debugger._getType(object);
-      let children = JSArrayOfNameValuePair().of([]);
-      let typeName = _debugger.getTypeName(core.Type._check(_debugger._getType(object)));
+    children(type) {
+      let ret = LinkedHashSetOfNameValuePair().new();
+      let staticProperties = SetOfNameValuePair().new();
+      let staticMethods = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getStaticFieldSig(type), staticProperties, type, false);
+      _debugger.addPropertiesFromSignature(dart.getStaticGetterSig(type), staticProperties, type, false);
+      _debugger.addPropertiesFromSignature(dart.getStaticSig(type), staticMethods, type, false);
+      if (dart.test(staticProperties.isNotEmpty) || dart.test(staticMethods.isNotEmpty)) {
+        ret.add(new _debugger.NameValuePair({value: '[[Static members]]', hideName: true}));
+        ret.addAll(_debugger.sortProperties(staticProperties));
+        ret.addAll(_debugger.sortProperties(staticMethods));
+      }
+      let instanceMethods = SetOfNameValuePair().new();
+      _debugger.addPropertiesFromSignature(dart.getMethodSig(type), instanceMethods, type.prototype, false, {tagTypes: true});
+      if (dart.test(instanceMethods.isNotEmpty)) {
+        ret.add(new _debugger.NameValuePair({value: '[[Instance Methods]]', hideName: true}));
+        ret.addAll(_debugger.sortProperties(instanceMethods));
+      }
+      let typeName = _debugger.getTypeName(type);
       let mixins = dart.getMixins(type);
       if (mixins != null && dart.test(dart.dload(mixins, 'isNotEmpty'))) {
-        children[dartx.add](new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
+        ret.add(new _debugger.NameValuePair({name: '[[Mixins]]', value: new _debugger.HeritageClause('mixins', core.List._check(mixins))}));
       }
-      let hiddenProperties = JSArrayOfString().of(['length', 'name', 'prototype', 'genericTypeName']);
-      for (let name of _debugger.getOwnPropertyNames(object)) {
-        if (dart.test(hiddenProperties[dartx.contains](name))) continue;
-        let value = _debugger.safeGetProperty(object, name);
-        if (value != null && dart.getIsNamedConstructor(value) != null) {
-          value = new _debugger.NamedConstructor(value);
-          name = dart.str`${typeName}.${name}`;
-        }
-        children[dartx.add](new _debugger.NameValuePair({name: name, value: value}));
+      let baseProto = type.__proto__;
+      if (baseProto != null && !dart.test(dart.isJsInterop(baseProto))) {
+        ret.add(new _debugger.NameValuePair({name: "[[base class]]", value: baseProto, config: _debugger.JsonMLConfig.asClass}));
       }
-      let hiddenPrototypeProperties = JSArrayOfString().of(['constructor', 'new', '$identityHash']);
-      let prototype = object.prototype;
-      if (prototype != null) {
-        for (let name of _debugger.getOwnPropertyNames(prototype)) {
-          if (dart.test(hiddenPrototypeProperties[dartx.contains](name))) continue;
-          let func = _debugger.safeGetProperty(prototype, name);
-          let constructor = _debugger.safeGetProperty(prototype, 'constructor');
-          let sigObj = dart.getMethodSig(constructor);
-          if (sigObj != null) {
-            let value = _debugger.safeGetProperty(sigObj, name);
-            if (_debugger.getTypeName(core.Type._check(dart.getReifiedType(value))) != 'Null') {
-              dart.tag(func, value);
-              children[dartx.add](new _debugger.NameValuePair({name: name, value: func}));
-            }
-          }
-        }
-      }
-      return children;
+      return ret.toList();
     }
   };
   _debugger.ClassFormatter[dart.implements] = () => [_debugger.Formatter];
@@ -4023,11 +4047,42 @@
       children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
     })
   });
+  _debugger.TypeFormatter = class TypeFormatter extends core.Object {
+    accept(object, config) {
+      return core.Type.is(object);
+    }
+    preview(object) {
+      return dart.toString(object);
+    }
+    hasChildren(object) {
+      return false;
+    }
+    children(object) {
+      return JSArrayOfNameValuePair().of([]);
+    }
+  };
+  _debugger.TypeFormatter[dart.implements] = () => [_debugger.Formatter];
+  dart.setSignature(_debugger.TypeFormatter, {
+    methods: () => ({
+      accept: dart.definiteFunctionType(core.bool, [dart.dynamic, dart.dynamic]),
+      preview: dart.definiteFunctionType(core.String, [dart.dynamic]),
+      hasChildren: dart.definiteFunctionType(core.bool, [dart.dynamic]),
+      children: dart.definiteFunctionType(core.List$(_debugger.NameValuePair), [dart.dynamic])
+    })
+  });
   _debugger.registerDevtoolsFormatter = function() {
     let formatters = JSArrayOfJsonMLFormatter().of([_debugger._devtoolsFormatter]);
     dart.global.devtoolsFormatters = formatters;
   };
   dart.fn(_debugger.registerDevtoolsFormatter, VoidTodynamic$());
+  _debugger.getModuleNames = function() {
+    return dart.getModuleNames();
+  };
+  dart.fn(_debugger.getModuleNames, VoidTodynamic$());
+  _debugger.getModuleLibraries = function(name) {
+    return dart.getModuleLibraries(name);
+  };
+  dart.lazyFn(_debugger.getModuleLibraries, () => StringTodynamic());
   _foreign_helper.JS = function(typeDescription, codeTemplate, arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11) {
     if (arg0 === void 0) arg0 = null;
     if (arg1 === void 0) arg1 = null;
@@ -4361,7 +4416,7 @@
         IterableOfE()._check(iterable);
         this[dartx.checkGrowable]('insertAll');
         core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable)) {
+        if (!_internal.EfficientLengthIterable.is(iterable)) {
           iterable = iterable[dartx.toList]();
         }
         let insertionLength = iterable[dartx.length];
@@ -4634,7 +4689,7 @@
         IterableOfE()._check(replacement);
         this[dartx.checkGrowable]('replace range');
         core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(replacement)) {
+        if (!_internal.EfficientLengthIterable.is(replacement)) {
           replacement = replacement[dartx.toList]();
         }
         let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6349,21 +6404,20 @@
         this[_filter](test, true);
       }
       [_filter](test, retainMatching) {
-        let source = this;
         let retained = JSArrayOfE().of([]);
-        let length = source[dartx.length];
+        let length = this[dartx.length];
         for (let i = 0; i < dart.notNull(length); i++) {
-          let element = source[dartx._get](i);
+          let element = this[dartx._get](i);
           if (dart.dcall(test, element) == retainMatching) {
             retained[dartx.add](element);
           }
-          if (length != source[dartx.length]) {
-            dart.throw(new core.ConcurrentModificationError(source));
+          if (length != this[dartx.length]) {
+            dart.throw(new core.ConcurrentModificationError(this));
           }
         }
-        if (retained[dartx.length] != source[dartx.length]) {
-          source[dartx.setRange](0, retained[dartx.length], retained);
-          source[dartx.length] = retained[dartx.length];
+        if (retained[dartx.length] != this[dartx.length]) {
+          this[dartx.setRange](0, retained[dartx.length], retained);
+          this[dartx.length] = retained[dartx.length];
         }
       }
       clear() {
@@ -6379,11 +6433,10 @@
       }
       sort(compare) {
         if (compare === void 0) compare = null;
-        if (compare == null) {
-          _internal.Sort.sort(E)(this, dart.fn((a, b) => core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b)), dynamicAnddynamicToint()));
-        } else {
-          _internal.Sort.sort(E)(this, compare);
-        }
+        _internal.Sort.sort(E)(this, (compare != null ? compare : collection.ListMixin._compareAny));
+      }
+      static _compareAny(a, b) {
+        return core.Comparable.compare(core.Comparable._check(a), core.Comparable._check(b));
       }
       shuffle(random) {
         if (random === void 0) random = null;
@@ -6463,7 +6516,7 @@
       replaceRange(start, end, newContents) {
         IterableOfE()._check(newContents);
         core.RangeError.checkValidRange(start, end, this[dartx.length]);
-        if (!_internal.EfficientLength.is(newContents)) {
+        if (!_internal.EfficientLengthIterable.is(newContents)) {
           newContents = newContents[dartx.toList]();
         }
         let removeLength = dart.notNull(end) - dart.notNull(start);
@@ -6541,7 +6594,7 @@
       insertAll(index, iterable) {
         IterableOfE()._check(iterable);
         core.RangeError.checkValueInInterval(index, 0, this[dartx.length], "index");
-        if (!_internal.EfficientLength.is(iterable) || core.identical(iterable, this)) {
+        if (!_internal.EfficientLengthIterable.is(iterable) || core.identical(iterable, this)) {
           iterable = iterable[dartx.toList]();
         }
         let insertionLength = iterable[dartx.length];
@@ -6630,7 +6683,9 @@
         removeAt: dart.definiteFunctionType(E, [core.int]),
         insertAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()]),
         setAll: dart.definiteFunctionType(dart.void, [core.int, IterableOfE()])
-      })
+      }),
+      statics: () => ({_compareAny: dart.definiteFunctionType(core.int, [dart.dynamic, dart.dynamic])}),
+      names: ['_compareAny']
     });
     dart.defineExtensionMembers(ListMixin, [
       'elementAt',
@@ -6889,7 +6944,66 @@
     names: ['stringOf']
   });
   dart.defineExtensionMembers(_internal.CodeUnits, ['_get', 'length']);
-  _internal.EfficientLength = class EfficientLength extends core.Object {};
+  _internal.ExternalName = class ExternalName extends core.Object {
+    new(name) {
+      this.name = name;
+    }
+  };
+  dart.setSignature(_internal.ExternalName, {
+    fields: () => ({name: core.String})
+  });
+  _internal.hexDigitValue = function(char) {
+    dart.assert(dart.notNull(char) >= 0 && dart.notNull(char) <= 65535);
+    let digit0 = 48;
+    let a = 97;
+    let f = 102;
+    let digit = (dart.notNull(char) ^ digit0) >>> 0;
+    if (digit <= 9) return digit;
+    let letter = (dart.notNull(char) | 32) >>> 0;
+    if (a <= letter && letter <= f) return letter - (a - 10);
+    return -1;
+  };
+  dart.fn(_internal.hexDigitValue, intToint());
+  _internal.parseHexByte = function(source, index) {
+    dart.assert(dart.notNull(index) + 2 <= dart.notNull(source[dartx.length]));
+    let digit1 = _internal.hexDigitValue(source[dartx.codeUnitAt](index));
+    let digit2 = _internal.hexDigitValue(source[dartx.codeUnitAt](dart.notNull(index) + 1));
+    return dart.notNull(digit1) * 16 + dart.notNull(digit2) - (dart.notNull(digit2) & 256);
+  };
+  dart.lazyFn(_internal.parseHexByte, () => StringAndintToint());
+  const _name$ = Symbol('_name');
+  const _nativeSymbol = Symbol('_nativeSymbol');
+  _internal.PrivateSymbol = class PrivateSymbol extends core.Object {
+    new(name, nativeSymbol) {
+      this[_name$] = name;
+      this[_nativeSymbol] = nativeSymbol;
+    }
+    static getName(symbol) {
+      return _internal.PrivateSymbol.as(symbol)[_name$];
+    }
+    static getNativeSymbol(symbol) {
+      if (_internal.PrivateSymbol.is(symbol)) return symbol[_nativeSymbol];
+      return null;
+    }
+    ['=='](other) {
+      return _internal.PrivateSymbol.is(other) && core.identical(this[_nativeSymbol], other[_nativeSymbol]);
+    }
+    toString() {
+      return dart.str`Symbol("${this[_name$]}")`;
+    }
+  };
+  _internal.PrivateSymbol[dart.implements] = () => [core.Symbol];
+  dart.setSignature(_internal.PrivateSymbol, {
+    fields: () => ({
+      [_name$]: core.String,
+      [_nativeSymbol]: core.Object
+    }),
+    statics: () => ({
+      getName: dart.definiteFunctionType(core.String, [core.Symbol]),
+      getNativeSymbol: dart.definiteFunctionType(core.Object, [core.Symbol])
+    }),
+    names: ['getName', 'getNativeSymbol']
+  });
   core.Iterable$ = dart.generic(E => {
     let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
     let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
@@ -7028,7 +7142,7 @@
         return SetOfE().from(this);
       }
       get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
+        dart.assert(!_internal.EfficientLengthIterable.is(this));
         let count = 0;
         let it = this[dartx.iterator];
         while (dart.test(it.moveNext())) {
@@ -7197,6 +7311,15 @@
     return Iterable;
   });
   core.Iterable = Iterable();
+  _internal.EfficientLengthIterable$ = dart.generic(T => {
+    class EfficientLengthIterable extends core.Iterable$(T) {
+      new() {
+        super.new();
+      }
+    }
+    return EfficientLengthIterable;
+  });
+  _internal.EfficientLengthIterable = EfficientLengthIterable();
   _internal.ListIterable$ = dart.generic(E => {
     let ListIteratorOfE = () => (ListIteratorOfE = dart.constFn(_internal.ListIterator$(E)))();
     let VoidToE = () => (VoidToE = dart.constFn(dart.functionType(E, [])))();
@@ -7206,7 +7329,7 @@
     let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListIterable extends core.Iterable$(E) {
+    class ListIterable extends _internal.EfficientLengthIterable$(E) {
       new() {
         super.new();
       }
@@ -7413,7 +7536,6 @@
         return result;
       }
     }
-    ListIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(ListIterable, {
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({reduce: dart.definiteFunctionType(E, [dynamicAndEToE()])})
@@ -7612,7 +7734,7 @@
     let _TransformationOfS$T = () => (_TransformationOfS$T = dart.constFn(_internal._Transformation$(S, T)))();
     class MappedIterable extends core.Iterable$(T) {
       static new(iterable, func) {
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthMappedIterableOfS$T())(iterable, func);
         }
         return new (MappedIterableOfS$T())._(iterable, func);
@@ -7665,12 +7787,13 @@
   });
   _internal.MappedIterable = MappedIterable();
   _internal.EfficientLengthMappedIterable$ = dart.generic((S, T) => {
+    let EfficientLengthIterableOfT = () => (EfficientLengthIterableOfT = dart.constFn(_internal.EfficientLengthIterable$(T)))();
     class EfficientLengthMappedIterable extends _internal.MappedIterable$(S, T) {
       new(iterable, func) {
         super._(iterable, func);
       }
     }
-    EfficientLengthMappedIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthMappedIterable[dart.implements] = () => [EfficientLengthIterableOfT()];
     return EfficientLengthMappedIterable;
   });
   _internal.EfficientLengthMappedIterable = EfficientLengthMappedIterable();
@@ -7731,7 +7854,6 @@
         return this[_f](this[_source][dartx.elementAt](index));
       }
     }
-    MappedListIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(MappedListIterable, {
       fields: () => ({
         [_source]: IterableOfS(),
@@ -7760,6 +7882,11 @@
       get iterator() {
         return new (WhereIteratorOfE())(this[_iterable$][dartx.iterator], this[_f]);
       }
+      map(T) {
+        return f => {
+          return new (_internal.MappedIterable$(E, T))._(this, f);
+        };
+      }
     }
     dart.setSignature(WhereIterable, {
       fields: () => ({
@@ -7768,13 +7895,12 @@
       }),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
     });
-    dart.defineExtensionMembers(WhereIterable, ['iterator']);
+    dart.defineExtensionMembers(WhereIterable, ['map', 'iterator']);
     return WhereIterable;
   });
   _internal.WhereIterable = WhereIterable();
   _internal.WhereIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _ElementPredicateOfE = () => (_ElementPredicateOfE = dart.constFn(_internal._ElementPredicate$(E)))();
     class WhereIterator extends core.Iterator$(E) {
       new(iterator, f) {
         this[_iterator] = iterator;
@@ -7782,7 +7908,7 @@
       }
       moveNext() {
         while (dart.test(this[_iterator].moveNext())) {
-          if (dart.test(this[_f](this[_iterator].current))) {
+          if (dart.test(dart.dcall(this[_f], this[_iterator].current))) {
             return true;
           }
         }
@@ -7795,7 +7921,7 @@
     dart.setSignature(WhereIterator, {
       fields: () => ({
         [_iterator]: IteratorOfE(),
-        [_f]: _ElementPredicateOfE()
+        [_f]: _internal._ElementPredicate
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -7890,7 +8016,7 @@
         if (!(typeof takeCount == 'number') || dart.notNull(takeCount) < 0) {
           dart.throw(new core.ArgumentError(takeCount));
         }
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthTakeIterableOfE())(iterable, takeCount);
         }
         return new (TakeIterableOfE())._(iterable, takeCount);
@@ -7917,6 +8043,7 @@
   });
   _internal.TakeIterable = TakeIterable();
   _internal.EfficientLengthTakeIterable$ = dart.generic(E => {
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class EfficientLengthTakeIterable extends _internal.TakeIterable$(E) {
       new(iterable, takeCount) {
         super._(iterable, takeCount);
@@ -7927,7 +8054,7 @@
         return iterableLength;
       }
     }
-    EfficientLengthTakeIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthTakeIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
     dart.setSignature(EfficientLengthTakeIterable, {});
     dart.defineExtensionMembers(EfficientLengthTakeIterable, ['length']);
     return EfficientLengthTakeIterable;
@@ -8034,7 +8161,7 @@
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
     class SkipIterable extends core.Iterable$(E) {
       static new(iterable, count) {
-        if (_internal.EfficientLength.is(iterable)) {
+        if (_internal.EfficientLengthIterable.is(iterable)) {
           return new (EfficientLengthSkipIterableOfE())(iterable, count);
         }
         return new (SkipIterableOfE())._(iterable, count);
@@ -8072,6 +8199,7 @@
   });
   _internal.SkipIterable = SkipIterable();
   _internal.EfficientLengthSkipIterable$ = dart.generic(E => {
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class EfficientLengthSkipIterable extends _internal.SkipIterable$(E) {
       new(iterable, skipCount) {
         super._(iterable, skipCount);
@@ -8082,7 +8210,7 @@
         return 0;
       }
     }
-    EfficientLengthSkipIterable[dart.implements] = () => [_internal.EfficientLength];
+    EfficientLengthSkipIterable[dart.implements] = () => [EfficientLengthIterableOfE()];
     dart.setSignature(EfficientLengthSkipIterable, {});
     dart.defineExtensionMembers(EfficientLengthSkipIterable, ['length']);
     return EfficientLengthSkipIterable;
@@ -8186,7 +8314,7 @@
     let SetOfE = () => (SetOfE = dart.constFn(core.Set$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class EmptyIterable extends core.Iterable$(E) {
+    class EmptyIterable extends _internal.EfficientLengthIterable$(E) {
       new() {
         super.new();
       }
@@ -8282,7 +8410,6 @@
         return SetOfE().new();
       }
     }
-    EmptyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(EmptyIterable, {
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({singleWhere: dart.definiteFunctionType(E, [ETobool()], {orElse: VoidToE()})})
@@ -8671,79 +8798,6 @@
     };
   };
   dart.lazyFn(_internal.makeFixedListUnmodifiable, () => ListOfEToListOfE());
-  _internal.Lists = class Lists extends core.Object {
-    static copy(src, srcStart, dst, dstStart, count) {
-      if (dart.notNull(srcStart) < dart.notNull(dstStart)) {
-        for (let i = dart.notNull(srcStart) + dart.notNull(count) - 1, j = dart.notNull(dstStart) + dart.notNull(count) - 1; i >= dart.notNull(srcStart); i--, j--) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      } else {
-        for (let i = srcStart, j = dstStart; dart.notNull(i) < dart.notNull(srcStart) + dart.notNull(count); i = dart.notNull(i) + 1, j = dart.notNull(j) + 1) {
-          dst[dartx._set](j, src[dartx._get](i));
-        }
-      }
-    }
-    static areEqual(a, b) {
-      if (core.identical(a, b)) return true;
-      if (!core.List.is(b)) return false;
-      let length = a[dartx.length];
-      if (!dart.equals(length, dart.dload(b, 'length'))) return false;
-      for (let i = 0; i < dart.notNull(length); i++) {
-        if (!core.identical(a[dartx._get](i), dart.dindex(b, i))) return false;
-      }
-      return true;
-    }
-    static indexOf(a, element, startIndex, endIndex) {
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) < 0) {
-        startIndex = 0;
-      }
-      for (let i = startIndex; dart.notNull(i) < dart.notNull(endIndex); i = dart.notNull(i) + 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static lastIndexOf(a, element, startIndex) {
-      if (dart.notNull(startIndex) < 0) {
-        return -1;
-      }
-      if (dart.notNull(startIndex) >= dart.notNull(a[dartx.length])) {
-        startIndex = dart.notNull(a[dartx.length]) - 1;
-      }
-      for (let i = startIndex; dart.notNull(i) >= 0; i = dart.notNull(i) - 1) {
-        if (dart.equals(a[dartx._get](i), element)) {
-          return i;
-        }
-      }
-      return -1;
-    }
-    static indicesCheck(a, start, end) {
-      core.RangeError.checkValidRange(start, end, a[dartx.length]);
-    }
-    static rangeCheck(a, start, length) {
-      core.RangeError.checkNotNegative(length);
-      core.RangeError.checkNotNegative(start);
-      if (dart.notNull(start) + dart.notNull(length) > dart.notNull(a[dartx.length])) {
-        let message = dart.str`${start} + ${length} must be in the range [0..${a[dartx.length]}]`;
-        dart.throw(new core.RangeError.range(length, 0, dart.notNull(a[dartx.length]) - dart.notNull(start), "length", message));
-      }
-    }
-  };
-  dart.setSignature(_internal.Lists, {
-    statics: () => ({
-      copy: dart.definiteFunctionType(dart.void, [core.List, core.int, core.List, core.int, core.int]),
-      areEqual: dart.definiteFunctionType(core.bool, [core.List, dart.dynamic]),
-      indexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int, core.int]),
-      lastIndexOf: dart.definiteFunctionType(core.int, [core.List, core.Object, core.int]),
-      indicesCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int]),
-      rangeCheck: dart.definiteFunctionType(dart.void, [core.List, core.int, core.int])
-    }),
-    names: ['copy', 'areEqual', 'indexOf', 'lastIndexOf', 'indicesCheck', 'rangeCheck']
-  });
   _internal.printToZone = null;
   _internal.printToConsole = function(line) {
     _js_primitives.printString(dart.str`${line}`);
@@ -8989,27 +9043,18 @@
     names: ['sort', 'sortRange', '_doSort', '_insertionSort', '_dualPivotQuicksort']
   });
   _internal.Sort._INSERTION_SORT_THRESHOLD = 32;
-  const _name$ = Symbol('_name');
-  const _nativeSymbol = Symbol('_nativeSymbol');
   _internal.Symbol = class Symbol extends core.Object {
     new(name) {
       this[_name$] = name;
-      this[_nativeSymbol] = null;
-    }
-    es6(name, nativeSymbol) {
-      this[_name$] = name;
-      this[_nativeSymbol] = nativeSymbol;
     }
     unvalidated(name) {
       this[_name$] = name;
-      this[_nativeSymbol] = null;
     }
     validated(name) {
       this[_name$] = _internal.Symbol.validatePublicSymbol(name);
-      this[_nativeSymbol] = null;
     }
     ['=='](other) {
-      return _internal.Symbol.is(other) && this[_name$] == other[_name$] && dart.equals(this[_nativeSymbol], other[_nativeSymbol]);
+      return _internal.Symbol.is(other) && this[_name$] == other[_name$];
     }
     get hashCode() {
       let hash = this._hashCode;
@@ -9025,9 +9070,6 @@
     static getName(symbol) {
       return symbol[_name$];
     }
-    static getNativeSymbol(symbol) {
-      return symbol[_nativeSymbol];
-    }
     static validatePublicSymbol(name) {
       if (dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.publicSymbolPattern.hasMatch(name))) return name;
       if (dart.test(name[dartx.startsWith]('_'))) {
@@ -9039,23 +9081,17 @@
       return dart.test(name[dartx.isEmpty]) || dart.test(_internal.Symbol.symbolPattern.hasMatch(name));
     }
   };
-  dart.defineNamedConstructor(_internal.Symbol, 'es6');
   dart.defineNamedConstructor(_internal.Symbol, 'unvalidated');
   dart.defineNamedConstructor(_internal.Symbol, 'validated');
   _internal.Symbol[dart.implements] = () => [core.Symbol];
   dart.setSignature(_internal.Symbol, {
-    fields: () => ({
-      [_name$]: core.String,
-      [_nativeSymbol]: dart.dynamic
-    }),
-    methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])}),
+    fields: () => ({[_name$]: core.String}),
     statics: () => ({
       getName: dart.definiteFunctionType(core.String, [_internal.Symbol]),
-      getNativeSymbol: dart.definiteFunctionType(dart.dynamic, [_internal.Symbol]),
       validatePublicSymbol: dart.definiteFunctionType(core.String, [core.String]),
       isValidSymbol: dart.definiteFunctionType(core.bool, [core.String])
     }),
-    names: ['getName', 'getNativeSymbol', 'validatePublicSymbol', 'isValidSymbol']
+    names: ['getName', 'validatePublicSymbol', 'isValidSymbol']
   });
   _internal.Symbol.reservedWordRE = '(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|' + 'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|' + 'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|' + 'v(?:ar|oid)|w(?:hile|ith))';
   _internal.Symbol.operatorRE = '(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
@@ -9238,8 +9274,8 @@
       this.weakPorts = SetOfint().new();
       this.isolateStatics = _foreign_helper.JS_CREATE_ISOLATE();
       this.controlPort = new _isolate_helper.RawReceivePortImpl._controlPort();
-      this.pauseCapability = isolate.Capability.new();
-      this.terminateCapability = isolate.Capability.new();
+      this.pauseCapability = isolate$.Capability.new();
+      this.terminateCapability = isolate$.Capability.new();
       this.delayedEvents = JSArrayOf_IsolateEvent().of([]);
       this.pauseTokens = SetOfCapability().new();
       this.errorPorts = SetOfSendPort().new();
@@ -9286,7 +9322,7 @@
       this.errorsAreFatal = errorsAreFatal;
     }
     handlePing(responsePort, pingType) {
-      if (pingType == isolate.Isolate.IMMEDIATE || pingType == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      if (pingType == isolate$.Isolate.IMMEDIATE || pingType == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
         responsePort.send(null);
         return;
       }
@@ -9294,11 +9330,7 @@
         responsePort.send(null);
       }
       dart.fn(respond, VoidTovoid$());
-      if (pingType == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, respond, "ping");
-        return;
-      }
-      dart.assert(pingType == isolate.Isolate.BEFORE_NEXT_EVENT);
+      dart.assert(pingType == isolate$.Isolate.BEFORE_NEXT_EVENT);
       if (this[_scheduledControlEvents] == null) {
         this[_scheduledControlEvents] = collection.Queue.new();
       }
@@ -9306,15 +9338,11 @@
     }
     handleKill(authentification, priority) {
       if (!dart.equals(this.terminateCapability, authentification)) return;
-      if (priority == isolate.Isolate.IMMEDIATE || priority == isolate.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
+      if (priority == isolate$.Isolate.IMMEDIATE || priority == isolate$.Isolate.BEFORE_NEXT_EVENT && !dart.test(this[_isExecutingEvent])) {
         this.kill();
         return;
       }
-      if (priority == isolate.Isolate.AS_EVENT) {
-        _isolate_helper._globalState.topEventLoop.enqueue(this, dart.bind(this, 'kill'), "kill");
-        return;
-      }
-      dart.assert(priority == isolate.Isolate.BEFORE_NEXT_EVENT);
+      dart.assert(priority == isolate$.Isolate.BEFORE_NEXT_EVENT);
       if (this[_scheduledControlEvents] == null) {
         this[_scheduledControlEvents] = collection.Queue.new();
       }
@@ -9382,47 +9410,47 @@
       switch (dart.dindex(message, 0)) {
         case "pause":
         {
-          this.addPause(isolate.Capability._check(dart.dindex(message, 1)), isolate.Capability._check(dart.dindex(message, 2)));
+          this.addPause(isolate$.Capability._check(dart.dindex(message, 1)), isolate$.Capability._check(dart.dindex(message, 2)));
           break;
         }
         case "resume":
         {
-          this.removePause(isolate.Capability._check(dart.dindex(message, 1)));
+          this.removePause(isolate$.Capability._check(dart.dindex(message, 1)));
           break;
         }
         case 'add-ondone':
         {
-          this.addDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.addDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case 'remove-ondone':
         {
-          this.removeDoneListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.removeDoneListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case 'set-errors-fatal':
         {
-          this.setErrorsFatal(isolate.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
+          this.setErrorsFatal(isolate$.Capability._check(dart.dindex(message, 1)), core.bool._check(dart.dindex(message, 2)));
           break;
         }
         case "ping":
         {
-          this.handlePing(isolate.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+          this.handlePing(isolate$.SendPort._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
           break;
         }
         case "kill":
         {
-          this.handleKill(isolate.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
+          this.handleKill(isolate$.Capability._check(dart.dindex(message, 1)), core.int._check(dart.dindex(message, 2)));
           break;
         }
         case "getErrors":
         {
-          this.addErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.addErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         case "stopErrors":
         {
-          this.removeErrorListener(isolate.SendPort._check(dart.dindex(message, 1)));
+          this.removeErrorListener(isolate$.SendPort._check(dart.dindex(message, 1)));
           break;
         }
         default:
@@ -9465,7 +9493,7 @@
       this.errorPorts.clear();
       if (this.doneHandlers != null) {
         for (let port of core.Iterable._check(this.doneHandlers)) {
-          isolate.SendPort._check(port);
+          isolate$.SendPort._check(port);
           port.send(null);
         }
         this.doneHandlers = null;
@@ -9485,8 +9513,8 @@
       weakPorts: SetOfint(),
       isolateStatics: dart.dynamic,
       controlPort: _isolate_helper.RawReceivePortImpl,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability,
+      pauseCapability: isolate$.Capability,
+      terminateCapability: isolate$.Capability,
       initialized: core.bool,
       isPaused: core.bool,
       delayedEvents: ListOf_IsolateEvent(),
@@ -9498,15 +9526,15 @@
       errorPorts: SetOfSendPort()
     }),
     methods: () => ({
-      addPause: dart.definiteFunctionType(dart.void, [isolate.Capability, isolate.Capability]),
-      removePause: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate.Capability, core.bool]),
-      handlePing: dart.definiteFunctionType(dart.void, [isolate.SendPort, core.int]),
-      handleKill: dart.definiteFunctionType(dart.void, [isolate.Capability, core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+      addPause: dart.definiteFunctionType(dart.void, [isolate$.Capability, isolate$.Capability]),
+      removePause: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      addDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeDoneListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      setErrorsFatal: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.bool]),
+      handlePing: dart.definiteFunctionType(dart.void, [isolate$.SendPort, core.int]),
+      handleKill: dart.definiteFunctionType(dart.void, [isolate$.Capability, core.int]),
+      addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
       handleUncaughtError: dart.definiteFunctionType(dart.void, [dart.dynamic, core.StackTrace]),
       eval: dart.definiteFunctionType(dart.dynamic, [core.Function]),
       [_setGlobals]: dart.definiteFunctionType(dart.void, []),
@@ -9707,7 +9735,7 @@
           let replyTo = _isolate_helper._deserializeMessage(dart.dindex(msg, 'replyTo'));
           let context = new _isolate_helper._IsolateContext();
           _isolate_helper._globalState.topEventLoop.enqueue(context, dart.fn(() => {
-            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate.SendPort._check(replyTo));
+            _isolate_helper.IsolateNatives._startIsolate(entryPoint, ListOfString()._check(args), message, core.bool._check(isSpawnUri), core.bool._check(startPaused), isolate$.SendPort._check(replyTo));
           }, VoidToNull()), 'worker-start');
           _isolate_helper._globalState.currentContext = context;
           _isolate_helper._globalState.topEventLoop.run();
@@ -9720,7 +9748,7 @@
         }
         case 'message':
         {
-          let port = isolate.SendPort._check(dart.dindex(msg, 'port'));
+          let port = isolate$.SendPort._check(dart.dindex(msg, 'port'));
           if (port != null) {
             dart.dsend(dart.dindex(msg, 'port'), 'send', dart.dindex(msg, 'msg'));
           }
@@ -9808,7 +9836,7 @@
       if (uri != null && dart.test(uri[dartx.endsWith](".dart"))) {
         uri = dart.notNull(uri) + ".js";
       }
-      let port = isolate.ReceivePort.new();
+      let port = isolate$.ReceivePort.new();
       let completer = CompleterOfList().new();
       port.first.then(dart.dynamic)(dart.fn(msg => {
         if (dart.equals(dart.dindex(msg, 0), _isolate_helper._SPAWNED_SIGNAL)) {
@@ -9847,7 +9875,7 @@
     }
     static get currentIsolate() {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
-      return new isolate.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
+      return new isolate$.Isolate(context.controlPort.sendPort, {pauseCapability: context.pauseCapability, terminateCapability: context.terminateCapability});
     }
     static _startIsolate(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
       let context = _isolate_helper._IsolateContext._check(_foreign_helper.JS_CURRENT_ISOLATE_CONTEXT());
@@ -9925,10 +9953,10 @@
       spawnFunction: dart.definiteFunctionType(async.Future$(core.List), [dynamicTovoid(), dart.dynamic, core.bool]),
       spawnUri: dart.definiteFunctionType(async.Future$(core.List), [core.Uri, ListOfString(), dart.dynamic, core.bool]),
       spawn: dart.definiteFunctionType(async.Future$(core.List), [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, core.bool]),
-      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
-      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort]),
-      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate.SendPort, StringTovoid()]),
+      _startWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
+      _startNonWorker: dart.definiteFunctionType(dart.void, [core.String, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+      _startIsolate: dart.definiteFunctionType(dart.void, [core.Function, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort]),
+      _spawnWorker: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String, ListOfString(), dart.dynamic, core.bool, core.bool, isolate$.SendPort, StringTovoid()]),
       workerOnError: dart.definiteFunctionType(core.bool, [dart.dynamic, core.String, StringTovoid()])
     }),
     names: ['computeThisScript', 'computeThisScriptJsshell', 'computeThisScriptD8', 'computeThisScriptFromTrace', '_getEventData', '_processWorkerMessage', 'handleSpawnWorkerRequest', '_log', '_consoleLog', '_getJSFunctionFromName', '_getJSFunctionName', '_allocate', 'spawnFunction', 'spawnUri', 'spawn', '_startWorker', '_startNonWorker', '_startIsolate', '_spawnWorker', 'workerOnError']
@@ -9955,10 +9983,10 @@
       }
     }
   };
-  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._BaseSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._BaseSendPort, {
     fields: () => ({[_isolateId]: core.int}),
-    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate.SendPort])})
+    methods: () => ({[_checkReplyTo]: dart.definiteFunctionType(dart.void, [isolate$.SendPort])})
   });
   const _receivePort = Symbol('_receivePort');
   const _isClosed = Symbol('_isClosed');
@@ -9990,7 +10018,7 @@
       return this[_receivePort][_id];
     }
   };
-  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._NativeJsSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._NativeJsSendPort, {
     fields: () => ({[_receivePort]: _isolate_helper.RawReceivePortImpl}),
     methods: () => ({send: dart.definiteFunctionType(dart.void, [dart.dynamic])})
@@ -10021,7 +10049,7 @@
       return (dart.notNull(this[_workerId]) << 16 ^ dart.notNull(this[_isolateId]) << 8 ^ dart.notNull(this[_receivePortId])) >>> 0;
     }
   };
-  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate.SendPort];
+  _isolate_helper._WorkerSendPort[dart.implements] = () => [isolate$.SendPort];
   dart.setSignature(_isolate_helper._WorkerSendPort, {
     fields: () => ({
       [_workerId]: core.int,
@@ -10079,14 +10107,14 @@
   };
   dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, 'weak');
   dart.defineNamedConstructor(_isolate_helper.RawReceivePortImpl, '_controlPort');
-  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate.RawReceivePort];
+  _isolate_helper.RawReceivePortImpl[dart.implements] = () => [isolate$.RawReceivePort];
   dart.setSignature(_isolate_helper.RawReceivePortImpl, {
     fields: () => ({
       [_id]: core.int,
       [_handler]: core.Function,
       [_isClosed]: core.bool
     }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+    getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
     setters: () => ({handler: dart.definiteFunctionType(dart.void, [core.Function])}),
     methods: () => ({
       [_close]: dart.definiteFunctionType(dart.void, []),
@@ -10232,7 +10260,8 @@
           }, VoidToNull()), onCancel: dart.fn(() => {
             if (timer != null) timer.cancel();
             timer = null;
-          }, VoidToNull())});
+            return async.Future._nullFuture;
+          }, VoidTo_Future())});
         return controller.stream;
       }
       static eventTransformed(source, mapSink) {
@@ -10291,9 +10320,7 @@
                 subscription.pause();
               }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
+              }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
           }
           return controller.stream;
         };
@@ -10331,9 +10358,7 @@
                 subscription.pause();
               }, VoidToNull()), onResume: dart.fn(() => {
                 subscription.resume();
-              }, VoidToNull()), onCancel: dart.fn(() => {
-                subscription.cancel();
-              }, VoidToNull()), sync: true});
+              }, VoidToNull()), onCancel: dart.fn(() => subscription.cancel(), VoidToFuture()), sync: true});
           }
           return controller.stream;
         };
@@ -10864,13 +10889,13 @@
   dart.addSimpleTypeTests(_isolate_helper.ReceivePortImpl);
   dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'weak');
   dart.defineNamedConstructor(_isolate_helper.ReceivePortImpl, 'fromRawReceivePort');
-  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate.ReceivePort];
+  _isolate_helper.ReceivePortImpl[dart.implements] = () => [isolate$.ReceivePort];
   dart.setSignature(_isolate_helper.ReceivePortImpl, {
     fields: () => ({
-      [_rawPort]: isolate.RawReceivePort,
+      [_rawPort]: isolate$.RawReceivePort,
       [_controller]: async.StreamController
     }),
-    getters: () => ({sendPort: dart.definiteFunctionType(isolate.SendPort, [])}),
+    getters: () => ({sendPort: dart.definiteFunctionType(isolate$.SendPort, [])}),
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       close: dart.definiteFunctionType(dart.void, [])
@@ -10983,7 +11008,7 @@
     }
   };
   dart.defineNamedConstructor(_isolate_helper.CapabilityImpl, '_internal');
-  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate.Capability];
+  _isolate_helper.CapabilityImpl[dart.implements] = () => [isolate$.Capability];
   dart.setSignature(_isolate_helper.CapabilityImpl, {
     fields: () => ({[_id]: core.int}),
     methods: () => ({'==': dart.definiteFunctionType(core.bool, [core.Object])})
@@ -11021,7 +11046,7 @@
       if (_js_helper.InternalMap.is(x)) return this.serializeMap(x);
       if (_interceptors.JSObject.is(x)) return this.serializeJSObject(x);
       if (_interceptors.Interceptor.is(x)) this.unsupported(x);
-      if (isolate.RawReceivePort.is(x)) {
+      if (isolate$.RawReceivePort.is(x)) {
         this.unsupported(x, "RawReceivePorts can't be transmitted:");
       }
       if (_isolate_helper._NativeJsSendPort.is(x)) return this.serializeJsSendPort(x);
@@ -11299,7 +11324,7 @@
     }
     deserializeRawSendPort(x) {
       dart.assert(dart.equals(dart.dindex(x, 0), 'raw sendport'));
-      let result = isolate.SendPort._check(dart.dindex(x, 1));
+      let result = isolate$.SendPort._check(dart.dindex(x, 1));
       this.deserializedObjects[dartx.add](result);
       return result;
     }
@@ -11351,8 +11376,8 @@
       deserializeMutable: dart.definiteFunctionType(core.List, [dart.dynamic]),
       deserializeConst: dart.definiteFunctionType(core.List, [dart.dynamic]),
       deserializeMap: dart.definiteFunctionType(core.Map, [_js_helper.InternalMap]),
-      deserializeSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
-      deserializeRawSendPort: dart.definiteFunctionType(isolate.SendPort, [dart.dynamic]),
+      deserializeSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
+      deserializeRawSendPort: dart.definiteFunctionType(isolate$.SendPort, [dart.dynamic]),
       deserializeJSObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic]),
       deserializeClosure: dart.definiteFunctionType(core.Function, [dart.dynamic]),
       deserializeDartObject: dart.definiteFunctionType(dart.dynamic, [dart.dynamic])
@@ -11389,6 +11414,11 @@
   _js_embedded_names.TYPEDEF_PREDICATE_PROPERTY_NAME = "$$isTypedef";
   _js_embedded_names.NATIVE_SUPERCLASS_TAG_NAME = "$nativeSuperclassTag";
   _js_embedded_names.MAP_TYPE_TO_INTERCEPTOR = "mapTypeToInterceptor";
+  dart.defineLazy(_js_helper, {
+    get _identityHashCode() {
+      return Symbol("_identityHashCode");
+    }
+  });
   _js_helper._Patch = class _Patch extends core.Object {
     new() {
     }
@@ -11408,10 +11438,10 @@
       _js_helper.Primitives.mirrorInvokeCacheName = dart.notNull(_js_helper.Primitives.mirrorInvokeCacheName) + dart.str`_${id}`;
     }
     static objectHashCode(object) {
-      let hash = object.$identityHash;
+      let hash = object[_js_helper._identityHashCode];
       if (hash == null) {
         hash = Math.random() * 0x3fffffff | 0;
-        object.$identityHash = hash;
+        object[_js_helper._identityHashCode] = hash;
       }
       return hash;
     }
@@ -12050,6 +12080,9 @@
     new() {
       super.new();
     }
+    toString() {
+      return super.toString();
+    }
   };
   _js_helper.FallThroughErrorImplementation = class FallThroughErrorImplementation extends core.FallThroughError {
     new() {
@@ -12072,13 +12105,18 @@
     fields: () => ({message: dart.dynamic})
   });
   core.AssertionError = class AssertionError extends core.Error {
-    new() {
+    new(message) {
+      if (message === void 0) message = null;
+      this.message = message;
       super.new();
     }
     toString() {
       return "Assertion failed";
     }
   };
+  dart.setSignature(core.AssertionError, {
+    fields: () => ({message: core.Object})
+  });
   _js_helper.AssertionErrorWithMessage = class AssertionErrorWithMessage extends core.AssertionError {
     new(message) {
       this[_message] = message;
@@ -12683,7 +12721,7 @@
     let LinkedHashMapKeyIteratorOfE = () => (LinkedHashMapKeyIteratorOfE = dart.constFn(_js_helper.LinkedHashMapKeyIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let JsLinkedHashMapOfE$dynamic = () => (JsLinkedHashMapOfE$dynamic = dart.constFn(_js_helper.JsLinkedHashMap$(E, dart.dynamic)))();
-    class LinkedHashMapKeyIterable extends core.Iterable$(E) {
+    class LinkedHashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
       new(map) {
         this[_map] = map;
         super.new();
@@ -12712,7 +12750,6 @@
         }
       }
     }
-    LinkedHashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(LinkedHashMapKeyIterable, {
       fields: () => ({[_map]: JsLinkedHashMapOfE$dynamic()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -13383,7 +13420,11 @@
   };
   dart.lazyFn(_js_helper.isJsArray, () => dynamicTobool$());
   _js_mirrors.getName = function(symbol) {
-    return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+    if (_internal.PrivateSymbol.is(symbol)) {
+      return _internal.PrivateSymbol.getName(symbol);
+    } else {
+      return _internal.Symbol.getName(_internal.Symbol.as(symbol));
+    }
   };
   dart.lazyFn(_js_mirrors.getName, () => SymbolToString());
   _js_mirrors.getSymbol = function(name, library) {
@@ -13462,7 +13503,7 @@
   });
   _js_mirrors._Lazy = _Lazy();
   _js_mirrors._getESSymbol = function(symbol) {
-    return _internal.Symbol.getNativeSymbol(_internal.Symbol.as(symbol));
+    return _internal.PrivateSymbol.getNativeSymbol(symbol);
   };
   dart.lazyFn(_js_mirrors._getESSymbol, () => SymbolTodynamic());
   _js_mirrors._getMember = function(symbol) {
@@ -13506,7 +13547,7 @@
   dart.lazyFn(_js_mirrors._getNameForESSymbol, () => dynamicToString());
   _js_mirrors._getSymbolForESSymbol = function(member) {
     let name = _js_mirrors._getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
+    return new _internal.PrivateSymbol(name, member);
   };
   dart.lazyFn(_js_mirrors._getSymbolForESSymbol, () => dynamicToSymbol());
   _js_mirrors._getSymbolForMember = function(member) {
@@ -13514,7 +13555,7 @@
       return core.Symbol.new(member);
     } else {
       let name = _js_mirrors._getNameForESSymbol(member);
-      return new _internal.Symbol.es6(name, member);
+      return new _internal.PrivateSymbol(name, member);
     }
   };
   dart.lazyFn(_js_mirrors._getSymbolForMember, () => dynamicToSymbol());
@@ -13658,12 +13699,18 @@
   };
   _js_mirrors.JsIsolateMirror[dart.implements] = () => [mirrors.IsolateMirror];
   _js_mirrors.JsLibraryDependencyMirror = class JsLibraryDependencyMirror extends _js_mirrors.JsMirror {
+    loadLibrary(...args) {
+      return FutureOfLibraryMirror()._check(this.noSuchMethod(new dart.InvocationImpl('loadLibrary', args, {isMethod: true})));
+    }
     get isImport() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isImport', [], {isGetter: true})));
     }
     get isExport() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isExport', [], {isGetter: true})));
     }
+    get isDeferred() {
+      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isDeferred', [], {isGetter: true})));
+    }
     get sourceLibrary() {
       return mirrors.LibraryMirror._check(this.noSuchMethod(new dart.InvocationImpl('sourceLibrary', [], {isGetter: true})));
     }
@@ -13694,6 +13741,9 @@
     setField(...args) {
       return mirrors.InstanceMirror._check(this.noSuchMethod(new dart.InvocationImpl('setField', args, {isMethod: true})));
     }
+    delegate(...args) {
+      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+    }
   };
   _js_mirrors.JsObjectMirror[dart.implements] = () => [mirrors.ObjectMirror];
   const _getAccessor = Symbol('_getAccessor');
@@ -13841,7 +13891,7 @@
         let setters = _js_mirrors._getSetters(unwrapped);
         setters[dartx.forEach](dart.fn((symbol, ft) => {
           let name = dart.notNull(_js_mirrors.getName(symbol)) + '=';
-          symbol = new _internal.Symbol.es6(name, _js_mirrors._getESSymbol(symbol));
+          symbol = new _internal.PrivateSymbol(name, _js_mirrors._getESSymbol(symbol));
           this[_declarations][dartx._set](symbol, new _js_mirrors.JsMethodMirror._instanceMethod(this, symbol, ft));
         }, SymbolAnddynamicToNull()));
         let staticFields = _js_mirrors._getStaticFields(unwrapped);
@@ -13990,12 +14040,18 @@
     get typeVariables() {
       return ListOfTypeVariableMirror()._check(this.noSuchMethod(new dart.InvocationImpl('typeVariables', [], {isGetter: true})));
     }
+    delegate(...args) {
+      return this.noSuchMethod(new dart.InvocationImpl('delegate', args, {isMethod: true}));
+    }
     isSubclassOf(...args) {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isSubclassOf', args, {isMethod: true})));
     }
     get isAbstract() {
       return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isAbstract', [], {isGetter: true})));
     }
+    get isEnum() {
+      return core.bool._check(this.noSuchMethod(new dart.InvocationImpl('isEnum', [], {isGetter: true})));
+    }
     get instanceMembers() {
       return MapOfSymbol$MethodMirror()._check(this.noSuchMethod(new dart.InvocationImpl('instanceMembers', [], {isGetter: true})));
     }
@@ -16801,9 +16857,9 @@
   async._registerErrorHandler = function(R) {
     return (errorHandler, zone) => {
       if (async.ZoneBinaryCallback.is(errorHandler)) {
-        return zone.registerBinaryCallback(dart.dynamic, dart.dynamic, core.StackTrace)(ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().as(errorHandler));
+        return zone.registerBinaryCallback(R, dart.dynamic, core.StackTrace)(async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).as(errorHandler));
       } else {
-        return zone.registerUnaryCallback(dart.dynamic, dart.dynamic)(async.ZoneUnaryCallback.as(errorHandler));
+        return zone.registerUnaryCallback(R, dart.dynamic)(async.ZoneUnaryCallback$(R, dart.dynamic).as(errorHandler));
       }
     };
   };
@@ -16957,7 +17013,6 @@
   const _waitsForCancel = Symbol('_waitsForCancel');
   const _canFire = Symbol('_canFire');
   const _cancelOnError = Symbol('_cancelOnError');
-  const _incrementPauseCount = Symbol('_incrementPauseCount');
   const _sendData = Symbol('_sendData');
   const _addPending = Symbol('_addPending');
   const _sendError = Symbol('_sendError');
@@ -17002,7 +17057,7 @@
       }
       onError(handleError) {
         if (handleError == null) handleError = async._nullErrorHandler;
-        this[_onError] = async._registerErrorHandler(T)(handleError, this[_zone]);
+        this[_onError] = async._registerErrorHandler(dart.dynamic)(handleError, this[_zone]);
       }
       onDone(handleDone) {
         if (handleDone == null) handleDone = async._nullDoneHandler;
@@ -17035,9 +17090,11 @@
       }
       cancel() {
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (dart.test(this[_isCanceled])) return this[_cancelFuture];
-        this[_cancel]();
-        return this[_cancelFuture];
+        if (!dart.test(this[_isCanceled])) {
+          this[_cancel]();
+        }
+        let l = this[_cancelFuture];
+        return l != null ? l : async.Future._nullFuture;
       }
       asFuture(E) {
         return futureValue => {
@@ -17047,8 +17104,14 @@
             result[_complete](futureValue);
           }, VoidToNull());
           this[_onError] = dart.fn((error, stackTrace) => {
-            this.cancel();
-            result[_completeError](error, core.StackTrace._check(stackTrace));
+            let cancelFuture = this.cancel();
+            if (!core.identical(cancelFuture, async.Future._nullFuture)) {
+              cancelFuture.whenComplete(dart.fn(() => {
+                result[_completeError](error, core.StackTrace._check(stackTrace));
+              }, VoidToNull()));
+            } else {
+              result[_completeError](error, core.StackTrace._check(stackTrace));
+            }
           }, dynamicAnddynamicToNull());
           return result;
         };
@@ -17094,9 +17157,6 @@
         if (!dart.test(this[_inCallback])) this[_pending] = null;
         this[_cancelFuture] = this[_onCancel]();
       }
-      [_incrementPauseCount]() {
-        this[_state] = (dart.notNull(this[_state]) + async._BufferingStreamSubscription._STATE_PAUSE_COUNT | async._BufferingStreamSubscription._STATE_INPUT_PAUSED) >>> 0;
-      }
       [_decrementPauseCount]() {
         dart.assert(this[_isPaused]);
         this[_state] = dart.notNull(this[_state]) - async._BufferingStreamSubscription._STATE_PAUSE_COUNT;
@@ -17183,7 +17243,7 @@
         if (dart.test(this[_cancelOnError])) {
           this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
           this[_cancel]();
-          if (async.Future.is(this[_cancelFuture])) {
+          if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
             this[_cancelFuture].whenComplete(sendError);
           } else {
             sendError();
@@ -17206,7 +17266,7 @@
         dart.fn(sendDone, VoidTovoid$());
         this[_cancel]();
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_WAIT_FOR_CANCEL) >>> 0;
-        if (async.Future.is(this[_cancelFuture])) {
+        if (async.Future.is(this[_cancelFuture]) && !core.identical(this[_cancelFuture], async.Future._nullFuture)) {
           this[_cancelFuture].whenComplete(sendDone);
         } else {
           sendDone();
@@ -17216,7 +17276,7 @@
         dart.assert(!dart.test(this[_inCallback]));
         let wasInputPaused = this[_isInputPaused];
         this[_state] = (dart.notNull(this[_state]) | async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
-        callback();
+        dart.dcall(callback);
         this[_state] = (dart.notNull(this[_state]) & ~async._BufferingStreamSubscription._STATE_IN_CALLBACK) >>> 0;
         this[_checkState](wasInputPaused);
       }
@@ -17284,7 +17344,6 @@
         cancel: dart.definiteFunctionType(async.Future, []),
         asFuture: dart.definiteFunctionType(E => [async.Future$(E), [], [E]]),
         [_cancel]: dart.definiteFunctionType(dart.void, []),
-        [_incrementPauseCount]: dart.definiteFunctionType(dart.void, []),
         [_decrementPauseCount]: dart.definiteFunctionType(dart.void, []),
         [_add$]: dart.definiteFunctionType(dart.void, [T]),
         [_addError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
@@ -17296,7 +17355,7 @@
         [_sendData]: dart.definiteFunctionType(dart.void, [T]),
         [_sendError]: dart.definiteFunctionType(dart.void, [core.Object, core.StackTrace]),
         [_sendDone]: dart.definiteFunctionType(dart.void, []),
-        [_guardCallback]: dart.definiteFunctionType(dart.void, [VoidTovoid()]),
+        [_guardCallback]: dart.definiteFunctionType(dart.void, [dart.dynamic]),
         [_checkState]: dart.definiteFunctionType(dart.void, [core.bool])
       })
     });
@@ -17311,7 +17370,6 @@
   async._BufferingStreamSubscription._STATE_IN_CALLBACK = 32;
   async._BufferingStreamSubscription._STATE_HAS_PENDING = 64;
   async._BufferingStreamSubscription._STATE_PAUSE_COUNT = 128;
-  async._BufferingStreamSubscription._STATE_PAUSE_COUNT_SHIFT = 7;
   async._ControllerSubscription$ = dart.generic(T => {
     let _StreamControllerLifecycleOfT = () => (_StreamControllerLifecycleOfT = dart.constFn(async._StreamControllerLifecycle$(T)))();
     class _ControllerSubscription extends async._BufferingStreamSubscription$(T) {
@@ -18067,7 +18125,7 @@
               result[_completeError](error, stackTrace);
             }
           }
-          dart.fn(handleError, dynamicAnddynamicTovoid$());
+          dart.fn(handleError, dynamicAnddynamicToNull());
           try {
             for (let future of futures) {
               let pos = remaining;
@@ -18213,7 +18271,7 @@
   };
   dart.fn(async._nonNullError, ObjectToObject());
   async._FutureOnValue$ = dart.generic((S, T) => {
-    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(dart.dynamic, [S]));
+    const _FutureOnValue = dart.typedef('_FutureOnValue', () => dart.functionType(async.FutureOr$(T), [S]));
     return _FutureOnValue;
   });
   async._FutureOnValue = _FutureOnValue();
@@ -18304,6 +18362,9 @@
   const _whenCompleteAction = Symbol('_whenCompleteAction');
   async._FutureListener$ = dart.generic((S, T) => {
     let _FutureOnValueOfS$T = () => (_FutureOnValueOfS$T = dart.constFn(async._FutureOnValue$(S, T)))();
+    let FutureOrOfT = () => (FutureOrOfT = dart.constFn(async.FutureOr$(T)))();
+    let ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = () => (ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace = dart.constFn(async.ZoneBinaryCallback$(FutureOrOfT(), core.Object, core.StackTrace)))();
+    let dynamicToFutureOrOfT = () => (dynamicToFutureOrOfT = dart.constFn(dart.functionType(FutureOrOfT(), [dart.dynamic])))();
     let _FutureOfT = () => (_FutureOfT = dart.constFn(async._Future$(T)))();
     class _FutureListener extends core.Object {
       then(result, onValue, errorCallback) {
@@ -18363,7 +18424,7 @@
       }
       handleValue(sourceResult) {
         S._check(sourceResult);
-        return this[_zone].runUnary(dart.dynamic, S)(this[_onValue], sourceResult);
+        return this[_zone].runUnary(FutureOrOfT(), S)(this[_onValue], sourceResult);
       }
       matchesErrorTest(asyncError) {
         if (!dart.test(this.hasErrorTest)) return true;
@@ -18373,10 +18434,10 @@
       handleError(asyncError) {
         dart.assert(dart.test(this.handlesError) && dart.test(this.hasErrorCallback));
         if (async.ZoneBinaryCallback.is(this.errorCallback)) {
-          let typedErrorCallback = ZoneBinaryCallbackOfObject$Object$StackTrace().as(this.errorCallback);
-          return this[_zone].runBinary(core.Object, core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
+          let typedErrorCallback = ZoneBinaryCallbackOfFutureOrOfT$Object$StackTrace().as(this.errorCallback);
+          return this[_zone].runBinary(FutureOrOfT(), core.Object, core.StackTrace)(typedErrorCallback, asyncError.error, asyncError.stackTrace);
         } else {
-          return this[_zone].runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(this.errorCallback), asyncError.error);
+          return this[_zone].runUnary(FutureOrOfT(), dart.dynamic)(dynamicToFutureOrOfT()._check(this.errorCallback), asyncError.error);
         }
       }
       handleWhenComplete() {
@@ -18409,9 +18470,9 @@
         hasErrorCallback: dart.definiteFunctionType(core.bool, [])
       }),
       methods: () => ({
-        handleValue: dart.definiteFunctionType(dart.dynamic, [S]),
+        handleValue: dart.definiteFunctionType(async.FutureOr$(T), [S]),
         matchesErrorTest: dart.definiteFunctionType(core.bool, [async.AsyncError]),
-        handleError: dart.definiteFunctionType(dart.dynamic, [async.AsyncError]),
+        handleError: dart.definiteFunctionType(async.FutureOr$(T), [async.AsyncError]),
         handleWhenComplete: dart.definiteFunctionType(dart.dynamic, [])
       })
     });
@@ -18512,7 +18573,7 @@
           if (!core.identical(currentZone, async._ROOT_ZONE)) {
             f = currentZone.registerUnaryCallback(async.FutureOr$(E), T)(f);
             if (onError != null) {
-              onError = async._registerErrorHandler(T)(onError, currentZone);
+              onError = async._registerErrorHandler(E)(onError, currentZone);
             }
           }
           return this[_thenNoZoneRegistration](E)(f, onError);
@@ -18521,7 +18582,7 @@
       [_thenNoZoneRegistration](E) {
         return (f, onError) => {
           let result = new (async._Future$(E))();
-          this[_addListener](new (async._FutureListener$(T, E)).then(result, f, onError));
+          this[_addListener](new (async._FutureListener$(T, E)).then(result, async._FutureOnValue$(T, E)._check(f), onError));
           return result;
         };
       }
@@ -19213,10 +19274,10 @@
   });
   async.StreamTransformer = StreamTransformer();
   async.StreamIterator$ = dart.generic(T => {
-    let _StreamIteratorImplOfT = () => (_StreamIteratorImplOfT = dart.constFn(async._StreamIteratorImpl$(T)))();
+    let _StreamIteratorOfT = () => (_StreamIteratorOfT = dart.constFn(async._StreamIterator$(T)))();
     class StreamIterator extends core.Object {
       static new(stream) {
-        return new (_StreamIteratorImplOfT())(stream);
+        return new (_StreamIteratorOfT())(stream);
       }
     }
     dart.addTypeTests(StreamIterator);
@@ -20084,36 +20145,6 @@
     return _StreamImplEvents;
   });
   async._StreamImplEvents = _StreamImplEvents();
-  const _unlink = Symbol('_unlink');
-  const _insertBefore = Symbol('_insertBefore');
-  async._BroadcastLinkedList = class _BroadcastLinkedList extends core.Object {
-    new() {
-      this[_next$] = null;
-      this[_previous$] = null;
-    }
-    [_unlink]() {
-      this[_previous$][_next$] = this[_next$];
-      this[_next$][_previous$] = this[_previous$];
-      this[_next$] = this[_previous$] = this;
-    }
-    [_insertBefore](newNext) {
-      let newPrevious = newNext[_previous$];
-      newPrevious[_next$] = this;
-      newNext[_previous$] = this[_previous$];
-      this[_previous$][_next$] = newNext;
-      this[_previous$] = newPrevious;
-    }
-  };
-  dart.setSignature(async._BroadcastLinkedList, {
-    fields: () => ({
-      [_next$]: async._BroadcastLinkedList,
-      [_previous$]: async._BroadcastLinkedList
-    }),
-    methods: () => ({
-      [_unlink]: dart.definiteFunctionType(dart.void, []),
-      [_insertBefore]: dart.definiteFunctionType(dart.void, [async._BroadcastLinkedList])
-    })
-  });
   async._BroadcastCallback$ = dart.generic(T => {
     const _BroadcastCallback = dart.typedef('_BroadcastCallback', () => dart.functionType(dart.void, [async.StreamSubscription$(T)]));
     return _BroadcastCallback;
@@ -20165,7 +20196,7 @@
         }
       }
       cancel() {
-        return null;
+        return async.Future._nullFuture;
       }
       asFuture(E) {
         return futureValue => {
@@ -20341,7 +20372,7 @@
       }
       cancel() {
         this[_stream][_cancelSubscription]();
-        return null;
+        return async.Future._nullFuture;
       }
       get isPaused() {
         return this[_stream][_isSubscriptionPaused];
@@ -20371,146 +20402,109 @@
     return _BroadcastSubscriptionWrapper;
   });
   async._BroadcastSubscriptionWrapper = _BroadcastSubscriptionWrapper();
-  const _current$1 = Symbol('_current');
-  const _futureOrPrefetch = Symbol('_futureOrPrefetch');
-  const _clear = Symbol('_clear');
-  async._StreamIteratorImpl$ = dart.generic(T => {
+  const _stateData = Symbol('_stateData');
+  const _initializeOrDone = Symbol('_initializeOrDone');
+  async._StreamIterator$ = dart.generic(T => {
+    let StreamOfT = () => (StreamOfT = dart.constFn(async.Stream$(T)))();
+    let StreamSubscriptionOfT = () => (StreamSubscriptionOfT = dart.constFn(async.StreamSubscription$(T)))();
     let StreamIteratorOfT = () => (StreamIteratorOfT = dart.constFn(async.StreamIterator$(T)))();
-    class _StreamIteratorImpl extends core.Object {
+    class _StreamIterator extends core.Object {
       new(stream) {
+        this[_stateData] = stream;
         this[_subscription] = null;
-        this[_current$1] = null;
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-        this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+        this[_isPaused] = false;
       }
       get current() {
-        return this[_current$1];
+        if (this[_subscription] != null && dart.test(this[_isPaused])) {
+          return T.as(this[_stateData]);
+        }
+        return null;
       }
       moveNext() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_DONE) {
-          return new (_FutureOfbool()).immediate(false);
-        }
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
+        if (this[_subscription] != null) {
+          if (dart.test(this[_isPaused])) {
+            let future = new (_FutureOfbool())();
+            this[_stateData] = future;
+            this[_isPaused] = false;
+            this[_subscription].resume();
+            return future;
+          }
           dart.throw(new core.StateError("Already waiting for next."));
         }
-        if (this[_state] == async._StreamIteratorImpl._STATE_FOUND) {
-          this[_state] = async._StreamIteratorImpl._STATE_MOVING;
-          this[_current$1] = null;
-          let result = new (_FutureOfbool())();
-          this[_futureOrPrefetch] = result;
-          return result;
-        } else {
-          dart.assert(dart.notNull(this[_state]) >= async._StreamIteratorImpl._STATE_EXTRA_DATA);
-          switch (this[_state]) {
-            case async._StreamIteratorImpl._STATE_EXTRA_DATA:
-            {
-              this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-              this[_current$1] = T.as(this[_futureOrPrefetch]);
-              this[_futureOrPrefetch] = null;
-              this[_subscription].resume();
-              return new (_FutureOfbool()).immediate(true);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_ERROR:
-            {
-              let prefetch = async.AsyncError._check(this[_futureOrPrefetch]);
-              this[_clear]();
-              return new (_FutureOfbool()).immediateError(prefetch.error, prefetch.stackTrace);
-            }
-            case async._StreamIteratorImpl._STATE_EXTRA_DONE:
-            {
-              this[_clear]();
-              return new (_FutureOfbool()).immediate(false);
-            }
-          }
-        }
+        return this[_initializeOrDone]();
       }
-      [_clear]() {
-        this[_subscription] = null;
-        this[_futureOrPrefetch] = null;
-        this[_current$1] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_DONE;
+      [_initializeOrDone]() {
+        dart.assert(this[_subscription] == null);
+        let stateData = this[_stateData];
+        if (stateData != null) {
+          let stream = StreamOfT().as(stateData);
+          this[_subscription] = stream.listen(dart.bind(this, _onData), {onError: dart.bind(this, _onError), onDone: dart.bind(this, _onDone), cancelOnError: true});
+          let future = new (_FutureOfbool())();
+          this[_stateData] = future;
+          return future;
+        }
+        return new (_FutureOfbool()).immediate(false);
       }
       cancel() {
-        let subscription = this[_subscription];
-        if (subscription == null) return null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-        } else {
-          this[_clear]();
+        let subscription = StreamSubscriptionOfT()._check(this[_subscription]);
+        let stateData = this[_stateData];
+        this[_stateData] = null;
+        if (subscription != null) {
+          this[_subscription] = null;
+          if (!dart.test(this[_isPaused])) {
+            let future = _FutureOfbool().as(stateData);
+            future[_asyncComplete](false);
+          }
+          return subscription.cancel();
         }
-        return subscription.cancel();
+        return async.Future._nullFuture;
       }
       [_onData](data) {
         T._check(data);
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          this[_current$1] = data;
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_futureOrPrefetch] = null;
-          this[_state] = async._StreamIteratorImpl._STATE_FOUND;
-          hasNext[_complete](true);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = data;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DATA;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_stateData] = data;
+        this[_isPaused] = true;
+        moveNextFuture[_complete](true);
+        if (this[_subscription] != null && dart.test(this[_isPaused])) this[_subscription].pause();
       }
       [_onError](error, stackTrace) {
         if (stackTrace === void 0) stackTrace = null;
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_completeError](error, stackTrace);
-          return;
-        }
-        this[_subscription].pause();
-        dart.assert(this[_futureOrPrefetch] == null);
-        this[_futureOrPrefetch] = new async.AsyncError(error, stackTrace);
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_ERROR;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_subscription] = null;
+        this[_stateData] = null;
+        moveNextFuture[_completeError](error, stackTrace);
       }
       [_onDone]() {
-        if (this[_state] == async._StreamIteratorImpl._STATE_MOVING) {
-          let hasNext = _FutureOfbool().as(this[_futureOrPrefetch]);
-          this[_clear]();
-          hasNext[_complete](false);
-          return;
-        }
-        this[_subscription].pause();
-        this[_futureOrPrefetch] = null;
-        this[_state] = async._StreamIteratorImpl._STATE_EXTRA_DONE;
+        dart.assert(this[_subscription] != null && !dart.test(this[_isPaused]));
+        let moveNextFuture = _FutureOfbool().as(this[_stateData]);
+        this[_subscription] = null;
+        this[_stateData] = null;
+        moveNextFuture[_complete](false);
       }
     }
-    dart.addTypeTests(_StreamIteratorImpl);
-    _StreamIteratorImpl[dart.implements] = () => [StreamIteratorOfT()];
-    dart.setSignature(_StreamIteratorImpl, {
+    dart.addTypeTests(_StreamIterator);
+    _StreamIterator[dart.implements] = () => [StreamIteratorOfT()];
+    dart.setSignature(_StreamIterator, {
       fields: () => ({
         [_subscription]: async.StreamSubscription,
-        [_current$1]: T,
-        [_futureOrPrefetch]: dart.dynamic,
-        [_state]: core.int
+        [_stateData]: core.Object,
+        [_isPaused]: core.bool
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({
         moveNext: dart.definiteFunctionType(async.Future$(core.bool), []),
-        [_clear]: dart.definiteFunctionType(dart.void, []),
+        [_initializeOrDone]: dart.definiteFunctionType(async.Future$(core.bool), []),
         cancel: dart.definiteFunctionType(async.Future, []),
         [_onData]: dart.definiteFunctionType(dart.void, [T]),
         [_onError]: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
         [_onDone]: dart.definiteFunctionType(dart.void, [])
       })
     });
-    return _StreamIteratorImpl;
+    return _StreamIterator;
   });
-  async._StreamIteratorImpl = _StreamIteratorImpl();
-  async._StreamIteratorImpl._STATE_FOUND = 0;
-  async._StreamIteratorImpl._STATE_DONE = 1;
-  async._StreamIteratorImpl._STATE_MOVING = 2;
-  async._StreamIteratorImpl._STATE_EXTRA_DATA = 3;
-  async._StreamIteratorImpl._STATE_EXTRA_ERROR = 4;
-  async._StreamIteratorImpl._STATE_EXTRA_DONE = 5;
+  async._StreamIterator = _StreamIterator();
   async._EmptyStream$ = dart.generic(T => {
     let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
     let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20553,7 +20547,7 @@
   dart.lazyFn(async._runUserCode, () => FnAndFnAndFnTodynamic());
   async._cancelAndError = function(subscription, future, error, stackTrace) {
     let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
+    if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
       cancelFuture.whenComplete(dart.fn(() => future[_completeError](error, stackTrace), VoidTovoid$()));
     } else {
       future[_completeError](error, stackTrace);
@@ -20578,7 +20572,7 @@
   dart.fn(async._cancelAndErrorClosure, StreamSubscriptionAnd_FutureTo_ErrorCallback());
   async._cancelAndValue = function(subscription, future, value) {
     let cancelFuture = subscription.cancel();
-    if (async.Future.is(cancelFuture)) {
+    if (async.Future.is(cancelFuture) && !core.identical(cancelFuture, async.Future._nullFuture)) {
       cancelFuture.whenComplete(dart.fn(() => future[_complete](value), VoidTovoid$()));
     } else {
       future[_complete](value);
@@ -20861,6 +20855,7 @@
   async._HandleErrorStream = _HandleErrorStream();
   const _count = Symbol('_count');
   async._TakeStream$ = dart.generic(T => {
+    let _DoneStreamSubscriptionOfT = () => (_DoneStreamSubscriptionOfT = dart.constFn(async._DoneStreamSubscription$(T)))();
     let _StateStreamSubscriptionOfT = () => (_StateStreamSubscriptionOfT = dart.constFn(async._StateStreamSubscription$(T)))();
     let _EventSinkOfT = () => (_EventSinkOfT = dart.constFn(async._EventSink$(T)))();
     let TTovoid = () => (TTovoid = dart.constFn(dart.functionType(dart.void, [T])))();
@@ -20871,6 +20866,10 @@
         if (!(typeof count == 'number')) dart.throw(new core.ArgumentError(count));
       }
       [_createSubscription](onData, onError, onDone, cancelOnError) {
+        if (this[_count] == 0) {
+          this[_source$].listen(null).cancel();
+          return new (_DoneStreamSubscriptionOfT())(onDone);
+        }
         return new (_StateStreamSubscriptionOfT())(this, onData, onError, onDone, cancelOnError, this[_count]);
       }
       [_handleData](inputEvent, sink) {
@@ -21173,7 +21172,7 @@
         if (dart.test(this[_isSubscribed])) {
           let subscription = this[_subscription];
           this[_subscription] = null;
-          subscription.cancel();
+          return subscription.cancel();
         }
         return null;
       }
@@ -22477,8 +22476,8 @@
       if (onError != null) {
         errorHandler = dart.fn((self, parent, zone, error, stackTrace) => {
           try {
-            if (ZoneBinaryCallbackOfdynamic$dynamic$StackTrace().is(onError)) {
-              return R.as(self.parent.runBinary(dart.dynamic, dart.dynamic, core.StackTrace)(onError, error, stackTrace));
+            if (async.ZoneBinaryCallback$(R, dart.dynamic, core.StackTrace).is(onError)) {
+              return self.parent.runBinary(R, dart.dynamic, core.StackTrace)(onError, error, stackTrace);
             }
             return self.parent.runUnary(dart.dynamic, dart.dynamic)(dynamicTodynamic()._check(onError), error);
           } catch (e) {
@@ -22940,7 +22939,7 @@
     let _HashMapKeyIteratorOfE = () => (_HashMapKeyIteratorOfE = dart.constFn(collection._HashMapKeyIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
-    class _HashMapKeyIterable extends core.Iterable$(E) {
+    class _HashMapKeyIterable extends _internal.EfficientLengthIterable$(E) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -22967,7 +22966,6 @@
         }
       }
     }
-    _HashMapKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_HashMapKeyIterable, {
       fields: () => ({[_map$0]: _HashMapOfE$dynamic()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])})
@@ -22983,7 +22981,7 @@
   });
   collection._HashMapKeyIterable = _HashMapKeyIterable();
   const _offset = Symbol('_offset');
-  const _current$2 = Symbol('_current');
+  const _current$1 = Symbol('_current');
   collection._HashMapKeyIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     let _HashMapOfE$dynamic = () => (_HashMapOfE$dynamic = dart.constFn(collection._HashMap$(E, dart.dynamic)))();
@@ -22993,10 +22991,10 @@
         this[_map$0] = map;
         this[_keys] = keys;
         this[_offset] = 0;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         let keys = this[_keys];
@@ -23004,10 +23002,10 @@
         if (keys !== this[_map$0][_keys]) {
           dart.throw(new core.ConcurrentModificationError(this[_map$0]));
         } else if (dart.notNull(offset) >= keys.length) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = keys[offset];
+          this[_current$1] = keys[offset];
           this[_offset] = dart.notNull(offset) + 1;
           return true;
         }
@@ -23020,7 +23018,7 @@
         [_map$0]: _HashMapOfE$dynamic(),
         [_keys]: ListOfE(),
         [_offset]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -23183,7 +23181,7 @@
   collection._Es6MapIterable$ = dart.generic(E => {
     let _Es6MapIteratorOfE = () => (_Es6MapIteratorOfE = dart.constFn(collection._Es6MapIterator$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
-    class _Es6MapIterable extends core.Iterable$(E) {
+    class _Es6MapIterable extends _internal.EfficientLengthIterable$(E) {
       new(map, isKeys) {
         this[_map$0] = map;
         this[_isKeys] = isKeys;
@@ -23221,7 +23219,6 @@
         }
       }
     }
-    _Es6MapIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_Es6MapIterable, {
       fields: () => ({
         [_map$0]: dart.dynamic,
@@ -23251,7 +23248,7 @@
         this[_isKeys] = isKeys;
         this[_jsIterator$] = null;
         this[_next$0] = null;
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_done] = null;
         if (dart.test(this[_isKeys])) {
           this[_jsIterator$] = dart.dload(this[_map$0], _map$0).keys();
@@ -23261,7 +23258,7 @@
         this[_done] = false;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (!dart.equals(this[_modifications$], dart.dload(this[_map$0], _modifications$))) {
@@ -23271,11 +23268,11 @@
         this[_next$0] = this[_jsIterator$].next();
         let done = this[_next$0].done;
         if (done) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           this[_done] = true;
           return false;
         } else {
-          this[_current$2] = this[_next$0].value;
+          this[_current$1] = this[_next$0].value;
           return true;
         }
       }
@@ -23289,7 +23286,7 @@
         [_isKeys]: core.bool,
         [_jsIterator$]: dart.dynamic,
         [_next$0]: dart.dynamic,
-        [_current$2]: E,
+        [_current$1]: E,
         [_done]: core.bool
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
@@ -24080,10 +24077,10 @@
         this[_set] = set;
         this[_elements] = elements;
         this[_offset] = 0;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         let elements = this[_elements];
@@ -24091,10 +24088,10 @@
         if (elements !== dart.dload(this[_set], _elements)) {
           dart.throw(new core.ConcurrentModificationError(this[_set]));
         } else if (dart.notNull(offset) >= elements.length) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = elements[offset];
+          this[_current$1] = elements[offset];
           this[_offset] = dart.notNull(offset) + 1;
           return true;
         }
@@ -24107,7 +24104,7 @@
         [_set]: dart.dynamic,
         [_elements]: ListOfE(),
         [_offset]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24561,20 +24558,20 @@
         this[_set] = set;
         this[_modifications$] = modifications;
         this[_cell$] = null;
-        this[_current$2] = null;
+        this[_current$1] = null;
         this[_cell$] = this[_set][_first$];
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (this[_modifications$] != this[_set][_modifications$]) {
           dart.throw(new core.ConcurrentModificationError(this[_set]));
         } else if (this[_cell$] == null) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         } else {
-          this[_current$2] = E._check(this[_cell$][_element]);
+          this[_current$1] = E._check(this[_cell$][_element]);
           this[_cell$] = this[_cell$][_next$0];
           return true;
         }
@@ -24587,7 +24584,7 @@
         [_set]: collection._LinkedHashSet,
         [_modifications$]: core.int,
         [_cell$]: collection._LinkedHashSetCell,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -24852,7 +24849,7 @@
         return SetOfE().from(this);
       }
       get length() {
-        dart.assert(!_internal.EfficientLength.is(this));
+        dart.assert(!_internal.EfficientLengthIterable.is(this));
         let count = 0;
         let it = this[dartx.iterator];
         while (dart.test(it.moveNext())) {
@@ -25280,9 +25277,9 @@
   });
   collection.LinkedHashSet = LinkedHashSet();
   const _modificationCount = Symbol('_modificationCount');
-  const _insertBefore$ = Symbol('_insertBefore');
+  const _insertBefore = Symbol('_insertBefore');
   const _list = Symbol('_list');
-  const _unlink$ = Symbol('_unlink');
+  const _unlink = Symbol('_unlink');
   collection.LinkedList$ = dart.generic(E => {
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
     let _LinkedListIteratorOfE = () => (_LinkedListIteratorOfE = dart.constFn(collection._LinkedListIterator$(E)))();
@@ -25296,12 +25293,12 @@
       }
       addFirst(entry) {
         E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: true});
+        this[_insertBefore](this[_first$], entry, {updateFirst: true});
         this[_first$] = entry;
       }
       add(entry) {
         E._check(entry);
-        this[_insertBefore$](this[_first$], entry, {updateFirst: false});
+        this[_insertBefore](this[_first$], entry, {updateFirst: false});
       }
       addAll(entries) {
         IterableOfE()._check(entries);
@@ -25310,7 +25307,7 @@
       remove(entry) {
         E._check(entry);
         if (!dart.equals(entry[_list], this)) return false;
-        this[_unlink$](entry);
+        this[_unlink](entry);
         return true;
       }
       get iterator() {
@@ -25367,7 +25364,7 @@
       get isEmpty() {
         return this[_length$1] == 0;
       }
-      [_insertBefore$](entry, newEntry, opts) {
+      [_insertBefore](entry, newEntry, opts) {
         E._check(entry);
         E._check(newEntry);
         let updateFirst = opts && 'updateFirst' in opts ? opts.updateFirst : null;
@@ -25394,7 +25391,7 @@
         }
         this[_length$1] = dart.notNull(this[_length$1]) + 1;
       }
-      [_unlink$](entry) {
+      [_unlink](entry) {
         E._check(entry);
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
         entry[_next$0][_previous$0] = entry[_previous$0];
@@ -25421,8 +25418,8 @@
         addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
         remove: dart.definiteFunctionType(core.bool, [E]),
         clear: dart.definiteFunctionType(dart.void, []),
-        [_insertBefore$]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [E])
+        [_insertBefore]: dart.definiteFunctionType(dart.void, [E, E], {updateFirst: core.bool}),
+        [_unlink]: dart.definiteFunctionType(dart.void, [E])
       })
     });
     dart.defineExtensionMembers(LinkedList, [
@@ -25448,21 +25445,21 @@
         this[_modificationCount] = list[_modificationCount];
         this[_next$0] = list[_first$];
         this[_visitedFirst] = false;
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         if (this[_modificationCount] != this[_list][_modificationCount]) {
           dart.throw(new core.ConcurrentModificationError(this));
         }
         if (dart.test(this[_list].isEmpty) || dart.test(this[_visitedFirst]) && core.identical(this[_next$0], this[_list].first)) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         }
         this[_visitedFirst] = true;
-        this[_current$2] = E._check(this[_next$0]);
+        this[_current$1] = E._check(this[_next$0]);
         this[_next$0] = this[_next$0][_next$0];
         return true;
       }
@@ -25473,7 +25470,7 @@
       fields: () => ({
         [_list]: LinkedListOfE(),
         [_modificationCount]: core.int,
-        [_current$2]: E,
+        [_current$1]: E,
         [_next$0]: LinkedListEntryOfE(),
         [_visitedFirst]: core.bool
       }),
@@ -25495,23 +25492,23 @@
         return this[_list];
       }
       unlink() {
-        this[_list][_unlink$](E._check(this));
+        this[_list][_unlink](E._check(this));
       }
       get next() {
-        if (core.identical(this, this[_next$0])) return null;
+        if (this[_list] == null || core.identical(this[_list].first, this[_next$0])) return null;
         return this[_next$0];
       }
       get previous() {
-        if (core.identical(this, this[_previous$0])) return null;
+        if (this[_list] == null || core.identical(this, this[_list].first)) return null;
         return this[_previous$0];
       }
       insertAfter(entry) {
         E._check(entry);
-        this[_list][_insertBefore$](this[_next$0], entry, {updateFirst: false});
+        this[_list][_insertBefore](this[_next$0], entry, {updateFirst: false});
       }
       insertBefore(entry) {
         E._check(entry);
-        this[_list][_insertBefore$](E.as(this), entry, {updateFirst: true});
+        this[_list][_insertBefore](E.as(this), entry, {updateFirst: true});
       }
     }
     dart.addTypeTests(LinkedListEntry);
@@ -25680,7 +25677,7 @@
   collection._MapBaseValueIterable$ = dart.generic((K, V) => {
     let _MapBaseValueIteratorOfK$V = () => (_MapBaseValueIteratorOfK$V = dart.constFn(collection._MapBaseValueIterator$(K, V)))();
     let MapOfK$V = () => (MapOfK$V = dart.constFn(core.Map$(K, V)))();
-    class _MapBaseValueIterable extends core.Iterable$(V) {
+    class _MapBaseValueIterable extends _internal.EfficientLengthIterable$(V) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -25707,7 +25704,6 @@
         return new (_MapBaseValueIteratorOfK$V())(this[_map$0]);
       }
     }
-    _MapBaseValueIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_MapBaseValueIterable, {
       fields: () => ({[_map$0]: MapOfK$V()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -25732,18 +25728,18 @@
       new(map) {
         this[_map$0] = map;
         this[_keys] = map[dartx.keys][dartx.iterator];
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       moveNext() {
         if (dart.test(this[_keys].moveNext())) {
-          this[_current$2] = this[_map$0][dartx._get](this[_keys].current);
+          this[_current$1] = this[_map$0][dartx._get](this[_keys].current);
           return true;
         }
-        this[_current$2] = null;
+        this[_current$1] = null;
         return false;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
     }
     dart.addTypeTests(_MapBaseValueIterator);
@@ -25752,7 +25748,7 @@
       fields: () => ({
         [_keys]: IteratorOfK(),
         [_map$0]: MapOfK$V(),
-        [_current$2]: V
+        [_current$1]: V
       }),
       getters: () => ({current: dart.definiteFunctionType(V, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -25988,7 +25984,7 @@
   });
   collection.Queue$ = dart.generic(E => {
     let ListQueueOfE = () => (ListQueueOfE = dart.constFn(collection.ListQueue$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class Queue extends core.Object {
       static new() {
         return new (ListQueueOfE())();
@@ -25996,33 +25992,30 @@
       static from(elements) {
         return ListQueueOfE().from(elements);
       }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this.iterator);
-      }
     }
     dart.addTypeTests(Queue);
-    Queue[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+    Queue[dart.implements] = () => [EfficientLengthIterableOfE()];
     return Queue;
   });
   collection.Queue = Queue();
   const _previousLink = Symbol('_previousLink');
   const _nextLink = Symbol('_nextLink');
   const _link = Symbol('_link');
-  collection._DoubleLink$ = dart.generic(E => {
+  collection._DoubleLink$ = dart.generic(Link => {
     class _DoubleLink extends core.Object {
       new() {
         this[_previousLink] = null;
         this[_nextLink] = null;
       }
       [_link](previous, next) {
-        E._check(previous);
-        E._check(next);
+        Link._check(previous);
+        Link._check(next);
         this[_nextLink] = next;
         this[_previousLink] = previous;
         if (previous != null) previous[_nextLink] = this;
         if (next != null) next[_previousLink] = this;
       }
-      [_unlink$]() {
+      [_unlink]() {
         if (this[_previousLink] != null) this[_previousLink][_nextLink] = this[_nextLink];
         if (this[_nextLink] != null) this[_nextLink][_previousLink] = this[_previousLink];
         this[_nextLink] = null;
@@ -26032,46 +26025,34 @@
     dart.addTypeTests(_DoubleLink);
     dart.setSignature(_DoubleLink, {
       fields: () => ({
-        [_previousLink]: E,
-        [_nextLink]: E
+        [_previousLink]: Link,
+        [_nextLink]: Link
       }),
       methods: () => ({
-        [_link]: dart.definiteFunctionType(dart.void, [E, E]),
-        [_unlink$]: dart.definiteFunctionType(dart.void, [])
+        [_link]: dart.definiteFunctionType(dart.void, [Link, Link]),
+        [_unlink]: dart.definiteFunctionType(dart.void, [])
       })
     });
     return _DoubleLink;
   });
   collection._DoubleLink = _DoubleLink();
   collection.DoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
-    class DoubleLinkedQueueEntry extends core.Object {
-      static new(element) {
-        return new (_UserDoubleLinkedQueueEntryOfE())(element);
-      }
-    }
-    dart.addTypeTests(DoubleLinkedQueueEntry);
-    return DoubleLinkedQueueEntry;
-  });
-  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
-  collection._UserDoubleLinkedQueueEntry$ = dart.generic(E => {
-    let _UserDoubleLinkedQueueEntryOfE = () => (_UserDoubleLinkedQueueEntryOfE = dart.constFn(collection._UserDoubleLinkedQueueEntry$(E)))();
     let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
-    class _UserDoubleLinkedQueueEntry extends collection._DoubleLink {
+    class DoubleLinkedQueueEntry extends collection._DoubleLink {
       new(element) {
         this.element = element;
         super.new();
       }
       append(e) {
         E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
+        new (DoubleLinkedQueueEntryOfE())(e)[_link](this, this[_nextLink]);
       }
       prepend(e) {
         E._check(e);
-        new (_UserDoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
+        new (DoubleLinkedQueueEntryOfE())(e)[_link](this[_previousLink], this);
       }
       remove() {
-        this[_unlink$]();
+        this[_unlink]();
         return this.element;
       }
       previousEntry() {
@@ -26081,8 +26062,7 @@
         return this[_nextLink];
       }
     }
-    _UserDoubleLinkedQueueEntry[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
-    dart.setSignature(_UserDoubleLinkedQueueEntry, {
+    dart.setSignature(DoubleLinkedQueueEntry, {
       fields: () => ({element: E}),
       methods: () => ({
         append: dart.definiteFunctionType(dart.void, [E]),
@@ -26092,22 +26072,23 @@
         nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
       })
     });
-    return _UserDoubleLinkedQueueEntry;
-  }, _UserDoubleLinkedQueueEntry => {
-    dart.setBaseClass(_UserDoubleLinkedQueueEntry, collection._DoubleLink$(_UserDoubleLinkedQueueEntry));
+    return DoubleLinkedQueueEntry;
+  }, DoubleLinkedQueueEntry => {
+    dart.setBaseClass(DoubleLinkedQueueEntry, collection._DoubleLink$(DoubleLinkedQueueEntry));
   });
-  collection._UserDoubleLinkedQueueEntry = _UserDoubleLinkedQueueEntry();
+  collection.DoubleLinkedQueueEntry = DoubleLinkedQueueEntry();
   const _queue = Symbol('_queue');
   const _append = Symbol('_append');
   const _prepend = Symbol('_prepend');
   const _asNonSentinelEntry = Symbol('_asNonSentinelEntry');
   collection._DoubleLinkedQueueEntry$ = dart.generic(E => {
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
-    class _DoubleLinkedQueueEntry extends collection._DoubleLink {
-      new(queue) {
+    class _DoubleLinkedQueueEntry extends collection.DoubleLinkedQueueEntry$(E) {
+      new(element, queue) {
         this[_queue] = queue;
-        super.new();
+        super.new(element);
       }
       [_append](e) {
         E._check(e);
@@ -26117,34 +26098,34 @@
         E._check(e);
         new (_DoubleLinkedQueueElementOfE())(e, this[_queue])[_link](this[_previousLink], this);
       }
+      get [_element]() {
+        return this.element;
+      }
       nextEntry() {
-        return this[_nextLink][_asNonSentinelEntry]();
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_nextLink]);
+        return entry[_asNonSentinelEntry]();
       }
       previousEntry() {
-        return this[_previousLink][_asNonSentinelEntry]();
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_previousLink]);
+        return entry[_asNonSentinelEntry]();
       }
     }
     dart.setSignature(_DoubleLinkedQueueEntry, {
       fields: () => ({[_queue]: DoubleLinkedQueueOfE()}),
+      getters: () => ({[_element]: dart.definiteFunctionType(E, [])}),
       methods: () => ({
         [_append]: dart.definiteFunctionType(dart.void, [E]),
-        [_prepend]: dart.definiteFunctionType(dart.void, [E]),
-        nextEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
-        previousEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), [])
+        [_prepend]: dart.definiteFunctionType(dart.void, [E])
       })
     });
     return _DoubleLinkedQueueEntry;
-  }, _DoubleLinkedQueueEntry => {
-    dart.setBaseClass(_DoubleLinkedQueueEntry, collection._DoubleLink$(_DoubleLinkedQueueEntry));
   });
   collection._DoubleLinkedQueueEntry = _DoubleLinkedQueueEntry();
   const _elementCount = Symbol('_elementCount');
   collection._DoubleLinkedQueueElement$ = dart.generic(E => {
-    let DoubleLinkedQueueEntryOfE = () => (DoubleLinkedQueueEntryOfE = dart.constFn(collection.DoubleLinkedQueueEntry$(E)))();
     class _DoubleLinkedQueueElement extends collection._DoubleLinkedQueueEntry$(E) {
       new(element, queue) {
-        this.element = element;
-        super.new(queue);
+        super.new(element, queue);
       }
       append(e) {
         E._check(e);
@@ -26164,7 +26145,7 @@
       }
       [_remove]() {
         this[_queue] = null;
-        this[_unlink$]();
+        this[_unlink]();
         return this.element;
       }
       remove() {
@@ -26178,14 +26159,9 @@
         return this;
       }
     }
-    _DoubleLinkedQueueElement[dart.implements] = () => [DoubleLinkedQueueEntryOfE()];
     dart.setSignature(_DoubleLinkedQueueElement, {
-      fields: () => ({element: E}),
       methods: () => ({
-        append: dart.definiteFunctionType(dart.void, [E]),
-        prepend: dart.definiteFunctionType(dart.void, [E]),
         [_remove]: dart.definiteFunctionType(E, []),
-        remove: dart.definiteFunctionType(E, []),
         [_asNonSentinelEntry]: dart.definiteFunctionType(collection._DoubleLinkedQueueElement$(E), [])
       })
     });
@@ -26195,7 +26171,7 @@
   collection._DoubleLinkedQueueSentinel$ = dart.generic(E => {
     class _DoubleLinkedQueueSentinel extends collection._DoubleLinkedQueueEntry$(E) {
       new(queue) {
-        super.new(queue);
+        super.new(null, queue);
         this[_previousLink] = this;
         this[_nextLink] = this;
       }
@@ -26205,12 +26181,11 @@
       [_remove]() {
         dart.throw(_internal.IterableElementError.noElement());
       }
-      get element() {
+      get [_element]() {
         dart.throw(_internal.IterableElementError.noElement());
       }
     }
     dart.setSignature(_DoubleLinkedQueueSentinel, {
-      getters: () => ({element: dart.definiteFunctionType(E, [])}),
       methods: () => ({
         [_asNonSentinelEntry]: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         [_remove]: dart.definiteFunctionType(E, [])
@@ -26224,6 +26199,7 @@
     let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
     let DoubleLinkedQueueOfE = () => (DoubleLinkedQueueOfE = dart.constFn(collection.DoubleLinkedQueue$(E)))();
     let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
     let _DoubleLinkedQueueIteratorOfE = () => (_DoubleLinkedQueueIteratorOfE = dart.constFn(collection._DoubleLinkedQueueIterator$(E)))();
     let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
@@ -26271,34 +26247,42 @@
         }
       }
       removeLast() {
-        let lastEntry = this[_sentinel][_previousLink];
+        let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
         let result = lastEntry[_remove]();
         this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         return result;
       }
       removeFirst() {
-        let firstEntry = this[_sentinel][_nextLink];
+        let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         let result = firstEntry[_remove]();
         this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
         return result;
       }
       remove(o) {
-        let entry = this[_sentinel][_nextLink];
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          if (dart.equals(entry.element, o)) {
+          let equals = dart.equals(entry[_element], o);
+          if (!core.identical(this, entry[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          if (equals) {
             entry[_remove]();
             this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
             return true;
           }
-          entry = entry[_nextLink];
+          entry = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
         }
         return false;
       }
       [_filter](test, removeMatching) {
-        let entry = this[_sentinel][_nextLink];
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          let next = entry[_nextLink];
-          if (core.identical(removeMatching, test(entry.element))) {
+          let matches = test(entry[_element]);
+          if (!core.identical(this, entry[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          let next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+          if (core.identical(removeMatching, matches)) {
             entry[_remove]();
             this[_elementCount] = dart.notNull(this[_elementCount]) - 1;
           }
@@ -26312,26 +26296,26 @@
         this[_filter](test, false);
       }
       get first() {
-        let firstEntry = this[_sentinel][_nextLink];
-        return firstEntry.element;
+        let firstEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+        return firstEntry[_element];
       }
       get last() {
-        let lastEntry = this[_sentinel][_previousLink];
-        return lastEntry.element;
+        let lastEntry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_previousLink]);
+        return lastEntry[_element];
       }
       get single() {
         if (core.identical(this[_sentinel][_nextLink], this[_sentinel][_previousLink])) {
-          let entry = this[_sentinel][_nextLink];
-          return entry.element;
+          let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
+          return entry[_element];
         }
         dart.throw(_internal.IterableElementError.tooMany());
       }
-      lastEntry() {
-        return this[_sentinel].previousEntry();
-      }
       firstEntry() {
         return this[_sentinel].nextEntry();
       }
+      lastEntry() {
+        return this[_sentinel].previousEntry();
+      }
       get isEmpty() {
         return core.identical(this[_sentinel][_nextLink], this[_sentinel]);
       }
@@ -26340,13 +26324,18 @@
         this[_sentinel][_previousLink] = this[_sentinel];
         this[_elementCount] = 0;
       }
-      forEachEntry(f) {
-        let entry = this[_sentinel][_nextLink];
+      forEachEntry(action) {
+        let entry = _DoubleLinkedQueueEntryOfE()._check(this[_sentinel][_nextLink]);
         while (!core.identical(entry, this[_sentinel])) {
-          let nextEntry = entry[_nextLink];
           let element = _DoubleLinkedQueueElementOfE()._check(entry);
-          f(element);
-          entry = nextEntry;
+          let next = _DoubleLinkedQueueEntryOfE()._check(element[_nextLink]);
+          action(element);
+          if (core.identical(this, entry[_queue])) {
+            next = _DoubleLinkedQueueEntryOfE()._check(entry[_nextLink]);
+          } else if (!core.identical(this, next[_queue])) {
+            dart.throw(new core.ConcurrentModificationError(this));
+          }
+          entry = next;
         }
       }
       get iterator() {
@@ -26374,8 +26363,8 @@
         [_filter]: dart.definiteFunctionType(dart.void, [ETobool(), core.bool]),
         removeWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
         retainWhere: dart.definiteFunctionType(dart.void, [ETobool()]),
-        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         firstEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
+        lastEntry: dart.definiteFunctionType(collection.DoubleLinkedQueueEntry$(E), []),
         clear: dart.definiteFunctionType(dart.void, []),
         forEachEntry: dart.definiteFunctionType(dart.void, [DoubleLinkedQueueEntryOfETovoid()])
       })
@@ -26394,33 +26383,33 @@
   collection.DoubleLinkedQueue = DoubleLinkedQueue();
   const _nextEntry = Symbol('_nextEntry');
   collection._DoubleLinkedQueueIterator$ = dart.generic(E => {
+    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     let _DoubleLinkedQueueElementOfE = () => (_DoubleLinkedQueueElementOfE = dart.constFn(collection._DoubleLinkedQueueElement$(E)))();
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     let _DoubleLinkedQueueSentinelOfE = () => (_DoubleLinkedQueueSentinelOfE = dart.constFn(collection._DoubleLinkedQueueSentinel$(E)))();
-    let _DoubleLinkedQueueEntryOfE = () => (_DoubleLinkedQueueEntryOfE = dart.constFn(collection._DoubleLinkedQueueEntry$(E)))();
     class _DoubleLinkedQueueIterator extends core.Object {
       new(sentinel) {
         this[_sentinel] = sentinel;
-        this[_nextEntry] = sentinel[_nextLink];
-        this[_current$2] = null;
+        this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(sentinel[_nextLink]);
+        this[_current$1] = null;
       }
       moveNext() {
         if (core.identical(this[_nextEntry], this[_sentinel])) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           this[_nextEntry] = null;
           this[_sentinel] = null;
           return false;
         }
         let elementEntry = _DoubleLinkedQueueElementOfE()._check(this[_nextEntry]);
-        if (elementEntry[_queue] == null) {
+        if (!core.identical(this[_sentinel][_queue], elementEntry[_queue])) {
           dart.throw(new core.ConcurrentModificationError(this[_sentinel][_queue]));
         }
-        this[_current$2] = elementEntry.element;
-        this[_nextEntry] = elementEntry[_nextLink];
+        this[_current$1] = elementEntry[_element];
+        this[_nextEntry] = _DoubleLinkedQueueEntryOfE()._check(elementEntry[_nextLink]);
         return true;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
     }
     dart.addTypeTests(_DoubleLinkedQueueIterator);
@@ -26429,7 +26418,7 @@
       fields: () => ({
         [_sentinel]: _DoubleLinkedQueueSentinelOfE(),
         [_nextEntry]: _DoubleLinkedQueueEntryOfE(),
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26452,7 +26441,7 @@
     let QueueOfE = () => (QueueOfE = dart.constFn(collection.Queue$(E)))();
     let ETovoid = () => (ETovoid = dart.constFn(dart.functionType(dart.void, [E])))();
     let ETobool = () => (ETobool = dart.constFn(dart.functionType(core.bool, [E])))();
-    class ListQueue extends core.Iterable$(E) {
+    class ListQueue extends _internal.ListIterable$(E) {
       new(initialCapacity) {
         if (initialCapacity === void 0) initialCapacity = null;
         this[_head] = 0;
@@ -26480,7 +26469,7 @@
           return queue;
         } else {
           let capacity = collection.ListQueue._INITIAL_CAPACITY;
-          if (_internal.EfficientLength.is(elements)) {
+          if (_internal.EfficientLengthIterable.is(elements)) {
             capacity = elements[dartx.length];
           }
           let result = new (ListQueueOfE())(capacity);
@@ -26729,7 +26718,6 @@
         [_tail]: core.int,
         [_modificationCount]: core.int
       }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       methods: () => ({
         add: dart.definiteFunctionType(dart.void, [E]),
         addAll: dart.definiteFunctionType(dart.void, [IterableOfE()]),
@@ -26782,18 +26770,18 @@
         this[_end] = queue[_tail];
         this[_modificationCount] = queue[_modificationCount];
         this[_position] = queue[_head];
-        this[_current$2] = null;
+        this[_current$1] = null;
       }
       get current() {
-        return this[_current$2];
+        return this[_current$1];
       }
       moveNext() {
         this[_queue][_checkModification](this[_modificationCount]);
         if (this[_position] == this[_end]) {
-          this[_current$2] = null;
+          this[_current$1] = null;
           return false;
         }
-        this[_current$2] = this[_queue][_table][dartx._get](this[_position]);
+        this[_current$1] = this[_queue][_table][dartx._get](this[_position]);
         this[_position] = (dart.notNull(this[_position]) + 1 & dart.notNull(this[_queue][_table][dartx.length]) - 1) >>> 0;
         return true;
       }
@@ -26806,7 +26794,7 @@
         [_end]: core.int,
         [_modificationCount]: core.int,
         [_position]: core.int,
-        [_current$2]: E
+        [_current$1]: E
       }),
       getters: () => ({current: dart.definiteFunctionType(E, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -26862,7 +26850,7 @@
   const _splayMin = Symbol('_splayMin');
   const _splayMax = Symbol('_splayMax');
   const _addNewRoot = Symbol('_addNewRoot');
-  const _clear$ = Symbol('_clear');
+  const _clear = Symbol('_clear');
   collection._SplayTree$ = dart.generic((K, Node) => {
     class _SplayTree extends core.Object {
       new() {
@@ -26987,7 +26975,7 @@
         this[_root] = this[_splayMax](this[_root]);
         return this[_root];
       }
-      [_clear$]() {
+      [_clear]() {
         this[_root] = null;
         this[_count$] = 0;
         this[_modificationCount] = dart.notNull(this[_modificationCount]) + 1;
@@ -27010,7 +26998,7 @@
         [_splayMax]: dart.definiteFunctionType(Node, [Node]),
         [_remove]: dart.definiteFunctionType(Node, [K]),
         [_addNewRoot]: dart.definiteFunctionType(dart.void, [Node, core.int]),
-        [_clear$]: dart.definiteFunctionType(dart.void, [])
+        [_clear]: dart.definiteFunctionType(dart.void, [])
       })
     });
     return _SplayTree;
@@ -27167,7 +27155,7 @@
         return this[_count$];
       }
       clear() {
-        this[_clear$]();
+        this[_clear]();
       }
       containsKey(key) {
         return dart.test(dart.dcall(this[_validKey], key)) && this[_splay](K.as(key)) == 0;
@@ -27387,7 +27375,7 @@
     let SplayTreeSetOfK = () => (SplayTreeSetOfK = dart.constFn(collection.SplayTreeSet$(K)))();
     let _SplayTreeNodeOfK = () => (_SplayTreeNodeOfK = dart.constFn(collection._SplayTreeNode$(K)))();
     let _SplayTreeOfK$_SplayTreeNodeOfK = () => (_SplayTreeOfK$_SplayTreeNodeOfK = dart.constFn(collection._SplayTree$(K, _SplayTreeNodeOfK())))();
-    class _SplayTreeKeyIterable extends core.Iterable$(K) {
+    class _SplayTreeKeyIterable extends _internal.EfficientLengthIterable$(K) {
       new(tree) {
         this[_tree] = tree;
         super.new();
@@ -27408,7 +27396,6 @@
         return set;
       }
     }
-    _SplayTreeKeyIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_SplayTreeKeyIterable, {
       fields: () => ({[_tree]: _SplayTreeOfK$_SplayTreeNodeOfK()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(K), [])})
@@ -27420,7 +27407,7 @@
   collection._SplayTreeValueIterable$ = dart.generic((K, V) => {
     let _SplayTreeValueIteratorOfK$V = () => (_SplayTreeValueIteratorOfK$V = dart.constFn(collection._SplayTreeValueIterator$(K, V)))();
     let SplayTreeMapOfK$V = () => (SplayTreeMapOfK$V = dart.constFn(collection.SplayTreeMap$(K, V)))();
-    class _SplayTreeValueIterable extends core.Iterable$(V) {
+    class _SplayTreeValueIterable extends _internal.EfficientLengthIterable$(V) {
       new(map) {
         this[_map$0] = map;
         super.new();
@@ -27435,7 +27422,6 @@
         return new (_SplayTreeValueIteratorOfK$V())(this[_map$0]);
       }
     }
-    _SplayTreeValueIterable[dart.implements] = () => [_internal.EfficientLength];
     dart.setSignature(_SplayTreeValueIterable, {
       fields: () => ({[_map$0]: SplayTreeMapOfK$V()}),
       getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(V), [])})
@@ -27651,7 +27637,7 @@
         return _;
       }
       clear() {
-        this[_clear$]();
+        this[_clear]();
       }
       toSet() {
         return this[_clone]();
@@ -28188,7 +28174,7 @@
   core.List$ = dart.generic(E => {
     let JSArrayOfE = () => (JSArrayOfE = dart.constFn(_interceptors.JSArray$(E)))();
     let ListOfE = () => (ListOfE = dart.constFn(core.List$(E)))();
-    let IterableOfE = () => (IterableOfE = dart.constFn(core.Iterable$(E)))();
+    let EfficientLengthIterableOfE = () => (EfficientLengthIterableOfE = dart.constFn(_internal.EfficientLengthIterable$(E)))();
     class List extends core.Object {
       static new(length) {
         if (length === void 0) length = null;
@@ -28239,12 +28225,9 @@
         let result = ListOfE().from(elements, {growable: false});
         return _internal.makeFixedListUnmodifiable(E)(result);
       }
-      [Symbol.iterator]() {
-        return new dart.JsIterator(this[dartx.iterator]);
-      }
     }
     dart.addTypeTests(List);
-    List[dart.implements] = () => [IterableOfE(), _internal.EfficientLength];
+    List[dart.implements] = () => [EfficientLengthIterableOfE()];
     return List;
   });
   core.List = List();
@@ -28383,6 +28366,7 @@
     }
   };
   dart.addSimpleTypeTests(convert._UnicodeSubsetEncoder);
+  convert._UnicodeSubsetEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert._UnicodeSubsetEncoder, {
     fields: () => ({[_subsetMask]: core.int}),
     methods: () => ({
@@ -28465,6 +28449,7 @@
     }
   };
   dart.addSimpleTypeTests(convert._UnicodeSubsetDecoder);
+  convert._UnicodeSubsetDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert._UnicodeSubsetDecoder, {
     fields: () => ({
       [_allowInvalid]: core.bool,
@@ -28629,6 +28614,7 @@
   };
   dart.addSimpleTypeTests(convert.Base64Encoder);
   dart.defineNamedConstructor(convert.Base64Encoder, 'urlSafe');
+  convert.Base64Encoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert.Base64Encoder, {
     fields: () => ({[_urlSafe]: core.bool}),
     methods: () => ({
@@ -28655,6 +28641,104 @@
     get decoder() {
       return const$33 || (const$33 = dart.const(new convert.Base64Decoder()));
     }
+    normalize(source, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      end = core.RangeError.checkValidRange(start, end, source[dartx.length]);
+      let percent = 37;
+      let equals = 61;
+      let buffer = null;
+      let sliceStart = start;
+      let alphabet = convert._Base64Encoder._base64Alphabet;
+      let inverseAlphabet = convert._Base64Decoder._inverseAlphabet;
+      let firstPadding = -1;
+      let firstPaddingSourceIndex = -1;
+      let paddingCount = 0;
+      for (let i = start; dart.notNull(i) < dart.notNull(end);) {
+        let sliceEnd = i;
+        let char = source[dartx.codeUnitAt]((() => {
+          let x = i;
+          i = dart.notNull(x) + 1;
+          return x;
+        })());
+        let originalChar = char;
+        if (char == percent) {
+          if (dart.notNull(i) + 2 <= dart.notNull(end)) {
+            char = _internal.parseHexByte(source, i);
+            i = dart.notNull(i) + 2;
+            if (char == percent) char = -1;
+          } else {
+            char = -1;
+          }
+        }
+        if (0 <= dart.notNull(char) && dart.notNull(char) <= 127) {
+          let value = inverseAlphabet[dartx._get](char);
+          if (dart.notNull(value) >= 0) {
+            char = alphabet[dartx.codeUnitAt](value);
+            if (char == originalChar) continue;
+          } else if (value == convert._Base64Decoder._padding) {
+            if (dart.notNull(firstPadding) < 0) {
+              firstPadding = (() => {
+                let l = dart.nullSafe(buffer, _ => _.length);
+                return l != null ? l : 0;
+              })() + (dart.notNull(sliceEnd) - dart.notNull(sliceStart));
+              firstPaddingSourceIndex = sliceEnd;
+            }
+            paddingCount = dart.notNull(paddingCount) + 1;
+            if (originalChar == equals) continue;
+          }
+          if (value != convert._Base64Decoder._invalid) {
+            let t = buffer;
+            t == null ? buffer = new core.StringBuffer() : t;
+            buffer.write(source[dartx.substring](sliceStart, sliceEnd));
+            buffer.writeCharCode(char);
+            sliceStart = i;
+            continue;
+          }
+        }
+        dart.throw(new core.FormatException("Invalid base64 data", source, sliceEnd));
+      }
+      if (buffer != null) {
+        buffer.write(source[dartx.substring](sliceStart, end));
+        if (dart.notNull(firstPadding) >= 0) {
+          convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, buffer.length);
+        } else {
+          let endLength = (dart.notNull(buffer.length) - 1)[dartx['%']](4) + 1;
+          if (endLength == 1) {
+            dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+          }
+          while (dart.notNull(endLength) < 4) {
+            buffer.write("=");
+            endLength = dart.notNull(endLength) + 1;
+          }
+        }
+        return source[dartx.replaceRange](start, end, dart.toString(buffer));
+      }
+      let length = dart.notNull(end) - dart.notNull(start);
+      if (dart.notNull(firstPadding) >= 0) {
+        convert.Base64Codec._checkPadding(source, firstPaddingSourceIndex, end, firstPadding, paddingCount, length);
+      } else {
+        let endLength = length[dartx['%']](4);
+        if (endLength == 1) {
+          dart.throw(new core.FormatException("Invalid base64 encoding length ", source, end));
+        }
+        if (dart.notNull(endLength) > 1) {
+          source = source[dartx.replaceRange](end, end, endLength == 2 ? "==" : "=");
+        }
+      }
+      return source;
+    }
+    static _checkPadding(source, sourceIndex, sourceEnd, firstPadding, paddingCount, length) {
+      if (length[dartx['%']](4) != 0) {
+        dart.throw(new core.FormatException("Invalid base64 padding, padded length must be multiple of four, " + dart.str`is ${length}`, source, sourceEnd));
+      }
+      if (dart.notNull(firstPadding) + dart.notNull(paddingCount) != length) {
+        dart.throw(new core.FormatException("Invalid base64 padding, '=' not at the end", source, sourceIndex));
+      }
+      if (dart.notNull(paddingCount) > 2) {
+        dart.throw(new core.FormatException("Invalid base64 padding, more than two '=' characters", source, sourceIndex));
+      }
+    }
   };
   dart.addSimpleTypeTests(convert.Base64Codec);
   dart.defineNamedConstructor(convert.Base64Codec, 'urlSafe');
@@ -28663,7 +28747,10 @@
     getters: () => ({
       encoder: dart.definiteFunctionType(convert.Base64Encoder, []),
       decoder: dart.definiteFunctionType(convert.Base64Decoder, [])
-    })
+    }),
+    methods: () => ({normalize: dart.definiteFunctionType(core.String, [core.String], [core.int, core.int])}),
+    statics: () => ({_checkPadding: dart.definiteFunctionType(core.int, [core.String, core.int, core.int, core.int, core.int, core.int])}),
+    names: ['_checkPadding']
   });
   convert.BASE64 = dart.const(new convert.Base64Codec());
   convert.BASE64URL = dart.const(new convert.Base64Codec.urlSafe());
@@ -28927,6 +29014,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Base64Decoder);
+  convert.Base64Decoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert.Base64Decoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -29455,6 +29543,7 @@
   });
   convert._InvertedCodec = _InvertedCodec();
   convert._FusedConverter$ = dart.generic((S, M, T) => {
+    let ChunkedConverterOfS$T$S$T = () => (ChunkedConverterOfS$T$S$T = dart.constFn(convert.ChunkedConverter$(S, T, S, T)))();
     let ConverterOfS$M = () => (ConverterOfS$M = dart.constFn(convert.Converter$(S, M)))();
     let ConverterOfM$T = () => (ConverterOfM$T = dart.constFn(convert.Converter$(M, T)))();
     let SinkOfT = () => (SinkOfT = dart.constFn(core.Sink$(T)))();
@@ -29473,6 +29562,7 @@
         return this[_first$0].startChunkedConversion(this[_second].startChunkedConversion(sink));
       }
     }
+    _FusedConverter[dart.implements] = () => [ChunkedConverterOfS$T$S$T()];
     dart.setSignature(_FusedConverter, {
       fields: () => ({
         [_first$0]: ConverterOfS$M(),
@@ -29607,6 +29697,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.HtmlEscape);
+  convert.HtmlEscape[dart.implements] = () => [ChunkedConverterOfString$String$String$String()];
   dart.setSignature(convert.HtmlEscape, {
     fields: () => ({mode: convert.HtmlEscapeMode}),
     methods: () => ({
@@ -29766,6 +29857,7 @@
   };
   dart.addSimpleTypeTests(convert.JsonEncoder);
   dart.defineNamedConstructor(convert.JsonEncoder, 'withIndent');
+  convert.JsonEncoder[dart.implements] = () => [ChunkedConverterOfObject$String$Object$String()];
   dart.setSignature(convert.JsonEncoder, {
     fields: () => ({
       indent: core.String,
@@ -29838,6 +29930,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.JsonUtf8Encoder);
+  convert.JsonUtf8Encoder[dart.implements] = () => [ChunkedConverterOfObject$ListOfint$Object$ListOfint()];
   dart.setSignature(convert.JsonUtf8Encoder, {
     fields: () => ({
       [_indent]: ListOfint(),
@@ -29945,6 +30038,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.JsonDecoder);
+  convert.JsonDecoder[dart.implements] = () => [ChunkedConverterOfString$Object$String$Object()];
   dart.setSignature(convert.JsonDecoder, {
     fields: () => ({[_reviver]: convert._Reviver}),
     methods: () => ({
@@ -31073,6 +31167,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Utf8Encoder);
+  convert.Utf8Encoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(convert.Utf8Encoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
@@ -31285,7 +31380,7 @@
       let buffer = new core.StringBuffer();
       let decoder = new convert._Utf8Decoder(buffer, this[_allowMalformed]);
       decoder.convert(codeUnits, start, end);
-      decoder.close();
+      decoder.flush(codeUnits, end);
       return buffer.toString();
     }
     startChunkedConversion(sink) {
@@ -31310,6 +31405,7 @@
     }
   };
   dart.addSimpleTypeTests(convert.Utf8Decoder);
+  convert.Utf8Decoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(convert.Utf8Decoder, {
     fields: () => ({[_allowMalformed]: core.bool}),
     methods: () => ({
@@ -31359,10 +31455,12 @@
     close() {
       this.flush();
     }
-    flush() {
+    flush(source, offset) {
+      if (source === void 0) source = null;
+      if (offset === void 0) offset = null;
       if (dart.test(this.hasPartialInput)) {
         if (!dart.test(this[_allowMalformed])) {
-          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence"));
+          dart.throw(new core.FormatException("Unfinished UTF-8 octet sequence", source, offset));
         }
         this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
         this[_value] = 0;
@@ -31406,7 +31504,7 @@
                 if ((dart.notNull(unit) & 192) != 128) {
                   expectedUnits = 0;
                   if (!dart.test(this[_allowMalformed])) {
-                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                    dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, i));
                   }
                   this[_isFirstCharacter] = false;
                   this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
@@ -31419,14 +31517,14 @@
               } while (dart.notNull(expectedUnits) > 0);
               if (dart.notNull(value) <= dart.notNull(convert._Utf8Decoder._LIMITS[dartx._get](dart.notNull(extraUnits) - 1))) {
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException(dart.str`Overlong encoding of 0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
                 }
                 expectedUnits = extraUnits = 0;
                 value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               }
               if (dart.notNull(value) > convert._FOUR_BYTE_LIMIT) {
                 if (!dart.test(this[_allowMalformed])) {
-                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`));
+                  dart.throw(new core.FormatException("Character outside valid Unicode range: " + dart.str`0x${value[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - dart.notNull(extraUnits) - 1));
                 }
                 value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               }
@@ -31450,7 +31548,7 @@
             })());
             if (dart.notNull(unit) < 0) {
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Negative UTF-8 code unit: -0x${(-dart.notNull(unit))[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
               }
               this[_stringSink].writeCharCode(convert.UNICODE_REPLACEMENT_CHARACTER_RUNE);
             } else {
@@ -31471,7 +31569,7 @@
                 continue loop;
               }
               if (!dart.test(this[_allowMalformed])) {
-                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`));
+                dart.throw(new core.FormatException(dart.str`Bad UTF-8 encoding 0x${unit[dartx.toRadixString](16)}`, codeUnits, dart.notNull(i) - 1));
               }
               value = convert.UNICODE_REPLACEMENT_CHARACTER_RUNE;
               expectedUnits = extraUnits = 0;
@@ -31500,7 +31598,7 @@
     getters: () => ({hasPartialInput: dart.definiteFunctionType(core.bool, [])}),
     methods: () => ({
       close: dart.definiteFunctionType(dart.void, []),
-      flush: dart.definiteFunctionType(dart.void, []),
+      flush: dart.definiteFunctionType(dart.void, [], [ListOfint(), core.int]),
       convert: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int])
     })
   });
@@ -31537,6 +31635,7 @@
   };
   core.proxy = dart.const(new core._Proxy());
   dart.defineExtensionNames([
+    'hashCode',
     'toString'
   ]);
   core.bool = class bool extends core.Object {
@@ -31544,6 +31643,9 @@
       let defaultValue = opts && 'defaultValue' in opts ? opts.defaultValue : false;
       dart.throw(new core.UnsupportedError('bool.fromEnvironment can only be used as a const constructor'));
     }
+    get [dartx.hashCode]() {
+      return super.hashCode;
+    }
     [dartx.toString]() {
       return this ? "true" : "false";
     }
@@ -32680,108 +32782,42 @@
     return _Generator;
   });
   core._Generator = _Generator();
-  const _end$ = Symbol('_end');
-  const _start$0 = Symbol('_start');
   const _generator$ = Symbol('_generator');
   core._GeneratorIterable$ = dart.generic(E => {
     let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    let _GeneratorIteratorOfE = () => (_GeneratorIteratorOfE = dart.constFn(core._GeneratorIterator$(E)))();
-    let EmptyIterableOfE = () => (EmptyIterableOfE = dart.constFn(_internal.EmptyIterable$(E)))();
-    let _GeneratorIterableOfE = () => (_GeneratorIterableOfE = dart.constFn(core._GeneratorIterable$(E)))();
-    class _GeneratorIterable extends core.Iterable$(E) {
-      new(end, generator) {
-        this[_end$] = end;
-        this[_start$0] = 0;
+    class _GeneratorIterable extends _internal.ListIterable$(E) {
+      get length() {
+        return this[length$];
+      }
+      set length(value) {
+        super.length = value;
+      }
+      new(length, generator) {
+        this[length$] = length;
         this[_generator$] = generator != null ? generator : _GeneratorOfE().as(core._GeneratorIterable._id);
         super.new();
       }
-      slice(start, end, generator) {
-        this[_start$0] = start;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        super.new();
-      }
-      get iterator() {
-        return new (_GeneratorIteratorOfE())(this[_start$0], this[_end$], this[_generator$]);
-      }
-      get length() {
-        return dart.notNull(this[_end$]) - dart.notNull(this[_start$0]);
-      }
-      skip(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return this;
-        let newStart = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newStart >= dart.notNull(this[_end$])) return new (EmptyIterableOfE())();
-        return new (_GeneratorIterableOfE()).slice(newStart, this[_end$], this[_generator$]);
-      }
-      take(count) {
-        core.RangeError.checkNotNegative(count, "count");
-        if (count == 0) return new (EmptyIterableOfE())();
-        let newEnd = dart.notNull(this[_start$0]) + dart.notNull(count);
-        if (newEnd >= dart.notNull(this[_end$])) return this;
-        return new (_GeneratorIterableOfE()).slice(this[_start$0], newEnd, this[_generator$]);
+      elementAt(index) {
+        core.RangeError.checkValidIndex(index, this);
+        return this[_generator$](index);
       }
       static _id(n) {
         return n;
       }
     }
-    dart.defineNamedConstructor(_GeneratorIterable, 'slice');
-    _GeneratorIterable[dart.implements] = () => [_internal.EfficientLength];
+    const length$ = Symbol("_GeneratorIterable.length");
     dart.setSignature(_GeneratorIterable, {
       fields: () => ({
-        [_start$0]: core.int,
-        [_end$]: core.int,
+        length: core.int,
         [_generator$]: _GeneratorOfE()
       }),
-      getters: () => ({iterator: dart.definiteFunctionType(core.Iterator$(E), [])}),
       statics: () => ({_id: dart.definiteFunctionType(core.int, [core.int])}),
       names: ['_id']
     });
-    dart.defineExtensionMembers(_GeneratorIterable, ['skip', 'take', 'iterator', 'length']);
+    dart.defineExtensionMembers(_GeneratorIterable, ['elementAt', 'length']);
     return _GeneratorIterable;
   });
   core._GeneratorIterable = _GeneratorIterable();
-  const _index$1 = Symbol('_index');
-  const _current$3 = Symbol('_current');
-  core._GeneratorIterator$ = dart.generic(E => {
-    let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
-    let _GeneratorOfE = () => (_GeneratorOfE = dart.constFn(core._Generator$(E)))();
-    class _GeneratorIterator extends core.Object {
-      new(index, end, generator) {
-        this[_index$1] = index;
-        this[_end$] = end;
-        this[_generator$] = generator;
-        this[_current$3] = null;
-      }
-      moveNext() {
-        if (dart.notNull(this[_index$1]) < dart.notNull(this[_end$])) {
-          this[_current$3] = this[_generator$](this[_index$1]);
-          this[_index$1] = dart.notNull(this[_index$1]) + 1;
-          return true;
-        } else {
-          this[_current$3] = null;
-          return false;
-        }
-      }
-      get current() {
-        return this[_current$3];
-      }
-    }
-    dart.addTypeTests(_GeneratorIterator);
-    _GeneratorIterator[dart.implements] = () => [IteratorOfE()];
-    dart.setSignature(_GeneratorIterator, {
-      fields: () => ({
-        [_end$]: core.int,
-        [_generator$]: _GeneratorOfE(),
-        [_index$1]: core.int,
-        [_current$3]: E
-      }),
-      getters: () => ({current: dart.definiteFunctionType(E, [])}),
-      methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
-    });
-    return _GeneratorIterator;
-  });
-  core._GeneratorIterator = _GeneratorIterator();
   core.BidirectionalIterator$ = dart.generic(E => {
     let IteratorOfE = () => (IteratorOfE = dart.constFn(core.Iterator$(E)))();
     class BidirectionalIterator extends core.Object {}
@@ -32823,6 +32859,9 @@
     static _uninstantiable() {
       dart.throw(new core.UnsupportedError('class Null cannot be instantiated'));
     }
+    get hashCode() {
+      return super.hashCode;
+    }
     toString() {
       return "null";
     }
@@ -32858,7 +32897,7 @@
   core.RegExp[dart.implements] = () => [core.Pattern];
   core.Set$ = dart.generic(E => {
     let LinkedHashSetOfE = () => (LinkedHashSetOfE = dart.constFn(collection.LinkedHashSet$(E)))();
-    class Set extends core.Iterable$(E) {
+    class Set extends _internal.EfficientLengthIterable$(E) {
       static new() {
         return LinkedHashSetOfE().new();
       }
@@ -32869,7 +32908,6 @@
         return LinkedHashSetOfE().from(elements);
       }
     }
-    Set[dart.implements] = () => [_internal.EfficientLength];
     return Set;
   });
   core.Set = Set();
@@ -32902,41 +32940,38 @@
   dart.setSignature(core._StringStackTrace, {
     fields: () => ({[_stackTrace]: core.String})
   });
+  const _start$0 = Symbol('_start');
   const _stop = Symbol('_stop');
   core.Stopwatch = class Stopwatch extends core.Object {
+    new() {
+      this[_start$0] = 0;
+      this[_stop] = 0;
+      if (core.Stopwatch._frequency == null) core.Stopwatch._initTicker();
+    }
     get frequency() {
       return core.Stopwatch._frequency;
     }
-    new() {
-      this[_start$0] = null;
-      this[_stop] = null;
-      core.Stopwatch._initTicker();
-    }
     start() {
-      if (dart.test(this.isRunning)) return;
-      if (this[_start$0] == null) {
-        this[_start$0] = core.Stopwatch._now();
-      } else {
-        this[_start$0] = dart.notNull(core.Stopwatch._now()) - (dart.notNull(this[_stop]) - dart.notNull(this[_start$0]));
+      if (this[_stop] != null) {
+        this[_start$0] = dart.notNull(this[_start$0]) + (dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_stop]));
         this[_stop] = null;
       }
     }
     stop() {
-      if (!dart.test(this.isRunning)) return;
-      this[_stop] = core.Stopwatch._now();
+      let t = this[_stop];
+      t == null ? this[_stop] = core.Stopwatch._now() : t;
     }
     reset() {
-      if (this[_start$0] == null) return;
-      this[_start$0] = core.Stopwatch._now();
-      if (this[_stop] != null) {
-        this[_stop] = this[_start$0];
-      }
+      this[_start$0] = (() => {
+        let l = this[_stop];
+        return l != null ? l : core.Stopwatch._now();
+      })();
     }
     get elapsedTicks() {
-      if (this[_start$0] == null) {
-        return 0;
-      }
-      return this[_stop] == null ? dart.notNull(core.Stopwatch._now()) - dart.notNull(this[_start$0]) : dart.notNull(this[_stop]) - dart.notNull(this[_start$0]);
+      return dart.notNull((() => {
+        let l = this[_stop];
+        return l != null ? l : core.Stopwatch._now();
+      })()) - dart.notNull(this[_start$0]);
     }
     get elapsed() {
       return new core.Duration({microseconds: this.elapsedMicroseconds});
@@ -32948,7 +32983,7 @@
       return (dart.notNull(this.elapsedTicks) * 1000 / dart.notNull(this.frequency))[dartx.truncate]();
     }
     get isRunning() {
-      return this[_start$0] != null && this[_stop] == null;
+      return this[_stop] == null;
     }
     static _initTicker() {
       _js_helper.Primitives.initTicker();
@@ -33224,37 +33259,471 @@
       return new _internal.Symbol(name);
     }
   };
+  core._SPACE = 32;
+  core._PERCENT = 37;
+  core._AMPERSAND = 38;
+  core._PLUS = 43;
+  core._DOT = 46;
+  core._SLASH = 47;
+  core._COLON = 58;
+  core._EQUALS = 61;
+  core._UPPER_CASE_A = 65;
+  core._UPPER_CASE_Z = 90;
+  core._LEFT_BRACKET = 91;
+  core._BACKSLASH = 92;
+  core._RIGHT_BRACKET = 93;
+  core._LOWER_CASE_A = 97;
+  core._LOWER_CASE_F = 102;
+  core._LOWER_CASE_Z = 122;
+  core._hexDigits = "0123456789ABCDEF";
+  core.Uri = class Uri extends core.Object {
+    static get base() {
+      let uri = _js_helper.Primitives.currentUri();
+      if (uri != null) return core.Uri.parse(uri);
+      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+    }
+    static new(opts) {
+      return core._Uri.new(opts);
+    }
+    static http(authority, unencodedPath, queryParameters) {
+      return core._Uri.http(authority, unencodedPath, queryParameters);
+    }
+    static https(authority, unencodedPath, queryParameters) {
+      return core._Uri.https(authority, unencodedPath, queryParameters);
+    }
+    static file(path, opts) {
+      return core._Uri.file(path, opts);
+    }
+    static directory(path, opts) {
+      return core._Uri.directory(path, opts);
+    }
+    static dataFromString(content, opts) {
+      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
+      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
+      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+      let base64 = opts && 'base64' in opts ? opts.base64 : false;
+      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
+      return data.uri;
+    }
+    static dataFromBytes(bytes, opts) {
+      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
+      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
+      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
+      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
+      return data.uri;
+    }
+    get hasScheme() {
+      return this.scheme[dartx.isNotEmpty];
+    }
+    static parse(uri, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      let t = end;
+      t == null ? end = uri[dartx.length] : t;
+      if (dart.notNull(end) >= dart.notNull(start) + 5) {
+        let dataDelta = core._startsWithData(uri, start);
+        if (dataDelta == 0) {
+          if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) uri = uri[dartx.substring](start, end);
+          return core.UriData._parse(uri, 5, null).uri;
+        } else if (dataDelta == 32) {
+          return core.UriData._parse(uri[dartx.substring](dart.notNull(start) + 5, end), 0, null).uri;
+        }
+      }
+      let indices = ListOfint().new(8);
+      indices[dartx._set](0, 0);
+      indices[dartx._set](core._schemeEndIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._hostStartIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._notSimpleIndex, dart.notNull(start) - 1);
+      indices[dartx._set](core._portStartIndex, start);
+      indices[dartx._set](core._pathStartIndex, start);
+      indices[dartx._set](core._queryStartIndex, end);
+      indices[dartx._set](core._fragmentStartIndex, end);
+      let state = core._scan(uri, start, end, core._uriStart, indices);
+      if (dart.notNull(state) >= core._nonSimpleEndStates) {
+        indices[dartx._set](core._notSimpleIndex, end);
+      }
+      let schemeEnd = indices[dartx._get](core._schemeEndIndex);
+      if (dart.notNull(schemeEnd) >= dart.notNull(start)) {
+        state = core._scan(uri, start, schemeEnd, core._schemeStart, indices);
+        if (state == core._schemeStart) {
+          indices[dartx._set](core._notSimpleIndex, schemeEnd);
+        }
+      }
+      let hostStart = dart.notNull(indices[dartx._get](core._hostStartIndex)) + 1;
+      let portStart = indices[dartx._get](core._portStartIndex);
+      let pathStart = indices[dartx._get](core._pathStartIndex);
+      let queryStart = indices[dartx._get](core._queryStartIndex);
+      let fragmentStart = indices[dartx._get](core._fragmentStartIndex);
+      let scheme = null;
+      if (dart.notNull(fragmentStart) < dart.notNull(queryStart)) queryStart = fragmentStart;
+      if (dart.notNull(pathStart) < dart.notNull(hostStart) || dart.notNull(pathStart) <= dart.notNull(schemeEnd)) {
+        pathStart = queryStart;
+      }
+      if (dart.notNull(portStart) < dart.notNull(hostStart)) portStart = pathStart;
+      dart.assert(hostStart == start || dart.notNull(schemeEnd) <= dart.notNull(hostStart));
+      dart.assert(dart.notNull(hostStart) <= dart.notNull(portStart));
+      dart.assert(dart.notNull(schemeEnd) <= dart.notNull(pathStart));
+      dart.assert(dart.notNull(portStart) <= dart.notNull(pathStart));
+      dart.assert(dart.notNull(pathStart) <= dart.notNull(queryStart));
+      dart.assert(dart.notNull(queryStart) <= dart.notNull(fragmentStart));
+      let isSimple = dart.notNull(indices[dartx._get](core._notSimpleIndex)) < dart.notNull(start);
+      if (isSimple) {
+        if (dart.notNull(hostStart) > dart.notNull(schemeEnd) + 3) {
+          isSimple = false;
+        } else if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 1 == pathStart) {
+          isSimple = false;
+        } else if (dart.notNull(queryStart) < dart.notNull(end) && queryStart == dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("..", pathStart)) || dart.notNull(queryStart) > dart.notNull(pathStart) + 2 && dart.test(uri[dartx.startsWith]("/..", dart.notNull(queryStart) - 3))) {
+          isSimple = false;
+        } else {
+          if (schemeEnd == dart.notNull(start) + 4) {
+            if (dart.test(uri[dartx.startsWith]("file", start))) {
+              scheme = "file";
+              if (dart.notNull(hostStart) <= dart.notNull(start)) {
+                let schemeAuth = "file://";
+                let delta = 2;
+                if (!dart.test(uri[dartx.startsWith]("/", pathStart))) {
+                  schemeAuth = "file:///";
+                  delta = 3;
+                }
+                uri = schemeAuth + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = 7;
+                portStart = 7;
+                pathStart = 7;
+                queryStart = dart.notNull(queryStart) + (delta - dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) + (delta - dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              } else if (pathStart == queryStart) {
+                if (start == 0 && end == uri[dartx.length]) {
+                  uri = uri[dartx.replaceRange](pathStart, queryStart, "/");
+                  queryStart = dart.notNull(queryStart) + 1;
+                  fragmentStart = dart.notNull(fragmentStart) + 1;
+                  end = dart.notNull(end) + 1;
+                } else {
+                  uri = dart.str`${uri[dartx.substring](start, pathStart)}/` + dart.str`${uri[dartx.substring](queryStart, end)}`;
+                  schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                  hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                  portStart = dart.notNull(portStart) - dart.notNull(start);
+                  pathStart = dart.notNull(pathStart) - dart.notNull(start);
+                  queryStart = dart.notNull(queryStart) + (1 - dart.notNull(start));
+                  fragmentStart = dart.notNull(fragmentStart) + (1 - dart.notNull(start));
+                  start = 0;
+                  end = uri[dartx.length];
+                }
+              }
+            } else if (dart.test(uri[dartx.startsWith]("http", start))) {
+              scheme = "http";
+              if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 3 == pathStart && dart.test(uri[dartx.startsWith]("80", dart.notNull(portStart) + 1))) {
+                if (start == 0 && end == uri[dartx.length]) {
+                  uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                  pathStart = dart.notNull(pathStart) - 3;
+                  queryStart = dart.notNull(queryStart) - 3;
+                  fragmentStart = dart.notNull(fragmentStart) - 3;
+                  end = dart.notNull(end) - 3;
+                } else {
+                  uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                  schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                  hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                  portStart = dart.notNull(portStart) - dart.notNull(start);
+                  pathStart = dart.notNull(pathStart) - (3 + dart.notNull(start));
+                  queryStart = dart.notNull(queryStart) - (3 + dart.notNull(start));
+                  fragmentStart = dart.notNull(fragmentStart) - (3 + dart.notNull(start));
+                  start = 0;
+                  end = uri[dartx.length];
+                }
+              }
+            }
+          } else if (schemeEnd == dart.notNull(start) + 5 && dart.test(uri[dartx.startsWith]("https", start))) {
+            scheme = "https";
+            if (dart.notNull(portStart) > dart.notNull(start) && dart.notNull(portStart) + 4 == pathStart && dart.test(uri[dartx.startsWith]("443", dart.notNull(portStart) + 1))) {
+              if (start == 0 && end == uri[dartx.length]) {
+                uri = uri[dartx.replaceRange](portStart, pathStart, "");
+                pathStart = dart.notNull(pathStart) - 4;
+                queryStart = dart.notNull(queryStart) - 4;
+                fragmentStart = dart.notNull(fragmentStart) - 4;
+                end = dart.notNull(end) - 3;
+              } else {
+                uri = dart.notNull(uri[dartx.substring](start, portStart)) + dart.notNull(uri[dartx.substring](pathStart, end));
+                schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+                hostStart = dart.notNull(hostStart) - dart.notNull(start);
+                portStart = dart.notNull(portStart) - dart.notNull(start);
+                pathStart = dart.notNull(pathStart) - (4 + dart.notNull(start));
+                queryStart = dart.notNull(queryStart) - (4 + dart.notNull(start));
+                fragmentStart = dart.notNull(fragmentStart) - (4 + dart.notNull(start));
+                start = 0;
+                end = uri[dartx.length];
+              }
+            }
+          }
+        }
+      }
+      if (isSimple) {
+        if (dart.notNull(start) > 0 || dart.notNull(end) < dart.notNull(uri[dartx.length])) {
+          uri = uri[dartx.substring](start, end);
+          schemeEnd = dart.notNull(schemeEnd) - dart.notNull(start);
+          hostStart = dart.notNull(hostStart) - dart.notNull(start);
+          portStart = dart.notNull(portStart) - dart.notNull(start);
+          pathStart = dart.notNull(pathStart) - dart.notNull(start);
+          queryStart = dart.notNull(queryStart) - dart.notNull(start);
+          fragmentStart = dart.notNull(fragmentStart) - dart.notNull(start);
+        }
+        return new core._SimpleUri(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+      }
+      return core._Uri.notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme);
+    }
+    static encodeComponent(component) {
+      return core._Uri._uriEncode(core._Uri._unreserved2396Table, component, convert.UTF8, false);
+    }
+    static encodeQueryComponent(component, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return core._Uri._uriEncode(core._Uri._unreservedTable, component, encoding, true);
+    }
+    static decodeComponent(encodedComponent) {
+      return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
+    }
+    static decodeQueryComponent(encodedComponent, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return core._Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
+    }
+    static encodeFull(uri) {
+      return core._Uri._uriEncode(core._Uri._encodeFullTable, uri, convert.UTF8, false);
+    }
+    static decodeFull(uri) {
+      return core._Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
+    }
+    static splitQueryString(query, opts) {
+      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
+      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
+        let index = element[dartx.indexOf]("=");
+        if (index == -1) {
+          if (element != "") {
+            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
+          }
+        } else if (index != 0) {
+          let key = element[dartx.substring](0, index);
+          let value = element[dartx.substring](dart.notNull(index) + 1);
+          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
+        }
+        return map;
+      }, MapOfString$StringAndStringToMapOfString$String()));
+    }
+    static parseIPv4Address(host) {
+      return core.Uri._parseIPv4Address(host, 0, host[dartx.length]);
+    }
+    static _parseIPv4Address(host, start, end) {
+      function error(msg, position) {
+        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`, host, position));
+      }
+      dart.fn(error, StringAndintTovoid());
+      let result = typed_data.Uint8List.new(4);
+      let partIndex = 0;
+      let partStart = start;
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = host[dartx.codeUnitAt](i);
+        if (char != core._DOT) {
+          if ((dart.notNull(char) ^ 48) >>> 0 > 9) {
+            error("invalid character", i);
+          }
+        } else {
+          if (partIndex == 3) {
+            error('IPv4 address should contain exactly 4 parts', i);
+          }
+          let part = core.int.parse(host[dartx.substring](partStart, i));
+          if (dart.notNull(part) > 255) {
+            error("each part must be in the range 0..255", partStart);
+          }
+          result[dartx._set](partIndex++, part);
+          partStart = dart.notNull(i) + 1;
+        }
+      }
+      if (partIndex != 3) {
+        error('IPv4 address should contain exactly 4 parts', end);
+      }
+      let part = core.int.parse(host[dartx.substring](partStart, end));
+      if (dart.notNull(part) > 255) {
+        error("each part must be in the range 0..255", partStart);
+      }
+      result[dartx._set](partIndex, part);
+      return result;
+    }
+    static parseIPv6Address(host, start, end) {
+      if (start === void 0) start = 0;
+      if (end === void 0) end = null;
+      if (end == null) end = host[dartx.length];
+      function error(msg, position) {
+        if (position === void 0) position = null;
+        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
+      }
+      dart.fn(error, String__Tovoid());
+      function parseHex(start, end) {
+        if (dart.notNull(end) - dart.notNull(start) > 4) {
+          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
+        }
+        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
+        if (dart.notNull(value) < 0 || dart.notNull(value) > 65535) {
+          error('each part must be in the range of `0x0..0xFFFF`', start);
+        }
+        return value;
+      }
+      dart.fn(parseHex, intAndintToint());
+      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
+      let parts = JSArrayOfint().of([]);
+      let wildcardSeen = false;
+      let seenDot = false;
+      let partStart = start;
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = host[dartx.codeUnitAt](i);
+        if (char == core._COLON) {
+          if (i == start) {
+            i = dart.notNull(i) + 1;
+            if (host[dartx.codeUnitAt](i) != core._COLON) {
+              error('invalid start colon.', i);
+            }
+            partStart = i;
+          }
+          if (i == partStart) {
+            if (wildcardSeen) {
+              error('only one wildcard `::` is allowed', i);
+            }
+            wildcardSeen = true;
+            parts[dartx.add](-1);
+          } else {
+            parts[dartx.add](parseHex(partStart, i));
+          }
+          partStart = dart.notNull(i) + 1;
+        } else if (char == core._DOT) {
+          seenDot = true;
+        }
+      }
+      if (parts[dartx.length] == 0) error('too few parts');
+      let atEnd = partStart == end;
+      let isLastWildcard = parts[dartx.last] == -1;
+      if (atEnd && !isLastWildcard) {
+        error('expected a part after last `:`', end);
+      }
+      if (!atEnd) {
+        if (!seenDot) {
+          parts[dartx.add](parseHex(partStart, end));
+        } else {
+          let last = core.Uri._parseIPv4Address(host, partStart, end);
+          parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
+          parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
+        }
+      }
+      if (wildcardSeen) {
+        if (dart.notNull(parts[dartx.length]) > 7) {
+          error('an address with a wildcard must have less than 7 parts');
+        }
+      } else if (parts[dartx.length] != 8) {
+        error('an address without a wildcard must contain exactly 8 parts');
+      }
+      let bytes = typed_data.Uint8List.new(16);
+      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
+        let value = parts[dartx._get](i);
+        if (value == -1) {
+          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
+          for (let j = 0; j < wildCardLength; j++) {
+            bytes[dartx._set](index, 0);
+            bytes[dartx._set](index + 1, 0);
+            index = index + 2;
+          }
+        } else {
+          bytes[dartx._set](index, value[dartx['>>']](8));
+          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
+          index = index + 2;
+        }
+      }
+      return bytes;
+    }
+  };
+  dart.setSignature(core.Uri, {
+    getters: () => ({hasScheme: dart.definiteFunctionType(core.bool, [])}),
+    statics: () => ({
+      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
+      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
+      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
+      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
+      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
+      _parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String, core.int, core.int]),
+      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int])
+    }),
+    names: ['parse', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', 'parseIPv4Address', '_parseIPv4Address', 'parseIPv6Address']
+  });
   const _userInfo = Symbol('_userInfo');
   const _host = Symbol('_host');
   const _port = Symbol('_port');
-  const _path = Symbol('_path');
   const _query = Symbol('_query');
   const _fragment = Symbol('_fragment');
   const _pathSegments = Symbol('_pathSegments');
+  const _text = Symbol('_text');
+  const _hashCodeCache = Symbol('_hashCodeCache');
   const _queryParameters = Symbol('_queryParameters');
   const _queryParameterLists = Symbol('_queryParameterLists');
   const _writeAuthority = Symbol('_writeAuthority');
   let const$51;
   const _mergePaths = Symbol('_mergePaths');
-  const _toWindowsFilePath = Symbol('_toWindowsFilePath');
   const _toFilePath = Symbol('_toFilePath');
   const _isPathAbsolute = Symbol('_isPathAbsolute');
-  core.Uri = class Uri extends core.Object {
+  const _initializeText = Symbol('_initializeText');
+  core._Uri = class _Uri extends core.Object {
     _internal(scheme, userInfo, host, port, path, query, fragment) {
       this.scheme = scheme;
       this[_userInfo] = userInfo;
       this[_host] = host;
       this[_port] = port;
-      this[_path] = path;
+      this.path = path;
       this[_query] = query;
       this[_fragment] = fragment;
       this[_pathSegments] = null;
+      this[_text] = null;
+      this[_hashCodeCache] = null;
       this[_queryParameters] = null;
       this[_queryParameterLists] = null;
     }
+    static notSimple(uri, start, end, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, scheme) {
+      if (scheme == null) {
+        scheme = "";
+        if (dart.notNull(schemeEnd) > dart.notNull(start)) {
+          scheme = core._Uri._makeScheme(uri, start, schemeEnd);
+        } else if (schemeEnd == start) {
+          core._Uri._fail(uri, start, "Invalid empty scheme");
+        }
+      }
+      let userInfo = "";
+      let host = null;
+      let port = null;
+      if (dart.notNull(hostStart) > dart.notNull(start)) {
+        let userInfoStart = dart.notNull(schemeEnd) + 3;
+        if (userInfoStart < dart.notNull(hostStart)) {
+          userInfo = core._Uri._makeUserInfo(uri, userInfoStart, dart.notNull(hostStart) - 1);
+        }
+        host = core._Uri._makeHost(uri, hostStart, portStart, false);
+        if (dart.notNull(portStart) + 1 < dart.notNull(pathStart)) {
+          port = core.int.parse(uri[dartx.substring](dart.notNull(portStart) + 1, pathStart), {onError: dart.fn(_ => {
+              dart.throw(new core.FormatException("Invalid port", uri, dart.notNull(portStart) + 1));
+            }, StringToNull())});
+          port = core._Uri._makePort(port, scheme);
+        }
+      }
+      let path = core._Uri._makePath(uri, pathStart, queryStart, null, scheme, host != null);
+      let query = null;
+      if (dart.notNull(queryStart) < dart.notNull(fragmentStart)) {
+        query = core._Uri._makeQuery(uri, dart.notNull(queryStart) + 1, fragmentStart, null);
+      }
+      let fragment = null;
+      if (dart.notNull(fragmentStart) < dart.notNull(end)) {
+        fragment = core._Uri._makeFragment(uri, dart.notNull(fragmentStart) + 1, end);
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    }
     static new(opts) {
-      let scheme = opts && 'scheme' in opts ? opts.scheme : "";
-      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : "";
+      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
       let host = opts && 'host' in opts ? opts.host : null;
       let port = opts && 'port' in opts ? opts.port : null;
       let path = opts && 'path' in opts ? opts.path : null;
@@ -33262,33 +33731,37 @@
       let query = opts && 'query' in opts ? opts.query : null;
       let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
       let fragment = opts && 'fragment' in opts ? opts.fragment : null;
-      scheme = core.Uri._makeScheme(scheme, 0, core.Uri._stringOrNullLength(scheme));
-      userInfo = core.Uri._makeUserInfo(userInfo, 0, core.Uri._stringOrNullLength(userInfo));
-      host = core.Uri._makeHost(host, 0, core.Uri._stringOrNullLength(host), false);
+      scheme = core._Uri._makeScheme(scheme, 0, core._stringOrNullLength(scheme));
+      userInfo = core._Uri._makeUserInfo(userInfo, 0, core._stringOrNullLength(userInfo));
+      host = core._Uri._makeHost(host, 0, core._stringOrNullLength(host), false);
       if (query == "") query = null;
-      query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
-      fragment = core.Uri._makeFragment(fragment, 0, core.Uri._stringOrNullLength(fragment));
-      port = core.Uri._makePort(port, scheme);
+      query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+      fragment = core._Uri._makeFragment(fragment, 0, core._stringOrNullLength(fragment));
+      port = core._Uri._makePort(port, scheme);
       let isFile = scheme == "file";
       if (host == null && (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile)) {
         host = "";
       }
       let hasAuthority = host != null;
-      path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
       if (dart.test(scheme[dartx.isEmpty]) && host == null && !dart.test(path[dartx.startsWith]('/'))) {
-        path = core.Uri._normalizeRelativePath(path);
+        let allowScheme = dart.test(scheme[dartx.isNotEmpty]) || host != null;
+        path = core._Uri._normalizeRelativePath(path, allowScheme);
       } else {
-        path = core.Uri._removeDotSegments(path);
+        path = core._Uri._removeDotSegments(path);
       }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+      if (host == null && dart.test(path[dartx.startsWith]("//"))) {
+        host = "";
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
     }
     static http(authority, unencodedPath, queryParameters) {
       if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("http", authority, unencodedPath, queryParameters);
+      return core._Uri._check(core._Uri._makeHttpUri("http", authority, unencodedPath, queryParameters));
     }
     static https(authority, unencodedPath, queryParameters) {
       if (queryParameters === void 0) queryParameters = null;
-      return core.Uri._makeHttpUri("https", authority, unencodedPath, queryParameters);
+      return core._Uri._check(core._Uri._makeHttpUri("https", authority, unencodedPath, queryParameters));
     }
     get authority() {
       if (!dart.test(this.hasAuthority)) return "";
@@ -33307,7 +33780,7 @@
       return this[_host];
     }
     get port() {
-      if (this[_port] == null) return core.Uri._defaultPort(this.scheme);
+      if (this[_port] == null) return core._Uri._defaultPort(this.scheme);
       return this[_port];
     }
     static _defaultPort(scheme) {
@@ -33315,181 +33788,34 @@
       if (scheme == "https") return 443;
       return 0;
     }
-    get path() {
-      return this[_path];
-    }
     get query() {
-      return this[_query] == null ? "" : this[_query];
+      return this[_query] != null ? this[_query] : "";
     }
     get fragment() {
-      return this[_fragment] == null ? "" : this[_fragment];
+      return this[_fragment] != null ? this[_fragment] : "";
     }
-    static parse(uri, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      let EOI = -1;
-      let scheme = "";
-      let userinfo = "";
-      let host = null;
-      let port = null;
-      let path = null;
-      let query = null;
-      let fragment = null;
-      if (end == null) end = uri[dartx.length];
-      let index = start;
-      let pathStart = start;
-      let char = EOI;
-      function parseAuth() {
-        if (index == end) {
-          char = EOI;
-          return;
-        }
-        let authStart = index;
-        let lastColon = -1;
-        let lastAt = -1;
-        char = uri[dartx.codeUnitAt](index);
-        while (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH || char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          if (char == core.Uri._AT_SIGN) {
-            lastAt = index;
-            lastColon = -1;
-          } else if (char == core.Uri._COLON) {
-            lastColon = index;
-          } else if (char == core.Uri._LEFT_BRACKET) {
-            lastColon = -1;
-            let endBracket = uri[dartx.indexOf](']', dart.notNull(index) + 1);
-            if (endBracket == -1) {
-              index = end;
-              char = EOI;
-              break;
-            } else {
-              index = endBracket;
+    isScheme(scheme) {
+      let thisScheme = this.scheme;
+      if (scheme == null) return thisScheme[dartx.isEmpty];
+      if (scheme[dartx.length] != thisScheme[dartx.length]) return false;
+      return core._Uri._compareScheme(scheme, thisScheme);
+    }
+    static _compareScheme(scheme, uri) {
+      for (let i = 0; i < dart.notNull(scheme[dartx.length]); i++) {
+        let schemeChar = scheme[dartx.codeUnitAt](i);
+        let uriChar = uri[dartx.codeUnitAt](i);
+        let delta = (dart.notNull(schemeChar) ^ dart.notNull(uriChar)) >>> 0;
+        if (delta != 0) {
+          if (delta == 32) {
+            let lowerChar = (dart.notNull(uriChar) | delta) >>> 0;
+            if (97 <= lowerChar && lowerChar <= 122) {
+              continue;
             }
           }
-          index = dart.notNull(index) + 1;
-          char = EOI;
-        }
-        let hostStart = authStart;
-        let hostEnd = index;
-        if (dart.notNull(lastAt) >= 0) {
-          userinfo = core.Uri._makeUserInfo(uri, authStart, lastAt);
-          hostStart = dart.notNull(lastAt) + 1;
-        }
-        if (dart.notNull(lastColon) >= 0) {
-          let portNumber = null;
-          if (dart.notNull(lastColon) + 1 < dart.notNull(index)) {
-            portNumber = 0;
-            for (let i = dart.notNull(lastColon) + 1; i < dart.notNull(index); i++) {
-              let digit = uri[dartx.codeUnitAt](i);
-              if (core.Uri._ZERO > dart.notNull(digit) || core.Uri._NINE < dart.notNull(digit)) {
-                core.Uri._fail(uri, i, "Invalid port number");
-              }
-              portNumber = dart.notNull(portNumber) * 10 + (dart.notNull(digit) - core.Uri._ZERO);
-            }
-          }
-          port = core.Uri._makePort(portNumber, scheme);
-          hostEnd = lastColon;
-        }
-        host = core.Uri._makeHost(uri, hostStart, hostEnd, true);
-        if (dart.notNull(index) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
+          return false;
         }
       }
-      dart.fn(parseAuth, VoidTovoid$());
-      let NOT_IN_PATH = 0;
-      let IN_PATH = 1;
-      let ALLOW_AUTH = 2;
-      let state = NOT_IN_PATH;
-      let i = index;
-      while (dart.notNull(i) < dart.notNull(end)) {
-        char = uri[dartx.codeUnitAt](i);
-        if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-          state = NOT_IN_PATH;
-          break;
-        }
-        if (char == core.Uri._SLASH) {
-          state = i == start ? ALLOW_AUTH : IN_PATH;
-          break;
-        }
-        if (char == core.Uri._COLON) {
-          if (i == start) core.Uri._fail(uri, start, "Invalid empty scheme");
-          scheme = core.Uri._makeScheme(uri, start, i);
-          i = dart.notNull(i) + 1;
-          pathStart = i;
-          if (i == end) {
-            char = EOI;
-            state = NOT_IN_PATH;
-          } else {
-            char = uri[dartx.codeUnitAt](i);
-            if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-              state = NOT_IN_PATH;
-            } else if (char == core.Uri._SLASH) {
-              state = ALLOW_AUTH;
-            } else {
-              state = IN_PATH;
-            }
-          }
-          break;
-        }
-        i = dart.notNull(i) + 1;
-        char = EOI;
-      }
-      index = i;
-      if (state == ALLOW_AUTH) {
-        dart.assert(char == core.Uri._SLASH);
-        index = dart.notNull(index) + 1;
-        if (index == end) {
-          char = EOI;
-          state = NOT_IN_PATH;
-        } else {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._SLASH) {
-            index = dart.notNull(index) + 1;
-            parseAuth();
-            pathStart = index;
-          }
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN || char == EOI) {
-            state = NOT_IN_PATH;
-          } else {
-            state = IN_PATH;
-          }
-        }
-      }
-      dart.assert(state == IN_PATH || state == NOT_IN_PATH);
-      if (state == IN_PATH) {
-        while ((index = dart.notNull(index) + 1) < dart.notNull(end)) {
-          char = uri[dartx.codeUnitAt](index);
-          if (char == core.Uri._QUESTION || char == core.Uri._NUMBER_SIGN) {
-            break;
-          }
-          char = EOI;
-        }
-        state = NOT_IN_PATH;
-      }
-      dart.assert(state == NOT_IN_PATH);
-      let hasAuthority = host != null;
-      path = core.Uri._makePath(uri, pathStart, index, null, scheme, hasAuthority);
-      if (char == core.Uri._QUESTION) {
-        let numberSignIndex = -1;
-        for (let i = dart.notNull(index) + 1; i < dart.notNull(end); i++) {
-          if (uri[dartx.codeUnitAt](i) == core.Uri._NUMBER_SIGN) {
-            numberSignIndex = i;
-            break;
-          }
-        }
-        if (numberSignIndex < 0) {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, end, null);
-        } else {
-          query = core.Uri._makeQuery(uri, dart.notNull(index) + 1, numberSignIndex, null);
-          fragment = core.Uri._makeFragment(uri, numberSignIndex + 1, end);
-        }
-      } else if (char == core.Uri._NUMBER_SIGN) {
-        fragment = core.Uri._makeFragment(uri, dart.notNull(index) + 1, end);
-      }
-      return new core.Uri._internal(scheme, userinfo, host, port, path, query, fragment);
+      return true;
     }
     static _fail(uri, index, message) {
       dart.throw(new core.FormatException(message, uri, index));
@@ -33502,7 +33828,8 @@
         let hostStart = 0;
         let hasUserInfo = false;
         for (let i = 0; i < dart.notNull(authority[dartx.length]); i++) {
-          if (authority[dartx.codeUnitAt](i) == core.Uri._AT_SIGN) {
+          let atSign = 64;
+          if (authority[dartx.codeUnitAt](i) == atSign) {
             hasUserInfo = true;
             userInfo = authority[dartx.substring](0, i);
             hostStart = i + 1;
@@ -33510,22 +33837,22 @@
           }
         }
         let hostEnd = hostStart;
-        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core.Uri._LEFT_BRACKET) {
+        if (hostStart < dart.notNull(authority[dartx.length]) && authority[dartx.codeUnitAt](hostStart) == core._LEFT_BRACKET) {
           for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-            if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._RIGHT_BRACKET) break;
+            if (authority[dartx.codeUnitAt](hostEnd) == core._RIGHT_BRACKET) break;
           }
           if (hostEnd == authority[dartx.length]) {
             dart.throw(new core.FormatException("Invalid IPv6 host entry.", authority, hostStart));
           }
           core.Uri.parseIPv6Address(authority, hostStart + 1, hostEnd);
           hostEnd++;
-          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core.Uri._COLON) {
+          if (hostEnd != authority[dartx.length] && authority[dartx.codeUnitAt](hostEnd) != core._COLON) {
             dart.throw(new core.FormatException("Invalid end of authority", authority, hostEnd));
           }
         }
         let hasPort = false;
         for (; hostEnd < dart.notNull(authority[dartx.length]); hostEnd++) {
-          if (authority[dartx.codeUnitAt](hostEnd) == core.Uri._COLON) {
+          if (authority[dartx.codeUnitAt](hostEnd) == core._COLON) {
             let portString = authority[dartx.substring](hostEnd + 1);
             if (dart.test(portString[dartx.isNotEmpty])) port = core.int.parse(portString);
             break;
@@ -33537,33 +33864,13 @@
     }
     static file(path, opts) {
       let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, false) : core.Uri._makeFileUri(path, false));
+      windows = windows == null ? core._Uri._isWindows : windows;
+      return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, false) : core._Uri._makeFileUri(path, false));
     }
     static directory(path, opts) {
       let windows = opts && 'windows' in opts ? opts.windows : null;
-      windows = windows == null ? core.Uri._isWindows : windows;
-      return core.Uri._check(dart.test(windows) ? core.Uri._makeWindowsFileUrl(path, true) : core.Uri._makeFileUri(path, true));
-    }
-    static dataFromString(content, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : null;
-      let encoding = opts && 'encoding' in opts ? opts.encoding : null;
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let base64 = opts && 'base64' in opts ? opts.base64 : false;
-      let data = core.UriData.fromString(content, {mimeType: mimeType, encoding: encoding, parameters: parameters, base64: base64});
-      return data.uri;
-    }
-    static dataFromBytes(bytes, opts) {
-      let mimeType = opts && 'mimeType' in opts ? opts.mimeType : "application/octet-stream";
-      let parameters = opts && 'parameters' in opts ? opts.parameters : null;
-      let percentEncoded = opts && 'percentEncoded' in opts ? opts.percentEncoded : false;
-      let data = core.UriData.fromBytes(bytes, {mimeType: mimeType, parameters: parameters, percentEncoded: percentEncoded});
-      return data.uri;
-    }
-    static get base() {
-      let uri = _js_helper.Primitives.currentUri();
-      if (uri != null) return core.Uri.parse(uri);
-      dart.throw(new core.UnsupportedError("'Uri.base' is not supported"));
+      windows = windows == null ? core._Uri._isWindows : windows;
+      return core._Uri._check(dart.test(windows) ? core._Uri._makeWindowsFileUrl(path, true) : core._Uri._makeFileUri(path, true));
     }
     static get _isWindows() {
       return false;
@@ -33592,7 +33899,7 @@
       }
     }
     static _checkWindowsDriveLetter(charCode, argumentError) {
-      if (core.Uri._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._UPPER_CASE_Z || core.Uri._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core.Uri._LOWER_CASE_Z) {
+      if (core._UPPER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._UPPER_CASE_Z || core._LOWER_CASE_A <= dart.notNull(charCode) && dart.notNull(charCode) <= core._LOWER_CASE_Z) {
         return;
       }
       if (dart.test(argumentError)) {
@@ -33619,7 +33926,7 @@
           path = path[dartx.replaceRange](0, 7, '\\');
         } else {
           path = path[dartx.substring](4);
-          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core.Uri._COLON || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+          if (dart.notNull(path[dartx.length]) < 3 || path[dartx.codeUnitAt](1) != core._COLON || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
             dart.throw(new core.ArgumentError("Windows paths with \\\\?\\ prefix must be absolute"));
           }
         }
@@ -33627,16 +33934,16 @@
         path = path[dartx.replaceAll]("/", '\\');
       }
       let sep = '\\';
-      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
-        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core.Uri._BACKSLASH) {
+      if (dart.notNull(path[dartx.length]) > 1 && path[dartx.codeUnitAt](1) == core._COLON) {
+        core._Uri._checkWindowsDriveLetter(path[dartx.codeUnitAt](0), true);
+        if (path[dartx.length] == 2 || path[dartx.codeUnitAt](2) != core._BACKSLASH) {
           dart.throw(new core.ArgumentError("Windows paths with drive letter must be absolute"));
         }
         let pathSegments = path[dartx.split](sep);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true, 1);
         return core.Uri.new({scheme: "file", pathSegments: pathSegments});
       }
       if (dart.test(path[dartx.startsWith](sep))) {
@@ -33645,7 +33952,7 @@
           let hostPart = dart.notNull(pathStart) < 0 ? path[dartx.substring](2) : path[dartx.substring](2, pathStart);
           let pathPart = dart.notNull(pathStart) < 0 ? "" : path[dartx.substring](dart.notNull(pathStart) + 1);
           let pathSegments = pathPart[dartx.split](sep);
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+          core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
           if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
             pathSegments[dartx.add]("");
           }
@@ -33655,12 +33962,12 @@
           if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
             pathSegments[dartx.add]("");
           }
-          core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+          core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
           return core.Uri.new({scheme: "file", pathSegments: pathSegments});
         }
       } else {
         let pathSegments = path[dartx.split](sep);
-        core.Uri._checkWindowsPathReservedCharacters(pathSegments, true);
+        core._Uri._checkWindowsPathReservedCharacters(pathSegments, true);
         if (dart.test(slashTerminated) && dart.test(pathSegments[dartx.isNotEmpty]) && dart.test(pathSegments[dartx.last][dartx.isNotEmpty])) {
           pathSegments[dartx.add]("");
         }
@@ -33679,27 +33986,27 @@
       let fragment = opts && 'fragment' in opts ? opts.fragment : null;
       let schemeChanged = false;
       if (scheme != null) {
-        scheme = core.Uri._makeScheme(scheme, 0, scheme[dartx.length]);
-        schemeChanged = true;
+        scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+        schemeChanged = scheme != this.scheme;
       } else {
         scheme = this.scheme;
       }
       let isFile = scheme == "file";
       if (userInfo != null) {
-        userInfo = core.Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+        userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
       } else {
         userInfo = this[_userInfo];
       }
       if (port != null) {
-        port = core.Uri._makePort(port, scheme);
+        port = core._Uri._makePort(port, scheme);
       } else {
         port = this[_port];
         if (schemeChanged) {
-          port = core.Uri._makePort(port, scheme);
+          port = core._Uri._makePort(port, scheme);
         }
       }
       if (host != null) {
-        host = core.Uri._makeHost(host, 0, host[dartx.length], false);
+        host = core._Uri._makeHost(host, 0, host[dartx.length], false);
       } else if (dart.test(this.hasAuthority)) {
         host = this[_host];
       } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
@@ -33707,34 +34014,34 @@
       }
       let hasAuthority = host != null;
       if (path != null || pathSegments != null) {
-        path = core.Uri._makePath(path, 0, core.Uri._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+        path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
       } else {
-        path = this[_path];
+        path = this.path;
         if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
           path = "/" + dart.notNull(path);
         }
       }
       if (query != null || queryParameters != null) {
-        query = core.Uri._makeQuery(query, 0, core.Uri._stringOrNullLength(query), queryParameters);
+        query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
       } else {
         query = this[_query];
       }
       if (fragment != null) {
-        fragment = core.Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+        fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
       } else {
         fragment = this[_fragment];
       }
-      return new core.Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
     }
     removeFragment() {
       if (!dart.test(this.hasFragment)) return this;
-      return new core.Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this[_path], this[_query], null);
+      return new core._Uri._internal(this.scheme, this[_userInfo], this[_host], this[_port], this.path, this[_query], null);
     }
     get pathSegments() {
       let result = this[_pathSegments];
       if (result != null) return result;
       let pathToSplit = this.path;
-      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core.Uri._SLASH) {
+      if (dart.test(pathToSplit[dartx.isNotEmpty]) && pathToSplit[dartx.codeUnitAt](0) == core._SLASH) {
         pathToSplit = pathToSplit[dartx.substring](1);
       }
       result = pathToSplit == "" ? const$51 || (const$51 = dart.constList([], core.String)) : ListOfString().unmodifiable(pathToSplit[dartx.split]("/")[dartx.map](core.String)(core.Uri.decodeComponent));
@@ -33749,7 +34056,7 @@
     }
     get queryParametersAll() {
       if (this[_queryParameterLists] == null) {
-        let queryParameterLists = core.Uri._splitQueryStringAll(this.query);
+        let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
         for (let key of queryParameterLists[dartx.keys]) {
           queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
         }
@@ -33758,36 +34065,36 @@
       return this[_queryParameterLists];
     }
     normalizePath() {
-      let path = core.Uri._normalizePath(this[_path], this.scheme, this.hasAuthority);
-      if (core.identical(path, this[_path])) return this;
+      let path = core._Uri._normalizePath(this.path, this.scheme, this.hasAuthority);
+      if (core.identical(path, this.path)) return this;
       return this.replace({path: path});
     }
     static _makePort(port, scheme) {
-      if (port != null && port == core.Uri._defaultPort(scheme)) return null;
+      if (port != null && port == core._Uri._defaultPort(scheme)) return null;
       return port;
     }
     static _makeHost(host, start, end, strictIPv6) {
       if (host == null) return null;
       if (start == end) return "";
-      if (host[dartx.codeUnitAt](start) == core.Uri._LEFT_BRACKET) {
-        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core.Uri._RIGHT_BRACKET) {
-          core.Uri._fail(host, start, 'Missing end `]` to match `[` in host');
+      if (host[dartx.codeUnitAt](start) == core._LEFT_BRACKET) {
+        if (host[dartx.codeUnitAt](dart.notNull(end) - 1) != core._RIGHT_BRACKET) {
+          core._Uri._fail(host, start, 'Missing end `]` to match `[` in host');
         }
         core.Uri.parseIPv6Address(host, dart.notNull(start) + 1, dart.notNull(end) - 1);
         return host[dartx.substring](start, end)[dartx.toLowerCase]();
       }
       if (!dart.test(strictIPv6)) {
         for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-          if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
+          if (host[dartx.codeUnitAt](i) == core._COLON) {
             core.Uri.parseIPv6Address(host, start, end);
             return dart.str`[${host}]`;
           }
         }
       }
-      return core.Uri._normalizeRegName(host, start, end);
+      return core._Uri._normalizeRegName(host, start, end);
     }
     static _isRegNameChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+      return dart.notNull(char) < 127 && (dart.notNull(core._Uri._regNameTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
     }
     static _normalizeRegName(host, start, end) {
       let buffer = null;
@@ -33796,8 +34103,8 @@
       let isNormalized = true;
       while (dart.notNull(index) < dart.notNull(end)) {
         let char = host[dartx.codeUnitAt](index);
-        if (char == core.Uri._PERCENT) {
-          let replacement = core.Uri._normalizeEscape(host, index, true);
+        if (char == core._PERCENT) {
+          let replacement = core._Uri._normalizeEscape(host, index, true);
           if (replacement == null && isNormalized) {
             index = dart.notNull(index) + 3;
             continue;
@@ -33817,8 +34124,8 @@
           index = dart.notNull(index) + sourceLength;
           sectionStart = index;
           isNormalized = true;
-        } else if (dart.test(core.Uri._isRegNameChar(char))) {
-          if (isNormalized && core.Uri._UPPER_CASE_A <= dart.notNull(char) && core.Uri._UPPER_CASE_Z >= dart.notNull(char)) {
+        } else if (dart.test(core._Uri._isRegNameChar(char))) {
+          if (isNormalized && core._UPPER_CASE_A <= dart.notNull(char) && core._UPPER_CASE_Z >= dart.notNull(char)) {
             if (buffer == null) buffer = new core.StringBuffer();
             if (dart.notNull(sectionStart) < dart.notNull(index)) {
               buffer.write(host[dartx.substring](sectionStart, index));
@@ -33827,8 +34134,8 @@
             isNormalized = false;
           }
           index = dart.notNull(index) + 1;
-        } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-          core.Uri._fail(host, index, "Invalid character");
+        } else if (dart.test(core._Uri._isGeneralDelimiter(char))) {
+          core._Uri._fail(host, index, "Invalid character");
         } else {
           let sourceLength = 1;
           if ((dart.notNull(char) & 64512) == 55296 && dart.notNull(index) + 1 < dart.notNull(end)) {
@@ -33842,7 +34149,7 @@
           let slice = host[dartx.substring](sectionStart, index);
           if (!isNormalized) slice = slice[dartx.toLowerCase]();
           buffer.write(slice);
-          buffer.write(core.Uri._escapeChar(char));
+          buffer.write(core._Uri._escapeChar(char));
           index = dart.notNull(index) + sourceLength;
           sectionStart = index;
         }
@@ -33858,26 +34165,33 @@
     static _makeScheme(scheme, start, end) {
       if (start == end) return "";
       let firstCodeUnit = scheme[dartx.codeUnitAt](start);
-      if (!dart.test(core.Uri._isAlphabeticCharacter(firstCodeUnit))) {
-        core.Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
+      if (!dart.test(core._Uri._isAlphabeticCharacter(firstCodeUnit))) {
+        core._Uri._fail(scheme, start, "Scheme not starting with alphabetic character");
       }
       let containsUpperCase = false;
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
         let codeUnit = scheme[dartx.codeUnitAt](i);
-        if (!dart.test(core.Uri._isSchemeCharacter(codeUnit))) {
-          core.Uri._fail(scheme, i, "Illegal scheme character");
+        if (!dart.test(core._Uri._isSchemeCharacter(codeUnit))) {
+          core._Uri._fail(scheme, i, "Illegal scheme character");
         }
-        if (core.Uri._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core.Uri._UPPER_CASE_Z) {
+        if (core._UPPER_CASE_A <= dart.notNull(codeUnit) && dart.notNull(codeUnit) <= core._UPPER_CASE_Z) {
           containsUpperCase = true;
         }
       }
       scheme = scheme[dartx.substring](start, end);
       if (containsUpperCase) scheme = scheme[dartx.toLowerCase]();
+      return core._Uri._canonicalizeScheme(scheme);
+    }
+    static _canonicalizeScheme(scheme) {
+      if (scheme == "http") return "http";
+      if (scheme == "file") return "file";
+      if (scheme == "https") return "https";
+      if (scheme == "package") return "package";
       return scheme;
     }
     static _makeUserInfo(userInfo, start, end) {
       if (userInfo == null) return "";
-      return core.Uri._normalize(userInfo, start, end, core.Uri._userinfoTable);
+      return core._Uri._normalizeOrSubstring(userInfo, start, end, core._Uri._userinfoTable);
     }
     static _makePath(path, start, end, pathSegments, scheme, hasAuthority) {
       let isFile = scheme == "file";
@@ -33888,30 +34202,32 @@
       }
       let result = null;
       if (path != null) {
-        result = core.Uri._normalize(path, start, end, core.Uri._pathCharOrSlashTable);
+        result = core._Uri._normalizeOrSubstring(path, start, end, core._Uri._pathCharOrSlashTable);
       } else {
-        result = pathSegments[dartx.map](core.String)(dart.fn(s => core.Uri._uriEncode(core.Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
+        result = pathSegments[dartx.map](core.String)(dart.fn(s => core._Uri._uriEncode(core._Uri._pathCharTable, s, convert.UTF8, false), StringToString$()))[dartx.join]("/");
       }
       if (dart.test(dart.dload(result, 'isEmpty'))) {
         if (isFile) return "/";
       } else if (ensureLeadingSlash && !dart.test(dart.dsend(result, 'startsWith', '/'))) {
         result = "/" + dart.notNull(core.String._check(result));
       }
-      result = core.Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
+      result = core._Uri._normalizePath(core.String._check(result), scheme, hasAuthority);
       return core.String._check(result);
     }
     static _normalizePath(path, scheme, hasAuthority) {
       if (dart.test(scheme[dartx.isEmpty]) && !dart.test(hasAuthority) && !dart.test(path[dartx.startsWith]('/'))) {
-        return core.Uri._normalizeRelativePath(path);
+        return core._Uri._normalizeRelativePath(path, dart.test(scheme[dartx.isNotEmpty]) || dart.test(hasAuthority));
       }
-      return core.Uri._removeDotSegments(path);
+      return core._Uri._removeDotSegments(path);
     }
     static _makeQuery(query, start, end, queryParameters) {
-      if (query == null && queryParameters == null) return null;
-      if (query != null && queryParameters != null) {
-        dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+      if (query != null) {
+        if (queryParameters != null) {
+          dart.throw(new core.ArgumentError('Both query and queryParameters specified'));
+        }
+        return core._Uri._normalizeOrSubstring(query, start, end, core._Uri._queryCharTable);
       }
-      if (query != null) return core.Uri._normalize(query, start, end, core.Uri._queryCharTable);
+      if (queryParameters == null) return null;
       let result = new core.StringBuffer();
       let separator = "";
       function writeParameter(key, value) {
@@ -33939,52 +34255,40 @@
     }
     static _makeFragment(fragment, start, end) {
       if (fragment == null) return null;
-      return core.Uri._normalize(fragment, start, end, core.Uri._queryCharTable);
-    }
-    static _stringOrNullLength(s) {
-      return s == null ? 0 : s[dartx.length];
+      return core._Uri._normalizeOrSubstring(fragment, start, end, core._Uri._queryCharTable);
     }
     static _normalizeEscape(source, index, lowerCase) {
-      dart.assert(source[dartx.codeUnitAt](index) == core.Uri._PERCENT);
+      dart.assert(source[dartx.codeUnitAt](index) == core._PERCENT);
       if (dart.notNull(index) + 2 >= dart.notNull(source[dartx.length])) {
         return "%";
       }
       let firstDigit = source[dartx.codeUnitAt](dart.notNull(index) + 1);
       let secondDigit = source[dartx.codeUnitAt](dart.notNull(index) + 2);
-      let firstDigitValue = core.Uri._parseHexDigit(firstDigit);
-      let secondDigitValue = core.Uri._parseHexDigit(secondDigit);
+      let firstDigitValue = _internal.hexDigitValue(firstDigit);
+      let secondDigitValue = _internal.hexDigitValue(secondDigit);
       if (dart.notNull(firstDigitValue) < 0 || dart.notNull(secondDigitValue) < 0) {
         return "%";
       }
       let value = dart.notNull(firstDigitValue) * 16 + dart.notNull(secondDigitValue);
-      if (dart.test(core.Uri._isUnreservedChar(value))) {
-        if (dart.test(lowerCase) && core.Uri._UPPER_CASE_A <= value && core.Uri._UPPER_CASE_Z >= value) {
+      if (dart.test(core._Uri._isUnreservedChar(value))) {
+        if (dart.test(lowerCase) && core._UPPER_CASE_A <= value && core._UPPER_CASE_Z >= value) {
           value = (value | 32) >>> 0;
         }
         return core.String.fromCharCode(value);
       }
-      if (dart.notNull(firstDigit) >= core.Uri._LOWER_CASE_A || dart.notNull(secondDigit) >= core.Uri._LOWER_CASE_A) {
+      if (dart.notNull(firstDigit) >= core._LOWER_CASE_A || dart.notNull(secondDigit) >= core._LOWER_CASE_A) {
         return source[dartx.substring](index, dart.notNull(index) + 3)[dartx.toUpperCase]();
       }
       return null;
     }
-    static _parseHexDigit(char) {
-      let digit = (dart.notNull(char) ^ core.Uri._ZERO) >>> 0;
-      if (digit <= 9) return digit;
-      let lowerCase = (dart.notNull(char) | 32) >>> 0;
-      if (core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_F) {
-        return lowerCase - (core.Uri._LOWER_CASE_A - 10);
-      }
-      return -1;
-    }
     static _escapeChar(char) {
       dart.assert(dart.notNull(char) <= 1114111);
       let codeUnits = null;
       if (dart.notNull(char) < 128) {
         codeUnits = ListOfint().new(3);
-        codeUnits[dartx._set](0, core.Uri._PERCENT);
-        codeUnits[dartx._set](1, core.Uri._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
-        codeUnits[dartx._set](2, core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
+        codeUnits[dartx._set](0, core._PERCENT);
+        codeUnits[dartx._set](1, core._hexDigits[dartx.codeUnitAt](char[dartx['>>']](4)));
+        codeUnits[dartx._set](2, core._hexDigits[dartx.codeUnitAt](dart.notNull(char) & 15));
       } else {
         let flag = 192;
         let encodedBytes = 2;
@@ -34000,16 +34304,21 @@
         let index = 0;
         while (--encodedBytes >= 0) {
           let byte = (char[dartx['>>']](6 * encodedBytes) & 63 | flag) >>> 0;
-          codeUnits[dartx._set](index, core.Uri._PERCENT);
-          codeUnits[dartx._set](index + 1, core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          codeUnits[dartx._set](index + 2, core.Uri._hexDigits[dartx.codeUnitAt](byte & 15));
+          codeUnits[dartx._set](index, core._PERCENT);
+          codeUnits[dartx._set](index + 1, core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+          codeUnits[dartx._set](index + 2, core._hexDigits[dartx.codeUnitAt](byte & 15));
           index = index + 3;
           flag = 128;
         }
       }
       return core.String.fromCharCodes(codeUnits);
     }
-    static _normalize(component, start, end, charTable) {
+    static _normalizeOrSubstring(component, start, end, charTable) {
+      let l = core._Uri._normalize(component, start, end, charTable);
+      return l != null ? l : component[dartx.substring](start, end);
+    }
+    static _normalize(component, start, end, charTable, opts) {
+      let escapeDelimiters = opts && 'escapeDelimiters' in opts ? opts.escapeDelimiters : false;
       let buffer = null;
       let sectionStart = start;
       let index = start;
@@ -34020,8 +34329,8 @@
         } else {
           let replacement = null;
           let sourceLength = null;
-          if (char == core.Uri._PERCENT) {
-            replacement = core.Uri._normalizeEscape(component, index, false);
+          if (char == core._PERCENT) {
+            replacement = core._Uri._normalizeEscape(component, index, false);
             if (replacement == null) {
               index = dart.notNull(index) + 3;
               continue;
@@ -34032,8 +34341,8 @@
             } else {
               sourceLength = 3;
             }
-          } else if (dart.test(core.Uri._isGeneralDelimiter(char))) {
-            core.Uri._fail(component, index, "Invalid character");
+          } else if (!dart.test(escapeDelimiters) && dart.test(core._Uri._isGeneralDelimiter(char))) {
+            core._Uri._fail(component, index, "Invalid character");
           } else {
             sourceLength = 1;
             if ((dart.notNull(char) & 64512) == 55296) {
@@ -34045,7 +34354,7 @@
                 }
               }
             }
-            replacement = core.Uri._escapeChar(char);
+            replacement = core._Uri._escapeChar(char);
           }
           if (buffer == null) buffer = new core.StringBuffer();
           buffer.write(component[dartx.substring](sectionStart, index));
@@ -34055,7 +34364,7 @@
         }
       }
       if (buffer == null) {
-        return component[dartx.substring](start, end);
+        return null;
       }
       if (dart.notNull(sectionStart) < dart.notNull(end)) {
         buffer.write(component[dartx.substring](sectionStart, end));
@@ -34063,10 +34372,10 @@
       return dart.toString(buffer);
     }
     static _isSchemeCharacter(ch) {
-      return dart.notNull(ch) < 128 && (dart.notNull(core.Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+      return dart.notNull(ch) < 128 && (dart.notNull(core._Uri._schemeTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
     }
     static _isGeneralDelimiter(ch) {
-      return dart.notNull(ch) <= core.Uri._RIGHT_BRACKET && (dart.notNull(core.Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
+      return dart.notNull(ch) <= core._RIGHT_BRACKET && (dart.notNull(core._Uri._genDelimitersTable[dartx._get](ch[dartx['>>']](4))) & 1 << (dart.notNull(ch) & 15)) != 0;
     }
     get isAbsolute() {
       return this.scheme != "" && this.fragment == "";
@@ -34085,7 +34394,7 @@
           break;
         }
         let delta = dart.notNull(baseEnd) - dart.notNull(newEnd);
-        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core.Uri._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core.Uri._DOT)) {
+        if ((delta == 2 || delta == 3) && base[dartx.codeUnitAt](dart.notNull(newEnd) + 1) == core._DOT && (delta == 2 || base[dartx.codeUnitAt](dart.notNull(newEnd) + 2) == core._DOT)) {
           break;
         }
         baseEnd = newEnd;
@@ -34099,7 +34408,7 @@
       return index != -1;
     }
     static _removeDotSegments(path) {
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+      if (!dart.test(core._Uri._mayContainDotSegments(path))) return path;
       dart.assert(path[dartx.isNotEmpty]);
       let output = JSArrayOfString().of([]);
       let appendSlash = false;
@@ -34122,9 +34431,12 @@
       if (appendSlash) output[dartx.add]("");
       return output[dartx.join]("/");
     }
-    static _normalizeRelativePath(path) {
+    static _normalizeRelativePath(path, allowScheme) {
       dart.assert(!dart.test(path[dartx.startsWith]('/')));
-      if (!dart.test(core.Uri._mayContainDotSegments(path))) return path;
+      if (!dart.test(core._Uri._mayContainDotSegments(path))) {
+        if (!dart.test(allowScheme)) path = core._Uri._escapeScheme(path);
+        return path;
+      }
       dart.assert(path[dartx.isNotEmpty]);
       let output = JSArrayOfString().of([]);
       let appendSlash = false;
@@ -34147,8 +34459,23 @@
         return "./";
       }
       if (appendSlash || output[dartx.last] == '..') output[dartx.add]("");
+      if (!dart.test(allowScheme)) output[dartx._set](0, core._Uri._escapeScheme(output[dartx._get](0)));
       return output[dartx.join]("/");
     }
+    static _escapeScheme(path) {
+      if (dart.notNull(path[dartx.length]) >= 2 && dart.test(core._Uri._isAlphabeticCharacter(path[dartx.codeUnitAt](0)))) {
+        for (let i = 1; i < dart.notNull(path[dartx.length]); i++) {
+          let char = path[dartx.codeUnitAt](i);
+          if (char == core._COLON) {
+            return dart.str`${path[dartx.substring](0, i)}%3A${path[dartx.substring](i + 1)}`;
+          }
+          if (dart.notNull(char) > 127 || (dart.notNull(core._Uri._schemeTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) == 0) {
+            break;
+          }
+        }
+      }
+      return path;
+    }
     resolve(reference) {
       return this.resolveUri(core.Uri.parse(reference));
     }
@@ -34166,7 +34493,7 @@
           targetHost = reference.host;
           targetPort = dart.test(reference.hasPort) ? reference.port : null;
         }
-        targetPath = core.Uri._removeDotSegments(reference.path);
+        targetPath = core._Uri._removeDotSegments(reference.path);
         if (dart.test(reference.hasQuery)) {
           targetQuery = reference.query;
         }
@@ -34175,15 +34502,15 @@
         if (dart.test(reference.hasAuthority)) {
           targetUserInfo = reference.userInfo;
           targetHost = reference.host;
-          targetPort = core.Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
-          targetPath = core.Uri._removeDotSegments(reference.path);
+          targetPort = core._Uri._makePort(dart.test(reference.hasPort) ? reference.port : null, targetScheme);
+          targetPath = core._Uri._removeDotSegments(reference.path);
           if (dart.test(reference.hasQuery)) targetQuery = reference.query;
         } else {
           targetUserInfo = this[_userInfo];
           targetHost = this[_host];
           targetPort = this[_port];
           if (reference.path == "") {
-            targetPath = this[_path];
+            targetPath = this.path;
             if (dart.test(reference.hasQuery)) {
               targetQuery = reference.query;
             } else {
@@ -34191,20 +34518,24 @@
             }
           } else {
             if (dart.test(reference.hasAbsolutePath)) {
-              targetPath = core.Uri._removeDotSegments(reference.path);
+              targetPath = core._Uri._removeDotSegments(reference.path);
             } else {
               if (dart.test(this.hasEmptyPath)) {
-                if (!dart.test(this.hasScheme) && !dart.test(this.hasAuthority)) {
-                  targetPath = reference.path;
+                if (!dart.test(this.hasAuthority)) {
+                  if (!dart.test(this.hasScheme)) {
+                    targetPath = reference.path;
+                  } else {
+                    targetPath = core._Uri._removeDotSegments(reference.path);
+                  }
                 } else {
-                  targetPath = core.Uri._removeDotSegments("/" + dart.notNull(reference.path));
+                  targetPath = core._Uri._removeDotSegments("/" + dart.notNull(reference.path));
                 }
               } else {
-                let mergedPath = this[_mergePaths](this[_path], reference.path);
+                let mergedPath = this[_mergePaths](this.path, reference.path);
                 if (dart.test(this.hasScheme) || dart.test(this.hasAuthority) || dart.test(this.hasAbsolutePath)) {
-                  targetPath = core.Uri._removeDotSegments(mergedPath);
+                  targetPath = core._Uri._removeDotSegments(mergedPath);
                 } else {
-                  targetPath = core.Uri._normalizeRelativePath(mergedPath);
+                  targetPath = core._Uri._normalizeRelativePath(mergedPath, dart.test(this.hasScheme) || dart.test(this.hasAuthority));
                 }
               }
             }
@@ -34213,7 +34544,7 @@
         }
       }
       let fragment = dart.test(reference.hasFragment) ? reference.fragment : null;
-      return new core.Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
+      return new core._Uri._internal(targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery, fragment);
     }
     get hasScheme() {
       return this.scheme[dartx.isNotEmpty];
@@ -34231,18 +34562,21 @@
       return this[_fragment] != null;
     }
     get hasEmptyPath() {
-      return this[_path][dartx.isEmpty];
+      return this.path[dartx.isEmpty];
     }
     get hasAbsolutePath() {
-      return this[_path][dartx.startsWith]('/');
+      return this.path[dartx.startsWith]('/');
     }
     get origin() {
-      if (this.scheme == "" || this[_host] == null || this[_host] == "") {
+      if (this.scheme == "") {
         dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
       }
       if (this.scheme != "http" && this.scheme != "https") {
         dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
       }
+      if (this[_host] == null || this[_host] == "") {
+        dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+      }
       if (this[_port] == null) return dart.str`${this.scheme}://${this[_host]}`;
       return dart.str`${this.scheme}://${this[_host]}:${this[_port]}`;
     }
@@ -34257,43 +34591,46 @@
       if (this.fragment != "") {
         dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
       }
-      if (windows == null) windows = core.Uri._isWindows;
-      return dart.test(windows) ? this[_toWindowsFilePath]() : this[_toFilePath]();
+      if (windows == null) windows = core._Uri._isWindows;
+      return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
     }
     [_toFilePath]() {
-      if (this.host != "") {
+      if (dart.test(this.hasAuthority) && this.host != "") {
         dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
       }
-      core.Uri._checkNonWindowsPathReservedCharacters(this.pathSegments, false);
+      let pathSegments = this.pathSegments;
+      core._Uri._checkNonWindowsPathReservedCharacters(pathSegments, false);
       let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute])) result.write("/");
-      result.writeAll(this.pathSegments, "/");
+      if (dart.test(this.hasAbsolutePath)) result.write("/");
+      result.writeAll(pathSegments, "/");
       return result.toString();
     }
-    [_toWindowsFilePath]() {
+    static _toWindowsFilePath(uri) {
       let hasDriveLetter = false;
-      let segments = this.pathSegments;
-      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core.Uri._COLON) {
-        core.Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
-        core.Uri._checkWindowsPathReservedCharacters(segments, false, 1);
+      let segments = uri.pathSegments;
+      if (dart.notNull(segments[dartx.length]) > 0 && segments[dartx._get](0)[dartx.length] == 2 && segments[dartx._get](0)[dartx.codeUnitAt](1) == core._COLON) {
+        core._Uri._checkWindowsDriveLetter(segments[dartx._get](0)[dartx.codeUnitAt](0), false);
+        core._Uri._checkWindowsPathReservedCharacters(segments, false, 1);
         hasDriveLetter = true;
       } else {
-        core.Uri._checkWindowsPathReservedCharacters(segments, false);
+        core._Uri._checkWindowsPathReservedCharacters(segments, false, 0);
       }
       let result = new core.StringBuffer();
-      if (dart.test(this[_isPathAbsolute]) && !hasDriveLetter) result.write("\\");
-      if (this.host != "") {
-        result.write("\\");
-        result.write(this.host);
-        result.write("\\");
+      if (dart.test(uri.hasAbsolutePath) && !hasDriveLetter) result.write("\\");
+      if (dart.test(uri.hasAuthority)) {
+        let host = uri.host;
+        if (dart.test(host[dartx.isNotEmpty])) {
+          result.write("\\");
+          result.write(host);
+          result.write("\\");
+        }
       }
       result.writeAll(segments, "\\");
       if (hasDriveLetter && segments[dartx.length] == 1) result.write("\\");
       return result.toString();
     }
     get [_isPathAbsolute]() {
-      if (this.path == null || dart.test(this.path[dartx.isEmpty])) return false;
-      return this.path[dartx.startsWith]('/');
+      return this.path != null && dart.test(this.path[dartx.startsWith]('/'));
     }
     [_writeAuthority](ss) {
       if (dart.test(this[_userInfo][dartx.isNotEmpty])) {
@@ -34310,9 +34647,17 @@
       return this.scheme == "data" ? core.UriData.fromUri(this) : null;
     }
     toString() {
+      let t = this[_text];
+      return t == null ? this[_text] = this[_initializeText]() : t;
+    }
+    [_initializeText]() {
+      dart.assert(this[_text] == null);
       let sb = new core.StringBuffer();
-      core.Uri._addIfNonEmpty(sb, this.scheme, this.scheme, ':');
-      if (dart.test(this.hasAuthority) || dart.test(this.path[dartx.startsWith]("//")) || this.scheme == "file") {
+      if (dart.test(this.scheme[dartx.isNotEmpty])) {
+        sb.write(this.scheme);
+        sb.write(":");
+      }
+      if (dart.test(this.hasAuthority) || this.scheme == "file") {
         sb.write("//");
         this[_writeAuthority](sb);
       }
@@ -34328,58 +34673,16 @@
       return sb.toString();
     }
     ['=='](other) {
-      if (!core.Uri.is(other)) return false;
-      let uri = core.Uri._check(other);
-      return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+      if (core.identical(this, other)) return true;
+      if (core.Uri.is(other)) {
+        let uri = other;
+        return this.scheme == uri.scheme && this.hasAuthority == uri.hasAuthority && this.userInfo == uri.userInfo && this.host == uri.host && this.port == uri.port && this.path == uri.path && this.hasQuery == uri.hasQuery && this.query == uri.query && this.hasFragment == uri.hasFragment && this.fragment == uri.fragment;
+      }
+      return false;
     }
     get hashCode() {
-      function combine(part, current) {
-        return core.int._check(dart.dsend(dart.dsend(dart.dsend(current, '*', 31), '+', dart.hashCode(part)), '&', 1073741823));
-      }
-      dart.fn(combine, dynamicAnddynamicToint());
-      return combine(this.scheme, combine(this.userInfo, combine(this.host, combine(this.port, combine(this.path, combine(this.query, combine(this.fragment, 1)))))));
-    }
-    static _addIfNonEmpty(sb, test, first, second) {
-      if ("" != test) {
-        sb.write(first);
-        sb.write(second);
-      }
-    }
-    static encodeComponent(component) {
-      return core.Uri._uriEncode(core.Uri._unreserved2396Table, component, convert.UTF8, false);
-    }
-    static encodeQueryComponent(component, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriEncode(core.Uri._unreservedTable, component, encoding, true);
-    }
-    static decodeComponent(encodedComponent) {
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], convert.UTF8, false);
-    }
-    static decodeQueryComponent(encodedComponent, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return core.Uri._uriDecode(encodedComponent, 0, encodedComponent[dartx.length], encoding, true);
-    }
-    static encodeFull(uri) {
-      return core.Uri._uriEncode(core.Uri._encodeFullTable, uri, convert.UTF8, false);
-    }
-    static decodeFull(uri) {
-      return core.Uri._uriDecode(uri, 0, uri[dartx.length], convert.UTF8, false);
-    }
-    static splitQueryString(query, opts) {
-      let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return query[dartx.split]("&")[dartx.fold](MapOfString$String())(dart.map({}, core.String, core.String), dart.fn((map, element) => {
-        let index = element[dartx.indexOf]("=");
-        if (index == -1) {
-          if (element != "") {
-            map[dartx._set](core.Uri.decodeQueryComponent(element, {encoding: encoding}), "");
-          }
-        } else if (index != 0) {
-          let key = element[dartx.substring](0, index);
-          let value = element[dartx.substring](dart.notNull(index) + 1);
-          map[dartx._set](core.Uri.decodeQueryComponent(key, {encoding: encoding}), core.Uri.decodeQueryComponent(value, {encoding: encoding}));
-        }
-        return map;
-      }, MapOfString$StringAndStringToMapOfString$String()));
+      let t = this[_hashCodeCache];
+      return t == null ? this[_hashCodeCache] = dart.hashCode(this.toString()) : t;
     }
     static _createList() {
       return [];
@@ -34395,22 +34698,20 @@
         let value = null;
         if (start == end) return;
         if (dart.notNull(equalsIndex) < 0) {
-          key = core.Uri._uriDecode(query, start, end, encoding, true);
+          key = core._Uri._uriDecode(query, start, end, encoding, true);
           value = "";
         } else {
-          key = core.Uri._uriDecode(query, start, equalsIndex, encoding, true);
-          value = core.Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
+          key = core._Uri._uriDecode(query, start, equalsIndex, encoding, true);
+          value = core._Uri._uriDecode(query, dart.notNull(equalsIndex) + 1, end, encoding, true);
         }
-        dart.dsend(result[dartx.putIfAbsent](key, core.Uri._createList), 'add', value);
+        dart.dsend(result[dartx.putIfAbsent](key, core._Uri._createList), 'add', value);
       }
       dart.fn(parsePair, intAndintAndintTovoid());
-      let _equals = 61;
-      let _ampersand = 38;
       while (i < dart.notNull(query[dartx.length])) {
         let char = query[dartx.codeUnitAt](i);
-        if (char == _equals) {
+        if (char == core._EQUALS) {
           if (equalsIndex < 0) equalsIndex = i;
-        } else if (char == _ampersand) {
+        } else if (char == core._AMPERSAND) {
           parsePair(start, equalsIndex, i);
           start = i + 1;
           equalsIndex = -1;
@@ -34420,125 +34721,17 @@
       parsePair(start, equalsIndex, i);
       return result;
     }
-    static parseIPv4Address(host) {
-      function error(msg) {
-        dart.throw(new core.FormatException(dart.str`Illegal IPv4 address, ${msg}`));
-      }
-      dart.fn(error, StringTovoid$());
-      let bytes = host[dartx.split]('.');
-      if (bytes[dartx.length] != 4) {
-        error('IPv4 address should contain exactly 4 parts');
-      }
-      return bytes[dartx.map](core.int)(dart.fn(byteString => {
-        let byte = core.int.parse(byteString);
-        if (dart.notNull(byte) < 0 || dart.notNull(byte) > 255) {
-          error('each part must be in the range of `0..255`');
-        }
-        return byte;
-      }, StringToint$()))[dartx.toList]();
-    }
-    static parseIPv6Address(host, start, end) {
-      if (start === void 0) start = 0;
-      if (end === void 0) end = null;
-      if (end == null) end = host[dartx.length];
-      function error(msg, position) {
-        if (position === void 0) position = null;
-        dart.throw(new core.FormatException(dart.str`Illegal IPv6 address, ${msg}`, host, core.int._check(position)));
-      }
-      dart.fn(error, String__Tovoid());
-      function parseHex(start, end) {
-        if (dart.notNull(end) - dart.notNull(start) > 4) {
-          error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-        }
-        let value = core.int.parse(host[dartx.substring](start, end), {radix: 16});
-        if (dart.notNull(value) < 0 || dart.notNull(value) > (1 << 16) - 1) {
-          error('each part must be in the range of `0x0..0xFFFF`', start);
-        }
-        return value;
-      }
-      dart.fn(parseHex, intAndintToint());
-      if (dart.notNull(host[dartx.length]) < 2) error('address is too short');
-      let parts = JSArrayOfint().of([]);
-      let wildcardSeen = false;
-      let partStart = start;
-      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
-        if (host[dartx.codeUnitAt](i) == core.Uri._COLON) {
-          if (i == start) {
-            i = dart.notNull(i) + 1;
-            if (host[dartx.codeUnitAt](i) != core.Uri._COLON) {
-              error('invalid start colon.', i);
-            }
-            partStart = i;
-          }
-          if (i == partStart) {
-            if (wildcardSeen) {
-              error('only one wildcard `::` is allowed', i);
-            }
-            wildcardSeen = true;
-            parts[dartx.add](-1);
-          } else {
-            parts[dartx.add](parseHex(partStart, i));
-          }
-          partStart = dart.notNull(i) + 1;
-        }
-      }
-      if (parts[dartx.length] == 0) error('too few parts');
-      let atEnd = partStart == end;
-      let isLastWildcard = parts[dartx.last] == -1;
-      if (atEnd && !isLastWildcard) {
-        error('expected a part after last `:`', end);
-      }
-      if (!atEnd) {
-        try {
-          parts[dartx.add](parseHex(partStart, end));
-        } catch (e) {
-          try {
-            let last = core.Uri.parseIPv4Address(host[dartx.substring](partStart, end));
-            parts[dartx.add]((dart.notNull(last[dartx._get](0)) << 8 | dart.notNull(last[dartx._get](1))) >>> 0);
-            parts[dartx.add]((dart.notNull(last[dartx._get](2)) << 8 | dart.notNull(last[dartx._get](3))) >>> 0);
-          } catch (e) {
-            error('invalid end of IPv6 address.', partStart);
-          }
-
-        }
-
-      }
-      if (wildcardSeen) {
-        if (dart.notNull(parts[dartx.length]) > 7) {
-          error('an address with a wildcard must have less than 7 parts');
-        }
-      } else if (parts[dartx.length] != 8) {
-        error('an address without a wildcard must contain exactly 8 parts');
-      }
-      let bytes = typed_data.Uint8List.new(16);
-      for (let i = 0, index = 0; i < dart.notNull(parts[dartx.length]); i++) {
-        let value = parts[dartx._get](i);
-        if (value == -1) {
-          let wildCardLength = 9 - dart.notNull(parts[dartx.length]);
-          for (let j = 0; j < wildCardLength; j++) {
-            bytes[dartx._set](index, 0);
-            bytes[dartx._set](index + 1, 0);
-            index = index + 2;
-          }
-        } else {
-          bytes[dartx._set](index, value[dartx['>>']](8));
-          bytes[dartx._set](index + 1, dart.notNull(value) & 255);
-          index = index + 2;
-        }
-      }
-      return bytes;
-    }
     static _uriEncode(canonicalTable, text, encoding, spaceToPlus) {
-      if (core.identical(encoding, convert.UTF8) && dart.test(core.Uri._needsNoEncoding.hasMatch(text))) {
+      if (core.identical(encoding, convert.UTF8) && dart.test(core._Uri._needsNoEncoding.hasMatch(text))) {
         return text;
       }
-      let result = new core.StringBuffer();
+      let result = new core.StringBuffer('');
       let bytes = encoding.encode(text);
       for (let i = 0; i < dart.notNull(bytes[dartx.length]); i++) {
         let byte = bytes[dartx._get](i);
         if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
           result.writeCharCode(byte);
-        } else if (dart.test(spaceToPlus) && byte == core.Uri._SPACE) {
+        } else if (dart.test(spaceToPlus) && byte == core._SPACE) {
           result.write('+');
         } else {
           let hexDigits = '0123456789ABCDEF';
@@ -34574,7 +34767,7 @@
       let simple = true;
       for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
         let codeUnit = text[dartx.codeUnitAt](i);
-        if (dart.notNull(codeUnit) > 127 || codeUnit == core.Uri._PERCENT || dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
+        if (dart.notNull(codeUnit) > 127 || codeUnit == core._PERCENT || dart.test(plusToSpace) && codeUnit == core._PLUS) {
           simple = false;
           break;
         }
@@ -34593,14 +34786,14 @@
           if (dart.notNull(codeUnit) > 127) {
             dart.throw(new core.ArgumentError("Illegal percent encoding in URI"));
           }
-          if (codeUnit == core.Uri._PERCENT) {
+          if (codeUnit == core._PERCENT) {
             if (dart.notNull(i) + 3 > dart.notNull(text[dartx.length])) {
               dart.throw(new core.ArgumentError('Truncated URI'));
             }
-            bytes[dartx.add](core.Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
+            bytes[dartx.add](core._Uri._hexCharPairToByte(text, dart.notNull(i) + 1));
             i = dart.notNull(i) + 2;
-          } else if (dart.test(plusToSpace) && codeUnit == core.Uri._PLUS) {
-            bytes[dartx.add](core.Uri._SPACE);
+          } else if (dart.test(plusToSpace) && codeUnit == core._PLUS) {
+            bytes[dartx.add](core._SPACE);
           } else {
             bytes[dartx.add](codeUnit);
           }
@@ -34610,23 +34803,26 @@
     }
     static _isAlphabeticCharacter(codeUnit) {
       let lowerCase = (dart.notNull(codeUnit) | 32) >>> 0;
-      return core.Uri._LOWER_CASE_A <= lowerCase && lowerCase <= core.Uri._LOWER_CASE_Z;
+      return core._LOWER_CASE_A <= lowerCase && lowerCase <= core._LOWER_CASE_Z;
     }
     static _isUnreservedChar(char) {
-      return dart.notNull(char) < 127 && (dart.notNull(core.Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
+      return dart.notNull(char) < 127 && (dart.notNull(core._Uri._unreservedTable[dartx._get](char[dartx['>>']](4))) & 1 << (dart.notNull(char) & 15)) != 0;
     }
   };
-  dart.defineNamedConstructor(core.Uri, '_internal');
-  dart.setSignature(core.Uri, {
+  dart.defineNamedConstructor(core._Uri, '_internal');
+  core._Uri[dart.implements] = () => [core.Uri];
+  dart.setSignature(core._Uri, {
     fields: () => ({
       scheme: core.String,
       [_userInfo]: core.String,
       [_host]: core.String,
       [_port]: core.int,
-      [_path]: core.String,
+      path: core.String,
       [_query]: core.String,
       [_fragment]: core.String,
       [_pathSegments]: ListOfString(),
+      [_text]: core.String,
+      [_hashCodeCache]: core.int,
       [_queryParameters]: MapOfString$String(),
       [_queryParameterLists]: MapOfString$ListOfString()
     }),
@@ -34635,7 +34831,6 @@
       userInfo: dart.definiteFunctionType(core.String, []),
       host: dart.definiteFunctionType(core.String, []),
       port: dart.definiteFunctionType(core.int, []),
-      path: dart.definiteFunctionType(core.String, []),
       query: dart.definiteFunctionType(core.String, []),
       fragment: dart.definiteFunctionType(core.String, []),
       pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
@@ -34654,6 +34849,7 @@
       data: dart.definiteFunctionType(core.UriData, [])
     }),
     methods: () => ({
+      isScheme: dart.definiteFunctionType(core.bool, [core.String]),
       replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
       removeFragment: dart.definiteFunctionType(core.Uri, []),
       normalizePath: dart.definiteFunctionType(core.Uri, []),
@@ -34662,12 +34858,12 @@
       resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
       toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
       [_toFilePath]: dart.definiteFunctionType(core.String, []),
-      [_toWindowsFilePath]: dart.definiteFunctionType(core.String, []),
-      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink])
+      [_writeAuthority]: dart.definiteFunctionType(dart.void, [core.StringSink]),
+      [_initializeText]: dart.definiteFunctionType(core.String, [])
     }),
     statics: () => ({
       _defaultPort: dart.definiteFunctionType(core.int, [core.String]),
-      parse: dart.definiteFunctionType(core.Uri, [core.String], [core.int, core.int]),
+      _compareScheme: dart.definiteFunctionType(core.bool, [core.String, core.String]),
       _fail: dart.definiteFunctionType(dart.void, [core.String, core.int, core.String]),
       _makeHttpUri: dart.definiteFunctionType(core.Uri, [core.String, core.String, core.String, MapOfString$String()]),
       _checkNonWindowsPathReservedCharacters: dart.definiteFunctionType(dart.dynamic, [ListOfString(), core.bool]),
@@ -34680,85 +34876,50 @@
       _isRegNameChar: dart.definiteFunctionType(core.bool, [core.int]),
       _normalizeRegName: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
       _makeScheme: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
+      _canonicalizeScheme: dart.definiteFunctionType(core.String, [core.String]),
       _makeUserInfo: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
       _makePath: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, IterableOfString(), core.String, core.bool]),
       _normalizePath: dart.definiteFunctionType(core.String, [core.String, core.String, core.bool]),
       _makeQuery: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, MapOfString$dynamic()]),
       _makeFragment: dart.definiteFunctionType(core.String, [core.String, core.int, core.int]),
-      _stringOrNullLength: dart.definiteFunctionType(core.int, [core.String]),
       _normalizeEscape: dart.definiteFunctionType(core.String, [core.String, core.int, core.bool]),
-      _parseHexDigit: dart.definiteFunctionType(core.int, [core.int]),
       _escapeChar: dart.definiteFunctionType(core.String, [core.int]),
-      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+      _normalizeOrSubstring: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()]),
+      _normalize: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, ListOfint()], {escapeDelimiters: core.bool}),
       _isSchemeCharacter: dart.definiteFunctionType(core.bool, [core.int]),
       _isGeneralDelimiter: dart.definiteFunctionType(core.bool, [core.int]),
       _mayContainDotSegments: dart.definiteFunctionType(core.bool, [core.String]),
       _removeDotSegments: dart.definiteFunctionType(core.String, [core.String]),
-      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String]),
-      _addIfNonEmpty: dart.definiteFunctionType(dart.void, [core.StringBuffer, core.String, core.String, core.String]),
-      encodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      encodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      decodeComponent: dart.definiteFunctionType(core.String, [core.String]),
-      decodeQueryComponent: dart.definiteFunctionType(core.String, [core.String], {encoding: convert.Encoding}),
-      encodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      decodeFull: dart.definiteFunctionType(core.String, [core.String]),
-      splitQueryString: dart.definiteFunctionType(core.Map$(core.String, core.String), [core.String], {encoding: convert.Encoding}),
+      _normalizeRelativePath: dart.definiteFunctionType(core.String, [core.String, core.bool]),
+      _escapeScheme: dart.definiteFunctionType(core.String, [core.String]),
+      _toWindowsFilePath: dart.definiteFunctionType(core.String, [core.Uri]),
       _createList: dart.definiteFunctionType(core.List, []),
       _splitQueryStringAll: dart.definiteFunctionType(core.Map, [core.String], {encoding: convert.Encoding}),
-      parseIPv4Address: dart.definiteFunctionType(core.List$(core.int), [core.String]),
-      parseIPv6Address: dart.definiteFunctionType(core.List$(core.int), [core.String], [core.int, core.int]),
       _uriEncode: dart.definiteFunctionType(core.String, [ListOfint(), core.String, convert.Encoding, core.bool]),
       _hexCharPairToByte: dart.definiteFunctionType(core.int, [core.String, core.int]),
       _uriDecode: dart.definiteFunctionType(core.String, [core.String, core.int, core.int, convert.Encoding, core.bool]),
       _isAlphabeticCharacter: dart.definiteFunctionType(core.bool, [core.int]),
       _isUnreservedChar: dart.definiteFunctionType(core.bool, [core.int])
     }),
-    names: ['_defaultPort', 'parse', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_stringOrNullLength', '_normalizeEscape', '_parseHexDigit', '_escapeChar', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_addIfNonEmpty', 'encodeComponent', 'encodeQueryComponent', 'decodeComponent', 'decodeQueryComponent', 'encodeFull', 'decodeFull', 'splitQueryString', '_createList', '_splitQueryStringAll', 'parseIPv4Address', 'parseIPv6Address', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
+    names: ['_defaultPort', '_compareScheme', '_fail', '_makeHttpUri', '_checkNonWindowsPathReservedCharacters', '_checkWindowsPathReservedCharacters', '_checkWindowsDriveLetter', '_makeFileUri', '_makeWindowsFileUrl', '_makePort', '_makeHost', '_isRegNameChar', '_normalizeRegName', '_makeScheme', '_canonicalizeScheme', '_makeUserInfo', '_makePath', '_normalizePath', '_makeQuery', '_makeFragment', '_normalizeEscape', '_escapeChar', '_normalizeOrSubstring', '_normalize', '_isSchemeCharacter', '_isGeneralDelimiter', '_mayContainDotSegments', '_removeDotSegments', '_normalizeRelativePath', '_escapeScheme', '_toWindowsFilePath', '_createList', '_splitQueryStringAll', '_uriEncode', '_hexCharPairToByte', '_uriDecode', '_isAlphabeticCharacter', '_isUnreservedChar']
   });
-  core.Uri._SPACE = 32;
-  core.Uri._DOUBLE_QUOTE = 34;
-  core.Uri._NUMBER_SIGN = 35;
-  core.Uri._PERCENT = 37;
-  core.Uri._ASTERISK = 42;
-  core.Uri._PLUS = 43;
-  core.Uri._DOT = 46;
-  core.Uri._SLASH = 47;
-  core.Uri._ZERO = 48;
-  core.Uri._NINE = 57;
-  core.Uri._COLON = 58;
-  core.Uri._LESS = 60;
-  core.Uri._GREATER = 62;
-  core.Uri._QUESTION = 63;
-  core.Uri._AT_SIGN = 64;
-  core.Uri._UPPER_CASE_A = 65;
-  core.Uri._UPPER_CASE_F = 70;
-  core.Uri._UPPER_CASE_Z = 90;
-  core.Uri._LEFT_BRACKET = 91;
-  core.Uri._BACKSLASH = 92;
-  core.Uri._RIGHT_BRACKET = 93;
-  core.Uri._LOWER_CASE_A = 97;
-  core.Uri._LOWER_CASE_F = 102;
-  core.Uri._LOWER_CASE_Z = 122;
-  core.Uri._BAR = 124;
-  core.Uri._hexDigits = "0123456789ABCDEF";
-  core.Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
-  core.Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
-  core.Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
-  core.Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
-  core.Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
-  dart.defineLazy(core.Uri, {
+  core._Uri._unreservedTable = dart.constList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._unreserved2396Table = dart.constList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._encodeFullTable = dart.constList([0, 0, 65498, 45055, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._schemeTable = dart.constList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047], core.int);
+  core._Uri._schemeLowerTable = dart.constList([0, 0, 26624, 1023, 0, 0, 65534, 2047], core.int);
+  core._Uri._subDelimitersTable = dart.constList([0, 0, 32722, 11263, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._genDelimitersTable = dart.constList([0, 0, 32776, 33792, 1, 10240, 0, 0], core.int);
+  core._Uri._userinfoTable = dart.constList([0, 0, 32722, 12287, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._regNameTable = dart.constList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431], core.int);
+  core._Uri._pathCharTable = dart.constList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._pathCharOrSlashTable = dart.constList([0, 0, 65490, 12287, 65535, 34815, 65534, 18431], core.int);
+  core._Uri._queryCharTable = dart.constList([0, 0, 65490, 45055, 65535, 34815, 65534, 18431], core.int);
+  dart.defineLazy(core._Uri, {
     get _needsNoEncoding() {
       return core.RegExp.new('^[\\-\\.0-9A-Z_a-z~]*$');
     }
   });
-  const _text = Symbol('_text');
   const _separatorIndices = Symbol('_separatorIndices');
   const _uriCache = Symbol('_uriCache');
   core.UriData = class UriData extends core.Object {
@@ -34842,9 +35003,9 @@
         if (dart.notNull(slashIndex) < 0) {
           dart.throw(new core.ArgumentError.value(mimeType, "mimeType", "Invalid MIME type"));
         }
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](0, slashIndex), convert.UTF8, false));
         buffer.write("/");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, mimeType[dartx.substring](dart.notNull(slashIndex) + 1), convert.UTF8, false));
       }
       if (charsetName != null) {
         if (indices != null) {
@@ -34852,7 +35013,7 @@
           indices[dartx.add](dart.notNull(buffer.length) + 8);
         }
         buffer.write(";charset=");
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, charsetName, convert.UTF8, false));
       }
       dart.nullSafe(parameters, _ => _[dartx.forEach](dart.fn((key, value) => {
         if (dart.test(key[dartx.isEmpty])) {
@@ -34863,17 +35024,17 @@
         }
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write(';');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, key, convert.UTF8, false));
         if (indices != null) indices[dartx.add](buffer.length);
         buffer.write('=');
-        buffer.write(core.Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
+        buffer.write(core._Uri._uriEncode(core.UriData._tokenCharTable, value, convert.UTF8, false));
       }, StringAndStringToNull())));
     }
     static _validateMimeType(mimeType) {
       let slashIndex = -1;
       for (let i = 0; i < dart.notNull(mimeType[dartx.length]); i++) {
         let char = mimeType[dartx.codeUnitAt](i);
-        if (char != core.Uri._SLASH) continue;
+        if (char != core._SLASH) continue;
         if (slashIndex < 0) {
           slashIndex = i;
           continue;
@@ -34883,10 +35044,16 @@
       return slashIndex;
     }
     static parse(uri) {
-      if (!dart.test(uri[dartx.startsWith]("data:"))) {
-        dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
+      if (dart.notNull(uri[dartx.length]) >= 5) {
+        let dataDelta = core._startsWithData(uri, 0);
+        if (dataDelta == 0) {
+          return core.UriData._parse(uri, 5, null);
+        }
+        if (dataDelta == 32) {
+          return core.UriData._parse(uri[dartx.substring](5), 0, null);
+        }
       }
-      return core.UriData._parse(uri, 5, null);
+      dart.throw(new core.FormatException("Does not start with 'data:'", uri, 0));
     }
     get uri() {
       if (this[_uriCache] != null) return this[_uriCache];
@@ -34894,20 +35061,20 @@
       let query = null;
       let colonIndex = this[_separatorIndices][dartx._get](0);
       let queryIndex = this[_text][dartx.indexOf]('?', dart.notNull(colonIndex) + 1);
-      let end = null;
+      let end = this[_text][dartx.length];
       if (dart.notNull(queryIndex) >= 0) {
-        query = this[_text][dartx.substring](dart.notNull(queryIndex) + 1);
+        query = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(queryIndex) + 1, end, core._Uri._queryCharTable);
         end = queryIndex;
       }
-      path = this[_text][dartx.substring](dart.notNull(colonIndex) + 1, end);
-      this[_uriCache] = new core.Uri._internal("data", "", null, null, path, query, null);
+      path = core._Uri._normalizeOrSubstring(this[_text], dart.notNull(colonIndex) + 1, end, core._Uri._pathCharOrSlashTable);
+      this[_uriCache] = new core._DataUri(this, path, query);
       return this[_uriCache];
     }
     get mimeType() {
       let start = dart.notNull(this[_separatorIndices][dartx._get](0)) + 1;
       let end = this[_separatorIndices][dartx._get](1);
       if (start == end) return "text/plain";
-      return core.Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
+      return core._Uri._uriDecode(this[_text], start, end, convert.UTF8, false);
     }
     get charset() {
       let parameterStart = 1;
@@ -34919,7 +35086,7 @@
         let keyStart = dart.notNull(this[_separatorIndices][dartx._get](i)) + 1;
         let keyEnd = this[_separatorIndices][dartx._get](i + 1);
         if (keyEnd == keyStart + 7 && dart.test(this[_text][dartx.startsWith]("charset", keyStart))) {
-          return core.Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
+          return core._Uri._uriDecode(this[_text], dart.notNull(keyEnd) + 1, this[_separatorIndices][dartx._get](i + 2), convert.UTF8, false);
         }
       }
       return "US-ASCII";
@@ -34957,10 +35124,8 @@
           result[dartx._set](index++, codeUnit);
         } else {
           if (i + 2 < dart.notNull(text[dartx.length])) {
-            let digit1 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 1));
-            let digit2 = core.Uri._parseHexDigit(text[dartx.codeUnitAt](i + 2));
-            if (dart.notNull(digit1) >= 0 && dart.notNull(digit2) >= 0) {
-              let byte = dart.notNull(digit1) * 16 + dart.notNull(digit2);
+            let byte = _internal.parseHexByte(text, i + 1);
+            if (dart.notNull(byte) >= 0) {
               result[dartx._set](index++, byte);
               i = i + 2;
               continue;
@@ -34987,7 +35152,7 @@
         let converter = convert.BASE64.decoder.fuse(core.String)(encoding.decoder);
         return converter.convert(text[dartx.substring](start));
       }
-      return core.Uri._uriDecode(text, start, text[dartx.length], encoding, false);
+      return core._Uri._uriDecode(text, start, text[dartx.length], encoding, false);
     }
     get parameters() {
       let result = dart.map({}, core.String, core.String);
@@ -34995,8 +35160,8 @@
         let start = dart.notNull(this[_separatorIndices][dartx._get](i - 2)) + 1;
         let equals = this[_separatorIndices][dartx._get](i - 1);
         let end = this[_separatorIndices][dartx._get](i);
-        let key = core.Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
-        let value = core.Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
+        let key = core._Uri._uriDecode(this[_text], start, equals, convert.UTF8, false);
+        let value = core._Uri._uriDecode(this[_text], dart.notNull(equals) + 1, end, convert.UTF8, false);
         result[dartx._set](key, value);
       }
       return result;
@@ -35049,6 +35214,15 @@
         }
       }
       indices[dartx.add](i);
+      let isBase64 = indices[dartx.length][dartx.isOdd];
+      if (dart.test(isBase64)) {
+        text = convert.BASE64.normalize(text, dart.notNull(i) + 1, text[dartx.length]);
+      } else {
+        let data = core._Uri._normalize(text, dart.notNull(i) + 1, text[dartx.length], core.UriData._uricTable, {escapeDelimiters: true});
+        if (data != null) {
+          text = text[dartx.replaceRange](dart.notNull(i) + 1, text[dartx.length], data);
+        }
+      }
       return new core.UriData._(text, indices, sourceUri);
     }
     static _uriEncodeBytes(canonicalTable, bytes, buffer) {
@@ -35059,9 +35233,9 @@
         if (dart.notNull(byte) < 128 && (dart.notNull(canonicalTable[dartx._get](byte[dartx['>>']](4))) & 1 << (dart.notNull(byte) & 15)) != 0) {
           buffer.writeCharCode(byte);
         } else {
-          buffer.writeCharCode(core.Uri._PERCENT);
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
-          buffer.writeCharCode(core.Uri._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
+          buffer.writeCharCode(core._PERCENT);
+          buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](byte[dartx['>>']](4)));
+          buffer.writeCharCode(core._hexDigits[dartx.codeUnitAt](dart.notNull(byte) & 15));
         }
       }
       if ((dart.notNull(byteOr) & ~255) != 0) {
@@ -35107,7 +35281,667 @@
   });
   core.UriData._noScheme = -1;
   core.UriData._tokenCharTable = dart.constList([0, 0, 27858, 1023, 65534, 51199, 65535, 32767], core.int);
-  core.UriData._uricTable = core.Uri._queryCharTable;
+  core.UriData._uricTable = core._Uri._queryCharTable;
+  core.UriData._base64Table = dart.constList([0, 0, 34816, 1023, 65534, 2047, 65534, 2047], core.int);
+  core._schemeEndIndex = 1;
+  core._hostStartIndex = 2;
+  core._portStartIndex = 3;
+  core._pathStartIndex = 4;
+  core._queryStartIndex = 5;
+  core._fragmentStartIndex = 6;
+  core._notSimpleIndex = 7;
+  core._uriStart = 0;
+  core._nonSimpleEndStates = 14;
+  core._schemeStart = 20;
+  dart.defineLazy(core, {
+    get _scannerTables() {
+      return core._createTables();
+    }
+  });
+  core._createTables = function() {
+    let stateCount = 22;
+    let schemeOrPath = 1;
+    let authOrPath = 2;
+    let authOrPathSlash = 3;
+    let uinfoOrHost0 = 4;
+    let uinfoOrHost = 5;
+    let uinfoOrPort0 = 6;
+    let uinfoOrPort = 7;
+    let ipv6Host = 8;
+    let relPathSeg = 9;
+    let pathSeg = 10;
+    let path = 11;
+    let query = 12;
+    let fragment = 13;
+    let schemeOrPathDot = 14;
+    let schemeOrPathDot2 = 15;
+    let relPathSegDot = 16;
+    let relPathSegDot2 = 17;
+    let pathSegDot = 18;
+    let pathSegDot2 = 19;
+    let scheme0 = core._schemeStart;
+    let scheme = 21;
+    let schemeEnd = core._schemeEndIndex << 5;
+    let hostStart = core._hostStartIndex << 5;
+    let portStart = core._portStartIndex << 5;
+    let pathStart = core._pathStartIndex << 5;
+    let queryStart = core._queryStartIndex << 5;
+    let fragmentStart = core._fragmentStartIndex << 5;
+    let notSimple = core._notSimpleIndex << 5;
+    let unreserved = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-._~";
+    let subDelims = "!$&'()*+,;=";
+    let pchar = dart.str`${unreserved}${subDelims}`;
+    let tables = ListOfUint8List().generate(stateCount, dart.fn(_ => typed_data.Uint8List.new(96), intToUint8List()));
+    function build(state, defaultTransition) {
+      return (() => {
+        let _ = tables[dartx._get](core.int._check(state));
+        _[dartx.fillRange](0, 96, core.int._check(defaultTransition));
+        return _;
+      })();
+    }
+    dart.fn(build, dynamicAnddynamicToUint8List());
+    function setChars(target, chars, transition) {
+      for (let i = 0; i < dart.notNull(chars[dartx.length]); i++) {
+        let char = chars[dartx.codeUnitAt](i);
+        target[dartx._set]((dart.notNull(char) ^ 96) >>> 0, transition);
+      }
+    }
+    dart.fn(setChars, Uint8ListAndStringAndintTovoid());
+    function setRange(target, range, transition) {
+      for (let i = range[dartx.codeUnitAt](0), n = range[dartx.codeUnitAt](1); dart.notNull(i) <= dart.notNull(n); i = dart.notNull(i) + 1) {
+        target[dartx._set]((dart.notNull(i) ^ 96) >>> 0, transition);
+      }
+    }
+    dart.fn(setRange, Uint8ListAndStringAndintTovoid());
+    let b = null;
+    b = build(core._uriStart, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot);
+    setChars(typed_data.Uint8List._check(b), ":", (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", authOrPathSlash);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPathDot, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ".", schemeOrPathDot2);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPathDot2, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), "%", (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(schemeOrPath, (schemeOrPath | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, schemeOrPath);
+    setChars(typed_data.Uint8List._check(b), ':', (authOrPath | schemeEnd) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(authOrPath, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, (path | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (authOrPathSlash | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ".", (pathSegDot | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(authOrPathSlash, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrHost0, (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+    setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "[", (ipv6Host | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrHost, (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, uinfoOrHost);
+    setRange(typed_data.Uint8List._check(b), "AZ", (uinfoOrHost | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), ":", (uinfoOrPort0 | portStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrPort0, (uinfoOrPort | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "19", uinfoOrPort);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(uinfoOrPort, (uinfoOrPort | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "09", uinfoOrPort);
+    setChars(typed_data.Uint8List._check(b), "@", (uinfoOrHost0 | hostStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | pathStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(ipv6Host, ipv6Host);
+    setChars(typed_data.Uint8List._check(b), "]", uinfoOrHost);
+    b = build(relPathSeg, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", relPathSegDot);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(relPathSegDot, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", relPathSegDot2);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(relPathSegDot2, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", relPathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSeg, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSegDot, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), ".", pathSegDot2);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(pathSegDot2, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", (pathSeg | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(path, (path | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, path);
+    setChars(typed_data.Uint8List._check(b), "/", pathSeg);
+    setChars(typed_data.Uint8List._check(b), "?", (query | queryStart) >>> 0);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(query, (query | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, query);
+    setChars(typed_data.Uint8List._check(b), "?", query);
+    setChars(typed_data.Uint8List._check(b), "#", (fragment | fragmentStart) >>> 0);
+    b = build(fragment, (fragment | notSimple) >>> 0);
+    setChars(typed_data.Uint8List._check(b), pchar, fragment);
+    setChars(typed_data.Uint8List._check(b), "?", fragment);
+    b = build(scheme0, (scheme | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "az", scheme);
+    b = build(scheme, (scheme | notSimple) >>> 0);
+    setRange(typed_data.Uint8List._check(b), "az", scheme);
+    setRange(typed_data.Uint8List._check(b), "09", scheme);
+    setChars(typed_data.Uint8List._check(b), "+-.", scheme);
+    return tables;
+  };
+  dart.lazyFn(core._createTables, () => VoidToListOfUint8List());
+  core._scan = function(uri, start, end, state, indices) {
+    let tables = core._scannerTables;
+    dart.assert(dart.notNull(end) <= dart.notNull(uri[dartx.length]));
+    for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+      let table = tables[dartx._get](state);
+      let char = (dart.notNull(uri[dartx.codeUnitAt](i)) ^ 96) >>> 0;
+      if (char > 95) char = 31;
+      let transition = table[dartx._get](char);
+      state = dart.notNull(transition) & 31;
+      indices[dartx._set](transition[dartx['>>']](5), i);
+    }
+    return state;
+  };
+  dart.fn(core._scan, StringAndintAndint__Toint());
+  const _uri = Symbol('_uri');
+  const _schemeEnd = Symbol('_schemeEnd');
+  const _hostStart = Symbol('_hostStart');
+  const _portStart = Symbol('_portStart');
+  const _pathStart = Symbol('_pathStart');
+  const _queryStart = Symbol('_queryStart');
+  const _fragmentStart = Symbol('_fragmentStart');
+  const _schemeCache = Symbol('_schemeCache');
+  const _isFile = Symbol('_isFile');
+  const _isHttp = Symbol('_isHttp');
+  const _isHttps = Symbol('_isHttps');
+  const _isPackage = Symbol('_isPackage');
+  const _isScheme = Symbol('_isScheme');
+  let const$52;
+  let const$53;
+  let const$54;
+  const _isPort = Symbol('_isPort');
+  const _simpleMerge = Symbol('_simpleMerge');
+  const _toNonSimple = Symbol('_toNonSimple');
+  core._SimpleUri = class _SimpleUri extends core.Object {
+    new(uri, schemeEnd, hostStart, portStart, pathStart, queryStart, fragmentStart, schemeCache) {
+      this[_uri] = uri;
+      this[_schemeEnd] = schemeEnd;
+      this[_hostStart] = hostStart;
+      this[_portStart] = portStart;
+      this[_pathStart] = pathStart;
+      this[_queryStart] = queryStart;
+      this[_fragmentStart] = fragmentStart;
+      this[_schemeCache] = schemeCache;
+      this[_hashCodeCache] = null;
+    }
+    get hasScheme() {
+      return dart.notNull(this[_schemeEnd]) > 0;
+    }
+    get hasAuthority() {
+      return dart.notNull(this[_hostStart]) > 0;
+    }
+    get hasUserInfo() {
+      return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 4;
+    }
+    get hasPort() {
+      return dart.notNull(this[_hostStart]) > 0 && dart.notNull(this[_portStart]) + 1 < dart.notNull(this[_pathStart]);
+    }
+    get hasQuery() {
+      return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]);
+    }
+    get hasFragment() {
+      return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]);
+    }
+    get [_isFile]() {
+      return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("file"));
+    }
+    get [_isHttp]() {
+      return this[_schemeEnd] == 4 && dart.test(this[_uri][dartx.startsWith]("http"));
+    }
+    get [_isHttps]() {
+      return this[_schemeEnd] == 5 && dart.test(this[_uri][dartx.startsWith]("https"));
+    }
+    get [_isPackage]() {
+      return this[_schemeEnd] == 7 && dart.test(this[_uri][dartx.startsWith]("package"));
+    }
+    [_isScheme](scheme) {
+      return this[_schemeEnd] == scheme[dartx.length] && dart.test(this[_uri][dartx.startsWith](scheme));
+    }
+    get hasAbsolutePath() {
+      return this[_uri][dartx.startsWith]("/", this[_pathStart]);
+    }
+    get hasEmptyPath() {
+      return this[_pathStart] == this[_queryStart];
+    }
+    get isAbsolute() {
+      return dart.test(this.hasScheme) && !dart.test(this.hasFragment);
+    }
+    isScheme(scheme) {
+      if (scheme == null || dart.test(scheme[dartx.isEmpty])) return dart.notNull(this[_schemeEnd]) < 0;
+      if (scheme[dartx.length] != this[_schemeEnd]) return false;
+      return core._Uri._compareScheme(scheme, this[_uri]);
+    }
+    get scheme() {
+      if (dart.notNull(this[_schemeEnd]) <= 0) return "";
+      if (this[_schemeCache] != null) return this[_schemeCache];
+      if (dart.test(this[_isHttp])) {
+        this[_schemeCache] = "http";
+      } else if (dart.test(this[_isHttps])) {
+        this[_schemeCache] = "https";
+      } else if (dart.test(this[_isFile])) {
+        this[_schemeCache] = "file";
+      } else if (dart.test(this[_isPackage])) {
+        this[_schemeCache] = "package";
+      } else {
+        this[_schemeCache] = this[_uri][dartx.substring](0, this[_schemeEnd]);
+      }
+      return this[_schemeCache];
+    }
+    get authority() {
+      return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_pathStart]) : "";
+    }
+    get userInfo() {
+      return dart.notNull(this[_hostStart]) > dart.notNull(this[_schemeEnd]) + 3 ? this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, dart.notNull(this[_hostStart]) - 1) : "";
+    }
+    get host() {
+      return dart.notNull(this[_hostStart]) > 0 ? this[_uri][dartx.substring](this[_hostStart], this[_portStart]) : "";
+    }
+    get port() {
+      if (dart.test(this.hasPort)) return core.int.parse(this[_uri][dartx.substring](dart.notNull(this[_portStart]) + 1, this[_pathStart]));
+      if (dart.test(this[_isHttp])) return 80;
+      if (dart.test(this[_isHttps])) return 443;
+      return 0;
+    }
+    get path() {
+      return this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+    }
+    get query() {
+      return dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart]) ? this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]) : "";
+    }
+    get fragment() {
+      return dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length]) ? this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1) : "";
+    }
+    get origin() {
+      let isHttp = this[_isHttp];
+      if (dart.notNull(this[_schemeEnd]) < 0) {
+        dart.throw(new core.StateError(dart.str`Cannot use origin without a scheme: ${this}`));
+      }
+      if (!dart.test(isHttp) && !dart.test(this[_isHttps])) {
+        dart.throw(new core.StateError(dart.str`Origin is only applicable schemes http and https: ${this}`));
+      }
+      if (this[_hostStart] == this[_portStart]) {
+        dart.throw(new core.StateError(dart.str`A ${this.scheme}: URI should have a non-empty host name: ${this}`));
+      }
+      if (this[_hostStart] == dart.notNull(this[_schemeEnd]) + 3) {
+        return this[_uri][dartx.substring](0, this[_pathStart]);
+      }
+      return dart.notNull(this[_uri][dartx.substring](0, dart.notNull(this[_schemeEnd]) + 3)) + dart.notNull(this[_uri][dartx.substring](this[_hostStart], this[_pathStart]));
+    }
+    get pathSegments() {
+      let start = this[_pathStart];
+      let end = this[_queryStart];
+      if (dart.test(this[_uri][dartx.startsWith]("/", start))) {
+        start = dart.notNull(start) + 1;
+      }
+      if (start == end) return const$52 || (const$52 = dart.constList([], core.String));
+      let parts = JSArrayOfString().of([]);
+      for (let i = start; dart.notNull(i) < dart.notNull(end); i = dart.notNull(i) + 1) {
+        let char = this[_uri][dartx.codeUnitAt](i);
+        if (char == core._SLASH) {
+          parts[dartx.add](this[_uri][dartx.substring](start, i));
+          start = dart.notNull(i) + 1;
+        }
+      }
+      parts[dartx.add](this[_uri][dartx.substring](start, end));
+      return ListOfString().unmodifiable(parts);
+    }
+    get queryParameters() {
+      if (!dart.test(this.hasQuery)) return const$53 || (const$53 = dart.const(dart.map({}, core.String, core.String)));
+      return new (UnmodifiableMapViewOfString$String())(core.Uri.splitQueryString(this.query));
+    }
+    get queryParametersAll() {
+      if (!dart.test(this.hasQuery)) return const$54 || (const$54 = dart.const(dart.map({}, core.String, ListOfString())));
+      let queryParameterLists = core._Uri._splitQueryStringAll(this.query);
+      for (let key of queryParameterLists[dartx.keys]) {
+        queryParameterLists[dartx._set](key, ListOfString().unmodifiable(core.Iterable._check(queryParameterLists[dartx._get](key))));
+      }
+      return MapOfString$ListOfString().unmodifiable(queryParameterLists);
+    }
+    [_isPort](port) {
+      let portDigitStart = dart.notNull(this[_portStart]) + 1;
+      return portDigitStart + dart.notNull(port[dartx.length]) == this[_pathStart] && dart.test(this[_uri][dartx.startsWith](port, portDigitStart));
+    }
+    normalizePath() {
+      return this;
+    }
+    removeFragment() {
+      if (!dart.test(this.hasFragment)) return this;
+      return new core._SimpleUri(this[_uri][dartx.substring](0, this[_fragmentStart]), this[_schemeEnd], this[_hostStart], this[_portStart], this[_pathStart], this[_queryStart], this[_fragmentStart], this[_schemeCache]);
+    }
+    replace(opts) {
+      let scheme = opts && 'scheme' in opts ? opts.scheme : null;
+      let userInfo = opts && 'userInfo' in opts ? opts.userInfo : null;
+      let host = opts && 'host' in opts ? opts.host : null;
+      let port = opts && 'port' in opts ? opts.port : null;
+      let path = opts && 'path' in opts ? opts.path : null;
+      let pathSegments = opts && 'pathSegments' in opts ? opts.pathSegments : null;
+      let query = opts && 'query' in opts ? opts.query : null;
+      let queryParameters = opts && 'queryParameters' in opts ? opts.queryParameters : null;
+      let fragment = opts && 'fragment' in opts ? opts.fragment : null;
+      let schemeChanged = false;
+      if (scheme != null) {
+        scheme = core._Uri._makeScheme(scheme, 0, scheme[dartx.length]);
+        schemeChanged = !dart.test(this[_isScheme](scheme));
+      } else {
+        scheme = this.scheme;
+      }
+      let isFile = scheme == "file";
+      if (userInfo != null) {
+        userInfo = core._Uri._makeUserInfo(userInfo, 0, userInfo[dartx.length]);
+      } else if (dart.notNull(this[_hostStart]) > 0) {
+        userInfo = this[_uri][dartx.substring](dart.notNull(this[_schemeEnd]) + 3, this[_hostStart]);
+      } else {
+        userInfo = "";
+      }
+      if (port != null) {
+        port = core._Uri._makePort(port, scheme);
+      } else {
+        port = dart.test(this.hasPort) ? this.port : null;
+        if (schemeChanged) {
+          port = core._Uri._makePort(port, scheme);
+        }
+      }
+      if (host != null) {
+        host = core._Uri._makeHost(host, 0, host[dartx.length], false);
+      } else if (dart.notNull(this[_hostStart]) > 0) {
+        host = this[_uri][dartx.substring](this[_hostStart], this[_portStart]);
+      } else if (dart.test(userInfo[dartx.isNotEmpty]) || port != null || isFile) {
+        host = "";
+      }
+      let hasAuthority = host != null;
+      if (path != null || pathSegments != null) {
+        path = core._Uri._makePath(path, 0, core._stringOrNullLength(path), pathSegments, scheme, hasAuthority);
+      } else {
+        path = this[_uri][dartx.substring](this[_pathStart], this[_queryStart]);
+        if ((isFile || hasAuthority && !dart.test(path[dartx.isEmpty])) && !dart.test(path[dartx.startsWith]('/'))) {
+          path = "/" + dart.notNull(path);
+        }
+      }
+      if (query != null || queryParameters != null) {
+        query = core._Uri._makeQuery(query, 0, core._stringOrNullLength(query), queryParameters);
+      } else if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+        query = this[_uri][dartx.substring](dart.notNull(this[_queryStart]) + 1, this[_fragmentStart]);
+      }
+      if (fragment != null) {
+        fragment = core._Uri._makeFragment(fragment, 0, fragment[dartx.length]);
+      } else if (dart.notNull(this[_fragmentStart]) < dart.notNull(this[_uri][dartx.length])) {
+        fragment = this[_uri][dartx.substring](dart.notNull(this[_fragmentStart]) + 1);
+      }
+      return new core._Uri._internal(scheme, userInfo, host, port, path, query, fragment);
+    }
+    resolve(reference) {
+      return this.resolveUri(core.Uri.parse(reference));
+    }
+    resolveUri(reference) {
+      if (core._SimpleUri.is(reference)) {
+        return this[_simpleMerge](this, reference);
+      }
+      return this[_toNonSimple]().resolveUri(reference);
+    }
+    [_simpleMerge](base, ref) {
+      if (dart.test(ref.hasScheme)) return ref;
+      if (dart.test(ref.hasAuthority)) {
+        if (!dart.test(base.hasScheme)) return ref;
+        let isSimple = true;
+        if (dart.test(base[_isFile])) {
+          isSimple = !dart.test(ref.hasEmptyPath);
+        } else if (dart.test(base[_isHttp])) {
+          isSimple = !dart.test(ref[_isPort]("80"));
+        } else if (dart.test(base[_isHttps])) {
+          isSimple = !dart.test(ref[_isPort]("443"));
+        }
+        if (isSimple) {
+          let delta = dart.notNull(base[_schemeEnd]) + 1;
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, dart.notNull(base[_schemeEnd]) + 1)) + dart.notNull(ref[_uri][dartx.substring](dart.notNull(ref[_schemeEnd]) + 1));
+          return new core._SimpleUri(newUri, base[_schemeEnd], dart.notNull(ref[_hostStart]) + delta, dart.notNull(ref[_portStart]) + delta, dart.notNull(ref[_pathStart]) + delta, dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        } else {
+          return this[_toNonSimple]().resolveUri(ref);
+        }
+      }
+      if (dart.test(ref.hasEmptyPath)) {
+        if (dart.test(ref.hasQuery)) {
+          let delta = dart.notNull(base[_queryStart]) - dart.notNull(ref[_queryStart]);
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_queryStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_queryStart]));
+          return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        }
+        if (dart.test(ref.hasFragment)) {
+          let delta = dart.notNull(base[_fragmentStart]) - dart.notNull(ref[_fragmentStart]);
+          let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_fragmentStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_fragmentStart]));
+          return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], base[_queryStart], dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+        }
+        return base.removeFragment();
+      }
+      if (dart.test(ref.hasAbsolutePath)) {
+        let delta = dart.notNull(base[_pathStart]) - dart.notNull(ref[_pathStart]);
+        let newUri = dart.notNull(base[_uri][dartx.substring](0, base[_pathStart])) + dart.notNull(ref[_uri][dartx.substring](ref[_pathStart]));
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      if (dart.test(base.hasEmptyPath) && dart.test(base.hasAuthority)) {
+        let refStart = ref[_pathStart];
+        while (dart.test(ref[_uri][dartx.startsWith]("../", refStart))) {
+          refStart = dart.notNull(refStart) + 3;
+        }
+        let delta = dart.notNull(base[_pathStart]) - dart.notNull(refStart) + 1;
+        let newUri = dart.str`${base[_uri][dartx.substring](0, base[_pathStart])}/` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+        return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+      }
+      let baseUri = base[_uri];
+      let refUri = ref[_uri];
+      let baseStart = base[_pathStart];
+      let baseEnd = base[_queryStart];
+      while (dart.test(baseUri[dartx.startsWith]("../", baseStart))) {
+        baseStart = dart.notNull(baseStart) + 3;
+      }
+      let refStart = ref[_pathStart];
+      let refEnd = ref[_queryStart];
+      let backCount = 0;
+      while (dart.notNull(refStart) + 3 <= dart.notNull(refEnd) && dart.test(refUri[dartx.startsWith]("../", refStart))) {
+        refStart = dart.notNull(refStart) + 3;
+        backCount = backCount + 1;
+      }
+      let insert = "";
+      while (dart.notNull(baseEnd) > dart.notNull(baseStart)) {
+        baseEnd = dart.notNull(baseEnd) - 1;
+        let char = baseUri[dartx.codeUnitAt](baseEnd);
+        if (char == core._SLASH) {
+          insert = "/";
+          if (backCount == 0) break;
+          backCount--;
+        }
+      }
+      if (baseEnd == baseStart && !dart.test(base.hasScheme) && !dart.test(base.hasAbsolutePath)) {
+        insert = "";
+        refStart = dart.notNull(refStart) - backCount * 3;
+      }
+      let delta = dart.notNull(baseEnd) - dart.notNull(refStart) + dart.notNull(insert[dartx.length]);
+      let newUri = dart.str`${base[_uri][dartx.substring](0, baseEnd)}${insert}` + dart.str`${ref[_uri][dartx.substring](refStart)}`;
+      return new core._SimpleUri(newUri, base[_schemeEnd], base[_hostStart], base[_portStart], base[_pathStart], dart.notNull(ref[_queryStart]) + delta, dart.notNull(ref[_fragmentStart]) + delta, base[_schemeCache]);
+    }
+    toFilePath(opts) {
+      let windows = opts && 'windows' in opts ? opts.windows : null;
+      if (dart.notNull(this[_schemeEnd]) >= 0 && !dart.test(this[_isFile])) {
+        dart.throw(new core.UnsupportedError(dart.str`Cannot extract a file path from a ${this.scheme} URI`));
+      }
+      if (dart.notNull(this[_queryStart]) < dart.notNull(this[_uri][dartx.length])) {
+        if (dart.notNull(this[_queryStart]) < dart.notNull(this[_fragmentStart])) {
+          dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a query component"));
+        }
+        dart.throw(new core.UnsupportedError("Cannot extract a file path from a URI with a fragment component"));
+      }
+      if (windows == null) windows = core._Uri._isWindows;
+      return dart.test(windows) ? core._Uri._toWindowsFilePath(this) : this[_toFilePath]();
+    }
+    [_toFilePath]() {
+      if (dart.notNull(this[_hostStart]) < dart.notNull(this[_portStart])) {
+        dart.throw(new core.UnsupportedError("Cannot extract a non-Windows file path from a file URI " + "with an authority"));
+      }
+      return this.path;
+    }
+    get data() {
+      dart.assert(this.scheme != "data");
+      return null;
+    }
+    get hashCode() {
+      return (() => {
+        let t = this[_hashCodeCache];
+        return t == null ? this[_hashCodeCache] = dart.hashCode(this[_uri]) : t;
+      })();
+    }
+    ['=='](other) {
+      if (core.identical(this, other)) return true;
+      if (core.Uri.is(other)) return this[_uri] == dart.toString(other);
+      return false;
+    }
+    [_toNonSimple]() {
+      return new core._Uri._internal(this.scheme, this.userInfo, dart.test(this.hasAuthority) ? this.host : null, dart.test(this.hasPort) ? this.port : null, this.path, dart.test(this.hasQuery) ? this.query : null, dart.test(this.hasFragment) ? this.fragment : null);
+    }
+    toString() {
+      return this[_uri];
+    }
+  };
+  core._SimpleUri[dart.implements] = () => [core.Uri];
+  dart.setSignature(core._SimpleUri, {
+    fields: () => ({
+      [_uri]: core.String,
+      [_schemeEnd]: core.int,
+      [_hostStart]: core.int,
+      [_portStart]: core.int,
+      [_pathStart]: core.int,
+      [_queryStart]: core.int,
+      [_fragmentStart]: core.int,
+      [_schemeCache]: core.String,
+      [_hashCodeCache]: core.int
+    }),
+    getters: () => ({
+      hasScheme: dart.definiteFunctionType(core.bool, []),
+      hasAuthority: dart.definiteFunctionType(core.bool, []),
+      hasUserInfo: dart.definiteFunctionType(core.bool, []),
+      hasPort: dart.definiteFunctionType(core.bool, []),
+      hasQuery: dart.definiteFunctionType(core.bool, []),
+      hasFragment: dart.definiteFunctionType(core.bool, []),
+      [_isFile]: dart.definiteFunctionType(core.bool, []),
+      [_isHttp]: dart.definiteFunctionType(core.bool, []),
+      [_isHttps]: dart.definiteFunctionType(core.bool, []),
+      [_isPackage]: dart.definiteFunctionType(core.bool, []),
+      hasAbsolutePath: dart.definiteFunctionType(core.bool, []),
+      hasEmptyPath: dart.definiteFunctionType(core.bool, []),
+      isAbsolute: dart.definiteFunctionType(core.bool, []),
+      scheme: dart.definiteFunctionType(core.String, []),
+      authority: dart.definiteFunctionType(core.String, []),
+      userInfo: dart.definiteFunctionType(core.String, []),
+      host: dart.definiteFunctionType(core.String, []),
+      port: dart.definiteFunctionType(core.int, []),
+      path: dart.definiteFunctionType(core.String, []),
+      query: dart.definiteFunctionType(core.String, []),
+      fragment: dart.definiteFunctionType(core.String, []),
+      origin: dart.definiteFunctionType(core.String, []),
+      pathSegments: dart.definiteFunctionType(core.List$(core.String), []),
+      queryParameters: dart.definiteFunctionType(core.Map$(core.String, core.String), []),
+      queryParametersAll: dart.definiteFunctionType(core.Map$(core.String, core.List$(core.String)), []),
+      data: dart.definiteFunctionType(core.UriData, [])
+    }),
+    methods: () => ({
+      [_isScheme]: dart.definiteFunctionType(core.bool, [core.String]),
+      isScheme: dart.definiteFunctionType(core.bool, [core.String]),
+      [_isPort]: dart.definiteFunctionType(core.bool, [core.String]),
+      normalizePath: dart.definiteFunctionType(core.Uri, []),
+      removeFragment: dart.definiteFunctionType(core.Uri, []),
+      replace: dart.definiteFunctionType(core.Uri, [], {scheme: core.String, userInfo: core.String, host: core.String, port: core.int, path: core.String, pathSegments: IterableOfString(), query: core.String, queryParameters: MapOfString$dynamic(), fragment: core.String}),
+      resolve: dart.definiteFunctionType(core.Uri, [core.String]),
+      resolveUri: dart.definiteFunctionType(core.Uri, [core.Uri]),
+      [_simpleMerge]: dart.definiteFunctionType(core.Uri, [core._SimpleUri, core._SimpleUri]),
+      toFilePath: dart.definiteFunctionType(core.String, [], {windows: core.bool}),
+      [_toFilePath]: dart.definiteFunctionType(core.String, []),
+      '==': dart.definiteFunctionType(core.bool, [core.Object]),
+      [_toNonSimple]: dart.definiteFunctionType(core.Uri, [])
+    })
+  });
+  const _data$ = Symbol('_data');
+  core._DataUri = class _DataUri extends core._Uri {
+    new(data, path, query) {
+      this[_data$] = data;
+      super._internal("data", null, null, null, path, query, null);
+    }
+    get data() {
+      return this[_data$];
+    }
+  };
+  dart.setSignature(core._DataUri, {
+    fields: () => ({[_data$]: core.UriData})
+  });
+  core._startsWithData = function(text, start) {
+    let delta = ((dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 4)) ^ core._COLON) >>> 0) * 3;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](start)) ^ 100) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 1)) ^ 97) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 2)) ^ 116) >>> 0;
+    delta = (delta | dart.notNull(text[dartx.codeUnitAt](dart.notNull(start) + 3)) ^ 97) >>> 0;
+    return delta;
+  };
+  dart.fn(core._startsWithData, StringAndintToint());
+  core._stringOrNullLength = function(s) {
+    return s == null ? 0 : s[dartx.length];
+  };
+  dart.fn(core._stringOrNullLength, StringToint$());
   developer.debugger = function(opts) {
     let when = opts && 'when' in opts ? opts.when : true;
     let message = opts && 'message' in opts ? opts.message : null;
@@ -35137,6 +35971,49 @@
     }
   });
   developer._clockValue = 0;
+  developer._FakeUserTag = class _FakeUserTag extends core.Object {
+    real(label) {
+      this.label = label;
+    }
+    static new(label) {
+      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
+      if (existingTag != null) {
+        return developer._FakeUserTag._check(existingTag);
+      }
+      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
+        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
+      }
+      let instance = new developer._FakeUserTag.real(label);
+      developer._FakeUserTag._instances[dartx._set](label, instance);
+      return instance;
+    }
+    makeCurrent() {
+      let old = developer._currentTag;
+      developer._currentTag = this;
+      return old;
+    }
+  };
+  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
+  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
+  dart.setSignature(developer._FakeUserTag, {
+    fields: () => ({label: core.String}),
+    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
+  });
+  dart.defineLazy(developer._FakeUserTag, {
+    get _instances() {
+      return dart.map();
+    },
+    set _instances(_) {},
+    get _defaultTag() {
+      return developer._FakeUserTag.new('Default');
+    }
+  });
+  dart.defineLazy(developer, {
+    get _currentTag() {
+      return developer._FakeUserTag._defaultTag;
+    },
+    set _currentTag(_) {}
+  });
   const _result = Symbol('_result');
   const _errorCode = Symbol('_errorCode');
   const _errorDetail = Symbol('_errorDetail');
@@ -35258,7 +36135,7 @@
   dart.fn(developer.postEvent, StringAndMapTovoid());
   developer._postEvent = function(eventKind, eventData) {
   };
-  dart.fn(developer._postEvent, StringAndStringTodynamic());
+  dart.fn(developer._postEvent, StringAndStringTovoid$());
   developer._lookupExtension = function(method) {
     return developer._extensions[dartx._get](method);
   };
@@ -35276,49 +36153,6 @@
     }
   };
   developer.UserTag.MAX_USER_TAGS = 64;
-  developer._FakeUserTag = class _FakeUserTag extends core.Object {
-    real(label) {
-      this.label = label;
-    }
-    static new(label) {
-      let existingTag = developer._FakeUserTag._instances[dartx._get](label);
-      if (existingTag != null) {
-        return developer._FakeUserTag._check(existingTag);
-      }
-      if (developer._FakeUserTag._instances[dartx.length] == developer.UserTag.MAX_USER_TAGS) {
-        dart.throw(new core.UnsupportedError(dart.str`UserTag instance limit (${developer.UserTag.MAX_USER_TAGS}) reached.`));
-      }
-      let instance = new developer._FakeUserTag.real(label);
-      developer._FakeUserTag._instances[dartx._set](label, instance);
-      return instance;
-    }
-    makeCurrent() {
-      let old = developer._currentTag;
-      developer._currentTag = this;
-      return old;
-    }
-  };
-  dart.defineNamedConstructor(developer._FakeUserTag, 'real');
-  developer._FakeUserTag[dart.implements] = () => [developer.UserTag];
-  dart.setSignature(developer._FakeUserTag, {
-    fields: () => ({label: core.String}),
-    methods: () => ({makeCurrent: dart.definiteFunctionType(developer.UserTag, [])})
-  });
-  dart.defineLazy(developer._FakeUserTag, {
-    get _instances() {
-      return dart.map();
-    },
-    set _instances(_) {},
-    get _defaultTag() {
-      return developer._FakeUserTag.new('Default');
-    }
-  });
-  dart.defineLazy(developer, {
-    get _currentTag() {
-      return developer._FakeUserTag._defaultTag;
-    },
-    set _currentTag(_) {}
-  });
   developer.getCurrentTag = function() {
     return developer._currentTag;
   };
@@ -35751,7 +36585,7 @@
   developer.Service = class Service extends core.Object {
     static getInfo() {
       return dart.async(function*() {
-        let receivePort = isolate.RawReceivePort.new();
+        let receivePort = isolate$.RawReceivePort.new();
         let uriCompleter = CompleterOfUri().new();
         receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
         developer._getServerInfo(receivePort.sendPort);
@@ -35766,7 +36600,7 @@
         if (!(typeof enable == 'boolean')) {
           dart.throw(new core.ArgumentError.value(enable, 'enable', 'Must be a bool'));
         }
-        let receivePort = isolate.RawReceivePort.new();
+        let receivePort = isolate$.RawReceivePort.new();
         let uriCompleter = CompleterOfUri().new();
         receivePort.handler = dart.fn(uri => uriCompleter.complete(uri), UriTovoid());
         developer._webServerControl(receivePort.sendPort, enable);
@@ -35775,20 +36609,27 @@
         return new developer.ServiceProtocolInfo(uri);
       }, developer.ServiceProtocolInfo, opts);
     }
+    static getIsolateID(isolate) {
+      if (!isolate$.Isolate.is(isolate)) {
+        dart.throw(new core.ArgumentError.value(isolate, 'isolate', 'Must be an Isolate'));
+      }
+      return developer._getIsolateIDFromSendPort(isolate.controlPort);
+    }
   };
   dart.setSignature(developer.Service, {
     statics: () => ({
       getInfo: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), []),
-      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool})
+      controlWebServer: dart.definiteFunctionType(async.Future$(developer.ServiceProtocolInfo), [], {enable: core.bool}),
+      getIsolateID: dart.definiteFunctionType(core.String, [isolate$.Isolate])
     }),
-    names: ['getInfo', 'controlWebServer']
+    names: ['getInfo', 'controlWebServer', 'getIsolateID']
   });
-  developer._getServerInfo = function(sp) {
-    sp.send(null);
+  developer._getServerInfo = function(sendPort) {
+    sendPort.send(null);
   };
   dart.lazyFn(developer._getServerInfo, () => SendPortTovoid());
-  developer._webServerControl = function(sp, enable) {
-    sp.send(null);
+  developer._webServerControl = function(sendPort, enable) {
+    sendPort.send(null);
   };
   dart.lazyFn(developer._webServerControl, () => SendPortAndboolTovoid());
   developer._getServiceMajorVersion = function() {
@@ -35799,6 +36640,10 @@
     return 0;
   };
   dart.fn(developer._getServiceMinorVersion, VoidToint());
+  developer._getIsolateIDFromSendPort = function(sendPort) {
+    return null;
+  };
+  dart.lazyFn(developer._getIsolateIDFromSendPort, () => SendPortToString());
   io.BytesBuilder = class BytesBuilder extends core.Object {
     static new(opts) {
       let copy = opts && 'copy' in opts ? opts.copy : true;
@@ -35809,27 +36654,21 @@
       }
     }
   };
-  const _length$2 = Symbol('_length');
   const _buffer$ = Symbol('_buffer');
-  const _pow2roundup = Symbol('_pow2roundup');
+  const _length$2 = Symbol('_length');
+  const _grow$ = Symbol('_grow');
   io._CopyingBytesBuilder = class _CopyingBytesBuilder extends core.Object {
-    new() {
+    new(initialCapacity) {
+      if (initialCapacity === void 0) initialCapacity = 0;
+      this[_buffer$] = dart.notNull(initialCapacity) <= 0 ? io._CopyingBytesBuilder._emptyList : typed_data.Uint8List.new(io._CopyingBytesBuilder._pow2roundup(initialCapacity));
       this[_length$2] = 0;
-      this[_buffer$] = null;
     }
     add(bytes) {
       let bytesLength = bytes[dartx.length];
       if (bytesLength == 0) return;
       let required = dart.notNull(this[_length$2]) + dart.notNull(bytesLength);
-      if (this[_buffer$] == null) {
-        let size = this[_pow2roundup](required);
-        size = math.max(core.int)(size, io._CopyingBytesBuilder._INIT_SIZE);
-        this[_buffer$] = typed_data.Uint8List.new(size);
-      } else if (dart.notNull(this[_buffer$][dartx.length]) < required) {
-        let size = dart.notNull(this[_pow2roundup](required)) * 2;
-        let newBuffer = typed_data.Uint8List.new(size);
-        newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
-        this[_buffer$] = newBuffer;
+      if (dart.notNull(this[_buffer$][dartx.length]) < required) {
+        this[_grow$](required);
       }
       dart.assert(dart.notNull(this[_buffer$][dartx.length]) >= required);
       if (typed_data.Uint8List.is(bytes)) {
@@ -35842,16 +36681,32 @@
       this[_length$2] = required;
     }
     addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
+      if (this[_buffer$][dartx.length] == this[_length$2]) {
+        this[_grow$](this[_length$2]);
+      }
+      dart.assert(dart.notNull(this[_buffer$][dartx.length]) > dart.notNull(this[_length$2]));
+      this[_buffer$][dartx._set](this[_length$2], byte);
+      this[_length$2] = dart.notNull(this[_length$2]) + 1;
+    }
+    [_grow$](required) {
+      let newSize = dart.notNull(required) * 2;
+      if (dart.notNull(newSize) < io._CopyingBytesBuilder._INIT_SIZE) {
+        newSize = io._CopyingBytesBuilder._INIT_SIZE;
+      } else {
+        newSize = io._CopyingBytesBuilder._pow2roundup(newSize);
+      }
+      let newBuffer = typed_data.Uint8List.new(newSize);
+      newBuffer[dartx.setRange](0, this[_buffer$][dartx.length], this[_buffer$]);
+      this[_buffer$] = newBuffer;
     }
     takeBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       let buffer = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]);
       this.clear();
       return buffer;
     }
     toBytes() {
-      if (this[_buffer$] == null) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       return typed_data.Uint8List.fromList(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
     }
     get length() {
@@ -35865,9 +36720,10 @@
     }
     clear() {
       this[_length$2] = 0;
-      this[_buffer$] = null;
+      this[_buffer$] = io._CopyingBytesBuilder._emptyList;
     }
-    [_pow2roundup](x) {
+    static _pow2roundup(x) {
+      dart.assert(dart.notNull(x) > 0);
       x = dart.notNull(x) - 1;
       x = (dart.notNull(x) | x[dartx['>>']](1)) >>> 0;
       x = (dart.notNull(x) | x[dartx['>>']](2)) >>> 0;
@@ -35891,33 +36747,48 @@
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addByte: dart.definiteFunctionType(dart.void, [core.int]),
+      [_grow$]: dart.definiteFunctionType(dart.void, [core.int]),
       takeBytes: dart.definiteFunctionType(core.List$(core.int), []),
       toBytes: dart.definiteFunctionType(core.List$(core.int), []),
-      clear: dart.definiteFunctionType(dart.void, []),
-      [_pow2roundup]: dart.definiteFunctionType(core.int, [core.int])
-    })
+      clear: dart.definiteFunctionType(dart.void, [])
+    }),
+    statics: () => ({_pow2roundup: dart.definiteFunctionType(core.int, [core.int])}),
+    names: ['_pow2roundup']
   });
   io._CopyingBytesBuilder._INIT_SIZE = 1024;
+  dart.defineLazy(io._CopyingBytesBuilder, {
+    get _emptyList() {
+      return typed_data.Uint8List.new(0);
+    }
+  });
   const _chunks = Symbol('_chunks');
   io._BytesBuilder = class _BytesBuilder extends core.Object {
     new() {
-      this[_chunks] = JSArrayOfListOfint().of([]);
+      this[_chunks] = JSArrayOfUint8List().of([]);
       this[_length$2] = 0;
     }
     add(bytes) {
-      if (!typed_data.Uint8List.is(bytes)) {
-        bytes = typed_data.Uint8List.fromList(bytes);
+      let typedBytes = null;
+      if (typed_data.Uint8List.is(bytes)) {
+        typedBytes = bytes;
+      } else {
+        typedBytes = typed_data.Uint8List.fromList(bytes);
       }
-      this[_chunks][dartx.add](bytes);
-      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(bytes[dartx.length]);
+      this[_chunks][dartx.add](typedBytes);
+      this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(typedBytes[dartx.length]);
     }
     addByte(byte) {
-      this.add(JSArrayOfint().of([byte]));
+      this[_chunks][dartx.add]((() => {
+        let _ = typed_data.Uint8List.new(1);
+        _[dartx._set](0, byte);
+        return _;
+      })());
+      this[_length$2] = dart.notNull(this[_length$2]) + 1;
     }
     takeBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       if (this[_chunks][dartx.length] == 1) {
-        let buffer = this[_chunks][dartx.single];
+        let buffer = this[_chunks][dartx._get](0);
         this.clear();
         return buffer;
       }
@@ -35931,7 +36802,7 @@
       return buffer;
     }
     toBytes() {
-      if (this[_chunks][dartx.length] == 0) return typed_data.Uint8List.new(0);
+      if (this[_length$2] == 0) return io._CopyingBytesBuilder._emptyList;
       let buffer = typed_data.Uint8List.new(this[_length$2]);
       let offset = 0;
       for (let chunk of this[_chunks]) {
@@ -35958,7 +36829,7 @@
   dart.setSignature(io._BytesBuilder, {
     fields: () => ({
       [_length$2]: core.int,
-      [_chunks]: ListOfListOfint()
+      [_chunks]: ListOfUint8List()
     }),
     getters: () => ({
       length: dart.definiteFunctionType(core.int, []),
@@ -35989,7 +36860,7 @@
     switch (dart.dindex(response, io._ERROR_RESPONSE_ERROR_TYPE)) {
       case io._ILLEGAL_ARGUMENT_RESPONSE:
       {
-        return new core.ArgumentError();
+        return new core.ArgumentError(dart.str`${message}: ${path}`);
       }
       case io._OSERROR_RESPONSE:
       {
@@ -36052,7 +36923,7 @@
   };
   dart.setSignature(io._BufferAndStart, {
     fields: () => ({
-      buffer: core.List,
+      buffer: ListOfint(),
       start: core.int
     })
   });
@@ -36064,7 +36935,7 @@
     let newBuffer = typed_data.Uint8List.new(length);
     let j = start;
     for (let i = 0; i < length; i++) {
-      let value = core.int._check(buffer[dartx._get](j));
+      let value = buffer[dartx._get](j);
       if (!(typeof value == 'number')) {
         dart.throw(new core.ArgumentError(dart.str`List element is not an integer at index ${j}`));
       }
@@ -36073,7 +36944,7 @@
     }
     return new io._BufferAndStart(newBuffer, 0);
   };
-  dart.fn(io._ensureFastAndSerializableByteData, ListAndintAndintTo_BufferAndStart());
+  dart.fn(io._ensureFastAndSerializableByteData, ListOfintAndintAndintTo_BufferAndStart());
   io._IOCrypto = class _IOCrypto extends core.Object {
     static getRandomBytes(count) {
       dart.throw(new core.UnsupportedError("_IOCrypto.getRandomBytes"));
@@ -36239,13 +37110,13 @@
     }
     close() {
       if (dart.test(this[_digestCalled])) {
-        return ListOfint()._check(this[_resultAsBytes]());
+        return this[_resultAsBytes]();
       }
       this[_digestCalled] = true;
       this[_finalizeData]();
       this[_iterate]();
       dart.assert(this[_pendingData][dartx.length] == 0);
-      return ListOfint()._check(this[_resultAsBytes]());
+      return this[_resultAsBytes]();
     }
     get blockSize() {
       return dart.notNull(this[_chunkSizeInWords]) * io._BYTES_PER_WORD;
@@ -36261,9 +37132,9 @@
       return (val[dartx['<<']](mod_shift) & io._MASK_32 | ((dart.notNull(val) & io._MASK_32) >>> 0)[dartx['>>']](32 - mod_shift)) >>> 0;
     }
     [_resultAsBytes]() {
-      let result = [];
+      let result = JSArrayOfint().of([]);
       for (let i = 0; i < dart.notNull(this[_h][dartx.length]); i++) {
-        result[dartx.addAll](core.Iterable._check(this[_wordToBytes](this[_h][dartx._get](i))));
+        result[dartx.addAll](this[_wordToBytes](this[_h][dartx._get](i)));
       }
       return result;
     }
@@ -36314,11 +37185,11 @@
       let lengthInBits = dart.notNull(this[_lengthInBytes]) * io._BITS_PER_BYTE;
       dart.assert(lengthInBits < dart.notNull(math.pow(2, 32)));
       if (dart.test(this[_bigEndianWords])) {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
+        this[_pendingData][dartx.addAll](this[_wordToBytes](0));
+        this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
       } else {
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0)));
-        this[_pendingData][dartx.addAll](IterableOfint()._check(this[_wordToBytes](0)));
+        this[_pendingData][dartx.addAll](this[_wordToBytes]((lengthInBits & io._MASK_32) >>> 0));
+        this[_pendingData][dartx.addAll](this[_wordToBytes](0));
       }
     }
   };
@@ -36340,9 +37211,9 @@
       [_add32]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
       [_roundUp]: dart.definiteFunctionType(dart.dynamic, [dart.dynamic, dart.dynamic]),
       [_rotl32]: dart.definiteFunctionType(core.int, [core.int, core.int]),
-      [_resultAsBytes]: dart.definiteFunctionType(dart.dynamic, []),
+      [_resultAsBytes]: dart.definiteFunctionType(core.List$(core.int), []),
       [_bytesToChunk]: dart.definiteFunctionType(dart.dynamic, [ListOfint(), core.int]),
-      [_wordToBytes]: dart.definiteFunctionType(dart.dynamic, [core.int]),
+      [_wordToBytes]: dart.definiteFunctionType(core.List$(core.int), [core.int]),
       [_iterate]: dart.definiteFunctionType(dart.dynamic, []),
       [_finalizeData]: dart.definiteFunctionType(dart.dynamic, [])
     })
@@ -36624,6 +37495,7 @@
     }
   };
   dart.addSimpleTypeTests(io.ZLibEncoder);
+  io.ZLibEncoder[dart.implements] = () => [ChunkedConverterOfListOfint$ListOfint$ListOfint$ListOfint()];
   dart.setSignature(io.ZLibEncoder, {
     fields: () => ({
       gzip: core.bool,
@@ -36706,7 +37578,7 @@
   const _filter$ = Symbol('_filter');
   const _closed = Symbol('_closed');
   const _empty = Symbol('_empty');
-  let const$52;
+  let const$55;
   io._FilterSink = class _FilterSink extends convert.ByteConversionSink {
     new(sink, filter) {
       this[_sink$0] = sink;
@@ -36725,10 +37597,10 @@
       try {
         this[_empty] = false;
         let bufferAndStart = io._ensureFastAndSerializableByteData(data, start, end);
-        this[_filter$].process(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+        this[_filter$].process(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
         let out = null;
         while ((out = this[_filter$].processed({flush: false})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
+          this[_sink$0].add(out);
         }
       } catch (e) {
         this[_closed] = true;
@@ -36739,11 +37611,11 @@
     }
     close() {
       if (dart.test(this[_closed])) return;
-      if (dart.test(this[_empty])) this[_filter$].process(const$52 || (const$52 = dart.constList([], core.int)), 0, 0);
+      if (dart.test(this[_empty])) this[_filter$].process(const$55 || (const$55 = dart.constList([], core.int)), 0, 0);
       try {
         let out = null;
         while ((out = this[_filter$].processed({end: true})) != null) {
-          this[_sink$0].add(ListOfint()._check(out));
+          this[_sink$0].add(out);
         }
       } catch (e) {
         this[_closed] = true;
@@ -36810,9 +37682,9 @@
     }
   };
   dart.fn(io._validateZLibMemLevel, intTovoid());
-  let const$53;
+  let const$56;
   io._validateZLibStrategy = function(strategy) {
-    let strategies = const$53 || (const$53 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
+    let strategies = const$56 || (const$56 = dart.constList([io.ZLibOption.STRATEGY_FILTERED, io.ZLibOption.STRATEGY_HUFFMAN_ONLY, io.ZLibOption.STRATEGY_RLE, io.ZLibOption.STRATEGY_FIXED, io.ZLibOption.STRATEGY_DEFAULT], core.int));
     if (strategies[dartx.indexOf](strategy) == -1) {
       dart.throw(new core.ArgumentError("Unsupported 'strategy'"));
     }
@@ -36842,7 +37714,6 @@
   const _isErrorResponse = Symbol('_isErrorResponse');
   const _exceptionOrErrorFromResponse = Symbol('_exceptionOrErrorFromResponse');
   const _absolutePath = Symbol('_absolutePath');
-  const _computeExistingIndex = Symbol('_computeExistingIndex');
   const _delete = Symbol('_delete');
   const _deleteSync = Symbol('_deleteSync');
   const _type = Symbol('_type');
@@ -36863,6 +37734,12 @@
       io.FileSystemEntity._throwIfError(result, "Cannot resolve symbolic links", this.path);
       return core.String._check(result);
     }
+    stat() {
+      return io.FileStat.stat(this.path);
+    }
+    statSync() {
+      return io.FileStat.statSync(this.path);
+    }
     delete(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       return this[_delete]({recursive: recursive});
@@ -37026,6 +37903,8 @@
     methods: () => ({
       resolveSymbolicLinks: dart.definiteFunctionType(async.Future$(core.String), []),
       resolveSymbolicLinksSync: dart.definiteFunctionType(core.String, []),
+      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
+      statSync: dart.definiteFunctionType(io.FileStat, []),
       delete: dart.definiteFunctionType(async.Future$(io.FileSystemEntity), [], {recursive: core.bool}),
       deleteSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       watch: dart.definiteFunctionType(async.Stream$(io.FileSystemEvent), [], {events: core.int, recursive: core.bool})
@@ -37131,33 +38010,6 @@
     get absolute() {
       return io.Directory.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
-    [_computeExistingIndex](dirsToCreate) {
-      let future = null;
-      let notFound = dirsToCreate[dartx.length];
-      for (let i = 0; i < dart.notNull(dirsToCreate[dartx.length]); i++) {
-        if (future == null) {
-          future = dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-        } else {
-          future = dart.dsend(future, 'then', dart.fn(index => {
-            if (!dart.equals(index, notFound)) {
-              return async.Future.value(index);
-            }
-            return dart.dsend(dart.dsend(dirsToCreate[dartx._get](i), 'exists'), 'then', dart.fn(e => dart.test(e) ? i : notFound, dynamicToint()));
-          }, dynamicTodynamic$()));
-        }
-      }
-      if (future == null) {
-        return FutureOfint().value(notFound);
-      } else {
-        return FutureOfint()._check(future);
-      }
-    }
     create(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       if (dart.test(recursive)) {
@@ -37268,7 +38120,7 @@
     list(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       let followLinks = opts && 'followLinks' in opts ? opts.followLinks : true;
-      return StreamOfFileSystemEntity()._check(new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream);
+      return new io._AsyncDirectoryLister(io.FileSystemEntity._ensureTrailingPathSeparators(this.path), recursive, followLinks).stream;
     }
     listSync(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
@@ -37312,9 +38164,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
-      [_computeExistingIndex]: dart.definiteFunctionType(async.Future$(core.int), [core.List]),
       create: dart.definiteFunctionType(async.Future$(io.Directory), [], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       createTemp: dart.definiteFunctionType(async.Future$(io.Directory), [], [core.String]),
@@ -37360,7 +38209,7 @@
       this.nextRunning = false;
       this.closed = false;
       this[_ops] = null;
-      this.controller = async.StreamController.new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
+      this.controller = StreamControllerOfFileSystemEntity().new({onListen: dart.bind(this, 'onListen'), onResume: dart.bind(this, 'onResume'), onCancel: dart.bind(this, 'onCancel'), sync: true});
     }
     [_pointer]() {
       return this[_ops] == null ? null : this[_ops].getPointer();
@@ -37487,14 +38336,14 @@
       path: core.String,
       recursive: core.bool,
       followLinks: core.bool,
-      controller: async.StreamController,
+      controller: StreamControllerOfFileSystemEntity(),
       canceled: core.bool,
       nextRunning: core.bool,
       closed: core.bool,
       [_ops]: io._AsyncDirectoryListerOps,
       closeCompleter: async.Completer
     }),
-    getters: () => ({stream: dart.definiteFunctionType(async.Stream, [])}),
+    getters: () => ({stream: dart.definiteFunctionType(async.Stream$(io.FileSystemEntity), [])}),
     methods: () => ({
       [_pointer]: dart.definiteFunctionType(core.int, []),
       onListen: dart.definiteFunctionType(dart.void, []),
@@ -37521,7 +38370,7 @@
     }
   };
   dart.setSignature(io._EventHandler, {
-    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate.SendPort, core.int])}),
+    statics: () => ({_sendData: dart.definiteFunctionType(dart.void, [core.Object, isolate$.SendPort, core.int])}),
     names: ['_sendData']
   });
   const _mode = Symbol('_mode');
@@ -37563,7 +38412,9 @@
     toString() {
       return {
         0: "FileLock.SHARED",
-        1: "FileLock.EXCLUSIVE"
+        1: "FileLock.EXCLUSIVE",
+        2: "FileLock.BLOCKING_SHARED",
+        3: "FileLock.BLOCKING_EXCLUSIVE"
       }[this.index];
     }
   };
@@ -37572,7 +38423,9 @@
   });
   dart.defineEnumValues(io.FileLock, [
     'SHARED',
-    'EXCLUSIVE'
+    'EXCLUSIVE',
+    'BLOCKING_SHARED',
+    'BLOCKING_EXCLUSIVE'
   ]);
   io.File = class File extends core.Object {
     static new(path) {
@@ -37625,9 +38478,9 @@
   });
   io._BLOCK_SIZE = 64 * 1024;
   const _closeCompleter = Symbol('_closeCompleter');
-  const _path$ = Symbol('_path');
+  const _path = Symbol('_path');
   const _position$0 = Symbol('_position');
-  const _end$0 = Symbol('_end');
+  const _end$ = Symbol('_end');
   const _controller$0 = Symbol('_controller');
   const _openedFile = Symbol('_openedFile');
   const _unsubscribed = Symbol('_unsubscribed');
@@ -37640,9 +38493,9 @@
   io._FileStream = class _FileStream extends async.Stream$(core.List$(core.int)) {
     new(path, position, end) {
       this[_closeCompleter] = async.Completer.new();
-      this[_path$] = path;
+      this[_path] = path;
       this[_position$0] = position;
-      this[_end$0] = end;
+      this[_end$] = end;
       this[_controller$0] = null;
       this[_openedFile] = null;
       this[_unsubscribed] = false;
@@ -37656,9 +38509,9 @@
       this[_closeCompleter] = async.Completer.new();
       this[_position$0] = 0;
       this[_controller$0] = null;
-      this[_path$] = null;
+      this[_path] = null;
       this[_openedFile] = null;
-      this[_end$0] = null;
+      this[_end$] = null;
       this[_unsubscribed] = false;
       this[_readInProgress] = true;
       this[_closed] = false;
@@ -37699,12 +38552,12 @@
       }
       this[_readInProgress] = true;
       let readBytes = io._BLOCK_SIZE;
-      if (this[_end$0] != null) {
-        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$0]) - dart.notNull(this[_position$0]));
+      if (this[_end$] != null) {
+        readBytes = math.min(core.int)(readBytes, dart.notNull(this[_end$]) - dart.notNull(this[_position$0]));
         if (dart.notNull(readBytes) < 0) {
           this[_readInProgress] = false;
           if (!dart.test(this[_unsubscribed])) {
-            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$0]}`));
+            this[_controller$0].addError(new core.RangeError(dart.str`Bad end position: ${this[_end$]}`));
             this[_closeFile]();
             this[_unsubscribed] = true;
           }
@@ -37718,7 +38571,7 @@
           return;
         }
         this[_position$0] = dart.notNull(this[_position$0]) + dart.notNull(block[dartx.length]);
-        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$0] != null && this[_position$0] == this[_end$0]) {
+        if (dart.notNull(block[dartx.length]) < dart.notNull(readBytes) || this[_end$] != null && this[_position$0] == this[_end$]) {
           this[_atEnd] = true;
         }
         if (!dart.test(this[_atEnd]) && !dart.test(this[_controller$0].isPaused)) {
@@ -37767,8 +38620,8 @@
         this[_closeCompleter].complete();
       }).bind(this);
       dart.fn(openFailed, dynamicAnddynamicTovoid$());
-      if (this[_path$] != null) {
-        io.File.new(this[_path$]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
+      if (this[_path] != null) {
+        io.File.new(this[_path]).open({mode: io.FileMode.READ}).then(dart.void)(onOpenFile, {onError: openFailed});
       } else {
         try {
           onOpenFile(io._File._openStdioSync(0));
@@ -37785,10 +38638,10 @@
   dart.setSignature(io._FileStream, {
     fields: () => ({
       [_controller$0]: StreamControllerOfListOfint(),
-      [_path$]: core.String,
+      [_path]: core.String,
       [_openedFile]: io.RandomAccessFile,
       [_position$0]: core.int,
-      [_end$0]: core.int,
+      [_end$]: core.int,
       [_closeCompleter]: async.Completer,
       [_unsubscribed]: core.bool,
       [_readInProgress]: core.bool,
@@ -37860,8 +38713,8 @@
     })
   });
   const _tryDecode = Symbol('_tryDecode');
-  let const$54;
-  let const$55;
+  let const$57;
+  let const$58;
   io._File = class _File extends io.FileSystemEntity {
     new(path) {
       this.path = path;
@@ -37888,12 +38741,6 @@
     get absolute() {
       return io.File.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
     create(opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       let result = dart.test(recursive) ? this.parent.create({recursive: true}) : async.Future.value(null);
@@ -38010,6 +38857,41 @@
       io._File.throwIfError(result, "Cannot retrieve length of file", this.path);
       return core.int._check(result);
     }
+    lastAccessed() {
+      return io._IOService._dispatch(io._FILE_LAST_ACCESSED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot retrieve access time", this.path));
+        }
+        return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(response));
+      }, dynamicToDateTime()));
+    }
+    static _lastAccessed(path) {
+      dart.throw(new core.UnsupportedError("File._lastAccessed"));
+    }
+    lastAccessedSync() {
+      let ms = io._File._lastAccessed(this.path);
+      io._File.throwIfError(ms, "Cannot retrieve access time", this.path);
+      return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
+    }
+    setLastAccessed(time) {
+      let millis = time.millisecondsSinceEpoch;
+      return io._IOService._dispatch(io._FILE_SET_LAST_ACCESSED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot set access time", this.path));
+        }
+        return null;
+      }, dynamicToNull$()));
+    }
+    static _setLastAccessed(path, millis) {
+      dart.throw(new core.UnsupportedError("File._setLastAccessed"));
+    }
+    setLastAccessedSync(time) {
+      let millis = time.millisecondsSinceEpoch;
+      let result = io._File._setLastAccessed(this.path, millis);
+      if (io.OSError.is(result)) {
+        dart.throw(new io.FileSystemException("Failed to set file access time", this.path, result));
+      }
+    }
     lastModified() {
       return io._IOService._dispatch(io._FILE_LAST_MODIFIED, JSArrayOfString().of([this.path])).then(core.DateTime)(dart.fn(response => {
         if (dart.test(io._isErrorResponse(response))) {
@@ -38026,6 +38908,25 @@
       io._File.throwIfError(ms, "Cannot retrieve modification time", this.path);
       return new core.DateTime.fromMillisecondsSinceEpoch(core.int._check(ms));
     }
+    setLastModified(time) {
+      let millis = time.millisecondsSinceEpoch;
+      return io._IOService._dispatch(io._FILE_SET_LAST_MODIFIED, JSArrayOfObject().of([this.path, millis])).then(dart.dynamic)(dart.fn(response => {
+        if (dart.test(io._isErrorResponse(response))) {
+          dart.throw(io._exceptionFromResponse(response, "Cannot set modification time", this.path));
+        }
+        return null;
+      }, dynamicToNull$()));
+    }
+    static _setLastModified(path, millis) {
+      dart.throw(new core.UnsupportedError("File._setLastModified"));
+    }
+    setLastModifiedSync(time) {
+      let millis = time.millisecondsSinceEpoch;
+      let result = io._File._setLastModified(this.path, millis);
+      if (io.OSError.is(result)) {
+        dart.throw(new io.FileSystemException("Failed to set file modification time", this.path, result));
+      }
+    }
     static _open(path, mode) {
       dart.throw(new core.UnsupportedError("File._open"));
     }
@@ -38065,22 +38966,22 @@
     readAsBytes() {
       function readDataChunked(file) {
         let builder = io.BytesBuilder.new({copy: false});
-        let completer = async.Completer.new();
+        let completer = CompleterOfListOfint().new();
         function read() {
-          dart.dsend(dart.dsend(file, 'read', io._BLOCK_SIZE), 'then', dart.fn(data => {
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) {
-              builder.add(ListOfint()._check(data));
+          file.read(io._BLOCK_SIZE).then(dart.dynamic)(dart.fn(data => {
+            if (dart.notNull(data[dartx.length]) > 0) {
+              builder.add(data);
               read();
             } else {
               completer.complete(builder.takeBytes());
             }
-          }, dynamicToNull$()), {onError: dart.bind(completer, 'completeError')});
+          }, ListOfintToNull()), {onError: dart.bind(completer, 'completeError')});
         }
         dart.fn(read, VoidTovoid$());
         read();
-        return FutureOfListOfint()._check(completer.future);
+        return completer.future;
       }
-      dart.fn(readDataChunked, dynamicToFutureOfListOfint());
+      dart.fn(readDataChunked, RandomAccessFileToFutureOfListOfint());
       return this.open().then(ListOfint())(dart.fn(file => file.length().then(ListOfint())(dart.fn(length => {
         if (length == 0) {
           return readDataChunked(file);
@@ -38097,13 +38998,13 @@
           let builder = io.BytesBuilder.new({copy: false});
           do {
             data = opened.readSync(io._BLOCK_SIZE);
-            if (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0))) builder.add(ListOfint()._check(data));
-          } while (dart.test(dart.dsend(dart.dload(data, 'length'), '>', 0)));
+            if (dart.notNull(data[dartx.length]) > 0) builder.add(data);
+          } while (dart.notNull(data[dartx.length]) > 0);
           data = builder.takeBytes();
         } else {
           data = opened.readSync(length);
         }
-        return ListOfint()._check(data);
+        return data;
       } finally {
         opened.closeSync();
       }
@@ -38126,11 +39027,11 @@
     }
     readAsLines(opts) {
       let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$54 || (const$54 = dart.const(new convert.LineSplitter())), 'convert'));
+      return this.readAsString({encoding: encoding}).then(ListOfString())(dart.bind(const$57 || (const$57 = dart.const(new convert.LineSplitter())), 'convert'));
     }
     readAsLinesSync(opts) {
       let encoding = opts && 'encoding' in opts ? opts.encoding : convert.UTF8;
-      return (const$55 || (const$55 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
+      return (const$58 || (const$58 = dart.const(new convert.LineSplitter()))).convert(this.readAsStringSync({encoding: encoding}));
     }
     writeAsBytes(bytes, opts) {
       let mode = opts && 'mode' in opts ? opts.mode : io.FileMode.WRITE;
@@ -38184,8 +39085,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
       create: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [], {recursive: core.bool}),
       [_delete]: dart.definiteFunctionType(async.Future$(io.File), [], {recursive: core.bool}),
@@ -38197,8 +39096,14 @@
       open: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], {mode: io.FileMode}),
       length: dart.definiteFunctionType(async.Future$(core.int), []),
       lengthSync: dart.definiteFunctionType(core.int, []),
+      lastAccessed: dart.definiteFunctionType(async.Future$(core.DateTime), []),
+      lastAccessedSync: dart.definiteFunctionType(core.DateTime, []),
+      setLastAccessed: dart.definiteFunctionType(async.Future, [core.DateTime]),
+      setLastAccessedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
       lastModified: dart.definiteFunctionType(async.Future$(core.DateTime), []),
       lastModifiedSync: dart.definiteFunctionType(core.DateTime, []),
+      setLastModified: dart.definiteFunctionType(async.Future, [core.DateTime]),
+      setLastModifiedSync: dart.definiteFunctionType(dart.void, [core.DateTime]),
       openSync: dart.definiteFunctionType(io.RandomAccessFile, [], {mode: io.FileMode}),
       openRead: dart.definiteFunctionType(async.Stream$(core.List$(core.int)), [], [core.int, core.int]),
       openWrite: dart.definiteFunctionType(io.IOSink, [], {mode: io.FileMode, encoding: convert.Encoding}),
@@ -38225,26 +39130,49 @@
       _renameLink: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
       _copy: dart.definiteFunctionType(dart.dynamic, [core.String, core.String]),
       _lengthFromPath: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _lastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _setLastAccessed: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _lastModified: dart.definiteFunctionType(dart.dynamic, [core.String]),
+      _setLastModified: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _open: dart.definiteFunctionType(dart.dynamic, [core.String, core.int]),
       _openStdio: dart.definiteFunctionType(core.int, [core.int]),
       _openStdioSync: dart.definiteFunctionType(io.RandomAccessFile, [core.int]),
       throwIfError: dart.definiteFunctionType(dart.dynamic, [core.Object, core.String, core.String])
     }),
-    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
+    names: ['_exists', '_create', '_createLink', '_linkTarget', '_deleteNative', '_deleteLinkNative', '_rename', '_renameLink', '_copy', '_lengthFromPath', '_lastAccessed', '_setLastAccessed', '_lastModified', '_setLastModified', '_open', '_openStdio', '_openStdioSync', 'throwIfError']
   });
   io._RandomAccessFileOps = class _RandomAccessFileOps extends core.Object {
     static new(pointer) {
       dart.throw(new core.UnsupportedError("RandomAccessFile"));
     }
   };
+  io._FileTranslation = class _FileTranslation extends core.Object {
+    new(index) {
+      this.index = index;
+    }
+    toString() {
+      return {
+        0: "_FileTranslation.text",
+        1: "_FileTranslation.binary"
+      }[this.index];
+    }
+  };
+  dart.setSignature(io._FileTranslation, {
+    fields: () => ({index: core.int})
+  });
+  dart.defineEnumValues(io._FileTranslation, [
+    'text',
+    'binary'
+  ]);
   const _asyncDispatched = Symbol('_asyncDispatched');
   const _fileService = Symbol('_fileService');
   const _resourceInfo = Symbol('_resourceInfo');
+  const _translation = Symbol('_translation');
   const _maybeConnectHandler = Symbol('_maybeConnectHandler');
   const _maybePerformCleanup = Symbol('_maybePerformCleanup');
   const _dispatch = Symbol('_dispatch');
   const _checkAvailable = Symbol('_checkAvailable');
+  const _fileLockValue = Symbol('_fileLockValue');
   io._RandomAccessFile = class _RandomAccessFile extends core.Object {
     new(pointer, path) {
       this.path = path;
@@ -38252,9 +39180,11 @@
       this[_fileService] = null;
       this[_resourceInfo] = null;
       this[_ops] = null;
+      this[_translation] = null;
       this.closed = false;
       this[_ops] = io._RandomAccessFileOps.new(pointer);
       this[_resourceInfo] = new io._FileResourceInfo(this);
+      this[_translation] = io._FileTranslation.binary;
       this[_maybeConnectHandler]();
     }
     [_maybePerformCleanup]() {
@@ -38316,8 +39246,8 @@
           dart.throw(io._exceptionFromResponse(response, "read failed", this.path));
         }
         this[_resourceInfo].addRead(core.int._check(dart.dload(dart.dindex(response, 1), 'length')));
-        return FutureOrOfListOfint()._check(dart.dindex(response, 1));
-      }, dynamicToFutureOrOfListOfint()));
+        return ListOfint().as(dart.dindex(response, 1));
+      }, dynamicToListOfint()));
     }
     readSync(bytes) {
       this[_checkAvailable]();
@@ -38329,7 +39259,7 @@
         dart.throw(new io.FileSystemException("readSync failed", this.path, result));
       }
       this[_resourceInfo].addRead(core.int._check(dart.dload(result, 'length')));
-      return ListOfint()._check(result);
+      return ListOfint().as(result);
     }
     readInto(buffer, start, end) {
       if (start === void 0) start = 0;
@@ -38347,8 +39277,8 @@
           dart.throw(io._exceptionFromResponse(response, "readInto failed", this.path));
         }
         let read = dart.dindex(response, 1);
-        let data = dart.dindex(response, 2);
-        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), IterableOfint()._check(data));
+        let data = ListOfint().as(dart.dindex(response, 2));
+        buffer[dartx.setRange](start, dart.asInt(dart.notNull(start) + dart.notNull(core.num._check(read))), data);
         this[_resourceInfo].addRead(core.int._check(read));
         return FutureOrOfint()._check(read);
       }, dynamicToFutureOrOfint()));
@@ -38437,7 +39367,7 @@
         return;
       }
       let bufferAndStart = io._ensureFastAndSerializableByteData(buffer, start, end);
-      let result = this[_ops].writeFrom(ListOfint()._check(bufferAndStart.buffer), bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
+      let result = this[_ops].writeFrom(bufferAndStart.buffer, bufferAndStart.start, dart.notNull(end) - (dart.notNull(start) - dart.notNull(bufferAndStart.start)));
       if (io.OSError.is(result)) {
         dart.throw(new io.FileSystemException("writeFrom failed", this.path, result));
       }
@@ -38536,6 +39466,30 @@
         dart.throw(new io.FileSystemException("flush failed", this.path, result));
       }
     }
+    [_fileLockValue](fl) {
+      switch (fl) {
+        case io.FileLock.SHARED:
+        {
+          return io._RandomAccessFile.LOCK_SHARED;
+        }
+        case io.FileLock.EXCLUSIVE:
+        {
+          return io._RandomAccessFile.LOCK_EXCLUSIVE;
+        }
+        case io.FileLock.BLOCKING_SHARED:
+        {
+          return io._RandomAccessFile.LOCK_BLOCKING_SHARED;
+        }
+        case io.FileLock.BLOCKING_EXCLUSIVE:
+        {
+          return io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE;
+        }
+        default:
+        {
+          return -1;
+        }
+      }
+    }
     lock(mode, start, end) {
       if (mode === void 0) mode = io.FileLock.EXCLUSIVE;
       if (start === void 0) start = 0;
@@ -38546,7 +39500,7 @@
       if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
         dart.throw(new core.ArgumentError());
       }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+      let lock = this[_fileLockValue](mode);
       return this[_dispatch](io._FILE_LOCK, JSArrayOfint().of([null, lock, start, end])).then(io._RandomAccessFile)(dart.fn(response => {
         if (dart.test(io._isErrorResponse(response))) {
           dart.throw(io._exceptionFromResponse(response, 'lock failed', this.path));
@@ -38581,7 +39535,7 @@
       if (dart.notNull(start) < 0 || dart.notNull(end) < -1 || end != -1 && dart.notNull(start) >= dart.notNull(end)) {
         dart.throw(new core.ArgumentError());
       }
-      let lock = dart.equals(mode, io.FileLock.EXCLUSIVE) ? io._RandomAccessFile.LOCK_EXCLUSIVE : io._RandomAccessFile.LOCK_SHARED;
+      let lock = this[_fileLockValue](mode);
       let result = this[_ops].lock(lock, start, end);
       if (io.OSError.is(result)) {
         dart.throw(new io.FileSystemException('lock failed', this.path, result));
@@ -38602,6 +39556,15 @@
         dart.throw(new io.FileSystemException('unlock failed', this.path, result));
       }
     }
+    get translation() {
+      return this[_translation];
+    }
+    set translation(translation) {
+      if (!dart.equals(this[_translation], translation)) {
+        this[_ops].setTranslation(translation.index);
+        this[_translation] = translation;
+      }
+    }
     [_pointer]() {
       return this[_ops].getPointer();
     }
@@ -38637,11 +39600,14 @@
     fields: () => ({
       path: core.String,
       [_asyncDispatched]: core.bool,
-      [_fileService]: isolate.SendPort,
+      [_fileService]: isolate$.SendPort,
       [_resourceInfo]: io._FileResourceInfo,
       [_ops]: io._RandomAccessFileOps,
+      [_translation]: io._FileTranslation,
       closed: core.bool
     }),
+    getters: () => ({translation: dart.definiteFunctionType(io._FileTranslation, [])}),
+    setters: () => ({translation: dart.definiteFunctionType(dart.void, [io._FileTranslation])}),
     methods: () => ({
       [_maybePerformCleanup]: dart.definiteFunctionType(dart.void, []),
       [_maybeConnectHandler]: dart.definiteFunctionType(dart.dynamic, []),
@@ -38669,6 +39635,7 @@
       lengthSync: dart.definiteFunctionType(core.int, []),
       flush: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), []),
       flushSync: dart.definiteFunctionType(dart.void, []),
+      [_fileLockValue]: dart.definiteFunctionType(core.int, [io.FileLock]),
       lock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [io.FileLock, core.int, core.int]),
       unlock: dart.definiteFunctionType(async.Future$(io.RandomAccessFile), [], [core.int, core.int]),
       lockSync: dart.definiteFunctionType(dart.void, [], [io.FileLock, core.int, core.int]),
@@ -38682,7 +39649,9 @@
   io._RandomAccessFile.LOCK_UNLOCK = 0;
   io._RandomAccessFile.LOCK_SHARED = 1;
   io._RandomAccessFile.LOCK_EXCLUSIVE = 2;
-  let const$56;
+  io._RandomAccessFile.LOCK_BLOCKING_SHARED = 3;
+  io._RandomAccessFile.LOCK_BLOCKING_EXCLUSIVE = 4;
+  let const$59;
   io.FileSystemEntityType = class FileSystemEntityType extends core.Object {
     _internal(type) {
       this[_type] = type;
@@ -38691,7 +39660,7 @@
       return io.FileSystemEntityType._typeList[dartx._get](type);
     }
     toString() {
-      return (const$56 || (const$56 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
+      return (const$59 || (const$59 = dart.constList(['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'], core.String)))[dartx._get](this[_type]);
     }
   };
   dart.defineNamedConstructor(io.FileSystemEntityType, '_internal');
@@ -38717,7 +39686,7 @@
       return dart.constList([io.FileSystemEntityType.FILE, io.FileSystemEntityType.DIRECTORY, io.FileSystemEntityType.LINK, io.FileSystemEntityType.NOT_FOUND], io.FileSystemEntityType);
     }
   });
-  let const$57;
+  let const$60;
   io.FileStat = class FileStat extends core.Object {
     _internal(changed, modified, accessed, type, mode, size) {
       this.changed = changed;
@@ -38763,7 +39732,7 @@
     }
     modeString() {
       let permissions = dart.notNull(this.mode) & 4095;
-      let codes = const$57 || (const$57 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
+      let codes = const$60 || (const$60 = dart.constList(['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'], core.String));
       let result = [];
       if ((permissions & 2048) != 0) result[dartx.add]("(suid) ");
       if ((permissions & 1024) != 0) result[dartx.add]("(guid) ");
@@ -39263,19 +40232,19 @@
     }),
     getters: () => ({uri: dart.definiteFunctionType(core.Uri, [])})
   });
-  let const$58;
-  let const$59;
-  let const$60;
   let const$61;
   let const$62;
   let const$63;
   let const$64;
   let const$65;
   let const$66;
+  let const$67;
+  let const$68;
+  let const$69;
   io.HttpDate = class HttpDate extends core.Object {
     static format(date) {
-      let wkday = const$58 || (const$58 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let month = const$59 || (const$59 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+      let wkday = const$61 || (const$61 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+      let month = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
       let d = date.toUtc();
       let sb = new core.StringBuffer();
       sb.write(wkday[dartx._get](dart.notNull(d.weekday) - 1));
@@ -39297,12 +40266,12 @@
     }
     static parse(date) {
       let SP = 32;
-      let wkdays = const$60 || (const$60 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
-      let weekdays = const$61 || (const$61 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
-      let months = const$62 || (const$62 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
-      let wkdaysLowerCase = const$63 || (const$63 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
-      let weekdaysLowerCase = const$64 || (const$64 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
-      let monthsLowerCase = const$65 || (const$65 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+      let wkdays = const$63 || (const$63 = dart.constList(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], core.String));
+      let weekdays = const$64 || (const$64 = dart.constList(["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], core.String));
+      let months = const$65 || (const$65 = dart.constList(["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], core.String));
+      let wkdaysLowerCase = const$66 || (const$66 = dart.constList(["mon", "tue", "wed", "thu", "fri", "sat", "sun"], core.String));
+      let weekdaysLowerCase = const$67 || (const$67 = dart.constList(["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"], core.String));
+      let monthsLowerCase = const$68 || (const$68 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
       let formatRfc1123 = 0;
       let formatRfc850 = 1;
       let formatAsctime = 2;
@@ -39418,7 +40387,7 @@
       return new core.DateTime.utc(year, dart.notNull(month) + 1, day, hours, minutes, seconds, 0);
     }
     static _parseCookieDate(date) {
-      let monthsLowerCase = const$66 || (const$66 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
+      let monthsLowerCase = const$69 || (const$69 = dart.constList(["jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"], core.String));
       let position = 0;
       function error() {
         dart.throw(new io.HttpException(dart.str`Invalid cookie date ${date}`));
@@ -39552,7 +40521,7 @@
   const _addIfModifiedSince = Symbol('_addIfModifiedSince');
   const _foldHeader = Symbol('_foldHeader');
   const _finalize = Symbol('_finalize');
-  const _write = Symbol('_write');
+  const _build = Symbol('_build');
   const _parseCookies = Symbol('_parseCookies');
   io._HttpHeaders = class _HttpHeaders extends core.Object {
     new(protocolVersion, opts) {
@@ -39988,81 +40957,32 @@
     [_finalize]() {
       this[_mutable] = false;
     }
-    [_write](buffer, offset) {
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
+    [_build](builder) {
       for (let name of this[_headers][dartx.keys]) {
         let values = this[_headers][dartx._get](name);
         let fold = core.bool._check(this[_foldHeader](name));
         let nameData = name[dartx.codeUnits];
-        write(nameData);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.COLON);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.SP);
+        builder.add(nameData);
+        builder.addByte(io._CharCode.COLON);
+        builder.addByte(io._CharCode.SP);
         for (let i = 0; i < dart.notNull(values[dartx.length]); i++) {
           if (i > 0) {
             if (dart.test(fold)) {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COMMA);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
+              builder.addByte(io._CharCode.COMMA);
+              builder.addByte(io._CharCode.SP);
             } else {
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.CR);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.LF);
-              write(nameData);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.COLON);
-              buffer[dartx._set]((() => {
-                let x = offset;
-                offset = dart.notNull(x) + 1;
-                return x;
-              })(), io._CharCode.SP);
+              builder.addByte(io._CharCode.CR);
+              builder.addByte(io._CharCode.LF);
+              builder.add(nameData);
+              builder.addByte(io._CharCode.COLON);
+              builder.addByte(io._CharCode.SP);
             }
           }
-          write(values[dartx._get](i)[dartx.codeUnits]);
+          builder.add(values[dartx._get](i)[dartx.codeUnits]);
         }
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.CR);
-        buffer[dartx._set]((() => {
-          let x = offset;
-          offset = dart.notNull(x) + 1;
-          return x;
-        })(), io._CharCode.LF);
+        builder.addByte(io._CharCode.CR);
+        builder.addByte(io._CharCode.LF);
       }
-      return offset;
     }
     toString() {
       let sb = new core.StringBuffer();
@@ -40237,7 +41157,7 @@
       [_updateHostHeader]: dart.definiteFunctionType(dart.dynamic, []),
       [_foldHeader]: dart.definiteFunctionType(dart.dynamic, [core.String]),
       [_finalize]: dart.definiteFunctionType(dart.void, []),
-      [_write]: dart.definiteFunctionType(core.int, [typed_data.Uint8List, core.int]),
+      [_build]: dart.definiteFunctionType(dart.void, [io.BytesBuilder]),
       [_parseCookies]: dart.definiteFunctionType(core.List$(io.Cookie), [])
     }),
     statics: () => ({
@@ -40386,7 +41306,7 @@
             return;
           }
           let value = parseParameterValue();
-          if (name == 'charset' && io._ContentType.is(this)) {
+          if (name == 'charset' && io._ContentType.is(this) && value != null) {
             value = value[dartx.toLowerCase]();
           }
           parameters._set(name, value);
@@ -40497,7 +41417,7 @@
   });
   const _validate = Symbol('_validate');
   const _parseSetCookieValue = Symbol('_parseSetCookieValue');
-  let const$67;
+  let const$70;
   io._Cookie = class _Cookie extends core.Object {
     new(name, value) {
       if (name === void 0) name = null;
@@ -40636,7 +41556,7 @@
       return sb.toString();
     }
     [_validate]() {
-      let SEPERATORS = const$67 || (const$67 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
+      let SEPERATORS = const$70 || (const$70 = dart.constList(["(", ")", "<", ">", "@", ",", ";", ":", "\\", '"', "/", "[", "]", "?", "=", "{", "}"], core.String));
       for (let i = 0; i < dart.notNull(this.name[dartx.length]); i++) {
         let codeUnit = this.name[dartx.codeUnits][dartx._get](i);
         if (dart.notNull(codeUnit) <= 32 || dart.notNull(codeUnit) >= 127 || dart.notNull(SEPERATORS[dartx.indexOf](this.name[dartx._get](i))) >= 0) {
@@ -40670,6 +41590,7 @@
     })
   });
   io._OUTGOING_BUFFER_SIZE = 8 * 1024;
+  io._BytesConsumer = dart.typedef('_BytesConsumer', () => dart.functionType(dart.void, [ListOfint()]));
   const _transferLength = Symbol('_transferLength');
   const _dataCompleter = Symbol('_dataCompleter');
   const _stream$ = Symbol('_stream');
@@ -40968,7 +41889,7 @@
       let cancelOnError = opts && 'cancelOnError' in opts ? opts.cancelOnError : null;
       if (dart.test(this[_incoming].upgraded)) {
         this[_httpRequest][_httpClientConnection].destroy();
-        return StreamSubscriptionOfListOfint()._check(async.Stream.fromIterable([]).listen(null, {onDone: onDone}));
+        return StreamOfListOfint().empty().listen(null, {onDone: onDone});
       }
       let stream = this[_incoming];
       if (dart.test(this[_httpClient].autoUncompress) && this.headers.value(io.HttpHeaders.CONTENT_ENCODING) == "gzip") {
@@ -41090,7 +42011,7 @@
       [_authenticate]: dart.definiteFunctionType(async.Future$(io.HttpClientResponse), [core.bool])
     })
   });
-  const _uri = Symbol('_uri');
+  const _uri$ = Symbol('_uri');
   const _outgoing = Symbol('_outgoing');
   const _encodingSet = Symbol('_encodingSet');
   const _bufferOutput = Symbol('_bufferOutput');
@@ -41318,7 +42239,7 @@
     class _HttpOutboundMessage extends io._IOSinkImpl {
       new(uri, protocolVersion, outgoing, opts) {
         let initialHeaders = opts && 'initialHeaders' in opts ? opts.initialHeaders : null;
-        this[_uri] = uri;
+        this[_uri$] = uri;
         this.headers = new io._HttpHeaders(protocolVersion, {defaultPortForScheme: uri.scheme == 'https' ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT, initialHeaders: initialHeaders});
         this[_outgoing] = outgoing;
         this[_encodingSet] = false;
@@ -41381,7 +42302,7 @@
       fields: () => ({
         [_encodingSet]: core.bool,
         [_bufferOutput]: core.bool,
-        [_uri]: core.Uri,
+        [_uri$]: core.Uri,
         [_outgoing]: io._HttpOutgoing,
         headers: io._HttpHeaders
       }),
@@ -41478,43 +42399,18 @@
       }, VoidToNull()));
     }
     [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
+      let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
       if (this.headers.protocolVersion == "1.1") {
-        write(io._Const.HTTP11);
+        buffer.add(io._Const.HTTP11);
       } else {
-        write(io._Const.HTTP10);
+        buffer.add(io._Const.HTTP10);
       }
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(dart.toString(this.statusCode)[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this.reasonPhrase[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(dart.toString(this.statusCode)[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(this.reasonPhrase[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
       let session = this[_httpRequest][_session];
       if (session != null && !dart.test(session[_destroyed])) {
         session[_isNew] = false;
@@ -41543,18 +42439,11 @@
         }, CookieToNull()));
       }
       this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
+      this.headers[_build](buffer);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
+      let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+      this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
     }
     [_findReasonPhrase](statusCode) {
       if (this[_reasonPhrase] != null) {
@@ -41859,39 +42748,14 @@
       }
     }
     [_writeHeader]() {
-      let buffer = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
-      let offset = 0;
-      function write(bytes) {
-        let len = bytes[dartx.length];
-        for (let i = 0; i < dart.notNull(len); i++) {
-          buffer[dartx._set](dart.notNull(offset) + i, bytes[dartx._get](i));
-        }
-        offset = dart.notNull(offset) + dart.notNull(len);
-      }
-      dart.fn(write, ListOfintTovoid());
-      write(this.method[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(this[_requestUri]()[dartx.codeUnits]);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.SP);
-      write(io._Const.HTTP11);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
+      let buffer = new io._CopyingBytesBuilder(io._OUTGOING_BUFFER_SIZE);
+      buffer.add(this.method[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(this[_requestUri]()[dartx.codeUnits]);
+      buffer.addByte(io._CharCode.SP);
+      buffer.add(io._Const.HTTP11);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
       if (!dart.test(this.cookies[dartx.isEmpty])) {
         let sb = new core.StringBuffer();
         for (let i = 0; i < dart.notNull(this.cookies[dartx.length]); i++) {
@@ -41903,18 +42767,11 @@
         this.headers.add(io.HttpHeaders.COOKIE, sb.toString());
       }
       this.headers[_finalize]();
-      offset = this.headers[_write](buffer, offset);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.CR);
-      buffer[dartx._set]((() => {
-        let x = offset;
-        offset = dart.notNull(x) + 1;
-        return x;
-      })(), io._CharCode.LF);
-      this[_outgoing].setHeader(buffer, offset);
+      this.headers[_build](buffer);
+      buffer.addByte(io._CharCode.CR);
+      buffer.addByte(io._CharCode.LF);
+      let headerBytes = typed_data.Uint8List._check(buffer.takeBytes());
+      this[_outgoing].setHeader(headerBytes, headerBytes[dartx.length]);
     }
   };
   dart.addSimpleTypeTests(io._HttpClientRequest);
@@ -41958,19 +42815,19 @@
       super.new();
     }
     add(chunk) {
-      dart.dcall(this[_consume], chunk);
+      this[_consume](chunk);
     }
     addSlice(chunk, start, end, isLast) {
       if (typed_data.Uint8List.is(chunk)) {
-        dart.dcall(this[_consume], typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
+        this[_consume](typed_data.Uint8List.view(chunk[dartx.buffer], start, dart.notNull(end) - dart.notNull(start)));
       } else {
-        dart.dcall(this[_consume], chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
+        this[_consume](chunk[dartx.sublist](start, dart.notNull(end) - dart.notNull(start)));
       }
     }
     close() {}
   };
   dart.setSignature(io._HttpGZipSink, {
-    fields: () => ({[_consume]: core.Function}),
+    fields: () => ({[_consume]: io._BytesConsumer}),
     methods: () => ({
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addSlice: dart.definiteFunctionType(dart.void, [ListOfint(), core.int, core.int, core.bool]),
@@ -41990,10 +42847,10 @@
   const _addChunk$ = Symbol('_addChunk');
   const _chunkHeader = Symbol('_chunkHeader');
   const _ignoreError = Symbol('_ignoreError');
-  let const$68;
+  let const$71;
   io._HttpOutgoing = class _HttpOutgoing extends core.Object {
     new(socket) {
-      this[_doneCompleter] = async.Completer.new();
+      this[_doneCompleter] = CompleterOfSocket().new();
       this.socket = socket;
       this.ignoreBody = false;
       this.headersWritten = false;
@@ -42015,16 +42872,6 @@
     writeHeaders(opts) {
       let drainRequest = opts && 'drainRequest' in opts ? opts.drainRequest : true;
       let setOutgoing = opts && 'setOutgoing' in opts ? opts.setOutgoing : true;
-      const write = (function() {
-        try {
-          this.outbound[_writeHeader]();
-        } catch (_) {
-          return async.Future.error(new io.HttpException(dart.str`Headers size exceeded the of '${io._OUTGOING_BUFFER_SIZE}'` + " bytes"));
-        }
-
-        return null;
-      }).bind(this);
-      dart.fn(write, VoidToFuture());
       if (dart.test(this.headersWritten)) return null;
       this.headersWritten = true;
       let drainFuture = null;
@@ -42046,22 +42893,22 @@
       } else {
         drainRequest = false;
       }
-      if (dart.test(this.ignoreBody)) {
-        return write();
-      }
-      if (dart.test(setOutgoing)) {
-        let contentLength = this.outbound.headers.contentLength;
-        if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
-          this.chunked = true;
-          if (gzip) this.gzip = true;
-        } else if (dart.notNull(contentLength) >= 0) {
-          this.contentLength = contentLength;
+      if (!dart.test(this.ignoreBody)) {
+        if (dart.test(setOutgoing)) {
+          let contentLength = this.outbound.headers.contentLength;
+          if (dart.test(this.outbound.headers.chunkedTransferEncoding)) {
+            this.chunked = true;
+            if (gzip) this.gzip = true;
+          } else if (dart.notNull(contentLength) >= 0) {
+            this.contentLength = contentLength;
+          }
+        }
+        if (drainFuture != null) {
+          return drainFuture.then(dart.void)(dart.fn(_ => this.outbound[_writeHeader](), dynamicTovoid$()));
         }
       }
-      if (drainFuture != null) {
-        return drainFuture.then(dart.dynamic)(dart.fn(_ => write(), dynamicToFuture()));
-      }
-      return write();
+      this.outbound[_writeHeader]();
+      return null;
     }
     addStream(stream) {
       if (dart.test(this[_socketError])) {
@@ -42078,10 +42925,10 @@
         return this.close();
       }
       let sub = null;
-      let controller = async.StreamController.new({onPause: dart.fn(() => dart.dsend(sub, 'pause'), VoidTovoid$()), onResume: dart.fn(() => dart.dsend(sub, 'resume'), VoidTovoid$()), sync: true});
+      let controller = StreamControllerOfListOfint().new({onPause: dart.fn(() => sub.pause(), VoidTovoid$()), onResume: dart.fn(() => sub.resume(), VoidTovoid$()), sync: true});
       const onData = (function(data) {
         if (dart.test(this[_socketError])) return;
-        if (dart.equals(dart.dload(data, 'length'), 0)) return;
+        if (data[dartx.length] == 0) return;
         if (dart.test(this.chunked)) {
           if (dart.test(this[_gzip])) {
             this[_gzipAdd] = dart.bind(controller, 'add');
@@ -42089,28 +42936,28 @@
             this[_gzipAdd] = null;
             return;
           }
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), dart.bind(controller, 'add'));
+          this[_addChunk$](this[_chunkHeader](data[dartx.length]), dart.bind(controller, 'add'));
           this[_pendingChunkedFooter] = 2;
         } else {
           if (this.contentLength != null) {
-            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(core.num._check(dart.dload(data, 'length')));
+            this[_bytesWritten] = dart.notNull(this[_bytesWritten]) + dart.notNull(data[dartx.length]);
             if (dart.notNull(this[_bytesWritten]) > dart.notNull(this.contentLength)) {
-              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(IterableOfint()._check(data))}]`));
+              controller.addError(new io.HttpException("Content size exceeds specified contentLength. " + dart.str`${this[_bytesWritten]} bytes written while expected ` + dart.str`${this.contentLength}. ` + dart.str`[${core.String.fromCharCodes(data)}]`));
               return;
             }
           }
         }
         this[_addChunk$](data, dart.bind(controller, 'add'));
       }).bind(this);
-      dart.fn(onData, dynamicTovoid$());
+      dart.fn(onData, ListOfintTovoid());
       sub = stream.listen(onData, {onError: dart.bind(controller, 'addError'), onDone: dart.bind(controller, 'close'), cancelOnError: true});
       if (!dart.test(this.headersWritten)) {
         let future = this.writeHeaders();
         if (future != null) {
-          dart.dsend(sub, 'pause', future);
+          sub.pause(future);
         }
       }
-      return this.socket.addStream(StreamOfListOfint()._check(controller.stream)).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
+      return this.socket.addStream(controller.stream).then(io._HttpOutboundMessage)(dart.fn(_ => this.outbound, dynamicTo_HttpOutboundMessage()), {onError: dart.fn((error, stackTrace) => {
           if (dart.test(this[_gzip])) this[_gzipSink].close();
           this[_socketError] = true;
           this[_doneCompleter].completeError(error, core.StackTrace._check(stackTrace));
@@ -42130,14 +42977,14 @@
           this.outbound.headers.chunkedTransferEncoding = false;
           this.outbound.headers.contentLength = 0;
         } else if (dart.notNull(this.outbound.headers.contentLength) > 0) {
-          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri]});
+          let error = new io.HttpException("No content even though contentLength was specified to be " + dart.str`greater than 0: ${this.outbound.headers.contentLength}.`, {uri: this.outbound[_uri$]});
           this[_doneCompleter].completeError(error);
           return this[_closeFuture] = async.Future.error(error);
         }
       }
       if (this.contentLength != null) {
         if (dart.notNull(this[_bytesWritten]) < dart.notNull(this.contentLength)) {
-          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri]});
+          let error = new io.HttpException("Content size below specified contentLength. " + dart.str` ${this[_bytesWritten]} bytes written but expected ` + dart.str`${this.contentLength}.`, {uri: this.outbound[_uri$]});
           this[_doneCompleter].completeError(error);
           return this[_closeFuture] = async.Future.error(error);
         }
@@ -42183,7 +43030,6 @@
     }
     setHeader(data, length) {
       dart.assert(this[_length$2] == 0);
-      dart.assert(data[dartx.length] == io._OUTGOING_BUFFER_SIZE);
       this[_buffer$] = typed_data.Uint8List._check(data);
       this[_length$2] = length;
     }
@@ -42194,10 +43040,10 @@
         dart.assert(this[_gzipSink] == null);
         this[_gzipSink] = new io.ZLibEncoder({gzip: true}).startChunkedConversion(new io._HttpGZipSink(dart.fn(data => {
           if (this[_gzipAdd] == null) return;
-          this[_addChunk$](this[_chunkHeader](core.int._check(dart.dload(data, 'length'))), _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
+          this[_addChunk$](this[_chunkHeader](data[dartx.length]), this[_gzipAdd]);
           this[_pendingChunkedFooter] = 2;
-          this[_addChunk$](data, _ChunkedConversionCallbackOfListOfint()._check(this[_gzipAdd]));
-        }, dynamicToNull$())));
+          this[_addChunk$](data, this[_gzipAdd]);
+        }, ListOfintToNull())));
       }
     }
     [_ignoreError](error) {
@@ -42205,19 +43051,19 @@
     }
     [_addGZipChunk](chunk, add) {
       if (!dart.test(this.outbound.bufferOutput)) {
-        add(ListOfint()._check(chunk));
+        add(chunk);
         return;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])))) {
+      if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_gzipBuffer][dartx.length]) - dart.notNull(this[_gzipBufferLength])) {
         add(typed_data.Uint8List.view(this[_gzipBuffer][dartx.buffer], 0, this[_gzipBufferLength]));
         this[_gzipBuffer] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
         this[_gzipBufferLength] = 0;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
+      if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+        add(chunk);
       } else {
-        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.asInt(dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+        this[_gzipBuffer][dartx.setRange](this[_gzipBufferLength], dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]), chunk);
+        this[_gzipBufferLength] = dart.notNull(this[_gzipBufferLength]) + dart.notNull(chunk[dartx.length]);
       }
     }
     [_addChunk$](chunk, add) {
@@ -42227,23 +43073,23 @@
           this[_buffer$] = null;
           this[_length$2] = 0;
         }
-        add(ListOfint()._check(chunk));
+        add(chunk);
         return;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])))) {
+      if (dart.notNull(chunk[dartx.length]) > dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_length$2])) {
         add(typed_data.Uint8List.view(this[_buffer$][dartx.buffer], 0, this[_length$2]));
         this[_buffer$] = typed_data.Uint8List.new(io._OUTGOING_BUFFER_SIZE);
         this[_length$2] = 0;
       }
-      if (dart.test(dart.dsend(dart.dload(chunk, 'length'), '>', io._OUTGOING_BUFFER_SIZE))) {
-        add(ListOfint()._check(chunk));
+      if (dart.notNull(chunk[dartx.length]) > io._OUTGOING_BUFFER_SIZE) {
+        add(chunk);
       } else {
-        this[_buffer$][dartx.setRange](this[_length$2], dart.asInt(dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')))), IterableOfint()._check(chunk));
-        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(core.num._check(dart.dload(chunk, 'length')));
+        this[_buffer$][dartx.setRange](this[_length$2], dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]), chunk);
+        this[_length$2] = dart.notNull(this[_length$2]) + dart.notNull(chunk[dartx.length]);
       }
     }
     [_chunkHeader](length) {
-      let hexDigits = const$68 || (const$68 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
+      let hexDigits = const$71 || (const$71 = dart.constList([48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70], core.int));
       if (length == 0) {
         if (this[_pendingChunkedFooter] == 2) return io._HttpOutgoing._footerAndChunk0Length;
         return io._HttpOutgoing._chunk0Length;
@@ -42272,7 +43118,7 @@
   io._HttpOutgoing[dart.implements] = () => [StreamConsumerOfListOfint()];
   dart.setSignature(io._HttpOutgoing, {
     fields: () => ({
-      [_doneCompleter]: async.Completer,
+      [_doneCompleter]: CompleterOfSocket(),
       socket: io.Socket,
       ignoreBody: core.bool,
       headersWritten: core.bool,
@@ -42285,13 +43131,13 @@
       [_bytesWritten]: core.int,
       [_gzip]: core.bool,
       [_gzipSink]: convert.ByteConversionSink,
-      [_gzipAdd]: core.Function,
+      [_gzipAdd]: io._BytesConsumer,
       [_gzipBuffer]: typed_data.Uint8List,
       [_gzipBufferLength]: core.int,
       [_socketError]: core.bool,
       outbound: io._HttpOutboundMessage
     }),
-    getters: () => ({done: dart.definiteFunctionType(async.Future, [])}),
+    getters: () => ({done: dart.definiteFunctionType(async.Future$(io.Socket), [])}),
     setters: () => ({gzip: dart.definiteFunctionType(dart.void, [core.bool])}),
     methods: () => ({
       writeHeaders: dart.definiteFunctionType(async.Future, [], {drainRequest: core.bool, setOutgoing: core.bool}),
@@ -42299,8 +43145,8 @@
       close: dart.definiteFunctionType(async.Future, []),
       setHeader: dart.definiteFunctionType(dart.void, [ListOfint(), core.int]),
       [_ignoreError]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
-      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
-      [_addChunk$]: dart.definiteFunctionType(dart.void, [dart.dynamic, _ChunkedConversionCallbackOfListOfint()]),
+      [_addGZipChunk]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
+      [_addChunk$]: dart.definiteFunctionType(dart.void, [ListOfint(), _ChunkedConversionCallbackOfListOfint()]),
       [_chunkHeader]: dart.definiteFunctionType(core.List$(core.int), [core.int])
     })
   });
@@ -42408,7 +43254,7 @@
         }
       }
       this[_httpParser].isHead = method == "HEAD";
-      this[_streamFuture] = outgoing.done.then(dart.dynamic)(dart.fn(s => {
+      this[_streamFuture] = outgoing.done.then(io.Socket)(dart.fn(s => {
         this[_nextResponseCompleter] = CompleterOf_HttpIncoming().new();
         this[_nextResponseCompleter].future.then(dart.dynamic)(dart.fn(incoming => {
           this[_currentUri] = null;
@@ -42451,13 +43297,13 @@
         }, dynamicAnddynamicToNull()));
         this[_subscription$].resume();
         return s;
-      }, dynamicTodynamic$()), {onError: dart.fn(e => {
+      }, SocketToSocket()), {onError: dart.fn(e => {
           this.destroy();
         }, dynamicToNull$())});
       return request;
     }
     detachSocket() {
-      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), dynamicTo_DetachedSocket()));
+      return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => new io._DetachedSocket(this[_socket], this[_httpParser].detachIncoming()), SocketTo_DetachedSocket()));
     }
     destroy() {
       this.closed = true;
@@ -42467,12 +43313,12 @@
     close() {
       this.closed = true;
       this[_httpClient][_connectionClosed](this);
-      this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), dynamicTovoid$()));
+      this[_streamFuture].then(dart.void)(dart.fn(_ => this[_socket].destroy(), SocketTovoid()));
     }
     createProxyTunnel(host, port, proxy, callback) {
-      let request = this.send(core.Uri.new({host: core.String._check(host), port: core.int._check(port)}), core.int._check(port), "CONNECT", io._Proxy._check(proxy));
-      if (dart.test(dart.dload(proxy, 'isAuthenticated'))) {
-        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${dart.dload(proxy, 'username')}:${dart.dload(proxy, 'password')}`));
+      let request = this.send(core.Uri.new({host: host, port: port}), port, "CONNECT", proxy);
+      if (dart.test(proxy.isAuthenticated)) {
+        let auth = io._CryptoUtils.bytesToBase64(convert.UTF8.encode(dart.str`${proxy.username}:${proxy.password}`));
         request.headers.set(io.HttpHeaders.PROXY_AUTHORIZATION, dart.str`Basic ${auth}`);
       }
       return request.close().then(io.SecureSocket)(dart.fn(response => {
@@ -42480,9 +43326,9 @@
           dart.throw("Proxy failed to establish tunnel " + dart.str`(${response.statusCode} ${response.reasonPhrase})`);
         }
         let socket = io._HttpClientResponse.as(response)[_httpRequest][_httpClientConnection][_socket];
-        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: X509CertificateTobool()._check(callback)});
+        return io.SecureSocket.secure(socket, {host: host, context: this[_context], onBadCertificate: callback});
       }, HttpClientResponseToFutureOfSecureSocket())).then(io._HttpClientConnection)(dart.fn(secureSocket => {
-        let key = core.String._check(io._HttpClientConnection.makeKey(true, core.String._check(host), core.int._check(port)));
+        let key = core.String._check(io._HttpClientConnection.makeKey(true, host, port));
         return new io._HttpClientConnection(key, secureSocket, request[_httpClient], true);
       }, SecureSocketTo_HttpClientConnection()));
     }
@@ -42520,7 +43366,7 @@
       closed: core.bool,
       [_currentUri]: core.Uri,
       [_nextResponseCompleter]: CompleterOf_HttpIncoming(),
-      [_streamFuture]: async.Future
+      [_streamFuture]: FutureOfSocket()
     }),
     getters: () => ({connectionInfo: dart.definiteFunctionType(io.HttpConnectionInfo, [])}),
     methods: () => ({
@@ -42528,7 +43374,7 @@
       detachSocket: dart.definiteFunctionType(async.Future$(io.Socket), []),
       destroy: dart.definiteFunctionType(dart.void, []),
       close: dart.definiteFunctionType(dart.void, []),
-      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [dart.dynamic, dart.dynamic, dart.dynamic, dart.dynamic]),
+      createProxyTunnel: dart.definiteFunctionType(async.Future$(io._HttpClientConnection), [core.String, core.int, io._Proxy, X509CertificateTobool()]),
       stopTimer: dart.definiteFunctionType(dart.void, []),
       startTimer: dart.definiteFunctionType(dart.void, [])
     }),
@@ -42622,11 +43468,11 @@
         return FutureOf_ConnectionInfo().value(new io._ConnectionInfo(connection, proxy));
       }
       if (client.maxConnectionsPerHost != null && dart.notNull(this[_active].length) + dart.notNull(this[_connecting]) >= dart.notNull(client.maxConnectionsPerHost)) {
-        let completer = async.Completer.new();
+        let completer = CompleterOf_ConnectionInfo().new();
         this[_pending$].add(dart.fn(() => {
-          this.connect(uriHost, uriPort, proxy, client).then(dart.void)(dart.bind(completer, 'complete'), {onError: dart.bind(completer, 'completeError')});
+          completer.complete(this.connect(uriHost, uriPort, proxy, client));
         }, VoidToNull()));
-        return FutureOf_ConnectionInfo()._check(completer.future);
+        return completer.future;
       }
       let currentBadCertificateCallback = client[_badCertificateCallback];
       function callback(certificate) {
@@ -42686,7 +43532,7 @@
   });
   io.BadCertificateCallback = dart.typedef('BadCertificateCallback', () => dart.functionType(core.bool, [io.X509Certificate, core.String, core.int]));
   const _idleTimeout = Symbol('_idleTimeout');
-  let const$69;
+  let const$72;
   const _connectionTargets = Symbol('_connectionTargets');
   const _credentials = Symbol('_credentials');
   const _closing = Symbol('_closing');
@@ -42694,7 +43540,7 @@
   const _findProxy = Symbol('_findProxy');
   const _openUrl = Symbol('_openUrl');
   const _closeConnections = Symbol('_closeConnections');
-  let const$70;
+  let const$73;
   const _getConnection = Symbol('_getConnection');
   io._HttpClient = class _HttpClient extends core.Object {
     get idleTimeout() {
@@ -42711,7 +43557,7 @@
       this[_authenticate] = null;
       this[_authenticateProxy] = null;
       this[_findProxy] = io.HttpClient.findProxyFromEnvironment;
-      this[_idleTimeout] = const$69 || (const$69 = dart.const(new core.Duration({seconds: 15})));
+      this[_idleTimeout] = const$72 || (const$72 = dart.const(new core.Duration({seconds: 15})));
       this[_badCertificateCallback] = null;
       this.maxConnectionsPerHost = null;
       this.autoUncompress = true;
@@ -42829,7 +43675,7 @@
       if (port == 0) {
         port = isSecure ? io.HttpClient.DEFAULT_HTTPS_PORT : io.HttpClient.DEFAULT_HTTP_PORT;
       }
-      let proxyConf = const$70 || (const$70 = dart.const(new io._ProxyConfiguration.direct()));
+      let proxyConf = const$73 || (const$73 = dart.const(new io._ProxyConfiguration.direct()));
       if (this[_findProxy] != null) {
         try {
           proxyConf = new io._ProxyConfiguration(core.String._check(dart.dcall(this[_findProxy], uri)));
@@ -43125,7 +43971,7 @@
       }
 
       io._HttpConnection._connections[dartx._set](this[_serviceId], this);
-      this[_httpParser].listenToStream(StreamOfListOfint()._check(this[_socket]));
+      this[_httpParser].listenToStream(io.Socket.as(this[_socket]));
       this[_subscription$] = this[_httpParser].listen(dart.fn(incoming => {
         this[_httpServer][_markActive](this);
         incoming.dataDone.then(dart.dynamic)(dart.fn(closing => {
@@ -43147,7 +43993,7 @@
           } else {
             this.destroy();
           }
-        }, dynamicToNull$()), {onError: dart.fn(_ => {
+        }, SocketToNull()), {onError: dart.fn(_ => {
             this.destroy();
           }, dynamicToNull$())});
         outgoing.ignoreBody = request.method == "HEAD";
@@ -43178,7 +44024,7 @@
       let detachedIncoming = this[_httpParser].detachIncoming();
       return this[_streamFuture].then(io._DetachedSocket)(dart.fn(_ => {
         io._HttpConnection._connections[dartx.remove](this[_serviceId]);
-        return new io._DetachedSocket(this[_socket], detachedIncoming);
+        return new io._DetachedSocket(io.Socket._check(this[_socket]), detachedIncoming);
       }, dynamicTo_DetachedSocket()));
     }
     get connectionInfo() {
@@ -43288,8 +44134,8 @@
   const _idleConnections = Symbol('_idleConnections');
   const _serverSocket = Symbol('_serverSocket');
   const _closeServer = Symbol('_closeServer');
-  let const$71;
-  let const$72;
+  let const$74;
+  let const$75;
   io._HttpServer = class _HttpServer extends dart.mixin(async.Stream$(io.HttpRequest), io._ServiceObject) {
     static bind(address, port, backlog, v6Only, shared) {
       return io.ServerSocket.bind(address, port, {backlog: backlog, v6Only: v6Only, shared: shared}).then(io._HttpServer)(dart.fn(socket => new io._HttpServer._(socket, true), ServerSocketTo_HttpServer()));
@@ -43312,7 +44158,7 @@
       this[_controller$0] = null;
       super.new();
       this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$71 || (const$71 = dart.const(new core.Duration({seconds: 120})));
+      this.idleTimeout = const$74 || (const$74 = dart.const(new core.Duration({seconds: 120})));
       io._HttpServer._servers[dartx._set](this[_serviceId], this);
       dart.dput(this[_serverSocket], _owner, this);
     }
@@ -43331,7 +44177,7 @@
       this[_controller$0] = null;
       super.new();
       this[_controller$0] = StreamControllerOfHttpRequest().new({sync: true, onCancel: dart.bind(this, 'close')});
-      this.idleTimeout = const$72 || (const$72 = dart.const(new core.Duration({seconds: 120})));
+      this.idleTimeout = const$75 || (const$75 = dart.const(new core.Duration({seconds: 120})));
       io._HttpServer._servers[dartx._set](this[_serviceId], this);
       try {
         dart.dput(this[_serverSocket], _owner, this);
@@ -43575,8 +44421,8 @@
     }),
     getters: () => ({isAuthenticated: dart.definiteFunctionType(core.bool, [])})
   });
-  let const$73;
-  let const$74;
+  let const$76;
+  let const$77;
   io._ProxyConfiguration = class _ProxyConfiguration extends core.Object {
     new(configuration) {
       this.proxies = ListOf_Proxy().new();
@@ -43631,7 +44477,7 @@
       }, StringToNull()));
     }
     direct() {
-      this.proxies = const$74 || (const$74 = dart.constList([const$73 || (const$73 = dart.const(new io._Proxy.direct()))], io._Proxy));
+      this.proxies = const$77 || (const$77 = dart.constList([const$76 || (const$76 = dart.const(new io._Proxy.direct()))], io._Proxy));
     }
   };
   dart.defineNamedConstructor(io._ProxyConfiguration, 'direct');
@@ -43683,61 +44529,61 @@
       return this[_incoming].listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
     }
     get encoding() {
-      return convert.Encoding._check(dart.dload(this[_socket], 'encoding'));
+      return this[_socket].encoding;
     }
     set encoding(value) {
-      dart.dput(this[_socket], 'encoding', value);
+      this[_socket].encoding = value;
     }
     write(obj) {
-      dart.dsend(this[_socket], 'write', obj);
+      this[_socket].write(obj);
     }
     writeln(obj) {
       if (obj === void 0) obj = "";
-      dart.dsend(this[_socket], 'writeln', obj);
+      this[_socket].writeln(obj);
     }
     writeCharCode(charCode) {
-      dart.dsend(this[_socket], 'writeCharCode', charCode);
+      this[_socket].writeCharCode(charCode);
     }
     writeAll(objects, separator) {
       if (separator === void 0) separator = "";
-      dart.dsend(this[_socket], 'writeAll', objects, separator);
+      this[_socket].writeAll(objects, separator);
     }
     add(bytes) {
-      dart.dsend(this[_socket], 'add', bytes);
+      this[_socket].add(bytes);
     }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
-      return dart.dsend(this[_socket], 'addError', error, stackTrace);
+      return this[_socket].addError(error, stackTrace);
     }
     addStream(stream) {
-      return FutureOfSocket()._check(dart.dsend(this[_socket], 'addStream', stream));
+      return this[_socket].addStream(stream);
     }
     destroy() {
-      dart.dsend(this[_socket], 'destroy');
+      this[_socket].destroy();
     }
     flush() {
-      return async.Future._check(dart.dsend(this[_socket], 'flush'));
+      return this[_socket].flush();
     }
     close() {
-      return async.Future._check(dart.dsend(this[_socket], 'close'));
+      return this[_socket].close();
     }
     get done() {
-      return FutureOfSocket()._check(dart.dload(this[_socket], 'done'));
+      return this[_socket].done;
     }
     get port() {
-      return core.int._check(dart.dload(this[_socket], 'port'));
+      return this[_socket].port;
     }
     get address() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'address'));
+      return this[_socket].address;
     }
     get remoteAddress() {
-      return io.InternetAddress._check(dart.dload(this[_socket], 'remoteAddress'));
+      return this[_socket].remoteAddress;
     }
     get remotePort() {
-      return core.int._check(dart.dload(this[_socket], 'remotePort'));
+      return this[_socket].remotePort;
     }
     setOption(option, enabled) {
-      return core.bool._check(dart.dsend(this[_socket], 'setOption', option, enabled));
+      return this[_socket].setOption(option, enabled);
     }
     [_toJSON$](ref) {
       return core.Map._check(dart.dsend(this[_socket], _toJSON$, ref));
@@ -43751,7 +44597,7 @@
   dart.setSignature(io._DetachedSocket, {
     fields: () => ({
       [_incoming]: StreamOfListOfint(),
-      [_socket]: dart.dynamic
+      [_socket]: io.Socket
     }),
     getters: () => ({
       encoding: dart.definiteFunctionType(convert.Encoding, []),
@@ -43773,10 +44619,10 @@
       writeAll: dart.definiteFunctionType(dart.void, [core.Iterable], [core.String]),
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
-      addStream: dart.definiteFunctionType(async.Future$(io.Socket), [StreamOfListOfint()]),
+      addStream: dart.definiteFunctionType(async.Future, [StreamOfListOfint()]),
       destroy: dart.definiteFunctionType(dart.void, []),
       flush: dart.definiteFunctionType(async.Future, []),
-      close: dart.definiteFunctionType(async.Future, []),
+      close: dart.definiteFunctionType(async.Future$(io.Socket), []),
       setOption: dart.definiteFunctionType(core.bool, [io.SocketOption, core.bool]),
       [_toJSON$]: dart.definiteFunctionType(core.Map, [core.bool])
     })
@@ -44217,23 +45063,21 @@
         this.subscription.onError(onError);
         this.subscription.onDone(onDone);
         if (this.bufferedData == null) {
-          return StreamSubscriptionOfListOfint()._check(((() => {
-            this.subscription.resume();
-            return this.subscription;
-          })()));
+          this.subscription.resume();
+          return this.subscription;
         }
-        let _ = new io._HttpDetachedStreamSubscription(StreamSubscriptionOfListOfint()._check(this.subscription), this.bufferedData, onData);
+        let _ = new io._HttpDetachedStreamSubscription(this.subscription, this.bufferedData, onData);
         _.resume();
         return _;
       } else {
-        return StreamOfint().fromIterable(this.bufferedData).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
+        return StreamOfListOfint().fromIterable(JSArrayOfListOfint().of([this.bufferedData])).listen(onData, {onError: onError, onDone: onDone, cancelOnError: cancelOnError});
       }
     }
   };
   dart.addSimpleTypeTests(io._HttpDetachedIncoming);
   dart.setSignature(io._HttpDetachedIncoming, {
     fields: () => ({
-      subscription: async.StreamSubscription,
+      subscription: StreamSubscriptionOfListOfint(),
       bufferedData: ListOfint()
     }),
     methods: () => ({listen: dart.definiteFunctionType(async.StreamSubscription$(core.List$(core.int)), [_ChunkedConversionCallbackOfListOfint()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool})})
@@ -44244,7 +45088,7 @@
   const _headerValue = Symbol('_headerValue');
   const _requestParser = Symbol('_requestParser');
   const _parserCalled = Symbol('_parserCalled');
-  const _index$2 = Symbol('_index');
+  const _index$1 = Symbol('_index');
   const _httpVersionIndex = Symbol('_httpVersionIndex');
   const _messageType = Symbol('_messageType');
   const _statusCodeLength = Symbol('_statusCodeLength');
@@ -44285,7 +45129,7 @@
       this[_requestParser] = requestParser;
       this[_parserCalled] = false;
       this[_buffer$] = null;
-      this[_index$2] = null;
+      this[_index$1] = null;
       this[_state$1] = null;
       this[_httpVersionIndex] = null;
       this[_messageType] = null;
@@ -44397,14 +45241,14 @@
       if (this[_state$1] == io._State.FAILURE) {
         dart.throw(new io.HttpException("Data on failed connection"));
       }
-      while (this[_buffer$] != null && dart.notNull(this[_index$2]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
+      while (this[_buffer$] != null && dart.notNull(this[_index$1]) < dart.notNull(this[_buffer$][dartx.length]) && this[_state$1] != io._State.FAILURE && this[_state$1] != io._State.UPGRADED) {
         if (this[_incoming] != null && dart.test(this[_bodyPaused]) || this[_incoming] == null && dart.test(this[_paused])) {
           this[_parserCalled] = false;
           return;
         }
         let byte = this[_buffer$][dartx._get]((() => {
-          let x = this[_index$2];
-          this[_index$2] = dart.notNull(x) + 1;
+          let x = this[_index$1];
+          this[_index$1] = dart.notNull(x) + 1;
           return x;
         })());
         switch (this[_state$1]) {
@@ -44585,7 +45429,7 @@
               this[_state$1] = io._State.HEADER_ENDING;
             } else if (byte == io._CharCode.LF) {
               this[_state$1] = io._State.HEADER_ENDING;
-              this[_index$2] = dart.notNull(this[_index$2]) - 1;
+              this[_index$1] = dart.notNull(this[_index$1]) - 1;
             } else {
               this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
               this[_state$1] = io._State.HEADER_FIELD;
@@ -44660,7 +45504,7 @@
                 this[_state$1] = io._State.HEADER_ENDING;
               } else if (byte == io._CharCode.LF) {
                 this[_state$1] = io._State.HEADER_ENDING;
-                this[_index$2] = dart.notNull(this[_index$2]) - 1;
+                this[_index$1] = dart.notNull(this[_index$1]) - 1;
               } else {
                 this[_headerField][dartx.add](io._HttpParser._toLowerCaseByte(byte));
                 this[_state$1] = io._State.HEADER_FIELD;
@@ -44734,17 +45578,17 @@
           }
           case io._State.BODY:
           {
-            this[_index$2] = dart.notNull(this[_index$2]) - 1;
-            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$2]);
+            this[_index$1] = dart.notNull(this[_index$1]) - 1;
+            let dataAvailable = dart.notNull(this[_buffer$][dartx.length]) - dart.notNull(this[_index$1]);
             if (dart.notNull(this[_remainingContent]) >= 0 && dart.notNull(dataAvailable) > dart.notNull(this[_remainingContent])) {
               dataAvailable = this[_remainingContent];
             }
-            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$2]), dataAvailable);
+            let data = typed_data.Uint8List.view(this[_buffer$][dartx.buffer], dart.notNull(this[_buffer$][dartx.offsetInBytes]) + dart.notNull(this[_index$1]), dataAvailable);
             this[_bodyController].add(data);
             if (this[_remainingContent] != -1) {
               this[_remainingContent] = dart.notNull(this[_remainingContent]) - dart.notNull(data[dartx.length]);
             }
-            this[_index$2] = dart.notNull(this[_index$2]) + dart.notNull(data[dartx.length]);
+            this[_index$1] = dart.notNull(this[_index$1]) + dart.notNull(data[dartx.length]);
             if (this[_remainingContent] == 0) {
               if (!dart.test(this[_chunked])) {
                 this[_reset]();
@@ -44768,7 +45612,7 @@
         }
       }
       this[_parserCalled] = false;
-      if (this[_buffer$] != null && this[_index$2] == this[_buffer$][dartx.length]) {
+      if (this[_buffer$] != null && this[_index$1] == this[_buffer$][dartx.length]) {
         this[_releaseBuffer]();
         if (this[_state$1] != io._State.UPGRADED && this[_state$1] != io._State.FAILURE) {
           this[_socketSubscription].resume();
@@ -44779,7 +45623,7 @@
       this[_socketSubscription].pause();
       dart.assert(this[_buffer$] == null);
       this[_buffer$] = typed_data.Uint8List._check(buffer);
-      this[_index$2] = 0;
+      this[_index$1] = 0;
       this[_parse]();
     }
     [_onDone$]() {
@@ -44852,8 +45696,8 @@
     }
     readUnparsedData() {
       if (this[_buffer$] == null) return null;
-      if (this[_index$2] == this[_buffer$][dartx.length]) return null;
-      let result = this[_buffer$][dartx.sublist](this[_index$2]);
+      if (this[_index$1] == this[_buffer$][dartx.length]) return null;
+      let result = this[_buffer$][dartx.sublist](this[_index$1]);
       this[_releaseBuffer]();
       return result;
     }
@@ -44878,7 +45722,7 @@
     }
     [_releaseBuffer]() {
       this[_buffer$] = null;
-      this[_index$2] = null;
+      this[_index$1] = null;
     }
     static _isTokenChar(byte) {
       return dart.notNull(byte) > 31 && dart.notNull(byte) < 128 && !dart.test(io._Const.SEPARATOR_MAP[dartx._get](byte));
@@ -44998,7 +45842,7 @@
     fields: () => ({
       [_parserCalled]: core.bool,
       [_buffer$]: typed_data.Uint8List,
-      [_index$2]: core.int,
+      [_index$1]: core.int,
       [_requestParser]: core.bool,
       [_state$1]: core.int,
       [_httpVersionIndex]: core.int,
@@ -45018,7 +45862,7 @@
       [_remainingContent]: core.int,
       [_headers]: io._HttpHeaders,
       [_incoming]: io._HttpIncoming,
-      [_socketSubscription]: async.StreamSubscription,
+      [_socketSubscription]: StreamSubscriptionOfListOfint(),
       [_paused]: core.bool,
       [_bodyPaused]: core.bool,
       [_controller$0]: StreamControllerOf_HttpIncoming(),
@@ -45061,7 +45905,7 @@
     names: ['_isTokenChar', '_isValueChar', '_tokenizeFieldValue', '_toLowerCaseByte']
   });
   io._DART_SESSION_ID = "DARTSESSID";
-  const _data$ = Symbol('_data');
+  const _data$0 = Symbol('_data');
   const _lastSeen = Symbol('_lastSeen');
   const _timeoutCallback = Symbol('_timeoutCallback');
   const _prev = Symbol('_prev');
@@ -45071,7 +45915,7 @@
   const _bumpToEnd = Symbol('_bumpToEnd');
   io._HttpSession = class _HttpSession extends core.Object {
     new(sessionManager, id) {
-      this[_data$] = collection.HashMap.new();
+      this[_data$0] = collection.HashMap.new();
       this[_sessionManager] = sessionManager;
       this.id = id;
       this[_lastSeen] = new core.DateTime.now();
@@ -45100,50 +45944,50 @@
       this[_timeoutCallback] = callback;
     }
     containsValue(value) {
-      return this[_data$][dartx.containsValue](value);
+      return this[_data$0][dartx.containsValue](value);
     }
     containsKey(key) {
-      return this[_data$][dartx.containsKey](key);
+      return this[_data$0][dartx.containsKey](key);
     }
     _get(key) {
-      return this[_data$][dartx._get](key);
+      return this[_data$0][dartx._get](key);
     }
     _set(key, value) {
-      this[_data$][dartx._set](key, value);
+      this[_data$0][dartx._set](key, value);
       return value;
     }
     putIfAbsent(key, ifAbsent) {
-      return this[_data$][dartx.putIfAbsent](key, ifAbsent);
+      return this[_data$0][dartx.putIfAbsent](key, ifAbsent);
     }
     addAll(other) {
-      return this[_data$][dartx.addAll](other);
+      return this[_data$0][dartx.addAll](other);
     }
     remove(key) {
-      return this[_data$][dartx.remove](key);
+      return this[_data$0][dartx.remove](key);
     }
     clear() {
-      this[_data$][dartx.clear]();
+      this[_data$0][dartx.clear]();
     }
     forEach(f) {
-      this[_data$][dartx.forEach](f);
+      this[_data$0][dartx.forEach](f);
     }
     get keys() {
-      return this[_data$][dartx.keys];
+      return this[_data$0][dartx.keys];
     }
     get values() {
-      return this[_data$][dartx.values];
+      return this[_data$0][dartx.values];
     }
     get length() {
-      return this[_data$][dartx.length];
+      return this[_data$0][dartx.length];
     }
     get isEmpty() {
-      return this[_data$][dartx.isEmpty];
+      return this[_data$0][dartx.isEmpty];
     }
     get isNotEmpty() {
-      return this[_data$][dartx.isNotEmpty];
+      return this[_data$0][dartx.isNotEmpty];
     }
     toString() {
-      return dart.str`HttpSession id:${this.id} ${this[_data$]}`;
+      return dart.str`HttpSession id:${this.id} ${this[_data$0]}`;
     }
   };
   io._HttpSession[dart.implements] = () => [io.HttpSession];
@@ -45157,7 +46001,7 @@
       [_prev]: io._HttpSession,
       [_next$1]: io._HttpSession,
       id: core.String,
-      [_data$]: core.Map
+      [_data$0]: core.Map
     }),
     getters: () => ({
       lastSeen: dart.definiteFunctionType(core.DateTime, []),
@@ -45328,7 +46172,7 @@
       this.id = io._IOResourceInfo.getNextID();
     }
     get referenceValueMap() {
-      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.String);
+      return dart.map({type: dart.str`@${this.type}`, id: this.id, name: this.name}, core.String, core.Object);
     }
     static getNextID() {
       return (() => {
@@ -45343,7 +46187,7 @@
       type: core.String,
       id: core.int
     }),
-    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    getters: () => ({referenceValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({getNextID: dart.definiteFunctionType(core.int, [])}),
     names: ['getNextID']
   });
@@ -45384,7 +46228,7 @@
       super.new(type);
     }
     get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.String);
+      return dart.map({type: this.type, id: this.id, name: this.name, totalRead: this.totalRead, totalWritten: this.totalWritten, readCount: this.readCount, writeCount: this.writeCount, lastRead: this.lastRead, lastWrite: this.lastWrite}, core.String, core.Object);
     }
   };
   dart.setSignature(io._ReadWriteResourceInfo, {
@@ -45396,7 +46240,7 @@
       lastRead: core.double,
       lastWrite: core.double
     }),
-    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    getters: () => ({fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     methods: () => ({
       addRead: dart.definiteFunctionType(dart.void, [core.int]),
       didRead: dart.definiteFunctionType(dart.void, []),
@@ -45418,7 +46262,7 @@
       io._FileResourceInfo.openFiles[dartx.remove](info.id);
     }
     static getOpenFilesList() {
-      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._FileResourceInfo.openFiles[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _FileResourceInfoToMapOfString$dynamic())));
     }
     static getOpenFiles(func, params) {
       dart.assert(dart.equals(func, 'ext.dart.io.getOpenFiles'));
@@ -45427,8 +46271,7 @@
       return FutureOfServiceExtensionResponse().value(new developer.ServiceExtensionResponse.result(json));
     }
     getFileInfoMap() {
-      let result = this.fullValueMap;
-      return result;
+      return this.fullValueMap;
     }
     static getFileInfoMapByID(func, params) {
       dart.assert(dart.dsend(params, 'containsKey', 'id'));
@@ -45444,7 +46287,7 @@
   dart.setSignature(io._FileResourceInfo, {
     fields: () => ({file: dart.dynamic}),
     getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    methods: () => ({getFileInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({
       FileOpened: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
       FileClosed: dart.definiteFunctionType(dart.dynamic, [io._FileResourceInfo]),
@@ -45471,13 +46314,13 @@
       io._ProcessResourceInfo.ProcessStarted(this);
     }
     get name() {
-      return core.String._check(dart.dload(this.process, _path$));
+      return core.String._check(dart.dload(this.process, _path));
     }
     stopped() {
       io._ProcessResourceInfo.ProcessStopped(this);
     }
     get fullValueMap() {
-      return dart.map({type: this.type, id: this.id, name: this.name, pid: core.String._check(dart.dload(this.process, 'pid')), startedAt: this.startedAt, arguments: core.String._check(dart.dload(this.process, _arguments$0)), workingDirectory: core.String._check(dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory))}, core.String, core.String);
+      return dart.map({type: this.type, id: this.id, name: this.name, pid: dart.dload(this.process, 'pid'), startedAt: this.startedAt, arguments: dart.dload(this.process, _arguments$0), workingDirectory: dart.dload(this.process, _workingDirectory) == null ? '.' : dart.dload(this.process, _workingDirectory)}, core.String, core.Object);
     }
     static ProcessStarted(info) {
       dart.assert(!dart.test(io._ProcessResourceInfo.startedProcesses[dartx.containsKey](info.id)));
@@ -45488,7 +46331,7 @@
       io._ProcessResourceInfo.startedProcesses[dartx.remove](info.id);
     }
     static getStartedProcessesList() {
-      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._ProcessResourceInfo.startedProcesses[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _ProcessResourceInfoToMapOfString$dynamic())));
     }
     static getStartedProcesses(func, params) {
       dart.assert(func == 'ext.dart.io.getProcesses');
@@ -45510,7 +46353,7 @@
     }),
     getters: () => ({
       name: dart.definiteFunctionType(core.String, []),
-      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])
+      fullValueMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])
     }),
     methods: () => ({stopped: dart.definiteFunctionType(dart.void, [])}),
     statics: () => ({
@@ -45550,18 +46393,18 @@
       return dart.str`${dart.dload(dart.dload(this.socket, 'address'), 'host')}:${dart.dload(this.socket, 'port')}${remote}`;
     }
     static getOpenSocketsList() {
-      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$String())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$String())));
+      return ListOfMapOfString$String().from(io._SocketResourceInfo.openSockets[dartx.values][dartx.map](MapOfString$dynamic())(dart.fn(e => e.referenceValueMap, _SocketResourceInfoToMapOfString$dynamic())));
     }
     getSocketInfoMap() {
       let result = this.fullValueMap;
       result[dartx._set]('socketType', dart.test(dart.dload(this.socket, 'isTcp')) ? io._SocketResourceInfo.TCP_STRING : io._SocketResourceInfo.UDP_STRING);
-      result[dartx._set]('listening', core.String._check(dart.dload(this.socket, 'isListening')));
-      result[dartx._set]('host', core.String._check(dart.dload(dart.dload(this.socket, 'address'), 'host')));
-      result[dartx._set]('port', core.String._check(dart.dload(this.socket, 'port')));
+      result[dartx._set]('listening', dart.dload(this.socket, 'isListening'));
+      result[dartx._set]('host', dart.dload(dart.dload(this.socket, 'address'), 'host'));
+      result[dartx._set]('port', dart.dload(this.socket, 'port'));
       if (!dart.test(dart.dload(this.socket, 'isListening'))) {
         try {
-          result[dartx._set]('remoteHost', core.String._check(dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host')));
-          result[dartx._set]('remotePort', core.String._check(dart.dload(this.socket, 'remotePort')));
+          result[dartx._set]('remoteHost', dart.dload(dart.dload(this.socket, 'remoteAddress'), 'host'));
+          result[dartx._set]('remotePort', dart.dload(this.socket, 'remotePort'));
         } catch (e) {
           result[dartx._set]('remotePort', 'NA');
           result[dartx._set]('remoteHost', 'NA');
@@ -45571,7 +46414,7 @@
         result[dartx._set]('remotePort', 'NA');
         result[dartx._set]('remoteHost', 'NA');
       }
-      result[dartx._set]('addressType', core.String._check(dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name')));
+      result[dartx._set]('addressType', dart.dload(dart.dload(dart.dload(this.socket, 'address'), 'type'), 'name'));
       return result;
     }
     static getSocketInfoMapByID(func, params) {
@@ -45599,7 +46442,7 @@
   dart.setSignature(io._SocketResourceInfo, {
     fields: () => ({socket: dart.dynamic}),
     getters: () => ({name: dart.definiteFunctionType(core.String, [])}),
-    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, core.String), [])}),
+    methods: () => ({getSocketInfoMap: dart.definiteFunctionType(core.Map$(core.String, dart.dynamic), [])}),
     statics: () => ({
       getOpenSocketsList: dart.definiteFunctionType(core.Iterable$(core.Map$(core.String, core.String)), []),
       getSocketInfoMapByID: dart.definiteFunctionType(async.Future$(developer.ServiceExtensionResponse), [core.String, MapOfString$String()]),
@@ -45641,33 +46484,36 @@
   io._FILE_TRUNCATE = 10;
   io._FILE_LENGTH = 11;
   io._FILE_LENGTH_FROM_PATH = 12;
-  io._FILE_LAST_MODIFIED = 13;
-  io._FILE_FLUSH = 14;
-  io._FILE_READ_BYTE = 15;
-  io._FILE_WRITE_BYTE = 16;
-  io._FILE_READ = 17;
-  io._FILE_READ_INTO = 18;
-  io._FILE_WRITE_FROM = 19;
-  io._FILE_CREATE_LINK = 20;
-  io._FILE_DELETE_LINK = 21;
-  io._FILE_RENAME_LINK = 22;
-  io._FILE_LINK_TARGET = 23;
-  io._FILE_TYPE = 24;
-  io._FILE_IDENTICAL = 25;
-  io._FILE_STAT = 26;
-  io._FILE_LOCK = 27;
-  io._SOCKET_LOOKUP = 28;
-  io._SOCKET_LIST_INTERFACES = 29;
-  io._SOCKET_REVERSE_LOOKUP = 30;
-  io._DIRECTORY_CREATE = 31;
-  io._DIRECTORY_DELETE = 32;
-  io._DIRECTORY_EXISTS = 33;
-  io._DIRECTORY_CREATE_TEMP = 34;
-  io._DIRECTORY_LIST_START = 35;
-  io._DIRECTORY_LIST_NEXT = 36;
-  io._DIRECTORY_LIST_STOP = 37;
-  io._DIRECTORY_RENAME = 38;
-  io._SSL_PROCESS_FILTER = 39;
+  io._FILE_LAST_ACCESSED = 13;
+  io._FILE_SET_LAST_ACCESSED = 14;
+  io._FILE_LAST_MODIFIED = 15;
+  io._FILE_SET_LAST_MODIFIED = 16;
+  io._FILE_FLUSH = 17;
+  io._FILE_READ_BYTE = 18;
+  io._FILE_WRITE_BYTE = 19;
+  io._FILE_READ = 20;
+  io._FILE_READ_INTO = 21;
+  io._FILE_WRITE_FROM = 22;
+  io._FILE_CREATE_LINK = 23;
+  io._FILE_DELETE_LINK = 24;
+  io._FILE_RENAME_LINK = 25;
+  io._FILE_LINK_TARGET = 26;
+  io._FILE_TYPE = 27;
+  io._FILE_IDENTICAL = 28;
+  io._FILE_STAT = 29;
+  io._FILE_LOCK = 30;
+  io._SOCKET_LOOKUP = 31;
+  io._SOCKET_LIST_INTERFACES = 32;
+  io._SOCKET_REVERSE_LOOKUP = 33;
+  io._DIRECTORY_CREATE = 34;
+  io._DIRECTORY_DELETE = 35;
+  io._DIRECTORY_EXISTS = 36;
+  io._DIRECTORY_CREATE_TEMP = 37;
+  io._DIRECTORY_LIST_START = 38;
+  io._DIRECTORY_LIST_NEXT = 39;
+  io._DIRECTORY_LIST_STOP = 40;
+  io._DIRECTORY_RENAME = 41;
+  io._SSL_PROCESS_FILTER = 42;
   io._IOService = class _IOService extends core.Object {
     static _dispatch(request, data) {
       dart.throw(new core.UnsupportedError("_IOService._dispatch"));
@@ -45707,12 +46553,6 @@
     get absolute() {
       return io.Link.new(this[_absolutePath]);
     }
-    stat() {
-      return io.FileStat.stat(this.path);
-    }
-    statSync() {
-      return io.FileStat.statSync(this.path);
-    }
     create(target, opts) {
       let recursive = opts && 'recursive' in opts ? opts.recursive : false;
       if (dart.test(io.Platform.isWindows)) {
@@ -45836,8 +46676,6 @@
     methods: () => ({
       exists: dart.definiteFunctionType(async.Future$(core.bool), []),
       existsSync: dart.definiteFunctionType(core.bool, []),
-      stat: dart.definiteFunctionType(async.Future$(io.FileStat), []),
-      statSync: dart.definiteFunctionType(io.FileStat, []),
       create: dart.definiteFunctionType(async.Future$(io.Link), [core.String], {recursive: core.bool}),
       createSync: dart.definiteFunctionType(dart.void, [core.String], {recursive: core.bool}),
       [_makeWindowsLinkTarget]: dart.definiteFunctionType(core.String, [core.String]),
@@ -45923,6 +46761,9 @@
     },
     get isIOS() {
       return io.Platform._operatingSystem == "ios";
+    },
+    get isFuchsia() {
+      return io.Platform._operatingSystem == "fuchsia";
     }
   });
   io._Platform = class _Platform extends core.Object {
@@ -45984,14 +46825,17 @@
         let env = io._Platform._environment();
         if (!io.OSError.is(env)) {
           let isWindows = io._Platform.operatingSystem == 'windows';
-          let result = isWindows ? new io._CaseInsensitiveStringMap() : core.Map.new();
+          let result = isWindows ? new (_CaseInsensitiveStringMapOfString())() : MapOfString$String().new();
           for (let str of core.Iterable._check(env)) {
+            if (str == null) {
+              continue;
+            }
             let equalsIndex = dart.dsend(str, 'indexOf', '=');
             if (dart.test(dart.dsend(equalsIndex, '>', 0))) {
-              result[dartx._set](dart.dsend(str, 'substring', 0, equalsIndex), dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1)));
+              result[dartx._set](core.String._check(dart.dsend(str, 'substring', 0, equalsIndex)), core.String._check(dart.dsend(str, 'substring', dart.dsend(equalsIndex, '+', 1))));
             }
           }
-          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(MapOfString$String()._check(result));
+          io._Platform._environmentCache = new (UnmodifiableMapViewOfString$String())(result);
         } else {
           io._Platform._environmentCache = env;
         }
@@ -45999,7 +46843,7 @@
       if (io.OSError.is(io._Platform._environmentCache)) {
         dart.throw(io._Platform._environmentCache);
       } else {
-        return MapOfString$String()._check(io._Platform._environmentCache);
+        return MapOfString$String().as(io._Platform._environmentCache);
       }
     }
     static get version() {
@@ -46047,6 +46891,7 @@
     let MapOfString$V = () => (MapOfString$V = dart.constFn(core.Map$(core.String, V)))();
     let VoidToV = () => (VoidToV = dart.constFn(dart.functionType(V, [])))();
     let StringAndVTovoid = () => (StringAndVTovoid = dart.constFn(dart.functionType(dart.void, [core.String, V])))();
+    let StringAndVToV = () => (StringAndVToV = dart.constFn(dart.definiteFunctionType(V, [core.String, V])))();
     class _CaseInsensitiveStringMap extends core.Object {
       new() {
         this[_map$1] = MapOfString$V().new();
@@ -46070,7 +46915,8 @@
         return this[_map$1][dartx.putIfAbsent](key[dartx.toUpperCase](), ifAbsent);
       }
       addAll(other) {
-        other[dartx.forEach](dart.fn((key, value) => this._set(core.String._check(dart.dsend(key, 'toUpperCase')), V._check(value)), dynamicAnddynamicTovoid$()));
+        MapOfString$V()._check(other);
+        other[dartx.forEach](dart.fn((key, value) => this._set(key[dartx.toUpperCase](), value), StringAndVToV()));
       }
       remove(key) {
         return typeof key == 'string' ? this[_map$1][dartx.remove](key[dartx.toUpperCase]()) : null;
@@ -46117,7 +46963,7 @@
         _get: dart.definiteFunctionType(V, [core.Object]),
         _set: dart.definiteFunctionType(dart.void, [core.String, V]),
         putIfAbsent: dart.definiteFunctionType(V, [core.String, VoidToV()]),
-        addAll: dart.definiteFunctionType(dart.void, [core.Map]),
+        addAll: dart.definiteFunctionType(dart.void, [MapOfString$V()]),
         remove: dart.definiteFunctionType(V, [core.Object]),
         clear: dart.definiteFunctionType(dart.void, []),
         forEach: dart.definiteFunctionType(dart.void, [StringAndVTovoid()])
@@ -46225,9 +47071,6 @@
     'DETACHED_WITH_STDIO'
   ]);
   io.Process = class Process extends core.Object {
-    new() {
-      this.exitCode = null;
-    }
     static start(executable, arguments$, opts) {
       let workingDirectory = opts && 'workingDirectory' in opts ? opts.workingDirectory : null;
       let environment = opts && 'environment' in opts ? opts.environment : null;
@@ -46260,7 +47103,6 @@
     }
   };
   dart.setSignature(io.Process, {
-    fields: () => ({exitCode: FutureOfint()}),
     statics: () => ({
       start: dart.definiteFunctionType(async.Future$(io.Process), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, mode: io.ProcessStartMode}),
       run: dart.definiteFunctionType(async.Future$(io.ProcessResult), [core.String, ListOfString()], {workingDirectory: core.String, environment: MapOfString$String(), includeParentEnvironment: core.bool, runInShell: core.bool, stdoutEncoding: convert.Encoding, stderrEncoding: convert.Encoding}),
@@ -46456,22 +47298,14 @@
       let host = opts && 'host' in opts ? opts.host : null;
       let context = opts && 'context' in opts ? opts.context : null;
       let onBadCertificate = opts && 'onBadCertificate' in opts ? opts.onBadCertificate : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket._check(dart.dindex(detachedRaw, 0)), {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
+      return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secure(io.RawSocket.as(dart.dindex(detachedRaw, 0)), {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), host: host, context: context, onBadCertificate: onBadCertificate}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
     }
     static secureServer(socket, context, opts) {
       let bufferedData = opts && 'bufferedData' in opts ? opts.bufferedData : null;
       let requestClientCertificate = opts && 'requestClientCertificate' in opts ? opts.requestClientCertificate : false;
       let requireClientCertificate = opts && 'requireClientCertificate' in opts ? opts.requireClientCertificate : false;
       let supportedProtocols = opts && 'supportedProtocols' in opts ? opts.supportedProtocols : null;
-      let completer = async.Completer.new();
-      dart.dsend(dart.dsend(dart.dsend(socket, _detachRaw), 'then', dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket._check(dart.dindex(detachedRaw, 0)), context, {subscription: async.StreamSubscription._check(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())), 'then', dart.fn(raw => {
-        completer.complete(io.SecureSocket._(io.RawSecureSocket._check(raw)));
-      }, dynamicToNull$()));
-      return FutureOfSecureSocket()._check(completer.future);
+      return async.Future.as(dart.dsend(socket, _detachRaw)).then(io.RawSecureSocket)(dart.fn(detachedRaw => io.RawSecureSocket.secureServer(io.RawSocket.as(dart.dindex(detachedRaw, 0)), context, {subscription: StreamSubscriptionOfRawSocketEvent().as(dart.dindex(detachedRaw, 1)), bufferedData: bufferedData, requestClientCertificate: requestClientCertificate, requireClientCertificate: requireClientCertificate, supportedProtocols: supportedProtocols}), dynamicToFutureOfRawSecureSocket())).then(io.SecureSocket)(dart.fn(raw => io.SecureSocket._(raw), RawSecureSocketToSecureSocket()));
     }
   };
   io.SecureSocket[dart.implements] = () => [io.Socket];
@@ -46567,8 +47401,8 @@
   dart.setSignature(io.RawSecureSocket, {
     statics: () => ({
       connect: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [dart.dynamic, core.int], {context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: async.StreamSubscription, host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
-      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
+      secure: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket], {subscription: StreamSubscriptionOfRawSocketEvent(), host: dart.dynamic, context: io.SecurityContext, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+      secureServer: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), [io.RawSocket, io.SecurityContext], {subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, supportedProtocols: ListOfString()})
     }),
     names: ['connect', 'secure', 'secureServer']
   });
@@ -46739,13 +47573,13 @@
   const _pushAllFilterStages = Symbol('_pushAllFilterStages');
   const _readSocketOrBufferedData = Symbol('_readSocketOrBufferedData');
   const _sendReadEvent = Symbol('_sendReadEvent');
-  let const$75;
+  let const$78;
   io.RawSocketEvent = class RawSocketEvent extends core.Object {
     _(value) {
       this[_value$1] = value;
     }
     toString() {
-      return (const$75 || (const$75 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
+      return (const$78 || (const$78 = dart.constList(['RawSocketEvent:READ', 'RawSocketEvent:WRITE', 'RawSocketEvent:READ_CLOSED', 'RawSocketEvent:CLOSED'], core.String)))[dartx._get](this[_value$1]);
     }
   };
   dart.defineNamedConstructor(io.RawSocketEvent, '_');
@@ -46786,12 +47620,12 @@
       if (host != null) {
         address = io.InternetAddress._cloneWithNewHost(address, core.String._check(host));
       }
-      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, StreamSubscriptionOfRawSocketEvent()._check(subscription), bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
+      return new io._RawSecureSocket(address, requestedPort, is_server, context, socket, subscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols)[_handshakeComplete].future;
     }
     new(address, requestedPort, is_server, context, socket, socketSubscription, bufferedData, requestClientCertificate, requireClientCertificate, onBadCertificate, supportedProtocols) {
       this[_handshakeComplete] = CompleterOf_RawSecureSocket().new();
       this[_status] = io._RawSecureSocket.HANDSHAKE;
-      this[_closeCompleter] = async.Completer.new();
+      this[_closeCompleter] = CompleterOfRawSecureSocket().new();
       this[_filterStatus] = new io._FilterStatus();
       this[_secureFilter] = io._SecureFilter.new();
       this.address = address;
@@ -46901,7 +47735,7 @@
     }
     close() {
       this.shutdown(io.SocketDirection.BOTH);
-      return FutureOfRawSecureSocket()._check(this[_closeCompleter].future);
+      return this[_closeCompleter].future;
     }
     [_completeCloseCompleter](dummy) {
       if (dummy === void 0) dummy = null;
@@ -47347,7 +48181,7 @@
       [_socketClosedWrite]: core.bool,
       [_closedRead]: core.bool,
       [_closedWrite]: core.bool,
-      [_closeCompleter]: async.Completer,
+      [_closeCompleter]: CompleterOfRawSecureSocket(),
       [_filterStatus]: io._FilterStatus,
       [_connectPending]: core.bool,
       [_filterPending]: core.bool,
@@ -47373,7 +48207,7 @@
       listen: dart.definiteFunctionType(async.StreamSubscription$(io.RawSocketEvent), [RawSocketEventTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       available: dart.definiteFunctionType(core.int, []),
       close: dart.definiteFunctionType(async.Future$(io.RawSecureSocket), []),
-      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [dart.dynamic]),
+      [_completeCloseCompleter]: dart.definiteFunctionType(dart.void, [], [io.RawSocket]),
       [_close$0]: dart.definiteFunctionType(dart.void, []),
       shutdown: dart.definiteFunctionType(dart.void, [io.SocketDirection]),
       read: dart.definiteFunctionType(core.List$(core.int), [], [core.int]),
@@ -47403,7 +48237,7 @@
     }),
     statics: () => ({
       _isBufferEncrypted: dart.definiteFunctionType(core.bool, [core.int]),
-      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: async.StreamSubscription, bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
+      connect: dart.definiteFunctionType(async.Future$(io._RawSecureSocket), [dart.dynamic, core.int], {is_server: core.bool, context: io.SecurityContext, socket: io.RawSocket, subscription: StreamSubscriptionOfRawSocketEvent(), bufferedData: ListOfint(), requestClientCertificate: core.bool, requireClientCertificate: core.bool, onBadCertificate: X509CertificateTobool(), supportedProtocols: ListOfString()}),
       _verifyFields: dart.definiteFunctionType(dart.void, [dart.dynamic, core.int, core.bool, core.bool, core.bool, core.Function])
     }),
     names: ['_isBufferEncrypted', 'connect', '_verifyFields']
@@ -47509,7 +48343,7 @@
       while (true) {
         let toWrite = this.linearLength;
         if (toWrite == 0) return false;
-        let bytes = socket.write(ListOfint()._check(this.data), this.start, toWrite);
+        let bytes = socket.write(this.data, this.start, toWrite);
         this.advanceStart(bytes);
         if (dart.notNull(bytes) < dart.notNull(toWrite)) {
           return true;
@@ -47519,7 +48353,7 @@
   };
   dart.setSignature(io._ExternalBuffer, {
     fields: () => ({
-      data: core.List,
+      data: ListOfint(),
       start: core.int,
       end: core.int,
       size: dart.dynamic
@@ -47983,7 +48817,7 @@
       let retainNewlines = opts && 'retainNewlines' in opts ? opts.retainNewlines : false;
       let CR = 13;
       let LF = 10;
-      let line = [];
+      let line = JSArrayOfint().of([]);
       let crIsNewline = dart.test(io.Platform.isWindows) && dart.equals(io.stdioType(io.stdin), io.StdioType.TERMINAL) && !dart.test(/* Unimplemented unknown name */lineMode);
       if (dart.test(retainNewlines)) {
         let byte = null;
@@ -48026,7 +48860,7 @@
             line[dartx.add](byte);
           }
       }
-      return encoding.decode(ListOfint()._check(line));
+      return encoding.decode(line);
     }
     set echoMode(enabled) {
       dart.throw(new core.UnsupportedError("Stdin.echoMode"));
@@ -48063,9 +48897,11 @@
   const _hasTerminal = Symbol('_hasTerminal');
   const _terminalColumns = Symbol('_terminalColumns');
   const _terminalLines = Symbol('_terminalLines');
-  io._StdSink = class _StdSink extends core.Object {
-    new(sink) {
+  const _isTranslatable = Symbol('_isTranslatable');
+  io._StdSinkHelper = class _StdSinkHelper extends core.Object {
+    new(sink, isTranslatable) {
       this[_sink$0] = sink;
+      this[_isTranslatable] = isTranslatable;
     }
     get encoding() {
       return this[_sink$0].encoding;
@@ -48073,18 +48909,29 @@
     set encoding(encoding) {
       this[_sink$0].encoding = encoding;
     }
+    set [_translation](t) {
+      if (dart.test(this[_isTranslatable])) {
+        let sink = io._IOSinkImpl._check(this[_sink$0]);
+        let target = io._StdConsumer._check(sink[_target$]);
+        dart.dput(target[_file], 'translation', t);
+      }
+    }
     write(object) {
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].write(object);
     }
     writeln(object) {
       if (object === void 0) object = "";
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeln(object);
     }
     writeAll(objects, sep) {
       if (sep === void 0) sep = "";
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeAll(objects, sep);
     }
     add(data) {
+      this[_translation] = io._FileTranslation.binary;
       this[_sink$0].add(data);
     }
     addError(error, stackTrace) {
@@ -48092,9 +48939,11 @@
       this[_sink$0].addError(error, stackTrace);
     }
     writeCharCode(charCode) {
+      this[_translation] = io._FileTranslation.text;
       this[_sink$0].writeCharCode(charCode);
     }
     addStream(stream) {
+      this[_translation] = io._FileTranslation.binary;
       return this[_sink$0].addStream(stream);
     }
     flush() {
@@ -48107,14 +48956,20 @@
       return this[_sink$0].done;
     }
   };
-  io._StdSink[dart.implements] = () => [io.IOSink];
-  dart.setSignature(io._StdSink, {
-    fields: () => ({[_sink$0]: io.IOSink}),
+  io._StdSinkHelper[dart.implements] = () => [io.IOSink];
+  dart.setSignature(io._StdSinkHelper, {
+    fields: () => ({
+      [_sink$0]: io.IOSink,
+      [_isTranslatable]: core.bool
+    }),
     getters: () => ({
       encoding: dart.definiteFunctionType(convert.Encoding, []),
       done: dart.definiteFunctionType(async.Future, [])
     }),
-    setters: () => ({encoding: dart.definiteFunctionType(dart.void, [convert.Encoding])}),
+    setters: () => ({
+      encoding: dart.definiteFunctionType(dart.void, [convert.Encoding]),
+      [_translation]: dart.definiteFunctionType(dart.void, [io._FileTranslation])
+    }),
     methods: () => ({
       write: dart.definiteFunctionType(dart.void, [core.Object]),
       writeln: dart.definiteFunctionType(dart.void, [], [core.Object]),
@@ -48127,7 +48982,12 @@
       close: dart.definiteFunctionType(async.Future, [])
     })
   });
-  io.Stdout = class Stdout extends io._StdSink {
+  io._StdFileSink = class _StdFileSink extends io._StdSinkHelper {
+    new(sink) {
+      super.new(sink, true);
+    }
+  };
+  io.Stdout = class Stdout extends io._StdFileSink {
     _(sink, fd) {
       this[_fd] = fd;
       this[_nonBlocking] = null;
@@ -48194,6 +49054,23 @@
       osError: io.OSError
     })
   });
+  io.StdinException = class StdinException extends core.Object {
+    new(message, osError) {
+      if (osError === void 0) osError = null;
+      this.message = message;
+      this.osError = osError;
+    }
+    toString() {
+      return dart.str`StdinException: ${this.message}${this.osError == null ? "" : dart.str`, ${this.osError}`}`;
+    }
+  };
+  io.StdinException[dart.implements] = () => [io.IOException];
+  dart.setSignature(io.StdinException, {
+    fields: () => ({
+      message: core.String,
+      osError: io.OSError
+    })
+  });
   io._StdConsumer = class _StdConsumer extends core.Object {
     new(fd) {
       this[_file] = io._File._openStdioSync(fd);
@@ -48226,6 +49103,11 @@
       close: dart.definiteFunctionType(async.Future, [])
     })
   });
+  io._StdSocketSink = class _StdSocketSink extends io._StdSinkHelper {
+    new(sink) {
+      super.new(sink, false);
+    }
+  };
   io.StdioType = class StdioType extends core.Object {
     _(name) {
       this.name = name;
@@ -48354,10 +49236,10 @@
     }),
     names: ['_getStdioOutputStream', '_getStdioInputStream', '_socketType', '_getStdioHandleType']
   });
-  let const$76;
-  let const$77;
-  let const$78;
   let const$79;
+  let const$80;
+  let const$81;
+  let const$82;
   io.SystemEncoding = class SystemEncoding extends convert.Encoding {
     new() {
       super.new();
@@ -48373,16 +49255,16 @@
     }
     get encoder() {
       if (io.Platform.operatingSystem == "windows") {
-        return const$76 || (const$76 = dart.const(new io._WindowsCodePageEncoder()));
+        return const$79 || (const$79 = dart.const(new io._WindowsCodePageEncoder()));
       } else {
-        return const$77 || (const$77 = dart.const(new convert.Utf8Encoder()));
+        return const$80 || (const$80 = dart.const(new convert.Utf8Encoder()));
       }
     }
     get decoder() {
       if (io.Platform.operatingSystem == "windows") {
-        return const$78 || (const$78 = dart.const(new io._WindowsCodePageDecoder()));
+        return const$81 || (const$81 = dart.const(new io._WindowsCodePageDecoder()));
       } else {
-        return const$79 || (const$79 = dart.const(new convert.Utf8Decoder()));
+        return const$82 || (const$82 = dart.const(new convert.Utf8Decoder()));
       }
     }
   };
@@ -48413,6 +49295,7 @@
     }
   };
   dart.addSimpleTypeTests(io._WindowsCodePageEncoder);
+  io._WindowsCodePageEncoder[dart.implements] = () => [ChunkedConverterOfString$ListOfint$String$ListOfint()];
   dart.setSignature(io._WindowsCodePageEncoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.List$(core.int), [core.String]),
@@ -48465,6 +49348,7 @@
     }
   };
   dart.addSimpleTypeTests(io._WindowsCodePageDecoder);
+  io._WindowsCodePageDecoder[dart.implements] = () => [ChunkedConverterOfListOfint$String$ListOfint$String()];
   dart.setSignature(io._WindowsCodePageDecoder, {
     methods: () => ({
       convert: dart.definiteFunctionType(core.String, [ListOfint()]),
@@ -48693,6 +49577,14 @@
   io._WebSocketOpcode.RESERVED_D = 13;
   io._WebSocketOpcode.RESERVED_E = 14;
   io._WebSocketOpcode.RESERVED_F = 15;
+  io._EncodedString = class _EncodedString extends core.Object {
+    new(bytes) {
+      this.bytes = bytes;
+    }
+  };
+  dart.setSignature(io._EncodedString, {
+    fields: () => ({bytes: ListOfint()})
+  });
   io._CompressionMaxWindowBits = class _CompressionMaxWindowBits extends core.Object {
     new(headerValue, maxWindowBits) {
       if (headerValue === void 0) headerValue = null;
@@ -49032,7 +49924,7 @@
       this[_unmaskingIndex] = 0;
     }
   };
-  io._WebSocketProtocolTransformer[dart.implements] = () => [StreamTransformerOfListOfint$dynamic(), EventSinkOfUint8List()];
+  io._WebSocketProtocolTransformer[dart.implements] = () => [EventSinkOfListOfint(), StreamTransformerOfListOfint$dynamic()];
   dart.setSignature(io._WebSocketProtocolTransformer, {
     fields: () => ({
       [_state$1]: core.int,
@@ -49055,7 +49947,7 @@
       [_deflate]: io._WebSocketPerMessageDeflate
     }),
     methods: () => ({
-      bind: dart.definiteFunctionType(async.Stream, [async.Stream]),
+      bind: dart.definiteFunctionType(async.Stream, [StreamOfListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [core.Object], [core.StackTrace]),
       close: dart.definiteFunctionType(dart.void, []),
       add: dart.definiteFunctionType(dart.void, [ListOfint()]),
@@ -49099,6 +49991,7 @@
   dart.setSignature(io._WebSocketPong, {
     fields: () => ({payload: ListOfint()})
   });
+  io._ProtocolSelector = dart.typedef('_ProtocolSelector', () => dart.functionType(dart.dynamic, [ListOfString()]));
   const _protocolSelector = Symbol('_protocolSelector');
   const _compression = Symbol('_compression');
   io._WebSocketTransformerImpl = class _WebSocketTransformerImpl extends core.Object {
@@ -49136,24 +50029,24 @@
         }
         let deflate = io._WebSocketTransformerImpl._negotiateCompression(request, response, compression);
         response.headers.contentLength = 0;
-        return response.detachSocket().then(io._WebSocketImpl)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
+        return response.detachSocket().then(io.WebSocket)(dart.fn(socket => new io._WebSocketImpl._fromSocket(socket, protocol, compression, true, deflate), SocketTo_WebSocketImpl()));
       }
-      dart.fn(upgrade, StringToFuture());
+      dart.fn(upgrade, StringToFutureOfWebSocket());
       let protocols = request.headers._get('Sec-WebSocket-Protocol');
       if (protocols != null && _protocolSelector != null) {
         protocols = io._HttpParser._tokenizeFieldValue(protocols[dartx.join](', '));
-        return async.Future.new(dart.fn(() => dart.dcall(_protocolSelector, protocols), VoidTodynamic$())).then(dart.dynamic)(dart.fn(protocol => {
-          if (dart.notNull(protocols[dartx.indexOf](core.String._check(protocol))) < 0) {
+        return FutureOfString().new(dart.fn(() => _protocolSelector(protocols), VoidTodynamic$())).then(core.String)(dart.fn(protocol => {
+          if (dart.notNull(protocols[dartx.indexOf](protocol)) < 0) {
             dart.throw(new io.WebSocketException("Selected protocol is not in the list of available protocols"));
           }
           return protocol;
-        }, dynamicTodynamic$())).catchError(dart.fn(error => {
+        }, StringToString$())).catchError(dart.fn(error => {
           response.statusCode = io.HttpStatus.INTERNAL_SERVER_ERROR;
           response.close();
           dart.throw(error);
         }, dynamicToNull$())).then(io.WebSocket)(upgrade);
       } else {
-        return FutureOfWebSocket()._check(upgrade(null));
+        return upgrade(null);
       }
     }
     static _negotiateCompression(request, response, compression) {
@@ -49202,12 +50095,12 @@
   dart.setSignature(io._WebSocketTransformerImpl, {
     fields: () => ({
       [_controller$0]: StreamControllerOfWebSocket(),
-      [_protocolSelector]: core.Function,
+      [_protocolSelector]: io._ProtocolSelector,
       [_compression]: io.CompressionOptions
     }),
     methods: () => ({bind: dart.definiteFunctionType(async.Stream$(io.WebSocket), [StreamOfHttpRequest()])}),
     statics: () => ({
-      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, dart.dynamic, io.CompressionOptions]),
+      _upgrade: dart.definiteFunctionType(async.Future$(io.WebSocket), [io.HttpRequest, io._ProtocolSelector, io.CompressionOptions]),
       _negotiateCompression: dart.definiteFunctionType(io._WebSocketPerMessageDeflate, [io.HttpRequest, io.HttpResponse, io.CompressionOptions]),
       _isUpgradeRequest: dart.definiteFunctionType(core.bool, [io.HttpRequest])
     }),
@@ -49215,7 +50108,7 @@
   });
   const _ensureDecoder = Symbol('_ensureDecoder');
   const _ensureEncoder = Symbol('_ensureEncoder');
-  let const$80;
+  let const$83;
   io._WebSocketPerMessageDeflate = class _WebSocketPerMessageDeflate extends core.Object {
     new(opts) {
       let clientMaxWindowBits = opts && 'clientMaxWindowBits' in opts ? opts.clientMaxWindowBits : io._WebSocketImpl.DEFAULT_WINDOW_BITS;
@@ -49243,25 +50136,24 @@
     }
     processIncomingMessage(msg) {
       this[_ensureDecoder]();
-      let data = [];
+      let data = JSArrayOfint().of([]);
       data[dartx.addAll](msg);
-      data[dartx.addAll](const$80 || (const$80 = dart.constList([0, 0, 255, 255], core.int)));
-      this.decoder.process(ListOfint()._check(data), 0, data[dartx.length]);
-      let result = [];
+      data[dartx.addAll](const$83 || (const$83 = dart.constList([0, 0, 255, 255], core.int)));
+      this.decoder.process(data, 0, data[dartx.length]);
+      let result = JSArrayOfint().of([]);
       let out = null;
       while ((out = this.decoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
+        result[dartx.addAll](out);
       }
       if (dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || !dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
         this.decoder = null;
       }
-      return typed_data.Uint8List.fromList(ListOfint()._check(result));
+      return typed_data.Uint8List.fromList(result);
     }
     processOutgoingMessage(msg) {
       this[_ensureEncoder]();
-      let result = [];
+      let result = JSArrayOfint().of([]);
       let buffer = null;
-      let out = null;
       if (!typed_data.Uint8List.is(msg)) {
         for (let i = 0; i < dart.notNull(msg[dartx.length]); i++) {
           if (dart.notNull(msg[dartx._get](i)) < 0 || 255 < dart.notNull(msg[dartx._get](i))) {
@@ -49273,8 +50165,9 @@
         buffer = typed_data.Uint8List._check(msg);
       }
       this.encoder.process(buffer, 0, buffer[dartx.length]);
+      let out = null;
       while ((out = this.encoder.processed()) != null) {
-        result[dartx.addAll](core.Iterable._check(out));
+        result[dartx.addAll](out);
       }
       if (!dart.test(this.serverSide) && dart.test(this.clientNoContextTakeover) || dart.test(this.serverSide) && dart.test(this.serverNoContextTakeover)) {
         this.encoder = null;
@@ -49282,7 +50175,7 @@
       if (dart.notNull(result[dartx.length]) > 4) {
         result = result[dartx.sublist](0, dart.notNull(result[dartx.length]) - 4);
       }
-      return ListOfint()._check(result);
+      return result;
     }
   };
   dart.setSignature(io._WebSocketPerMessageDeflate, {
@@ -49336,13 +50229,14 @@
         if (typeof message == 'string') {
           opcode = io._WebSocketOpcode.TEXT;
           data = convert.UTF8.encode(message);
+        } else if (ListOfint().is(message)) {
+          opcode = io._WebSocketOpcode.BINARY;
+          data = message;
+        } else if (io._EncodedString.is(message)) {
+          opcode = io._WebSocketOpcode.TEXT;
+          data = message.bytes;
         } else {
-          if (ListOfint().is(message)) {
-            data = message;
-            opcode = io._WebSocketOpcode.BINARY;
-          } else {
-            dart.throw(new core.ArgumentError(message));
-          }
+          dart.throw(new core.ArgumentError(message));
         }
         if (this[_deflateHelper] != null) {
           data = this[_deflateHelper].processOutgoingMessage(data);
@@ -49372,7 +50266,7 @@
       this[_eventSink$].close();
     }
     addFrame(opcode, data) {
-      return io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
+      io._WebSocketOutgoingTransformer.createFrame(opcode, data, this.webSocket[_serverSide], this[_deflateHelper] != null && (opcode == io._WebSocketOpcode.TEXT || opcode == io._WebSocketOpcode.BINARY))[dartx.forEach](dart.fn(e => {
         this[_eventSink$].add(e);
       }, ListOfintToNull()));
     }
@@ -49564,7 +50458,7 @@
       this[_ensureController]();
       const closeSocket = (function() {
         return this.socket.close().catchError(dart.fn(_ => {
-        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, dynamicTo_WebSocketImpl()));
+        }, dynamicToNull$())).then(io._WebSocketImpl)(dart.fn(_ => this.webSocket, SocketTo_WebSocketImpl()));
       }).bind(this);
       dart.fn(closeSocket, VoidToFuture());
       this[_controller$0].close();
@@ -49614,7 +50508,7 @@
   const _pingTimer = Symbol('_pingTimer');
   const _consumer = Symbol('_consumer');
   const _closeTimer = Symbol('_closeTimer');
-  let const$81;
+  let const$84;
   io._WebSocketImpl = class _WebSocketImpl extends dart.mixin(async.Stream, io._ServiceObject) {
     static connect(url, protocols, headers, opts) {
       let compression = opts && 'compression' in opts ? opts.compression : io.CompressionOptions.DEFAULT;
@@ -49811,6 +50705,12 @@
     add(data) {
       this[_sink$0].add(data);
     }
+    addUtf8Text(bytes) {
+      if (!ListOfint().is(bytes)) {
+        dart.throw(new core.ArgumentError.value(bytes, "bytes", "Is not a list of bytes"));
+      }
+      this[_sink$0].add(new io._EncodedString(bytes));
+    }
     addError(error, stackTrace) {
       if (stackTrace === void 0) stackTrace = null;
       this[_sink$0].addError(error, stackTrace);
@@ -49836,7 +50736,7 @@
           this[_controller$0].stream.drain(dart.dynamic)().catchError(dart.fn(_ => dart.map(), dynamicToMap()));
         }
         if (this[_closeTimer] == null) {
-          this[_closeTimer] = async.Timer.new(const$81 || (const$81 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
+          this[_closeTimer] = async.Timer.new(const$84 || (const$84 = dart.const(new core.Duration({seconds: 5}))), dart.fn(() => {
             this[_closeCode] = this[_outCloseCode];
             this[_closeReason] = this[_outCloseReason];
             if (this[_subscription$] != null) this[_subscription$].cancel();
@@ -49920,6 +50820,7 @@
     methods: () => ({
       listen: dart.definiteFunctionType(async.StreamSubscription, [dynamicTovoid()], {onError: core.Function, onDone: VoidTovoid(), cancelOnError: core.bool}),
       add: dart.definiteFunctionType(dart.void, [dart.dynamic]),
+      addUtf8Text: dart.definiteFunctionType(dart.void, [ListOfint()]),
       addError: dart.definiteFunctionType(dart.void, [dart.dynamic], [core.StackTrace]),
       addStream: dart.definiteFunctionType(async.Future, [async.Stream]),
       close: dart.definiteFunctionType(async.Future, [], [core.int, core.String]),
@@ -49944,7 +50845,7 @@
       return io.HttpClient.new();
     }
   });
-  isolate.IsolateSpawnException = class IsolateSpawnException extends core.Object {
+  isolate$.IsolateSpawnException = class IsolateSpawnException extends core.Object {
     new(message) {
       this.message = message;
     }
@@ -49952,12 +50853,12 @@
       return dart.str`IsolateSpawnException: ${this.message}`;
     }
   };
-  isolate.IsolateSpawnException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate.IsolateSpawnException, {
+  isolate$.IsolateSpawnException[dart.implements] = () => [core.Exception];
+  dart.setSignature(isolate$.IsolateSpawnException, {
     fields: () => ({message: core.String})
   });
   const _pause = Symbol('_pause');
-  isolate.Isolate = class Isolate extends core.Object {
+  isolate$.Isolate = class Isolate extends core.Object {
     new(controlPort, opts) {
       let pauseCapability = opts && 'pauseCapability' in opts ? opts.pauseCapability : null;
       let terminateCapability = opts && 'terminateCapability' in opts ? opts.terminateCapability : null;
@@ -49966,12 +50867,48 @@
       this.terminateCapability = terminateCapability;
     }
     static get current() {
-      return isolate.Isolate._currentIsolateCache;
+      return isolate$.Isolate._currentIsolateCache;
+    }
+    static get packageRoot() {
+      dart.throw(new core.UnsupportedError("Isolate.packageRoot"));
+    }
+    static get packageConfig() {
+      dart.throw(new core.UnsupportedError("Isolate.packageConfig"));
+    }
+    static resolvePackageUri(packageUri) {
+      return dart.async(function*(packageUri) {
+        if (packageUri.scheme != 'package') return packageUri;
+        return isolate$.Isolate._packageBase.resolveUri(packageUri.replace({scheme: ''}));
+      }, core.Uri, packageUri);
     }
     static spawn(entryPoint, message, opts) {
       let paused = opts && 'paused' in opts ? opts.paused : false;
+      let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+      let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let forcePause = errorsAreFatal != null || onExit != null || onError != null;
       try {
-        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+        if (!isolate$._UnaryFunction.is(entryPoint)) {
+          dart.throw(new core.ArgumentError(entryPoint));
+        }
+        return _isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+          let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+          if (forcePause) {
+            if (errorsAreFatal != null) {
+              isolate.setErrorsFatal(errorsAreFatal);
+            }
+            if (onExit != null) {
+              isolate.addOnExitListener(onExit);
+            }
+            if (onError != null) {
+              isolate.addErrorListener(onError);
+            }
+            if (!dart.test(paused)) {
+              isolate.resume(isolate.pauseCapability);
+            }
+          }
+          return isolate;
+        }, ListToIsolate()));
       } catch (e) {
         let st = dart.stackTrace(e);
         return FutureOfIsolate().error(e, st);
@@ -49980,10 +50917,20 @@
     }
     static spawnUri(uri, args, message, opts) {
       let paused = opts && 'paused' in opts ? opts.paused : false;
+      let onExit = opts && 'onExit' in opts ? opts.onExit : null;
+      let onError = opts && 'onError' in opts ? opts.onError : null;
+      let errorsAreFatal = opts && 'errorsAreFatal' in opts ? opts.errorsAreFatal : null;
+      let checked = opts && 'checked' in opts ? opts.checked : null;
+      let environment = opts && 'environment' in opts ? opts.environment : null;
       let packageRoot = opts && 'packageRoot' in opts ? opts.packageRoot : null;
+      let packageConfig = opts && 'packageConfig' in opts ? opts.packageConfig : null;
+      let automaticPackageResolution = opts && 'automaticPackageResolution' in opts ? opts.automaticPackageResolution : false;
+      if (environment != null) dart.throw(new core.UnimplementedError("environment"));
       if (packageRoot != null) dart.throw(new core.UnimplementedError("packageRoot"));
+      if (packageConfig != null) dart.throw(new core.UnimplementedError("packageConfig"));
+      let forcePause = errorsAreFatal != null || onExit != null || onError != null;
       try {
-        if (core.List.is(args)) {
+        if (ListOfString().is(args)) {
           for (let i = 0; i < dart.notNull(args[dartx.length]); i++) {
             if (!(typeof args[dartx._get](i) == 'string')) {
               dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
@@ -49992,7 +50939,24 @@
         } else if (args != null) {
           dart.throw(new core.ArgumentError(dart.str`Args must be a list of Strings ${args}`));
         }
-        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(isolate.Isolate)(dart.fn(msg => new isolate.Isolate(isolate.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate.Capability._check(msg[dartx._get](2)), terminateCapability: isolate.Capability._check(msg[dartx._get](3))}), ListToIsolate()));
+        return _isolate_helper.IsolateNatives.spawnUri(uri, args, message, dart.test(paused) || forcePause).then(isolate$.Isolate)(dart.fn(msg => {
+          let isolate = new isolate$.Isolate(isolate$.SendPort._check(msg[dartx._get](1)), {pauseCapability: isolate$.Capability._check(msg[dartx._get](2)), terminateCapability: isolate$.Capability._check(msg[dartx._get](3))});
+          if (forcePause) {
+            if (errorsAreFatal != null) {
+              isolate.setErrorsFatal(errorsAreFatal);
+            }
+            if (onExit != null) {
+              isolate.addOnExitListener(onExit);
+            }
+            if (onError != null) {
+              isolate.addErrorListener(onError);
+            }
+            if (!dart.test(paused)) {
+              isolate.resume(isolate.pauseCapability);
+            }
+          }
+          return isolate;
+        }, ListToIsolate()));
       } catch (e) {
         let st = dart.stackTrace(e);
         return FutureOfIsolate().error(e, st);
@@ -50001,7 +50965,8 @@
     }
     pause(resumeCapability) {
       if (resumeCapability === void 0) resumeCapability = null;
-      if (resumeCapability == null) resumeCapability = isolate.Capability.new();
+      let t = resumeCapability;
+      t == null ? resumeCapability = isolate$.Capability.new() : t;
       this[_pause](resumeCapability);
       return resumeCapability;
     }
@@ -50018,10 +50983,12 @@
       message[dartx._set](1, resumeCapability);
       this.controlPort.send(message);
     }
-    addOnExitListener(responsePort) {
-      let message = core.List.new(2);
+    addOnExitListener(responsePort, opts) {
+      let response = opts && 'response' in opts ? opts.response : null;
+      let message = core.List.new(3);
       message[dartx._set](0, "add-ondone");
       message[dartx._set](1, responsePort);
+      message[dartx._set](2, response);
       this.controlPort.send(message);
     }
     removeOnExitListener(responsePort) {
@@ -50037,16 +51004,18 @@
       message[dartx._set](2, errorsAreFatal);
       this.controlPort.send(message);
     }
-    kill(priority) {
-      if (priority === void 0) priority = isolate.Isolate.BEFORE_NEXT_EVENT;
+    kill(opts) {
+      let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.BEFORE_NEXT_EVENT;
       this.controlPort.send(JSArrayOfObject().of(["kill", this.terminateCapability, priority]));
     }
-    ping(responsePort, pingType) {
-      if (pingType === void 0) pingType = isolate.Isolate.IMMEDIATE;
-      let message = core.List.new(3);
+    ping(responsePort, opts) {
+      let response = opts && 'response' in opts ? opts.response : null;
+      let priority = opts && 'priority' in opts ? opts.priority : isolate$.Isolate.IMMEDIATE;
+      let message = core.List.new(4);
       message[dartx._set](0, "ping");
       message[dartx._set](1, responsePort);
-      message[dartx._set](2, pingType);
+      message[dartx._set](2, priority);
+      message[dartx._set](3, response);
       this.controlPort.send(message);
     }
     addErrorListener(port) {
@@ -50067,12 +51036,12 @@
       function handleError(message) {
         let errorDescription = core.String._check(dart.dindex(message, 0));
         let stackDescription = core.String._check(dart.dindex(message, 1));
-        let error = new isolate.RemoteError(errorDescription, stackDescription);
+        let error = new isolate$.RemoteError(errorDescription, stackDescription);
         controller.addError(error, error.stackTrace);
       }
       dart.fn(handleError, dynamicTovoid$());
       controller = async.StreamController.broadcast({sync: true, onListen: dart.fn(() => {
-          port = isolate.RawReceivePort.new(handleError);
+          port = isolate$.RawReceivePort.new(handleError);
           this.addErrorListener(port.sendPort);
         }, VoidToNull()), onCancel: dart.fn(() => {
           this.removeErrorListener(port.sendPort);
@@ -50082,42 +51051,46 @@
       return controller.stream;
     }
   };
-  dart.setSignature(isolate.Isolate, {
+  dart.setSignature(isolate$.Isolate, {
     fields: () => ({
-      controlPort: isolate.SendPort,
-      pauseCapability: isolate.Capability,
-      terminateCapability: isolate.Capability
+      controlPort: isolate$.SendPort,
+      pauseCapability: isolate$.Capability,
+      terminateCapability: isolate$.Capability
     }),
     getters: () => ({errors: dart.definiteFunctionType(async.Stream, [])}),
     methods: () => ({
-      pause: dart.definiteFunctionType(isolate.Capability, [], [isolate.Capability]),
-      [_pause]: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      resume: dart.definiteFunctionType(dart.void, [isolate.Capability]),
-      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
+      pause: dart.definiteFunctionType(isolate$.Capability, [], [isolate$.Capability]),
+      [_pause]: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      resume: dart.definiteFunctionType(dart.void, [isolate$.Capability]),
+      addOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object}),
+      removeOnExitListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
       setErrorsFatal: dart.definiteFunctionType(dart.void, [core.bool]),
-      kill: dart.definiteFunctionType(dart.void, [], [core.int]),
-      ping: dart.definiteFunctionType(dart.void, [isolate.SendPort], [core.int]),
-      addErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort]),
-      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate.SendPort])
+      kill: dart.definiteFunctionType(dart.void, [], {priority: core.int}),
+      ping: dart.definiteFunctionType(dart.void, [isolate$.SendPort], {response: core.Object, priority: core.int}),
+      addErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort]),
+      removeErrorListener: dart.definiteFunctionType(dart.void, [isolate$.SendPort])
     }),
     statics: () => ({
-      spawn: dart.definiteFunctionType(async.Future$(isolate.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool}),
-      spawnUri: dart.definiteFunctionType(async.Future$(isolate.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, packageRoot: core.Uri})
+      resolvePackageUri: dart.definiteFunctionType(async.Future$(core.Uri), [core.Uri]),
+      spawn: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [dynamicTovoid(), dart.dynamic], {paused: core.bool, errorsAreFatal: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort}),
+      spawnUri: dart.definiteFunctionType(async.Future$(isolate$.Isolate), [core.Uri, ListOfString(), dart.dynamic], {paused: core.bool, onExit: isolate$.SendPort, onError: isolate$.SendPort, errorsAreFatal: core.bool, checked: core.bool, environment: MapOfString$String(), packageRoot: core.Uri, packageConfig: core.Uri, automaticPackageResolution: core.bool})
     }),
-    names: ['spawn', 'spawnUri']
+    names: ['resolvePackageUri', 'spawn', 'spawnUri']
   });
-  isolate.Isolate.IMMEDIATE = 0;
-  isolate.Isolate.BEFORE_NEXT_EVENT = 1;
-  isolate.Isolate.AS_EVENT = 2;
-  dart.defineLazy(isolate.Isolate, {
+  isolate$.Isolate.IMMEDIATE = 0;
+  isolate$.Isolate.BEFORE_NEXT_EVENT = 1;
+  dart.defineLazy(isolate$.Isolate, {
     get _currentIsolateCache() {
       return _isolate_helper.IsolateNatives.currentIsolate;
-    }
+    },
+    get _packageBase() {
+      return core.Uri.base.resolve(core.String._check(dart.dload(_isolate_helper.IsolateNatives, 'packagesBase')));
+    },
+    set _packageBase(_) {}
   });
-  isolate.SendPort = class SendPort extends core.Object {};
-  isolate.SendPort[dart.implements] = () => [isolate.Capability];
-  isolate.ReceivePort = class ReceivePort extends core.Object {
+  isolate$.SendPort = class SendPort extends core.Object {};
+  isolate$.SendPort[dart.implements] = () => [isolate$.Capability];
+  isolate$.ReceivePort = class ReceivePort extends core.Object {
     static new() {
       return new _isolate_helper.ReceivePortImpl();
     }
@@ -50125,62 +51098,32 @@
       return new _isolate_helper.ReceivePortImpl.fromRawReceivePort(rawPort);
     }
   };
-  isolate.ReceivePort[dart.implements] = () => [async.Stream];
-  isolate.RawReceivePort = class RawReceivePort extends core.Object {
+  isolate$.ReceivePort[dart.implements] = () => [async.Stream];
+  isolate$.RawReceivePort = class RawReceivePort extends core.Object {
     static new(handler) {
       if (handler === void 0) handler = null;
       return new _isolate_helper.RawReceivePortImpl(handler);
     }
   };
-  isolate._IsolateUnhandledException = class _IsolateUnhandledException extends core.Object {
-    new(message, source, stackTrace) {
-      this.message = message;
-      this.source = source;
-      this.stackTrace = stackTrace;
-    }
-    toString() {
-      return 'IsolateUnhandledException: exception while handling message: ' + dart.str`${this.message} \n  ` + dart.str`${dart.toString(this.source)[dartx.replaceAll]("\n", "\n  ")}\n` + 'original stack trace:\n  ' + dart.str`${dart.toString(this.stackTrace)[dartx.replaceAll]("\n", "\n  ")}`;
-    }
-  };
-  isolate._IsolateUnhandledException[dart.implements] = () => [core.Exception];
-  dart.setSignature(isolate._IsolateUnhandledException, {
-    fields: () => ({
-      message: dart.dynamic,
-      source: dart.dynamic,
-      stackTrace: core.StackTrace
-    })
-  });
   const _description = Symbol('_description');
-  isolate.RemoteError = class RemoteError extends core.Object {
+  isolate$.RemoteError = class RemoteError extends core.Object {
     new(description, stackDescription) {
       this[_description] = description;
-      this.stackTrace = new isolate._RemoteStackTrace(stackDescription);
+      this.stackTrace = core.StackTrace.fromString(stackDescription);
     }
     toString() {
       return this[_description];
     }
   };
-  isolate.RemoteError[dart.implements] = () => [core.Error];
-  dart.setSignature(isolate.RemoteError, {
+  isolate$.RemoteError[dart.implements] = () => [core.Error];
+  dart.setSignature(isolate$.RemoteError, {
     fields: () => ({
       [_description]: core.String,
       stackTrace: core.StackTrace
     })
   });
-  const _trace$ = Symbol('_trace');
-  isolate._RemoteStackTrace = class _RemoteStackTrace extends core.Object {
-    new(trace) {
-      this[_trace$] = trace;
-    }
-    toString() {
-      return this[_trace$];
-    }
-  };
-  isolate._RemoteStackTrace[dart.implements] = () => [core.StackTrace];
-  dart.setSignature(isolate._RemoteStackTrace, {
-    fields: () => ({[_trace$]: core.String})
-  });
-  isolate.Capability = class Capability extends core.Object {
+  isolate$._UnaryFunction = dart.typedef('_UnaryFunction', () => dart.functionType(dart.dynamic, [dart.dynamic]));
+  isolate$.Capability = class Capability extends core.Object {
     static new() {
       return new _isolate_helper.CapabilityImpl();
     }
@@ -50697,13 +51640,40 @@
   math.SQRT2 = 1.4142135623730951;
   math.min = function(T) {
     return (a, b) => {
-      return Math.min(_js_helper.checkNum(a), _js_helper.checkNum(b));
+      if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+      if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+      if (dart.notNull(a) > dart.notNull(b)) return b;
+      if (dart.notNull(a) < dart.notNull(b)) return a;
+      if (typeof b == 'number') {
+        if (typeof a == 'number') {
+          if (a == 0.0) {
+            return (dart.notNull(a) + dart.notNull(b)) * dart.notNull(a) * dart.notNull(b);
+          }
+        }
+        if (a == 0 && dart.test(b[dartx.isNegative]) || dart.test(b[dartx.isNaN])) return b;
+        return a;
+      }
+      return a;
     };
   };
   dart.fn(math.min, TAndTToT());
   math.max = function(T) {
     return (a, b) => {
-      return Math.max(_js_helper.checkNum(a), _js_helper.checkNum(b));
+      if (!(typeof a == 'number')) dart.throw(new core.ArgumentError(a));
+      if (!(typeof b == 'number')) dart.throw(new core.ArgumentError(b));
+      if (dart.notNull(a) > dart.notNull(b)) return a;
+      if (dart.notNull(a) < dart.notNull(b)) return b;
+      if (typeof b == 'number') {
+        if (typeof a == 'number') {
+          if (a == 0.0) {
+            return dart.notNull(a) + dart.notNull(b);
+          }
+        }
+        if (dart.test(b[dartx.isNaN])) return b;
+        return a;
+      }
+      if (b == 0 && dart.test(a[dartx.isNegative])) return b;
+      return a;
     };
   };
   dart.fn(math.max, TAndTToT$());
@@ -51056,11 +52026,11 @@
     return Point;
   });
   math.Point = Point$();
-  let const$82;
+  let const$85;
   math.Random = class Random extends core.Object {
     static new(seed) {
       if (seed === void 0) seed = null;
-      return seed == null ? const$82 || (const$82 = dart.const(new math._JSRandom())) : new math._Random(seed);
+      return seed == null ? const$85 || (const$85 = dart.const(new math._JSRandom())) : new math._Random(seed);
     }
     static secure() {
       return math.Random._secureRandom;
@@ -51104,8 +52074,7 @@
       }
       ['=='](other) {
         if (!RectangleOfnum().is(other)) return false;
-        let otherRect = RectangleOfnum().as(other);
-        return this[dartx.left] == otherRect[dartx.left] && this[dartx.top] == otherRect[dartx.top] && this[dartx.right] == otherRect[dartx.right] && this[dartx.bottom] == otherRect[dartx.bottom];
+        return dart.equals(this[dartx.left], dart.dload(other, 'left')) && dart.equals(this[dartx.top], dart.dload(other, 'top')) && dart.equals(this[dartx.right], dart.dload(other, 'right')) && dart.equals(this[dartx.bottom], dart.dload(other, 'bottom'));
       }
       get hashCode() {
         return math._JenkinsSmiHash.hash4(dart.hashCode(this[dartx.left]), dart.hashCode(this[dartx.top]), dart.hashCode(this[dartx.right]), dart.hashCode(this[dartx.bottom]));
@@ -52415,7 +53384,7 @@
   });
   dart.registerExtension(dart.global.IDBKeyRange, indexed_db.KeyRange);
   const _add$3 = Symbol('_add');
-  const _clear$0 = Symbol('_clear');
+  const _clear$ = Symbol('_clear');
   const _put = Symbol('_put');
   const _createIndex = Symbol('_createIndex');
   const _add_1 = Symbol('_add_1');
@@ -52463,7 +53432,7 @@
     }
     [dartx.clear]() {
       try {
-        return indexed_db._completeRequest(dart.dynamic)(this[_clear$0]());
+        return indexed_db._completeRequest(dart.dynamic)(this[_clear$]());
       } catch (e) {
         let stacktrace = dart.stackTrace(e);
         return async.Future.error(e, stacktrace);
@@ -52584,7 +53553,7 @@
     [_add_2](...args) {
       return this.add.apply(this, args);
     }
-    [_clear$0](...args) {
+    [_clear$](...args) {
       return this.clear.apply(this, args);
     }
     [_count$0](...args) {
@@ -52683,7 +53652,7 @@
       [_add$3]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic], [dart.dynamic]),
       [_add_1]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic, dart.dynamic]),
       [_add_2]: dart.definiteFunctionType(indexed_db.Request, [dart.dynamic]),
-      [_clear$0]: dart.definiteFunctionType(indexed_db.Request, []),
+      [_clear$]: dart.definiteFunctionType(indexed_db.Request, []),
       [_count$0]: dart.definiteFunctionType(indexed_db.Request, [core.Object]),
       [_createIndex]: dart.definiteFunctionType(indexed_db.Index, [core.String, core.Object], [core.Map]),
       [_createIndex_1]: dart.definiteFunctionType(indexed_db.Index, [dart.dynamic, dart.dynamic, dart.dynamic]),
@@ -59472,7 +60441,7 @@
   const _borderWidth = Symbol('_borderWidth');
   const _bottom = Symbol('_bottom');
   const _captionSide = Symbol('_captionSide');
-  const _clear$1 = Symbol('_clear');
+  const _clear$0 = Symbol('_clear');
   const _clip = Symbol('_clip');
   const _color = Symbol('_color');
   const _content = Symbol('_content');
@@ -64287,15 +65256,15 @@
       this.captionSide = value;
     }
     get [dartx.clear]() {
-      return this[_clear$1];
+      return this[_clear$0];
     }
     set [dartx.clear](value) {
-      this[_clear$1] = value == null ? '' : value;
+      this[_clear$0] = value == null ? '' : value;
     }
-    get [_clear$1]() {
+    get [_clear$0]() {
       return this.clear;
     }
-    set [_clear$1](value) {
+    set [_clear$0](value) {
       this.clear = value;
     }
     get [dartx.clip]() {
@@ -65042,7 +66011,7 @@
       [_borderWidth]: core.String,
       [_bottom]: core.String,
       [_captionSide]: core.String,
-      [_clear$1]: core.String,
+      [_clear$0]: core.String,
       [_clip]: core.String,
       [_color]: core.String,
       [_content]: core.String,
@@ -84090,7 +85059,7 @@
       return value;
     }
     [dartx.clear]() {
-      return this[_clear$1]();
+      return this[_clear$0]();
     }
     [dartx.forEach](f) {
       for (let i = 0; true; i++) {
@@ -84133,7 +85102,7 @@
     [__setter__](...args) {
       return this.__setter__.apply(this, args);
     }
-    [_clear$1](...args) {
+    [_clear$0](...args) {
       return this.clear.apply(this, args);
     }
     [_getItem](...args) {
@@ -84172,7 +85141,7 @@
       [__delete__]: dart.definiteFunctionType(core.bool, [dart.dynamic]),
       [__getter__]: dart.definiteFunctionType(core.String, [dart.dynamic]),
       [__setter__]: dart.definiteFunctionType(dart.void, [dart.dynamic, core.String]),
-      [_clear$1]: dart.definiteFunctionType(dart.void, []),
+      [_clear$0]: dart.definiteFunctionType(dart.void, []),
       [_getItem]: dart.definiteFunctionType(core.String, [core.String]),
       [_key]: dart.definiteFunctionType(core.String, [core.int]),
       [_removeItem]: dart.definiteFunctionType(dart.void, [core.String]),
@@ -93182,9 +94151,6 @@
       allowsAttribute: dart.definiteFunctionType(core.bool, [html$.Element, core.String, core.String])
     })
   });
-  let const$83;
-  let const$84;
-  let const$85;
   let const$86;
   let const$87;
   let const$88;
@@ -93192,15 +94158,18 @@
   let const$90;
   let const$91;
   let const$92;
+  let const$93;
+  let const$94;
+  let const$95;
   html$._SimpleNodeValidator = class _SimpleNodeValidator extends core.Object {
     static allowNavigation(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$83 || (const$83 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$84 || (const$84 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$85 || (const$85 = dart.constList(['A::href', 'FORM::action'], core.String))});
+      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['A', 'FORM'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['A::accesskey', 'A::coords', 'A::hreflang', 'A::name', 'A::shape', 'A::tabindex', 'A::target', 'A::type', 'FORM::accept', 'FORM::autocomplete', 'FORM::enctype', 'FORM::method', 'FORM::name', 'FORM::novalidate', 'FORM::target'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['A::href', 'FORM::action'], core.String))});
     }
     static allowImages(uriPolicy) {
-      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$86 || (const$86 = dart.constList(['IMG'], core.String)), allowedAttributes: const$87 || (const$87 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$88 || (const$88 = dart.constList(['IMG::src'], core.String))});
+      return new html$._SimpleNodeValidator(uriPolicy, {allowedElements: const$89 || (const$89 = dart.constList(['IMG'], core.String)), allowedAttributes: const$90 || (const$90 = dart.constList(['IMG::align', 'IMG::alt', 'IMG::border', 'IMG::height', 'IMG::hspace', 'IMG::ismap', 'IMG::name', 'IMG::usemap', 'IMG::vspace', 'IMG::width'], core.String)), allowedUriAttributes: const$91 || (const$91 = dart.constList(['IMG::src'], core.String))});
     }
     static allowTextElements() {
-      return new html$._SimpleNodeValidator(null, {allowedElements: const$89 || (const$89 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
+      return new html$._SimpleNodeValidator(null, {allowedElements: const$92 || (const$92 = dart.constList(['B', 'BLOCKQUOTE', 'BR', 'EM', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HR', 'I', 'LI', 'OL', 'P', 'SPAN', 'UL'], core.String))});
     }
     new(uriPolicy, opts) {
       let allowedElements = opts && 'allowedElements' in opts ? opts.allowedElements : null;
@@ -93210,9 +94179,9 @@
       this.allowedAttributes = SetOfString().new();
       this.allowedUriAttributes = SetOfString().new();
       this.uriPolicy = uriPolicy;
-      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$90 || (const$90 = dart.constList([], core.String))));
-      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$91 || (const$91 = dart.constList([], core.String));
-      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$92 || (const$92 = dart.constList([], core.String));
+      this.allowedElements.addAll((allowedElements != null ? allowedElements : const$93 || (const$93 = dart.constList([], core.String))));
+      allowedAttributes = allowedAttributes != null ? allowedAttributes : const$94 || (const$94 = dart.constList([], core.String));
+      allowedUriAttributes = allowedUriAttributes != null ? allowedUriAttributes : const$95 || (const$95 = dart.constList([], core.String));
       let legalAttributes = allowedAttributes[dartx.where](dart.fn(x => !dart.test(html$._Html5NodeValidator._uriAttributes[dartx.contains](x)), StringTobool$()));
       let extraUriAttributes = allowedAttributes[dartx.where](dart.fn(x => html$._Html5NodeValidator._uriAttributes[dartx.contains](x), StringTobool$()));
       this.allowedAttributes.addAll(legalAttributes);
@@ -93498,7 +94467,7 @@
     names: ['get']
   });
   const _array = Symbol('_array');
-  const _current$4 = Symbol('_current');
+  const _current$2 = Symbol('_current');
   html$.FixedSizeListIterator$ = dart.generic(T => {
     let IteratorOfT = () => (IteratorOfT = dart.constFn(core.Iterator$(T)))();
     let ListOfT = () => (ListOfT = dart.constFn(core.List$(T)))();
@@ -93507,21 +94476,21 @@
         this[_array] = array;
         this[_position$1] = -1;
         this[_length$3] = array[dartx.length];
-        this[_current$4] = null;
+        this[_current$2] = null;
       }
       moveNext() {
         let nextPosition = dart.notNull(this[_position$1]) + 1;
         if (nextPosition < dart.notNull(this[_length$3])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
+          this[_current$2] = this[_array][dartx._get](nextPosition);
           this[_position$1] = nextPosition;
           return true;
         }
-        this[_current$4] = null;
+        this[_current$2] = null;
         this[_position$1] = this[_length$3];
         return false;
       }
       get current() {
-        return this[_current$4];
+        return this[_current$2];
       }
     }
     dart.addTypeTests(FixedSizeListIterator);
@@ -93531,7 +94500,7 @@
         [_array]: ListOfT(),
         [_length$3]: core.int,
         [_position$1]: core.int,
-        [_current$4]: T
+        [_current$2]: T
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -93546,21 +94515,21 @@
       new(array) {
         this[_array] = array;
         this[_position$1] = -1;
-        this[_current$4] = null;
+        this[_current$2] = null;
       }
       moveNext() {
         let nextPosition = dart.notNull(this[_position$1]) + 1;
         if (nextPosition < dart.notNull(this[_array][dartx.length])) {
-          this[_current$4] = this[_array][dartx._get](nextPosition);
+          this[_current$2] = this[_array][dartx._get](nextPosition);
           this[_position$1] = nextPosition;
           return true;
         }
-        this[_current$4] = null;
+        this[_current$2] = null;
         this[_position$1] = this[_array][dartx.length];
         return false;
       }
       get current() {
-        return this[_current$4];
+        return this[_current$2];
       }
     }
     dart.addTypeTests(_VariableSizeListIterator);
@@ -93569,7 +94538,7 @@
       fields: () => ({
         [_array]: ListOfT(),
         [_position$1]: core.int,
-        [_current$4]: T
+        [_current$2]: T
       }),
       getters: () => ({current: dart.definiteFunctionType(T, [])}),
       methods: () => ({moveNext: dart.definiteFunctionType(core.bool, [])})
@@ -104477,6 +105446,7 @@
     methods: () => ({[dartx.executeSql]: dart.definiteFunctionType(dart.void, [core.String, ListOfObject()], [web_sql.SqlStatementCallback, web_sql.SqlStatementErrorCallback])})
   });
   dart.registerExtension(dart.global.SQLTransaction, web_sql.SqlTransaction);
+  dart.trackLibraries("dart_sdk", {"dart:_runtime": dart, "dart:_debugger": _debugger, "dart:_foreign_helper": _foreign_helper, "dart:_interceptors": _interceptors, "dart:_internal": _internal, "dart:_isolate_helper": _isolate_helper, "dart:_js_embedded_names": _js_embedded_names, "dart:_js_helper": _js_helper, "dart:_js_mirrors": _js_mirrors, "dart:_js_primitives": _js_primitives, "dart:_metadata": _metadata, "dart:_native_typed_data": _native_typed_data, "dart:async": async, "dart:collection": collection, "dart:convert": convert, "dart:core": core, "dart:developer": developer, "dart:io": io, "dart:isolate": isolate$, "dart:js": js, "dart:js_util": js_util, "dart:math": math, "dart:mirrors": mirrors, "dart:typed_data": typed_data, "dart:indexed_db": indexed_db, "dart:html": html$, "dart:html_common": html_common, "dart:svg": svg$, "dart:web_audio": web_audio, "dart:web_gl": web_gl, "dart:web_sql": web_sql});
   // Exports:
   exports.dart = dart;
   exports.dartx = dartx;
@@ -104497,7 +105467,7 @@
   exports.core = core;
   exports.developer = developer;
   exports.io = io;
-  exports.isolate = isolate;
+  exports.isolate = isolate$;
   exports.js = js;
   exports.js_util = js_util;
   exports.math = math;
diff --git a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
index 2578829..d9d2b37 100644
--- a/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
+++ b/pkg/dev_compiler/lib/sdk/ddc_sdk.sum
Binary files differ
diff --git a/pkg/dev_compiler/lib/src/compiler/code_generator.dart b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
index 24aac39..ce888fc 100644
--- a/pkg/dev_compiler/lib/src/compiler/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/compiler/code_generator.dart
@@ -127,7 +127,7 @@
   final ClassElement objectClass;
   final ClassElement stringClass;
   final ClassElement functionClass;
-  final ClassElement symbolClass;
+  final ClassElement privateSymbolClass;
 
   ConstFieldVisitor _constants;
 
@@ -174,7 +174,8 @@
         objectClass = _getLibrary(c, 'dart:core').getType('Object'),
         stringClass = _getLibrary(c, 'dart:core').getType('String'),
         functionClass = _getLibrary(c, 'dart:core').getType('Function'),
-        symbolClass = _getLibrary(c, 'dart:_internal').getType('Symbol'),
+        privateSymbolClass =
+            _getLibrary(c, 'dart:_internal').getType('PrivateSymbol'),
         dartJSLibrary = _getLibrary(c, 'dart:js');
 
   LibraryElement get currentLibrary => _loader.currentElement.library;
@@ -191,7 +192,7 @@
       _libraryRoot += separator;
     }
 
-    var module = _emitModule(compilationUnits);
+    var module = _emitModule(compilationUnits, unit.name);
     var dartApiSummary = _summarizeModule(compilationUnits);
 
     return new JSModuleFile(unit.name, errors, options, module, dartApiSummary);
@@ -237,7 +238,7 @@
     return bundle.toBuffer();
   }
 
-  JS.Program _emitModule(List<CompilationUnit> compilationUnits) {
+  JS.Program _emitModule(List<CompilationUnit> compilationUnits, String name) {
     if (_moduleItems.isNotEmpty) {
       throw new StateError('Can only call emitModule once.');
     }
@@ -320,6 +321,11 @@
     // hoisted definitions.
     items.addAll(_typeTable.discharge());
 
+    // Track the module name for each library in the module.
+    // This data is only required for debugging.
+    _moduleItems.add(js.statement('#.trackLibraries(#, #);',
+        [_runtimeModule, js.string(name), _librariesDebuggerObject()]));
+
     // Add the module's code (produced by visiting compilation units, above)
     _copyAndFlattenBlocks(items, _moduleItems);
 
@@ -327,6 +333,17 @@
     return new JS.Program(items, name: _buildUnit.name);
   }
 
+  JS.ObjectInitializer _librariesDebuggerObject() {
+    var properties = <JS.Property>[];
+    _libraries.forEach((library, value) {
+      // TODO(jacobr): we could specify a short library name instead of the
+      // full library uri if we wanted to save space.
+      properties.add(new JS.Property(
+          js.string(jsLibraryDebuggerName(_libraryRoot, library)), value));
+    });
+    return new JS.ObjectInitializer(properties);
+  }
+
   List<String> _getJSName(Element e) {
     if (e.library == null ||
         findAnnotation(e.library, isPublicJSAnnotation) == null) {
@@ -457,6 +474,7 @@
         imports.add(new JS.NameSpecifier(_runtimeModule));
         imports.add(new JS.NameSpecifier(_extensionSymbolsModule));
       }
+
       items.add(new JS.ImportDeclaration(
           namedImports: imports, from: js.string(module, "'")));
     });
@@ -2272,8 +2290,8 @@
       // Run constructor field initializers such as `: foo = bar.baz`
       for (var init in ctor.initializers) {
         if (init is ConstructorFieldInitializer) {
-          fields[init.fieldName.staticElement as FieldElement] =
-              _visit(init.expression);
+          var element = init.fieldName.staticElement as FieldElement;
+          fields[element] = _visit(init.expression);
         }
       }
     }
@@ -5367,8 +5385,11 @@
       var name = js.string(node.components.join('.'), "'");
       if (last.startsWith('_')) {
         var nativeSymbol = _emitPrivateNameSymbol(currentLibrary, last);
-        return js.call('new #.es6(#, #)',
-            [_emitConstructorAccess(symbolClass.type), name, nativeSymbol]);
+        return js.call('new #(#, #)', [
+          _emitConstructorAccess(privateSymbolClass.type),
+          name,
+          nativeSymbol
+        ]);
       } else {
         return js
             .call('#.new(#)', [_emitConstructorAccess(types.symbolType), name]);
@@ -5853,6 +5874,44 @@
   return pathToJSIdentifier(qualifiedPath);
 }
 
+/// Debugger friendly name for a Dart Library.
+String jsLibraryDebuggerName(String libraryRoot, LibraryElement library) {
+  var uri = library.source.uri;
+  // For package: and dart: uris show the entire
+  if (uri.scheme == 'dart' || uri.scheme == 'package') return uri.toString();
+
+  if (!uri.toFilePath().startsWith(libraryRoot)) {
+    throw 'Invalid library root. $libraryRoot does not contain ${uri
+        .toFilePath()}';
+  }
+  // Relative path to the library.
+  return uri.path.substring(libraryRoot.length);
+}
+
+String jsDebuggingLibraryName(String libraryRoot, LibraryElement library) {
+  var uri = library.source.uri;
+  if (uri.scheme == 'dart') {
+    return uri.path;
+  }
+  // TODO(vsm): This is not necessarily unique if '__' appears in a file name.
+  var separator = '__';
+  String qualifiedPath;
+  if (uri.scheme == 'package') {
+    // Strip the package name.
+    // TODO(vsm): This is not unique if an escaped '/'appears in a filename.
+    // E.g., "foo/bar.dart" and "foo$47bar.dart" would collide.
+    qualifiedPath = uri.pathSegments.skip(1).join(separator);
+  } else if (uri.toFilePath().startsWith(libraryRoot)) {
+    qualifiedPath =
+        uri.path.substring(libraryRoot.length).replaceAll('/', separator);
+  } else {
+    // We don't have a unique name.
+    throw 'Invalid library root. $libraryRoot does not contain ${uri
+        .toFilePath()}';
+  }
+  return pathToJSIdentifier(qualifiedPath);
+}
+
 /// Shorthand for identifier-like property names.
 /// For now, we emit them as strings and the printer restores them to
 /// identifiers if it can.
diff --git a/pkg/dev_compiler/package.json b/pkg/dev_compiler/package.json
index 2616c06..a4a9ab2 100644
--- a/pkg/dev_compiler/package.json
+++ b/pkg/dev_compiler/package.json
@@ -19,7 +19,7 @@
     "chai": "^2.2.0",
     "electron-prebuilt": "^0.36.0",
     "is_js": "^0.9.0",
-    "karma": "^0.12.31",
+    "karma": "^1.5.0",
     "karma-chai": "^0.1.0",
     "karma-chrome-launcher": "^0.1.8",
     "karma-electron-launcher": "^0.0.5",
diff --git a/pkg/dev_compiler/test/browser/language_tests.js b/pkg/dev_compiler/test/browser/language_tests.js
index f36b2a7..48605ea 100644
--- a/pkg/dev_compiler/test/browser/language_tests.js
+++ b/pkg/dev_compiler/test/browser/language_tests.js
@@ -11,6 +11,10 @@
   let mochaOnError = window.onerror;
   dart_sdk.dart.trapRuntimeErrors(false);
   dart_sdk._isolate_helper.startRootIsolate(function() {}, []);
+  // Make it easier to debug test failures and required for formatter test that
+  // assumes custom formatters are enabled.
+  dart_sdk._debugger.registerDevtoolsFormatter();
+
   let html_config = unittest.html_config;
   // Test attributes are a list of strings, or a string for a single
   // attribute. Valid attributes are:
@@ -184,7 +188,6 @@
       'generic_is_check_test': fail,
       'getter_closure_execution_order_test': fail,
       'gc_test': 'slow',
-      'hash_code_mangling_test': fail,
       'identical_closure2_test': fail,
       'infinite_switch_label_test': fail,
       'infinity_test': fail,
@@ -289,6 +292,7 @@
       'const_list_literal_test': fail,
       'const_list_remove_range_test': fail,
       'const_list_set_range_test': fail,
+      'data_uri_test': fail,
       'double_parse_test_01_multi': fail,
       'double_parse_test_02_multi': firefox_fail,
       'error_stack_trace1_test': fail,
@@ -339,7 +343,6 @@
 
       'list_insert_test': fail,
       'list_removeat_test': fail,
-      'set_test': fail, // runtime strong mode reject
     },
 
     'corelib/regexp': {
@@ -571,6 +574,7 @@
       'library_uri_package_test': fail,
       'list_constructor_test_01_multi': fail,
       'list_constructor_test_none_multi': fail,
+      'load_library_test': fail,
       'local_function_is_static_test': fail,
       'local_isolate_test': fail,
       'metadata_allowed_values_test_none_multi': fail,
diff --git a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js b/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
index 9aabf8f..0b2cfba 100644
--- a/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
+++ b/pkg/dev_compiler/test/codegen_expected/BenchmarkBase.js
@@ -89,6 +89,7 @@
     statics: () => ({measureFor: dart.definiteFunctionType(core.double, [core.Function, core.int])}),
     names: ['measureFor']
   });
+  dart.trackLibraries("BenchmarkBase", {"BenchmarkBase.dart": BenchmarkBase$});
   // Exports:
   return {
     BenchmarkBase: BenchmarkBase$
diff --git a/pkg/dev_compiler/test/codegen_expected/async_helper.js b/pkg/dev_compiler/test/codegen_expected/async_helper.js
index 44cf910..cd86052 100644
--- a/pkg/dev_compiler/test/codegen_expected/async_helper.js
+++ b/pkg/dev_compiler/test/codegen_expected/async_helper.js
@@ -69,6 +69,7 @@
     dart.dsend(f(), 'then', async_helper.asyncSuccess);
   };
   dart.fn(async_helper.asyncTest, FnTovoid());
+  dart.trackLibraries("async_helper", {"async_helper.dart": async_helper});
   // Exports:
   return {
     async_helper: async_helper
diff --git a/pkg/dev_compiler/test/codegen_expected/closure.js b/pkg/dev_compiler/test/codegen_expected/closure.js
index 1da1e9c..535b23d 100644
--- a/pkg/dev_compiler/test/codegen_expected/closure.js
+++ b/pkg/dev_compiler/test/codegen_expected/closure.js
@@ -117,3 +117,4 @@
 closure.some_top_level_final = "abc";
 /** @type {string} */
 closure.some_top_level_var = "abc";
+dart.trackLibraries("closure", {"closure.dart": closure});
diff --git a/pkg/dev_compiler/test/codegen_expected/destructuring.js b/pkg/dev_compiler/test/codegen_expected/destructuring.js
index 46b4899..c07b2ca 100644
--- a/pkg/dev_compiler/test/codegen_expected/destructuring.js
+++ b/pkg/dev_compiler/test/codegen_expected/destructuring.js
@@ -80,6 +80,7 @@
     dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
   };
   dart.fn(src__varargs.spread, dynamicTodynamic());
+  dart.trackLibraries("destructuring", {"destructuring.dart": destructuring, "package:js/src/varargs.dart": src__varargs});
   // Exports:
   return {
     destructuring: destructuring,
diff --git a/pkg/dev_compiler/test/codegen_expected/es6_modules.js b/pkg/dev_compiler/test/codegen_expected/es6_modules.js
index 8f76e89..482ca51 100644
--- a/pkg/dev_compiler/test/codegen_expected/es6_modules.js
+++ b/pkg/dev_compiler/test/codegen_expected/es6_modules.js
@@ -45,3 +45,4 @@
   },
   set lazyMutable(_) {}
 });
+dart.trackLibraries("es6_modules", {"es6_modules.dart": es6_modules});
diff --git a/pkg/dev_compiler/test/codegen_expected/map_keys.js b/pkg/dev_compiler/test/codegen_expected/map_keys.js
index 4f7dcee..cd6b376 100644
--- a/pkg/dev_compiler/test/codegen_expected/map_keys.js
+++ b/pkg/dev_compiler/test/codegen_expected/map_keys.js
@@ -15,6 +15,7 @@
     core.print(dart.map(['1', 2, null, 4, '5', 6], core.String, core.int));
   };
   dart.fn(map_keys.main, VoidTodynamic());
+  dart.trackLibraries("map_keys", {"map_keys.dart": map_keys});
   // Exports:
   return {
     map_keys: map_keys
diff --git a/pkg/dev_compiler/test/codegen_expected/node_modules.js b/pkg/dev_compiler/test/codegen_expected/node_modules.js
index 5a7fa95..8c2eade 100644
--- a/pkg/dev_compiler/test/codegen_expected/node_modules.js
+++ b/pkg/dev_compiler/test/codegen_expected/node_modules.js
@@ -49,5 +49,6 @@
   },
   set lazyMutable(_) {}
 });
+dart.trackLibraries("node_modules", {"node_modules.dart": node_modules});
 // Exports:
 exports.node_modules = node_modules;
diff --git a/pkg/dev_compiler/test/codegen_expected/script.js b/pkg/dev_compiler/test/codegen_expected/script.js
index c2b69f4..6564c29 100644
--- a/pkg/dev_compiler/test/codegen_expected/script.js
+++ b/pkg/dev_compiler/test/codegen_expected/script.js
@@ -12,6 +12,7 @@
     core.print(dart.str`hello ${name}`);
   };
   dart.fn(script.main, ListOfStringTovoid());
+  dart.trackLibraries("script", {"script.dart": script});
   // Exports:
   return {
     script: script
diff --git a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js b/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js
index 220bc7b..06bc7f3 100644
--- a/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js
+++ b/pkg/dev_compiler/test/codegen_expected/sunflower/sunflower.js
@@ -123,6 +123,7 @@
       return html.CanvasRenderingContext2D.as(painter.canvas[dartx.getContext]('2d'));
     }
   });
+  dart.trackLibraries("sunflower", {"sunflower.dart": sunflower, "circle.dart": circle, "painter.dart": painter});
   // Exports:
   return {
     sunflower: sunflower,
diff --git a/pkg/dev_compiler/test/codegen_expected/varargs.js b/pkg/dev_compiler/test/codegen_expected/varargs.js
index 0dea1a0..de0fe75 100644
--- a/pkg/dev_compiler/test/codegen_expected/varargs.js
+++ b/pkg/dev_compiler/test/codegen_expected/varargs.js
@@ -26,6 +26,7 @@
     dart.throw(new core.StateError('The spread function cannot be called, ' + 'it should be compiled away.'));
   };
   dart.fn(src__varargs.spread, dynamicTodynamic());
+  dart.trackLibraries("varargs", {"varargs.dart": varargs, "package:js/src/varargs.dart": src__varargs});
   // Exports:
   return {
     varargs: varargs,
diff --git a/pkg/dev_compiler/test/not_yet_strong_tests.dart b/pkg/dev_compiler/test/not_yet_strong_tests.dart
index c73580e..da7cd00 100644
--- a/pkg/dev_compiler/test/not_yet_strong_tests.dart
+++ b/pkg/dev_compiler/test/not_yet_strong_tests.dart
@@ -2048,7 +2048,6 @@
   'corelib/int_from_environment3_test_03_multi',
   'corelib/int_from_environment3_test_04_multi',
   'corelib/int_from_environment3_test_05_multi',
-  'corelib/iterable_contains2_test',
   'corelib/iterable_element_at_test',
   'corelib/iterable_fold_test',
   'corelib/iterable_mapping_test',
@@ -2154,7 +2153,6 @@
   'lib/mirrors/library_imports_prefixed_test',
   'lib/mirrors/library_imports_shown_test',
   'lib/mirrors/library_metadata2_test_01_multi',
-  'lib/mirrors/load_library_test',
   'lib/mirrors/metadata_allowed_values_test_01_multi',
   'lib/mirrors/metadata_allowed_values_test_02_multi',
   'lib/mirrors/metadata_allowed_values_test_03_multi',
@@ -2385,7 +2383,6 @@
   'language/unresolved_top_level_method_negative_test',
   'language/unresolved_top_level_var_negative_test',
   'corelib/file_resource_test',
-  'corelib/queue_test',
   'corelib/regexp/global_test',
   'corelib/regexp/regexp_test',
   'corelib/regexp/regress-regexp-codeflush_test',
diff --git a/pkg/dev_compiler/tool/build_sdk.sh b/pkg/dev_compiler/tool/build_sdk.sh
index bcda0af..23e3cc4 100755
--- a/pkg/dev_compiler/tool/build_sdk.sh
+++ b/pkg/dev_compiler/tool/build_sdk.sh
@@ -4,25 +4,31 @@
 cd $( dirname "${BASH_SOURCE[0]}" )/..
 
 echo "*** Patching SDK"
-dart -c tool/patch_sdk.dart tool/input_sdk gen/patched_sdk
+{ # Try
+  dart -c tool/patch_sdk.dart ../.. tool/input_sdk gen/patched_sdk \
+      > tool/sdk_expected_errors.txt
+} || { # Catch
+  # Show errors if the sdk didn't compile.
+  cat tool/sdk_expected_errors.txt
+  exit 1
+}
 
 echo "*** Compiling SDK to JavaScript"
-
-# TODO(jmesserly): break out dart:html & friends.
 { # Try
+  # TODO(jmesserly): break out dart:html & friends into a module.
   dart -c tool/build_sdk.dart \
-    --dart-sdk gen/patched_sdk \
-    --dart-sdk-summary=build \
-    --summary-out lib/sdk/ddc_sdk.sum \
-    --modules=amd \
-    -o lib/js/amd/dart_sdk.js \
-    --modules=es6 \
-    -o lib/js/es6/dart_sdk.js \
-    --modules=common \
-    -o lib/js/common/dart_sdk.js \
-    --modules=legacy \
-    -o lib/js/legacy/dart_sdk.js \
-    "$@" > tool/sdk_expected_errors.txt
+      --dart-sdk gen/patched_sdk \
+      --dart-sdk-summary=build \
+      --summary-out lib/sdk/ddc_sdk.sum \
+      --modules=amd \
+      -o lib/js/amd/dart_sdk.js \
+      --modules=es6 \
+      -o lib/js/es6/dart_sdk.js \
+      --modules=common \
+      -o lib/js/common/dart_sdk.js \
+      --modules=legacy \
+      -o lib/js/legacy/dart_sdk.js \
+      "$@" > tool/sdk_expected_errors.txt
 } || { # Catch
   # Show errors if the sdk didn't compile.
   cat tool/sdk_expected_errors.txt
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart b/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart
deleted file mode 100644
index 4e56e9f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/_internal/libraries.dart
+++ /dev/null
@@ -1,316 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library libraries;
-
-/**
- * A bit flag used by [LibraryInfo] indicating that a library is used by dart2js
- */
-const int DART2JS_PLATFORM = 1;
-
-/**
- * A bit flag used by [LibraryInfo] indicating that a library is used by the VM
- */
-const int VM_PLATFORM = 2;
-
-/**
- * Mapping of "dart:" library name (e.g. "core") to information about that library.
- * This information is structured such that Dart Editor can parse this file
- * and extract the necessary information without executing it
- * while other tools can access via execution.
- */
-const Map<String, LibraryInfo> LIBRARIES = const {
-
-  "async": const LibraryInfo(
-      "async/async.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/async_patch.dart"),
-
-  "collection": const LibraryInfo(
-      "collection/collection.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/collection_patch.dart"),
-
-  "convert": const LibraryInfo(
-      "convert/convert.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/convert_patch.dart"),
-
-  "core": const LibraryInfo(
-      "core/core.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/core_patch.dart"),
-
-  "developer": const LibraryInfo(
-      "developer/developer.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/js_runtime/lib/developer_patch.dart"),
-
-  "html": const LibraryInfo(
-      "html/dart2js/html_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "html_common": const LibraryInfo(
-      "html/html_common/html_common_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE,
-      documented: false,
-      implementation: true),
-
-  "indexed_db": const LibraryInfo(
-      "indexed_db/dart2js/indexed_db_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "io": const LibraryInfo(
-      "io/io.dart",
-      category: "Server",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/io_patch.dart"),
-
-  "isolate": const LibraryInfo(
-      "isolate/isolate.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/isolate_patch.dart"),
-
-  "js": const LibraryInfo(
-      "js/dartium/js_dartium.dart",
-      category: "Client",
-      maturity: Maturity.STABLE,
-      dart2jsPath: "js/dart2js/js_dart2js.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",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/math_patch.dart"),
-
-  "mirrors": const LibraryInfo(
-      "mirrors/mirrors.dart",
-      maturity: Maturity.UNSTABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/mirrors_patch.dart"),
-
-  "typed_data": const LibraryInfo(
-      "typed_data/typed_data.dart",
-      maturity: Maturity.STABLE,
-      dart2jsPatchPath: "_internal/compiler/js_lib/typed_data_patch.dart"),
-
-  "_native_typed_data": const LibraryInfo(
-      "_internal/compiler/js_lib/native_typed_data.dart",
-      category: "Internal",
-      implementation: true,
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "svg": const LibraryInfo(
-      "svg/dart2js/svg_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "web_audio": const LibraryInfo(
-      "web_audio/dart2js/web_audio_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "web_gl": const LibraryInfo(
-      "web_gl/dart2js/web_gl_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "web_sql": const LibraryInfo(
-      "web_sql/dart2js/web_sql_dart2js.dart",
-      category: "Client",
-      maturity: Maturity.WEB_STABLE),
-
-  "_internal": const LibraryInfo(
-      "internal/internal.dart",
-      category: "Internal",
-      documented: false,
-      dart2jsPatchPath:
-          "_internal/compiler/js_lib/internal_patch.dart"),
-
-  "_js_helper": const LibraryInfo(
-      "_internal/compiler/js_lib/js_helper.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_interceptors": const LibraryInfo(
-      "_internal/compiler/js_lib/interceptors.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_foreign_helper": const LibraryInfo(
-      "_internal/compiler/js_lib/foreign_helper.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_isolate_helper": const LibraryInfo(
-      "_internal/compiler/js_lib/isolate_helper.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_js_mirrors": const LibraryInfo(
-      "_internal/compiler/js_lib/js_mirrors.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_js_primitives": const LibraryInfo(
-      "_internal/compiler/js_lib/js_primitives.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  // TODO(ahe): This library is only for dart2dart, perhaps it should use a
-  // different platform.
-  "_mirror_helper": const LibraryInfo(
-      "_internal/compiler/js_lib/mirror_helper.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_js_embedded_names": const LibraryInfo(
-      "_internal/compiler/js_lib/shared/embedded_names.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_metadata": const LibraryInfo(
-      "html/html_common/metadata.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_runtime": const LibraryInfo(
-      "_internal/compiler/js_lib/ddc_runtime/runtime.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-
-  "_debugger": const LibraryInfo(
-      "_internal/compiler/js_lib/debugger.dart",
-      category: "Internal",
-      documented: false,
-      platforms: DART2JS_PLATFORM),
-};
-
-/**
- * Information about a "dart:" library.
- */
-class LibraryInfo {
-
-  /**
-   * Path to the library's *.dart file relative to this file.
-   */
-  final String path;
-
-  /**
-   * The category in which the library should appear in the editor
-   * (e.g. "Shared", "Client", "Server", ...).
-   * If a category is not specified it defaults to "Shared".
-   */
-  final String category;
-
-  /**
-   * Path to the dart2js library's *.dart file relative to this file
-   * or null if dart2js uses the common library path defined above.
-   * Access using the [#getDart2JsPath()] method.
-   */
-  final String dart2jsPath;
-
-  /**
-   * Path to the dart2js library's patch file relative to this file
-   * or null if no dart2js patch file associated with this library.
-   * Access using the [#getDart2JsPatchPath()] method.
-   */
-  final String dart2jsPatchPath;
-
-  /**
-   * True if this library is documented and should be shown to the user.
-   */
-  final bool documented;
-
-  /**
-   * Bit flags indicating which platforms consume this library.
-   * See [DART2JS_LIBRARY] and [VM_LIBRARY].
-   */
-  final int platforms;
-
-  /**
-   * True if the library contains implementation details for another library.
-   * The implication is that these libraries are less commonly used
-   * and that tools like Dart Editor should not show these libraries
-   * in a list of all libraries unless the user specifically asks the tool to
-   * do so.
-   */
-  final bool implementation;
-
-  /**
-   * States the current maturity of this library.
-   */
-  final Maturity maturity;
-
-  const LibraryInfo(this.path, {
-                    this.category: "Shared",
-                    this.dart2jsPath,
-                    this.dart2jsPatchPath,
-                    this.implementation: false,
-                    this.documented: true,
-                    this.maturity: Maturity.UNSPECIFIED,
-                    this.platforms: DART2JS_PLATFORM | VM_PLATFORM});
-
-  bool get isDart2jsLibrary => (platforms & DART2JS_PLATFORM) != 0;
-  bool get isVmLibrary => (platforms & VM_PLATFORM) != 0;
-}
-
-
-
-/**
- * Abstraction to capture the maturity of a library.
- */
-class Maturity {
-  final int level;
-  final String name;
-  final String description;
-
-  const Maturity(this.level, this.name, this.description);
-
-  String toString() => "$name: $level\n$description\n";
-
-  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",
-    "This library is experimental and will likely change or be removed\n"
-    "in future versions.");
-
-  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",
-    "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",
-    "The library is stable. API backwards-compatibility is guaranteed.\n"
-    "However implementation details might change.");
-
-  static const Maturity LOCKED = const Maturity(5, "Locked",
-    "This library will not change except when serious bugs are encountered.");
-
-  static const Maturity UNSPECIFIED = const Maturity(-1, "Unspecified",
-    "The maturity for this library has not been specified.");
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/async.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/async.dart
deleted file mode 100644
index 5d1e2c7..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/async.dart
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Support for asynchronous programming,
- * with classes such as Future and Stream.
- *
- * Understanding [Future]s and [Stream]s is a prerequisite for
- * writing just about any Dart program.
- *
- * To use this library in your code:
- *
- *     import 'dart:async';
- *
- * ## Future
- *
- * A Future object represents a computation whose return value
- * might not yet be available.
- * The Future returns the value of the computation
- * when it completes at some time in the future.
- * Futures are often used for potentially lengthy computations
- * such as I/O and interaction with users.
- *
- * Many methods in the Dart libraries return Futures when
- * performing tasks. For example, when binding an HttpServer
- * to a host and port, the `bind()` method returns a Future.
- *
- *      HttpServer.bind('127.0.0.1', 4444)
- *          .then((server) => print('${server.isBroadcast}'))
- *          .catchError(print);
- *
- * [Future.then] registers a callback function that runs
- * when the Future's operation, in this case the `bind()` method,
- * completes successfully.
- * The value returned by the operation
- * is passed into the callback function.
- * In this example, the `bind()` method returns the HttpServer
- * object. The callback function prints one of its properties.
- * [Future.catchError] registers a callback function that
- * runs if an error occurs within the Future.
- *
- * ## Stream
- *
- * A Stream provides an asynchronous sequence of data.
- * Examples of data sequences include individual events, like mouse clicks,
- * or sequential chunks of larger data, like multiple byte lists with the
- * contents of a file
- * such as mouse clicks, and a stream of byte lists read from a file.
- * The following example opens a file for reading.
- * [Stream.listen] registers a callback function that runs
- * each time more data is available.
- *
- *     Stream<List<int>> stream = new File('quotes.txt').openRead();
- *     stream.transform(UTF8.decoder).listen(print);
- *
- * The stream emits a sequence of a list of bytes.
- * The program must interpret the bytes or handle the raw byte data.
- * Here, the code uses a UTF8 decoder (provided in the `dart:convert` library)
- * to convert the sequence of bytes into a sequence
- * of Dart strings.
- *
- * Another common use of streams is for user-generated events
- * in a web app: The following code listens for mouse clicks on a button.
- *
- *     querySelector('#myButton').onClick.listen((_) => print('Click.'));
- *
- * ## Other resources
- *
- * * The [dart:async section of the library tour][asynchronous-programming]:
- *   A brief overview of asynchronous programming.
- *
- * * [Use Future-Based APIs][futures-tutorial]: A closer look at Futures and
- *   how to use them to write asynchronous Dart code.
- *
- * * [Futures and Error Handling][futures-error-handling]: Everything you
- *   wanted to know about handling errors and exceptions when working with
- *   Futures (but were afraid to ask).
- *
- * * [The Event Loop and Dart](https://www.dartlang.org/articles/event-loop/):
- *   Learn how Dart handles the event queue and microtask queue, so you can
- *   write better asynchronous code with fewer surprises.
- *
- * * [test package: Asynchronous Tests][test-readme]: How to test asynchronous
- *   code.
- *
- * [asynchronous-programming]: https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartasync---asynchronous-programming
- * [futures-tutorial]: https://www.dartlang.org/docs/tutorials/futures/
- * [futures-error-handling]: https://www.dartlang.org/articles/futures-and-error-handling/
- * [test-readme]: https://pub.dartlang.org/packages/test
- */
-library dart.async;
-
-import "dart:collection";
-import "dart:_internal" show printToZone, printToConsole,
-                             IterableElementError;
-
-part 'async_error.dart';
-part 'broadcast_stream_controller.dart';
-part 'deferred_load.dart';
-part 'future.dart';
-part 'future_impl.dart';
-part 'schedule_microtask.dart';
-part 'stream.dart';
-part 'stream_controller.dart';
-part 'stream_impl.dart';
-part 'stream_pipe.dart';
-part 'stream_transformers.dart';
-part 'timer.dart';
-part 'zone.dart';
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/async_error.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/async_error.dart
deleted file mode 100644
index 5378885..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/async_error.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-_invokeErrorHandler(Function errorHandler,
-                    Object error, StackTrace stackTrace) {
-  if (errorHandler is ZoneBinaryCallback) {
-    return errorHandler(error, stackTrace);
-  } else {
-    ZoneUnaryCallback unaryErrorHandler = errorHandler;
-    return unaryErrorHandler(error);
-  }
-}
-
-Function _registerErrorHandler/*<R>*/(Function errorHandler, Zone zone) {
-  if (errorHandler is ZoneBinaryCallback) {
-    // TODO(leafp): These are commented out, because the async libraries
-    // pass a (...) -> void into this function which fails whenever R
-    // is something interesting.  This needs to be sorted out in the main
-    // SDK as to what the intent is here: if this is really supposed to
-    // return an R, then the function that gets passed in is wrong.  If not,
-    // then this code doesn't need to track the return type at all.
-    //    return zone.registerBinaryCallback/*<R, dynamic, StackTrace>*/(
-    //        errorHandler as dynamic/*=ZoneBinaryCallback<R, dynamic, StackTrace>*/);
-    return zone.registerBinaryCallback/*<dynamic, dynamic, StackTrace>*/(
-        errorHandler as dynamic/*=ZoneBinaryCallback<dynamic, dynamic, StackTrace>*/);
-  } else {
-    //    return zone.registerUnaryCallback/*<R, dynamic>*/(
-    //        errorHandler as dynamic/*=ZoneUnaryCallback<R, dynamic>*/);
-    return zone.registerUnaryCallback/*<dynamic, dynamic>*/(
-        errorHandler as dynamic/*=ZoneUnaryCallback<dynamic, dynamic>*/);
-  }
-}
-
-class _UncaughtAsyncError extends AsyncError {
-  _UncaughtAsyncError(error, StackTrace stackTrace)
-      : super(error, _getBestStackTrace(error, stackTrace));
-
-  static StackTrace _getBestStackTrace(error, StackTrace stackTrace) {
-    if (stackTrace != null) return stackTrace;
-    if (error is Error) {
-      return error.stackTrace;
-    }
-    return null;
-  }
-
-  String toString() {
-    String result = "Uncaught Error: ${error}";
-
-    if (stackTrace != null) {
-      result += "\nStack Trace:\n$stackTrace";
-    }
-    return result;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/broadcast_stream_controller.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/broadcast_stream_controller.dart
deleted file mode 100644
index c34ec9f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/broadcast_stream_controller.dart
+++ /dev/null
@@ -1,544 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-class _BroadcastStream<T> extends _ControllerStream<T> {
-  _BroadcastStream(_StreamControllerLifecycle<T> controller)
-      : super(controller);
-
-  bool get isBroadcast => true;
-}
-
-class _BroadcastSubscription<T> extends _ControllerSubscription<T> {
-  static const int _STATE_EVENT_ID = 1;
-  static const int _STATE_FIRING = 2;
-  static const int _STATE_REMOVE_AFTER_FIRING = 4;
-  // TODO(lrn): Use the _state field on _ControllerSubscription to
-  // also store this state. Requires that the subscription implementation
-  // does not assume that it's use of the state integer is the only use.
-  int _eventState = 0;  // Initialized to help dart2js type inference.
-
-  _BroadcastSubscription<T> _next;
-  _BroadcastSubscription<T> _previous;
-
-  _BroadcastSubscription(_StreamControllerLifecycle<T> controller,
-                         void onData(T data),
-                         Function onError,
-                         void onDone(),
-                         bool cancelOnError)
-      : super(controller, onData, onError, onDone, cancelOnError) {
-    _next = _previous = this;
-  }
-
-  bool _expectsEvent(int eventId) =>
-      (_eventState & _STATE_EVENT_ID) == eventId;
-
-  void _toggleEventId() {
-    _eventState ^= _STATE_EVENT_ID;
-  }
-
-  bool get _isFiring => (_eventState & _STATE_FIRING) != 0;
-
-  void _setRemoveAfterFiring() {
-    assert(_isFiring);
-    _eventState |= _STATE_REMOVE_AFTER_FIRING;
-  }
-
-  bool get _removeAfterFiring =>
-      (_eventState & _STATE_REMOVE_AFTER_FIRING) != 0;
-
-  // The controller._recordPause doesn't do anything for a broadcast controller,
-  // so we don't bother calling it.
-  void _onPause() { }
-
-  // The controller._recordResume doesn't do anything for a broadcast
-  // controller, so we don't bother calling it.
-  void _onResume() { }
-
-  // _onCancel is inherited.
-}
-
-abstract class _BroadcastStreamController<T>
-    implements StreamController<T>,
-               _StreamControllerLifecycle<T>,
-               _EventSink<T>,
-               _EventDispatch<T> {
-  static const int _STATE_INITIAL = 0;
-  static const int _STATE_EVENT_ID = 1;
-  static const int _STATE_FIRING = 2;
-  static const int _STATE_CLOSED = 4;
-  static const int _STATE_ADDSTREAM = 8;
-
-  ControllerCallback onListen;
-  ControllerCancelCallback onCancel;
-
-  // State of the controller.
-  int _state;
-
-  // Double-linked list of active listeners.
-  _BroadcastSubscription<T> _firstSubscription;
-  _BroadcastSubscription<T> _lastSubscription;
-
-  // Extra state used during an [addStream] call.
-  _AddStreamState<T> _addStreamState;
-
-  /**
-   * Future returned by [close] and [done].
-   *
-   * The future is completed whenever the done event has been sent to all
-   * relevant listeners.
-   * The relevant listeners are the ones that were listening when [close] was
-   * called. When all of these have been canceled (sending the done event makes
-   * them cancel, but they can also be canceled before sending the event),
-   * this future completes.
-   *
-   * Any attempt to listen after calling [close] will throw, so there won't
-   * be any further listeners.
-   */
-  _Future _doneFuture;
-
-  _BroadcastStreamController(this.onListen, this.onCancel)
-      : _state = _STATE_INITIAL;
-
-  ControllerCallback get onPause {
-    throw new UnsupportedError(
-        "Broadcast stream controllers do not support pause callbacks");
-  }
-
-  void set onPause(void onPauseHandler()) {
-    throw new UnsupportedError(
-        "Broadcast stream controllers do not support pause callbacks");
-  }
-
-  ControllerCallback get onResume {
-    throw new UnsupportedError(
-        "Broadcast stream controllers do not support pause callbacks");
-  }
-
-  void set onResume(void onResumeHandler())  {
-    throw new UnsupportedError(
-        "Broadcast stream controllers do not support pause callbacks");
-  }
-
-  // StreamController interface.
-
-  Stream<T> get stream => new _BroadcastStream<T>(this);
-
-  StreamSink<T> get sink => new _StreamSinkWrapper<T>(this);
-
-  bool get isClosed => (_state & _STATE_CLOSED) != 0;
-
-  /**
-   * A broadcast controller is never paused.
-   *
-   * Each receiving stream may be paused individually, and they handle their
-   * own buffering.
-   */
-  bool get isPaused => false;
-
-  /** Whether there are currently one or more subscribers. */
-  bool get hasListener => !_isEmpty;
-
-  /**
-   * Test whether the stream has exactly one listener.
-   *
-   * Assumes that the stream has a listener (not [_isEmpty]).
-   */
-  bool get _hasOneListener {
-    assert(!_isEmpty);
-    return identical(_firstSubscription, _lastSubscription);
-  }
-
-  /** Whether an event is being fired (sent to some, but not all, listeners). */
-  bool get _isFiring => (_state & _STATE_FIRING) != 0;
-
-  bool get _isAddingStream => (_state & _STATE_ADDSTREAM) != 0;
-
-  bool get _mayAddEvent => (_state < _STATE_CLOSED);
-
-  _Future _ensureDoneFuture() {
-    if (_doneFuture != null) return _doneFuture;
-    return _doneFuture = new _Future();
-  }
-
-  // Linked list helpers
-
-  bool get _isEmpty => _firstSubscription == null;
-
-  /** Adds subscription to linked list of active listeners. */
-  void _addListener(_BroadcastSubscription<T> subscription) {
-    assert(identical(subscription._next, subscription));
-    subscription._eventState = (_state & _STATE_EVENT_ID);
-    // Insert in linked list as last subscription.
-    _BroadcastSubscription<T> oldLast = _lastSubscription;
-    _lastSubscription = subscription;
-    subscription._next = null;
-    subscription._previous = oldLast;
-    if (oldLast == null) {
-      _firstSubscription = subscription;
-    } else {
-      oldLast._next = subscription;
-    }
-  }
-
-  void _removeListener(_BroadcastSubscription<T> subscription) {
-    assert(identical(subscription._controller, this));
-    assert(!identical(subscription._next, subscription));
-    _BroadcastSubscription<T> previous = subscription._previous;
-    _BroadcastSubscription<T> next = subscription._next;
-    if (previous == null) {
-      // This was the first subscription.
-      _firstSubscription = next;
-    } else {
-      previous._next = next;
-    }
-    if (next == null) {
-      // This was the last subscription.
-      _lastSubscription = previous;
-    } else {
-      next._previous = previous;
-    }
-
-    subscription._next = subscription._previous = subscription;
-  }
-
-  // _StreamControllerLifecycle interface.
-
-  StreamSubscription<T> _subscribe(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    if (isClosed) {
-      if (onDone == null) onDone = _nullDoneHandler;
-      return new _DoneStreamSubscription<T>(onDone);
-    }
-    StreamSubscription<T> subscription =
-        new _BroadcastSubscription<T>(this, onData, onError, onDone,
-                                      cancelOnError);
-    _addListener(subscription);
-    if (identical(_firstSubscription, _lastSubscription)) {
-      // Only one listener, so it must be the first listener.
-      _runGuarded(onListen);
-    }
-    return subscription;
-  }
-
-  Future _recordCancel(StreamSubscription<T> sub) {
-    _BroadcastSubscription<T> subscription = sub;
-    // If already removed by the stream, don't remove it again.
-    if (identical(subscription._next, subscription)) return null;
-    if (subscription._isFiring) {
-      subscription._setRemoveAfterFiring();
-    } else {
-      _removeListener(subscription);
-      // If we are currently firing an event, the empty-check is performed at
-      // the end of the listener loop instead of here.
-      if (!_isFiring && _isEmpty) {
-        _callOnCancel();
-      }
-    }
-    return null;
-  }
-
-  void _recordPause(StreamSubscription<T> subscription) {}
-  void _recordResume(StreamSubscription<T> subscription) {}
-
-  // EventSink interface.
-
-  Error _addEventError() {
-    if (isClosed) {
-      return new StateError("Cannot add new events after calling close");
-    }
-    assert(_isAddingStream);
-    return new StateError("Cannot add new events while doing an addStream");
-  }
-
-  void add(T data) {
-    if (!_mayAddEvent) throw _addEventError();
-    _sendData(data);
-  }
-
-  void addError(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
-    if (!_mayAddEvent) throw _addEventError();
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-    if (replacement != null) {
-      error = _nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    _sendError(error, stackTrace);
-  }
-
-  Future close() {
-    if (isClosed) {
-      assert(_doneFuture != null);
-      return _doneFuture;
-    }
-    if (!_mayAddEvent) throw _addEventError();
-    _state |= _STATE_CLOSED;
-    Future doneFuture = _ensureDoneFuture();
-    _sendDone();
-    return doneFuture;
-  }
-
-  Future get done => _ensureDoneFuture();
-
-  Future addStream(Stream<T> stream, {bool cancelOnError: true}) {
-    if (!_mayAddEvent) throw _addEventError();
-    _state |= _STATE_ADDSTREAM;
-    _addStreamState = new _AddStreamState(this, stream, cancelOnError);
-    return _addStreamState.addStreamFuture;
-  }
-
-  // _EventSink interface, called from AddStreamState.
-  void _add(T data) {
-    _sendData(data);
-  }
-
-  void _addError(Object error, StackTrace stackTrace) {
-    _sendError(error, stackTrace);
-  }
-
-  void _close() {
-    assert(_isAddingStream);
-    _AddStreamState addState = _addStreamState;
-    _addStreamState = null;
-    _state &= ~_STATE_ADDSTREAM;
-    addState.complete();
-  }
-
-  // Event handling.
-  void _forEachListener(
-      void action(_BufferingStreamSubscription<T> subscription)) {
-    if (_isFiring) {
-      throw new StateError(
-          "Cannot fire new event. Controller is already firing an event");
-    }
-    if (_isEmpty) return;
-
-    // Get event id of this event.
-    int id = (_state & _STATE_EVENT_ID);
-    // Start firing (set the _STATE_FIRING bit). We don't do [onCancel]
-    // callbacks while firing, and we prevent reentrancy of this function.
-    //
-    // Set [_state]'s event id to the next event's id.
-    // Any listeners added while firing this event will expect the next event,
-    // not this one, and won't get notified.
-    _state ^= _STATE_EVENT_ID | _STATE_FIRING;
-    _BroadcastSubscription<T> subscription = _firstSubscription;
-    while (subscription != null) {
-      if (subscription._expectsEvent(id)) {
-        subscription._eventState |= _BroadcastSubscription._STATE_FIRING;
-        action(subscription);
-        subscription._toggleEventId();
-        _BroadcastSubscription<T> next = subscription._next;
-        if (subscription._removeAfterFiring) {
-          _removeListener(subscription);
-        }
-        subscription._eventState &= ~_BroadcastSubscription._STATE_FIRING;
-        subscription = next;
-      } else {
-        subscription = subscription._next;
-      }
-    }
-    _state &= ~_STATE_FIRING;
-
-    if (_isEmpty) {
-      _callOnCancel();
-    }
-  }
-
-  void _callOnCancel() {
-    assert(_isEmpty);
-    if (isClosed && _doneFuture._mayComplete) {
-      // When closed, _doneFuture is not null.
-      _doneFuture._asyncComplete(null);
-    }
-    _runGuarded(onCancel);
-  }
-}
-
-class _SyncBroadcastStreamController<T> extends _BroadcastStreamController<T>
-                                     implements SynchronousStreamController<T> {
-  _SyncBroadcastStreamController(void onListen(), void onCancel())
-      : super(onListen, onCancel);
-
-  // EventDispatch interface.
-
-  bool get _mayAddEvent => super._mayAddEvent && !_isFiring;
-
-  _addEventError() {
-    if (_isFiring) {
-      return new StateError(
-          "Cannot fire new event. Controller is already firing an event");
-    }
-    return super._addEventError();
-  }
-
-  void _sendData(T data) {
-    if (_isEmpty) return;
-    if (_hasOneListener) {
-      _state |= _BroadcastStreamController._STATE_FIRING;
-      _BroadcastSubscription<T> subscription = _firstSubscription;
-      subscription._add(data);
-      _state &= ~_BroadcastStreamController._STATE_FIRING;
-      if (_isEmpty) {
-        _callOnCancel();
-      }
-      return;
-    }
-    _forEachListener((_BufferingStreamSubscription<T> subscription) {
-      subscription._add(data);
-    });
-  }
-
-  void _sendError(Object error, StackTrace stackTrace) {
-    if (_isEmpty) return;
-    _forEachListener((_BufferingStreamSubscription<T> subscription) {
-      subscription._addError(error, stackTrace);
-    });
-  }
-
-  void _sendDone() {
-    if (!_isEmpty) {
-      _forEachListener((_BufferingStreamSubscription<T> subscription) {
-        subscription._close();
-      });
-    } else {
-      assert(_doneFuture != null);
-      assert(_doneFuture._mayComplete);
-      _doneFuture._asyncComplete(null);
-    }
-  }
-}
-
-class _AsyncBroadcastStreamController<T> extends _BroadcastStreamController<T> {
-  _AsyncBroadcastStreamController(void onListen(), void onCancel())
-      : super(onListen, onCancel);
-
-  // EventDispatch interface.
-
-  void _sendData(T data) {
-    for (_BroadcastSubscription<T> subscription = _firstSubscription;
-         subscription != null;
-         subscription = subscription._next) {
-      subscription._addPending(new _DelayedData<T>(data));
-    }
-  }
-
-  void _sendError(Object error, StackTrace stackTrace) {
-    for (_BroadcastSubscription<T> subscription = _firstSubscription;
-         subscription != null;
-         subscription = subscription._next) {
-      subscription._addPending(new _DelayedError(error, stackTrace));
-    }
-  }
-
-  void _sendDone() {
-    if (!_isEmpty) {
-      for (_BroadcastSubscription<T> subscription = _firstSubscription;
-           subscription != null;
-           subscription = subscription._next) {
-        subscription._addPending(const _DelayedDone());
-      }
-    } else {
-      assert(_doneFuture != null);
-      assert(_doneFuture._mayComplete);
-      _doneFuture._asyncComplete(null);
-    }
-  }
-}
-
-/**
- * Stream controller that is used by [Stream.asBroadcastStream].
- *
- * This stream controller allows incoming events while it is firing
- * other events. This is handled by delaying the events until the
- * current event is done firing, and then fire the pending events.
- *
- * This class extends [_SyncBroadcastStreamController]. Events of
- * an "asBroadcastStream" stream are always initiated by events
- * on another stream, and it is fine to forward them synchronously.
- */
-class _AsBroadcastStreamController<T>
-    extends _SyncBroadcastStreamController<T>
-    implements _EventDispatch<T> {
-  _StreamImplEvents<T> _pending;
-
-  _AsBroadcastStreamController(void onListen(), void onCancel())
-      : super(onListen, onCancel);
-
-  bool get _hasPending => _pending != null && ! _pending.isEmpty;
-
-  void _addPendingEvent(_DelayedEvent event) {
-    if (_pending == null) {
-      _pending = new _StreamImplEvents<T>();
-    }
-    _pending.add(event);
-  }
-
-  void add(T data) {
-    if (!isClosed && _isFiring) {
-      _addPendingEvent(new _DelayedData<T>(data));
-      return;
-    }
-    super.add(data);
-    while (_hasPending) {
-      _pending.handleNext(this);
-    }
-  }
-
-  void addError(Object error, [StackTrace stackTrace]) {
-    if (!isClosed && _isFiring) {
-      _addPendingEvent(new _DelayedError(error, stackTrace));
-      return;
-    }
-    if (!_mayAddEvent) throw _addEventError();
-    _sendError(error, stackTrace);
-    while (_hasPending) {
-      _pending.handleNext(this);
-    }
-  }
-
-  Future close() {
-    if (!isClosed && _isFiring) {
-      _addPendingEvent(const _DelayedDone());
-      _state |= _BroadcastStreamController._STATE_CLOSED;
-      return super.done;
-    }
-    Future result = super.close();
-    assert(!_hasPending);
-    return result;
-  }
-
-  void _callOnCancel() {
-    if (_hasPending) {
-      _pending.clear();
-      _pending = null;
-    }
-    super._callOnCancel();
-  }
-}
-
-// A subscription that never receives any events.
-// It can simulate pauses, but otherwise does nothing.
-class _DoneSubscription<T> implements StreamSubscription<T> {
-  int _pauseCount = 0;
-  void onData(void handleData(T data)) {}
-  void onError(Function handleError) {}
-  void onDone(void handleDone()) {}
-  void pause([Future resumeSignal]) {
-    if (resumeSignal != null) resumeSignal.then(_resume);
-    _pauseCount++;
-  }
-  void resume() { _resume(null); }
-  void _resume(_) {
-    if (_pauseCount > 0) _pauseCount--;
-  }
-  Future cancel() { return new _Future.immediate(null); }
-  bool get isPaused => _pauseCount > 0;
-  Future/*<E>*/ asFuture/*<E>*/([Object/*=E*/ value]) => new _Future/*<E>*/();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/deferred_load.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/deferred_load.dart
deleted file mode 100644
index 9d5c51f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/deferred_load.dart
+++ /dev/null
@@ -1,36 +0,0 @@
-// 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.
-
-part of dart.async;
-
-/**
- * Indicates that loading of [libraryName] is deferred.
- *
- * This class is obsolete. Instead use the syntax:
- * import "library.dart" deferred as prefix;
- */
-@Deprecated("Dart sdk v. 1.8")
-class DeferredLibrary {
-  final String libraryName;
-  final String uri;
-
-  const DeferredLibrary(this.libraryName, {this.uri});
-
-  /**
-   * Ensure that [libraryName] has been loaded.
-   *
-   * If the library fails to load, the Future will complete with a
-   * DeferredLoadException.
-   */
-  external Future<Null> load();
-}
-
-/**
- * Thrown when a deferred library fails to load.
- */
-class DeferredLoadException implements Exception {
-  DeferredLoadException(String this._s);
-  String toString() => "DeferredLoadException: '$_s'";
-  final String _s;
-}
\ No newline at end of file
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart
deleted file mode 100644
index 5b570c6..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/future.dart
+++ /dev/null
@@ -1,829 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-/// A type representing values that are either `Future<T>` or `T`.
-///
-/// This class declaration is a public stand-in for an internal
-/// future-or-value generic type. References to this class are resolved to the
-/// internal type.
-///
-/// It is a compile-time error for any class to extend, mix in or implement
-/// `FutureOr`.
-///
-/// Note: the `FutureOr<T>` type is interpreted as `dynamic` in non strong-mode.
-///
-/// # Examples
-/// ``` dart
-/// // The `Future<T>.then` function takes a callback [f] that returns either
-/// // an `S` or a `Future<S>`.
-/// Future<S> then<S>(FutureOr<S> f(T x), ...);
-///
-/// // `Completer<T>.complete` takes either a `T` or `Future<T>`.
-/// void complete(FutureOr<T> value);
-/// ```
-///
-/// # Advanced
-/// The `FutureOr<int>` type is actually the "type union" of the types `int` and
-/// `Future<int>`. This type union is defined in such a way that
-/// `FutureOr<Object>` is both a super- and sub-type of `Object` (sub-type
-/// because `Object` is one of the types of the union, super-type because
-/// `Object` is a super-type of both of the types of the union). Together it
-/// means that `FutureOr<Object>` is equivalent to `Object`.
-///
-/// As a corollary, `FutureOr<Object>` is equivalent to
-/// `FutureOr<FutureOr<Object>>`, `FutureOr<Future<Object>> is equivalent to
-/// `Future<Object>`.
-abstract class FutureOr<T> {
-  // Private constructor, so that it is not subclassable, mixable, or
-  // instantiable.
-  FutureOr._() {
-    throw new UnsupportedError("FutureOr can't be instantiated");
-  }
-}
-
-/**
- * An object representing a delayed computation.
- *
- * A [Future] is used to represent a potential value, or error,
- * that will be available at some time in the future.
- * Receivers of a [Future] can register callbacks
- * that handle the value or error once it is available.
- * For example:
- *
- *     Future<int> future = getFuture();
- *     future.then((value) => handleValue(value))
- *           .catchError((error) => handleError(error));
- *
- * A [Future] can complete in two ways:
- * with a value ("the future succeeds")
- * or with an error ("the future fails").
- * Users can install callbacks for each case.
- * The result of registering a pair of callbacks is a new Future (the
- * "successor") which in turn is completed with the result of invoking the
- * corresponding callback.
- * The successor is completed with an error if the invoked callback throws.
- * For example:
- *
- *     Future<int> successor = future.then((int value) {
- *         // Invoked when the future is completed with a value.
- *         return 42;  // The successor is completed with the value 42.
- *       },
- *       onError: (e) {
- *         // Invoked when the future is completed with an error.
- *         if (canHandle(e)) {
- *           return 499;  // The successor is completed with the value 499.
- *         } else {
- *           throw e;  // The successor is completed with the error e.
- *         }
- *       });
- *
- * If a future does not have a successor when it completes with an error,
- * it forwards the error message to the global error-handler.
- * This behavior makes sure that no error is silently dropped.
- * However, it also means that error handlers should be installed early,
- * so that they are present as soon as a future is completed with an error.
- * The following example demonstrates this potential bug:
- *
- *     var future = getFuture();
- *     new Timer(new Duration(milliseconds: 5), () {
- *       // The error-handler is not attached until 5 ms after the future has
- *       // been received. If the future fails before that, the error is
- *       // forwarded to the global error-handler, even though there is code
- *       // (just below) to eventually handle the error.
- *       future.then((value) { useValue(value); },
- *                   onError: (e) { handleError(e); });
- *     });
- *
- * When registering callbacks, it's often more readable to register the two
- * callbacks separately, by first using [then] with one argument
- * (the value handler) and using a second [catchError] for handling errors.
- * Each of these will forward the result that they don't handle
- * to their successors, and together they handle both value and error result.
- * It also has the additional benefit of the [catchError] handling errors in the
- * [then] value callback too.
- * Using sequential handlers instead of parallel ones often leads to code that
- * is easier to reason about.
- * It also makes asynchronous code very similar to synchronous code:
- *
- *     // Synchronous code.
- *     try {
- *       int value = foo();
- *       return bar(value);
- *     } catch (e) {
- *       return 499;
- *     }
- *
- * Equivalent asynchronous code, based on futures:
- *
- *     Future<int> future = new Future(foo);  // Result of foo() as a future.
- *     future.then((int value) => bar(value))
- *           .catchError((e) => 499);
- *
- * Similar to the synchronous code, the error handler (registered with
- * [catchError]) is handling any errors thrown by either `foo` or `bar`.
- * If the error-handler had been registered as the `onError` parameter of
- * the `then` call, it would not catch errors from the `bar` call.
- *
- * Futures can have more than one callback-pair registered. Each successor is
- * treated independently and is handled as if it was the only successor.
- *
- * A future may also fail to ever complete. In that case, no callbacks are
- * called.
- */
-abstract class Future<T> {
-  // The `_nullFuture` is a completed Future with the value `null`.
-  static final _Future _nullFuture = new Future.value(null);
-
-  /**
-   * Creates a future containing the result of calling [computation]
-   * asynchronously with [Timer.run].
-   *
-   * If the result of executing [computation] throws, the returned future is
-   * completed with the error.
-   *
-   * If the returned value is itself a [Future], completion of
-   * the created future will wait until the returned future completes,
-   * and will then complete with the same result.
-   *
-   * If a non-future value is returned, the returned future is completed
-   * with that value.
-   */
-  factory Future(computation()) {
-    _Future<T> result = new _Future<T>();
-    Timer.run(() {
-      try {
-        result._complete(computation());
-      } catch (e, s) {
-        _completeWithErrorCallback(result, e, s);
-      }
-    });
-    return result;
-  }
-
-  /**
-   * Creates a future containing the result of calling [computation]
-   * asynchronously with [scheduleMicrotask].
-   *
-   * If executing [computation] throws,
-   * the returned future is completed with the thrown error.
-   *
-   * If calling [computation] returns a [Future], completion of
-   * the created future will wait until the returned future completes,
-   * and will then complete with the same result.
-   *
-   * If calling [computation] returns a non-future value,
-   * the returned future is completed with that value.
-   */
-  factory Future.microtask(computation()) {
-    _Future<T> result = new _Future<T>();
-    scheduleMicrotask(() {
-      try {
-        result._complete(computation());
-      } catch (e, s) {
-        _completeWithErrorCallback(result, e, s);
-      }
-    });
-    return result;
-  }
-
-  /**
-   * Creates a future containing the result of immediately calling
-   * [computation].
-   *
-   * If calling [computation] throws, the returned future is completed with the
-   * error.
-   *
-   * If calling [computation] returns a [Future], completion of
-   * the created future will wait until the returned future completes,
-   * and will then complete with the same result.
-   *
-   * If calling [computation] returns a non-future value,
-   * the returned future is completed with that value.
-   */
-  factory Future.sync(computation()) {
-    try {
-      var result = computation();
-      return new Future<T>.value(result);
-    } catch (error, stackTrace) {
-      return new Future<T>.error(error, stackTrace);
-    }
-  }
-
-  /**
-   * A future whose value is available in the next event-loop iteration.
-   *
-   * If [value] is not a [Future], using this constructor is equivalent
-   * to [:new Future<T>.sync(() => value):].
-   *
-   * Use [Completer] to create a Future and complete it later.
-   */
-  factory Future.value([value]) {
-    return new _Future<T>.immediate(value);
-  }
-
-  /**
-   * A future that completes with an error in the next event-loop iteration.
-   *
-   * If [error] is `null`, it is replaced by a [NullThrownError].
-   *
-   * Use [Completer] to create a future and complete it later.
-   */
-  factory Future.error(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
-    if (!identical(Zone.current, _ROOT_ZONE)) {
-      AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-      if (replacement != null) {
-        error = _nonNullError(replacement.error);
-        stackTrace = replacement.stackTrace;
-      }
-    }
-    return new _Future<T>.immediateError(error, stackTrace);
-  }
-
-  /**
-   * Creates a future that runs its computation after a delay.
-   *
-   * The [computation] will be executed after the given [duration] has passed,
-   * and the future is completed with the result.
-   * If the duration is 0 or less,
-   * it completes no sooner than in the next event-loop iteration.
-   *
-   * If [computation] is omitted,
-   * it will be treated as if [computation] was set to `() => null`,
-   * and the future will eventually complete with the `null` value.
-   *
-   * If calling [computation] throws, the created future will complete with the
-   * error.
-   *
-   * See also [Completer] for a way to create and complete a future at a
-   * later time that isn't necessarily after a known fixed duration.
-   */
-  factory Future.delayed(Duration duration, [computation()]) {
-    _Future<T> result = new _Future<T>();
-    new Timer(duration, () {
-      try {
-        result._complete(computation?.call());
-      } catch (e, s) {
-        _completeWithErrorCallback(result, e, s);
-      }
-    });
-    return result;
-  }
-
-  /**
-   * Wait for all the given futures to complete and collect their values.
-   *
-   * Returns a future which will complete once all the futures in a list are
-   * complete. If any of the futures in the list completes with an error,
-   * the resulting future also completes with an error. Otherwise the value
-   * of the returned future will be a list of all the values that were
-   * produced.
-   *
-   * If `eagerError` is true, the future completes with an error immediately on
-   * the first error from one of the futures. Otherwise all futures must
-   * complete before the returned future is completed (still with the first
-   * error to occur, the remaining errors are silently dropped).
-   *
-   * If [cleanUp] is provided, in the case of an error, any non-null result of
-   * a successful future is passed to `cleanUp`, which can then release any
-   * resources that the successful operation allocated.
-   *
-   * The call to `cleanUp` should not throw. If it does, the error will be an
-   * uncaught asynchronous error.
-   */
-  static Future<List<T>> wait<T>(Iterable<Future<T>> futures,
-                           {bool eagerError: false,
-                            void cleanUp(T successValue)}) {
-    final _Future<List<T>> result = new _Future<List<T>>();
-    List<T> values;  // Collects the values. Set to null on error.
-    int remaining = 0;  // How many futures are we waiting for.
-    var error;   // The first error from a future.
-    StackTrace stackTrace;  // The stackTrace that came with the error.
-
-    // Handle an error from any of the futures.
-    void handleError(theError, theStackTrace) {
-      remaining--;
-      if (values != null) {
-        if (cleanUp != null) {
-          for (var value in values) {
-            if (value != null) {
-              // Ensure errors from cleanUp are uncaught.
-              new Future.sync(() { cleanUp(value); });
-            }
-          }
-        }
-        values = null;
-        if (remaining == 0 || eagerError) {
-          result._completeError(theError, theStackTrace);
-        } else {
-          error = theError;
-          stackTrace = theStackTrace;
-        }
-      } else if (remaining == 0 && !eagerError) {
-        result._completeError(error, stackTrace);
-      }
-    }
-
-    try {
-      // As each future completes, put its value into the corresponding
-      // position in the list of values.
-      for (Future future in futures) {
-        int pos = remaining;
-        future.then((T value) {
-          remaining--;
-          if (values != null) {
-            values[pos] = value;
-            if (remaining == 0) {
-              result._completeWithValue(values);
-            }
-          } else {
-            if (cleanUp != null && value != null) {
-              // Ensure errors from cleanUp are uncaught.
-              new Future.sync(() { cleanUp(value); });
-            }
-            if (remaining == 0 && !eagerError) {
-              result._completeError(error, stackTrace);
-            }
-          }
-        }, onError: handleError);
-        // Increment the 'remaining' after the call to 'then'.
-        // If that call throws, we don't expect any future callback from
-        // the future, and we also don't increment remaining.
-        remaining++;
-      }
-      if (remaining == 0) {
-        return new Future.value(const []);
-      }
-      values = new List<T>(remaining);
-    } catch (e, st) {
-      // The error must have been thrown while iterating over the futures
-      // list, or while installing a callback handler on the future.
-      if (remaining == 0 || eagerError) {
-        // Throw a new Future.error.
-        // Don't just call `result._completeError` since that would propagate
-        // the error too eagerly, not giving the callers time to install
-        // error handlers.
-        // Also, don't use `_asyncCompleteError` since that one doesn't give
-        // zones the chance to intercept the error.
-        return new Future.error(e, st);
-      } else {
-        // Don't allocate a list for values, thus indicating that there was an
-        // error.
-        // Set error to the caught exception.
-        error = e;
-        stackTrace = st;
-      }
-    }
-    return result;
-  }
-
-  /**
-   * Returns the result of the first future in [futures] to complete.
-   *
-   * The returned future is completed with the result of the first
-   * future in [futures] to report that it is complete.
-   * The results of all the other futures are discarded.
-   *
-   * If [futures] is empty, or if none of its futures complete,
-   * the returned future never completes.
-   */
-  static Future<T> any<T>(Iterable<Future<T>> futures) {
-    var completer = new Completer<T>.sync();
-    var onValue = (T value) {
-      if (!completer.isCompleted) completer.complete(value);
-    };
-    var onError = (error, stack) {
-      if (!completer.isCompleted) completer.completeError(error, stack);
-    };
-    for (var future in futures) {
-      future.then(onValue, onError: onError);
-    }
-    return completer.future;
-  }
-
-
-  /**
-   * Perform an async operation for each element of the iterable, in turn.
-   *
-   * Runs [f] for each element in [input] in order, moving to the next element
-   * only when the [Future] returned by [f] completes. Returns a [Future] that
-   * completes when all elements have been processed.
-   *
-   * The return values of all [Future]s are discarded. Any errors will cause the
-   * iteration to stop and will be piped through the returned [Future].
-   *
-   * If [f] returns a non-[Future], iteration continues immediately. Otherwise
-   * it waits for the returned [Future] to complete.
-   */
-  static Future forEach<T>(Iterable<T> input, f(T element)) {
-    var iterator = input.iterator;
-    return doWhile(() {
-      if (!iterator.moveNext()) return false;
-      return new Future.sync(() => f(iterator.current)).then((_) => true);
-    });
-  }
-
-  /**
-   * Performs an async operation repeatedly until it returns `false`.
-   *
-   * The function [f] is called repeatedly while it returns either the [bool]
-   * value `true` or a [Future] which completes with the value `true`.
-   *
-   * If a call to [f] returns `false` or a [Future] that completes to `false`,
-   * iteration ends and the future returned by [doWhile] is completed.
-   *
-   * If a future returned by [f] completes with an error, iteration ends and
-   * the future returned by [doWhile] completes with the same error.
-   *
-   * The [f] function must return either a `bool` value or a [Future] completing
-   * with a `bool` value.
-   */
-  static Future doWhile(f()) {
-    _Future doneSignal = new _Future();
-    var nextIteration;
-    // Bind this callback explicitly so that each iteration isn't bound in the
-    // context of all the previous iterations' callbacks.
-    nextIteration = Zone.current.bindUnaryCallback((bool keepGoing) {
-      if (keepGoing) {
-        new Future.sync(f).then(nextIteration,
-                                onError: doneSignal._completeError);
-      } else {
-        doneSignal._complete(null);
-      }
-    }, runGuarded: true);
-    nextIteration(true);
-    return doneSignal;
-  }
-
-  /**
-   * Register callbacks to be called when this future completes.
-   *
-   * When this future completes with a value,
-   * the [onValue] callback will be called with that value.
-   * If this future is already completed, the callback will not be called
-   * immediately, but will be scheduled in a later microtask.
-   *
-   * If [onError] is provided, and this future completes with an error,
-   * the `onError` callback is called with that error and its stack trace.
-   * The `onError` callback must accept either one argument or two arguments.
-   * If `onError` accepts two arguments,
-   * it is called with both the error and the stack trace,
-   * otherwise it is called with just the error object.
-   *
-   * Returns a new [Future]
-   * which is completed with the result of the call to `onValue`
-   * (if this future completes with a value)
-   * or to `onError` (if this future completes with an error).
-   *
-   * If the invoked callback throws,
-   * the returned future is completed with the thrown error
-   * and a stack trace for the error.
-   * In the case of `onError`,
-   * if the exception thrown is `identical` to the error argument to `onError`,
-   * the throw is considered a rethrow,
-   * and the original stack trace is used instead.
-   *
-   * If the callback returns a [Future],
-   * the future returned by `then` will be completed with
-   * the same result as the future returned by the callback.
-   *
-   * If [onError] is not given, and this future completes with an error,
-   * the error is forwarded directly to the returned future.
-   *
-   * In most cases, it is more readable to use [catchError] separately, possibly
-   * with a `test` parameter, instead of handling both value and error in a
-   * single [then] call.
-   */
-  Future<S> then<S>(FutureOr<S> onValue(T value), { Function onError });
-
-  /**
-   * Handles errors emitted by this [Future].
-   *
-   * This is the asynchronous equivalent of a "catch" block.
-   *
-   * Returns a new [Future] that will be completed with either the result of
-   * this future or the result of calling the `onError` callback.
-   *
-   * If this future completes with a value,
-   * the returned future completes with the same value.
-   *
-   * If this future completes with an error,
-   * then [test] is first called with the error value.
-   *
-   * If `test` returns false, the exception is not handled by this `catchError`,
-   * and the returned future completes with the same error and stack trace
-   * as this future.
-   *
-   * If `test` returns `true`,
-   * [onError] is called with the error and possibly stack trace,
-   * and the returned future is completed with the result of this call
-   * in exactly the same way as for [then]'s `onError`.
-   *
-   * If `test` is omitted, it defaults to a function that always returns true.
-   * The `test` function should not throw, but if it does, it is handled as
-   * if the `onError` function had thrown.
-   *
-   * Example:
-   *
-   *     foo
-   *       .catchError(..., test: (e) => e is ArgumentError)
-   *       .catchError(..., test: (e) => e is NoSuchMethodError)
-   *       .then((v) { ... });
-   *
-   * This method is equivalent to:
-   *
-   *     Future catchError(onError(error),
-   *                       {bool test(error)}) {
-   *       this.then((v) => v,  // Forward the value.
-   *                 // But handle errors, if the [test] succeeds.
-   *                 onError: (e, stackTrace) {
-   *                   if (test == null || test(e)) {
-   *                     if (onError is ZoneBinaryCallback) {
-   *                       return onError(e, stackTrace);
-   *                     }
-   *                     return onError(e);
-   *                   }
-   *                   throw e;
-   *                 });
-   *     }
-   *
-   */
-  // The `Function` below can stand for several types:
-  // - (dynamic) -> T
-  // - (dynamic, StackTrace) -> T
-  // - (dynamic) -> Future<T>
-  // - (dynamic, StackTrace) -> Future<T>
-  // Given that there is a `test` function that is usually used to do an
-  // `isCheck` we should also expect functions that take a specific argument.
-  // Note: making `catchError` return a `Future<T>` in non-strong mode could be
-  // a breaking change.
-  Future<T> catchError(Function onError,
-                           {bool test(Object error)});
-
-  /**
-   * Register a function to be called when this future completes.
-   *
-   * The [action] function is called when this future completes, whether it
-   * does so with a value or with an error.
-   *
-   * This is the asynchronous equivalent of a "finally" block.
-   *
-   * The future returned by this call, `f`, will complete the same way
-   * as this future unless an error occurs in the [action] call, or in
-   * a [Future] returned by the [action] call. If the call to [action]
-   * does not return a future, its return value is ignored.
-   *
-   * If the call to [action] throws, then `f` is completed with the
-   * thrown error.
-   *
-   * If the call to [action] returns a [Future], `f2`, then completion of
-   * `f` is delayed until `f2` completes. If `f2` completes with
-   * an error, that will be the result of `f` too. The value of `f2` is always
-   * ignored.
-   *
-   * This method is equivalent to:
-   *
-   *     Future<T> whenComplete(action()) {
-   *       return this.then((v) {
-   *         var f2 = action();
-   *         if (f2 is Future) return f2.then((_) => v);
-   *         return v
-   *       }, onError: (e) {
-   *         var f2 = action();
-   *         if (f2 is Future) return f2.then((_) { throw e; });
-   *         throw e;
-   *       });
-   *     }
-   */
-  Future<T> whenComplete(action());
-
-  /**
-   * Creates a [Stream] containing the result of this future.
-   *
-   * The stream will produce single data or error event containing the
-   * completion result of this future, and then it will close with a
-   * done event.
-   *
-   * If the future never completes, the stream will not produce any events.
-   */
-  Stream<T> asStream();
-
-  /**
-   * Time-out the future computation after [timeLimit] has passed.
-   *
-   * Returns a new future that completes with the same value as this future,
-   * if this future completes in time.
-   *
-   * If this future does not complete before `timeLimit` has passed,
-   * the [onTimeout] action is executed instead, and its result (whether it
-   * returns or throws) is used as the result of the returned future.
-   * The [onTimeout] function must return a [T] or a `Future<T>`.
-   *
-   * If `onTimeout` is omitted, a timeout will cause the returned future to
-   * complete with a [TimeoutException].
-   */
-  Future<T> timeout(Duration timeLimit, {onTimeout()});
-}
-
-/**
- * Thrown when a scheduled timeout happens while waiting for an async result.
- */
-class TimeoutException implements Exception {
-  /** Description of the cause of the timeout. */
-  final String message;
-  /** The duration that was exceeded. */
-  final Duration duration;
-
-  TimeoutException(this.message, [this.duration]);
-
-  String toString() {
-    String result = "TimeoutException";
-    if (duration != null) result = "TimeoutException after $duration";
-    if (message != null) result = "$result: $message";
-    return result;
-  }
-}
-
-/**
- * A way to produce Future objects and to complete them later
- * with a value or error.
- *
- * Most of the time, the simplest way to create a future is to just use
- * one of the [Future] constructors to capture the result of a single
- * asynchronous computation:
- *
- *     new Future(() { doSomething(); return result; });
- *
- * or, if the future represents the result of a sequence of asynchronous
- * computations, they can be chained using [Future.then] or similar functions
- * on [Future]:
- *
- *     Future doStuff(){
- *       return someAsyncOperation().then((result) {
- *         return someOtherAsyncOperation(result);
- *       });
- *     }
- *
- * If you do need to create a Future from scratch — for example,
- * when you're converting a callback-based API into a Future-based
- * one — you can use a Completer as follows:
- *
- *     class AsyncOperation {
- *       Completer _completer = new Completer();
- *
- *       Future<T> doOperation() {
- *         _startOperation();
- *         return _completer.future; // Send future object back to client.
- *       }
- *
- *       // Something calls this when the value is ready.
- *       void _finishOperation(T result) {
- *         _completer.complete(result);
- *       }
- *
- *       // If something goes wrong, call this.
- *       void _errorHappened(error) {
- *         _completer.completeError(error);
- *       }
- *     }
- */
-abstract class Completer<T> {
-
-  /**
-   * Creates a new completer.
-   *
-   * The general workflow for creating a new future is to 1) create a
-   * new completer, 2) hand out its future, and, at a later point, 3) invoke
-   * either [complete] or [completeError].
-   *
-   * The completer completes the future asynchronously. That means that
-   * callbacks registered on the future, are not called immediately when
-   * [complete] or [completeError] is called. Instead the callbacks are
-   * delayed until a later microtask.
-   *
-   * Example:
-   *
-   *     var completer = new Completer();
-   *     handOut(completer.future);
-   *     later: {
-   *       completer.complete('completion value');
-   *     }
-   */
-  factory Completer() => new _AsyncCompleter<T>();
-
-  /**
-   * Completes the future synchronously.
-   *
-   * This constructor should be avoided unless the completion of the future is
-   * known to be the final result of another asynchronous operation. If in doubt
-   * use the default [Completer] constructor.
-   *
-   * Using an normal, asynchronous, completer will never give the wrong
-   * behavior, but using a synchronous completer incorrectly can cause
-   * otherwise correct programs to break.
-   *
-   * A synchronous completer is only intended for optimizing event
-   * propagation when one asynchronous event immediately triggers another.
-   * It should not be used unless the calls to [complete] and [completeError]
-   * are guaranteed to occur in places where it won't break `Future` invariants.
-   *
-   * Completing synchronously means that the completer's future will be
-   * completed immediately when calling the [complete] or [completeError]
-   * method on a synchronous completer, which also calls any callbacks
-   * registered on that future.
-   *
-   * Completing synchronously must not break the rule that when you add a
-   * callback on a future, that callback must not be called until the code
-   * that added the callback has completed.
-   * For that reason, a synchronous completion must only occur at the very end
-   * (in "tail position") of another synchronous event,
-   * because at that point, completing the future immediately is be equivalent
-   * to returning to the event loop and completing the future in the next
-   * microtask.
-   *
-   * Example:
-   *
-   *     var completer = new Completer.sync();
-   *     // The completion is the result of the asynchronous onDone event.
-   *     // No other operation is performed after the completion. It is safe
-   *     // to use the Completer.sync constructor.
-   *     stream.listen(print, onDone: () { completer.complete("done"); });
-   *
-   * Bad example. Do not use this code. Only for illustrative purposes:
-   *
-   *     var completer = new Completer.sync();
-   *     completer.future.then((_) { bar(); });
-   *     // The completion is the result of the asynchronous onDone event.
-   *     // However, there is still code executed after the completion. This
-   *     // operation is *not* safe.
-   *     stream.listen(print, onDone: () {
-   *       completer.complete("done");
-   *       foo();  // In this case, foo() runs after bar().
-   *     });
-   */
-  factory Completer.sync() => new _SyncCompleter<T>();
-
-  /** The future that will contain the result provided to this completer. */
-  Future<T> get future;
-
-  /**
-   * Completes [future] with the supplied values.
-   *
-   * The value must be either a value of type [T]
-   * or a future of type `Future<T>`.
-   *
-   * If the value is itself a future, the completer will wait for that future
-   * to complete, and complete with the same result, whether it is a success
-   * or an error.
-   *
-   * Calling `complete` or [completeError] must not be done more than once.
-   *
-   * All listeners on the future are informed about the value.
-   */
-  void complete([value]);
-
-  /**
-   * Complete [future] with an error.
-   *
-   * Calling [complete] or `completeError` must not be done more than once.
-   *
-   * Completing a future with an error indicates that an exception was thrown
-   * while trying to produce a value.
-   *
-   * If [error] is `null`, it is replaced by a [NullThrownError].
-   *
-   * If `error` is a `Future`, the future itself is used as the error value.
-   * If you want to complete with the result of the future, you can use:
-   *
-   *     thisCompleter.complete(theFuture)
-   *
-   * or if you only want to handle an error from the future:
-   *
-   *     theFuture.catchError(thisCompleter.completeError);
-   *
-   */
-  void completeError(Object error, [StackTrace stackTrace]);
-
-  /**
-   * Whether the future has been completed.
-   */
-  bool get isCompleted;
-}
-
-// Helper function completing a _Future with error, but checking the zone
-// for error replacement first.
-void _completeWithErrorCallback(_Future result, error, stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-  if (replacement != null) {
-    error = _nonNullError(replacement.error);
-    stackTrace = replacement.stackTrace;
-  }
-  result._completeError(error, stackTrace);
-}
-
-/** Helper function that converts `null` to a [NullThrownError]. */
-Object _nonNullError(Object error) =>
-  (error != null) ? error : new NullThrownError();
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
deleted file mode 100644
index 4e6ba42..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/future_impl.dart
+++ /dev/null
@@ -1,746 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-/** The onValue and onError handlers return either a value or a future */
-typedef dynamic/*T|Future<T>*/ _FutureOnValue<S, T>(S value);
-/** Test used by [Future.catchError] to handle skip some errors. */
-typedef bool _FutureErrorTest(var error);
-/** Used by [WhenFuture]. */
-typedef _FutureAction();
-
-abstract class _Completer<T> implements Completer<T> {
-  final _Future<T> future = new _Future<T>();
-
-  void complete([value]);
-
-  void completeError(Object error, [StackTrace stackTrace]) {
-    error = _nonNullError(error);
-    if (!future._mayComplete) throw new StateError("Future already completed");
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-    if (replacement != null) {
-      error = _nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    _completeError(error, stackTrace);
-  }
-
-  void _completeError(Object error, StackTrace stackTrace);
-
-  // The future's _isComplete doesn't take into account pending completions.
-  // We therefore use _mayComplete.
-  bool get isCompleted => !future._mayComplete;
-}
-
-class _AsyncCompleter<T> extends _Completer<T> {
-
-  void complete([value]) {
-    if (!future._mayComplete) throw new StateError("Future already completed");
-    future._asyncComplete(value);
-  }
-
-  void _completeError(Object error, StackTrace stackTrace) {
-    future._asyncCompleteError(error, stackTrace);
-  }
-}
-
-class _SyncCompleter<T> extends _Completer<T> {
-  void complete([value]) {
-    if (!future._mayComplete) throw new StateError("Future already completed");
-    future._complete(value);
-  }
-
-  void _completeError(Object error, StackTrace stackTrace) {
-    future._completeError(error, stackTrace);
-  }
-}
-
-class _FutureListener<S, T> {
-  static const int MASK_VALUE = 1;
-  static const int MASK_ERROR = 2;
-  static const int MASK_TEST_ERROR = 4;
-  static const int MASK_WHENCOMPLETE = 8;
-  static const int STATE_CHAIN = 0;
-  static const int STATE_THEN = MASK_VALUE;
-  // TODO(johnmccutchan): Remove the hard coded value. See #26030.
-  static const int STATE_THEN_ONERROR = 3;  // MASK_VALUE | MASK_ERROR.
-  static const int STATE_CATCHERROR = MASK_ERROR;
-  // TODO(johnmccutchan): Remove the hard coded value. See #26030.
-  static const int STATE_CATCHERROR_TEST = 6;  // MASK_ERROR | MASK_TEST_ERROR.
-  static const int STATE_WHENCOMPLETE = MASK_WHENCOMPLETE;
-  // Listeners on the same future are linked through this link.
-  _FutureListener _nextListener = null;
-  // The future to complete when this listener is activated.
-  final _Future<T> result;
-  // Which fields means what.
-  final int state;
-  // Used for then/whenDone callback and error test
-  final Function callback;
-  // Used for error callbacks.
-  final Function errorCallback;
-
-  _FutureListener.then(this.result,
-                       _FutureOnValue<S, T> onValue, Function errorCallback)
-      : callback = onValue,
-        errorCallback = errorCallback,
-        state = (errorCallback == null) ? STATE_THEN : STATE_THEN_ONERROR;
-
-  _FutureListener.catchError(this.result,
-                             this.errorCallback, _FutureErrorTest test)
-      : callback = test,
-        state = (test == null) ? STATE_CATCHERROR : STATE_CATCHERROR_TEST;
-
-  _FutureListener.whenComplete(this.result, _FutureAction onComplete)
-      : callback = onComplete,
-        errorCallback = null,
-        state = STATE_WHENCOMPLETE;
-
-  Zone get _zone => result._zone;
-
-  bool get handlesValue => (state & MASK_VALUE != 0);
-  bool get handlesError => (state & MASK_ERROR != 0);
-  bool get hasErrorTest => (state == STATE_CATCHERROR_TEST);
-  bool get handlesComplete => (state == STATE_WHENCOMPLETE);
-
-
-  _FutureOnValue<S, T> get _onValue {
-    assert(handlesValue);
-    return callback as Object /*=_FutureOnValue<S, T>*/;
-  }
-  Function get _onError => errorCallback;
-  _FutureErrorTest get _errorTest {
-    assert(hasErrorTest);
-    return callback as Object /*=_FutureErrorTest*/;
-  }
-  _FutureAction get _whenCompleteAction {
-    assert(handlesComplete);
-    return callback as Object /*=_FutureAction*/;
-  }
-
-  /// Whether this listener has an error callback.
-  ///
-  /// This function must only be called if the listener [handlesError].
-  bool get hasErrorCallback {
-    assert(handlesError);
-    return _onError != null;
-  }
-
-  dynamic/*T|Future<T>*/ handleValue(S sourceResult) {
-    return _zone.runUnary<dynamic/*T|Future<T>*/, S>(
-        _onValue, sourceResult);
-  }
-
-  bool matchesErrorTest(AsyncError asyncError) {
-    if (!hasErrorTest) return true;
-    _FutureErrorTest test = _errorTest;
-    return _zone.runUnary<bool, dynamic>(_errorTest, asyncError.error);
-  }
-
-  dynamic/*T|Future<T>*/ handleError(AsyncError asyncError) {
-    assert(handlesError && hasErrorCallback);
-    if (errorCallback is ZoneBinaryCallback) {
-      var typedErrorCallback = errorCallback as Object
-          /*=ZoneBinaryCallback<Object/*T|Future<T>*/, Object, StackTrace>*/;
-      return _zone.runBinary(typedErrorCallback,
-          asyncError.error,
-          asyncError.stackTrace);
-    } else {
-      return _zone.runUnary<dynamic/*T|Future<T>*/, dynamic>(
-          errorCallback, asyncError.error);
-    }
-  }
-
-  dynamic handleWhenComplete() {
-    assert(!handlesError);
-    return _zone.run(_whenCompleteAction);
-  }
-}
-
-class _Future<T> implements Future<T> {
-  /// Initial state, waiting for a result. In this state, the
-  /// [resultOrListeners] field holds a single-linked list of
-  /// [_FutureListener] listeners.
-  static const int _INCOMPLETE = 0;
-  /// Pending completion. Set when completed using [_asyncComplete] or
-  /// [_asyncCompleteError]. It is an error to try to complete it again.
-  /// [resultOrListeners] holds listeners.
-  static const int _PENDING_COMPLETE = 1;
-  /// The future has been chained to another future. The result of that
-  /// other future becomes the result of this future as well.
-  /// [resultOrListeners] contains the source future.
-  static const int _CHAINED = 2;
-  /// The future has been completed with a value result.
-  static const int _VALUE = 4;
-  /// The future has been completed with an error result.
-  static const int _ERROR = 8;
-
-  /** Whether the future is complete, and as what. */
-  int _state = _INCOMPLETE;
-
-  /**
-   * Zone that the future was completed from.
-   * This is the zone that an error result belongs to.
-   *
-   * Until the future is completed, the field may hold the zone that
-   * listener callbacks used to create this future should be run in.
-   */
-  final Zone _zone = Zone.current;
-
-  /**
-   * Either the result, a list of listeners or another future.
-   *
-   * The result of the future is either a value or an error.
-   * A result is only stored when the future has completed.
-   *
-   * The listeners is an internally linked list of [_FutureListener]s.
-   * Listeners are only remembered while the future is not yet complete,
-   * and it is not chained to another future.
-   *
-   * The future is another future that his future is chained to. This future
-   * is waiting for the other future to complete, and when it does, this future
-   * will complete with the same result.
-   * All listeners are forwarded to the other future.
-   */
-  var _resultOrListeners;
-
-  // This constructor is used by async/await.
-  _Future();
-
-  /// Valid types for value: `T` or `Future<T>`.
-  _Future.immediate(value) {
-    _asyncComplete(value);
-  }
-
-  _Future.immediateError(var error, [StackTrace stackTrace]) {
-    _asyncCompleteError(error, stackTrace);
-  }
-
-  bool get _mayComplete       => _state == _INCOMPLETE;
-  bool get _isPendingComplete => _state == _PENDING_COMPLETE;
-  bool get _mayAddListener    => _state <= _PENDING_COMPLETE;
-  bool get _isChained         => _state == _CHAINED;
-  bool get _isComplete        => _state >= _VALUE;
-  bool get _hasError          => _state == _ERROR;
-
-  void _setChained(_Future source) {
-    assert(_mayAddListener);
-    _state = _CHAINED;
-    _resultOrListeners = source;
-  }
-
-  Future<E> then<E>(
-      FutureOr<E> f(T value), { Function onError }) {
-    Zone currentZone = Zone.current;
-    ZoneUnaryCallback registered;
-    if (!identical(currentZone, _ROOT_ZONE)) {
-      f = currentZone.registerUnaryCallback<FutureOr<E>, T>(f);
-      if (onError != null) {
-        onError = _registerErrorHandler<T>(onError, currentZone);
-      }
-    }
-    return _thenNoZoneRegistration<E>(f, onError);
-  }
-
-  // This method is used by async/await.
-  Future<E> _thenNoZoneRegistration<E>(f(T value), Function onError) {
-    _Future<E> result = new _Future<E>();
-    _addListener(new _FutureListener<T, E>.then(result, f, onError));
-    return result;
-  }
-
-  Future<T> catchError(Function onError, { bool test(error) }) {
-    _Future<T> result = new _Future<T>();
-    if (!identical(result._zone, _ROOT_ZONE)) {
-      onError = _registerErrorHandler<T>(onError, result._zone);
-      if (test != null) test = result._zone.registerUnaryCallback(test);
-    }
-    _addListener(new _FutureListener<T, T>.catchError(
-        result, onError, test));
-    return result;
-  }
-
-  Future<T> whenComplete(action()) {
-    _Future<T> result = new _Future<T>();
-    if (!identical(result._zone, _ROOT_ZONE)) {
-      action = result._zone.registerCallback<dynamic>(action);
-    }
-    _addListener(new _FutureListener<T, T>.whenComplete(result, action));
-    return result;
-  }
-
-  Stream<T> asStream() => new Stream<T>.fromFuture(this);
-
-  void _setPendingComplete() {
-    assert(_mayComplete);
-    _state = _PENDING_COMPLETE;
-  }
-
-  void _clearPendingComplete() {
-    assert(_isPendingComplete);
-    _state = _INCOMPLETE;
-  }
-
-  AsyncError get _error {
-    assert(_hasError);
-    return _resultOrListeners;
-  }
-
-  _Future get _chainSource {
-    assert(_isChained);
-    return _resultOrListeners;
-  }
-
-  // This method is used by async/await.
-  void _setValue(T value) {
-    assert(!_isComplete);  // But may have a completion pending.
-    _state = _VALUE;
-    _resultOrListeners = value;
-  }
-
-  void _setErrorObject(AsyncError error) {
-    assert(!_isComplete);  // But may have a completion pending.
-    _state = _ERROR;
-    _resultOrListeners = error;
-  }
-
-  void _setError(Object error, StackTrace stackTrace) {
-    _setErrorObject(new AsyncError(error, stackTrace));
-  }
-
-  /// Copy the completion result of [source] into this future.
-  ///
-  /// Used when a chained future notices that its source is completed.
-  void _cloneResult(_Future source) {
-    assert(!_isComplete);
-    assert(source._isComplete);
-    _state = source._state;
-    _resultOrListeners = source._resultOrListeners;
-  }
-
-  void _addListener(_FutureListener listener) {
-    assert(listener._nextListener == null);
-    if (_mayAddListener) {
-      listener._nextListener = _resultOrListeners;
-      _resultOrListeners = listener;
-    } else {
-      if (_isChained) {
-        // Delegate listeners to chained source future.
-        // If the source is complete, instead copy its values and
-        // drop the chaining.
-        _Future source = _chainSource;
-        if (!source._isComplete) {
-          source._addListener(listener);
-          return;
-        }
-        _cloneResult(source);
-      }
-      assert(_isComplete);
-      // Handle late listeners asynchronously.
-      _zone.scheduleMicrotask(() {
-        _propagateToListeners(this, listener);
-      });
-    }
-  }
-
-  void _prependListeners(_FutureListener listeners) {
-    if (listeners == null) return;
-    if (_mayAddListener) {
-      _FutureListener existingListeners = _resultOrListeners;
-      _resultOrListeners = listeners;
-      if (existingListeners != null) {
-        _FutureListener cursor = listeners;
-        while (cursor._nextListener != null) {
-          cursor = cursor._nextListener;
-        }
-        cursor._nextListener = existingListeners;
-      }
-    } else {
-      if (_isChained) {
-        // Delegate listeners to chained source future.
-        // If the source is complete, instead copy its values and
-        // drop the chaining.
-        _Future source = _chainSource;
-        if (!source._isComplete) {
-          source._prependListeners(listeners);
-          return;
-        }
-        _cloneResult(source);
-      }
-      assert(_isComplete);
-      listeners = _reverseListeners(listeners);
-      _zone.scheduleMicrotask(() {
-        _propagateToListeners(this, listeners);
-      });
-    }
-  }
-
-  _FutureListener _removeListeners() {
-    // Reverse listeners before returning them, so the resulting list is in
-    // subscription order.
-    assert(!_isComplete);
-    _FutureListener current = _resultOrListeners;
-    _resultOrListeners = null;
-    return _reverseListeners(current);
-  }
-
-  _FutureListener _reverseListeners(_FutureListener listeners) {
-    _FutureListener prev = null;
-    _FutureListener current = listeners;
-    while (current != null) {
-      _FutureListener next = current._nextListener;
-      current._nextListener = prev;
-      prev = current;
-      current = next;
-    }
-    return prev;
-  }
-
-  // Take the value (when completed) of source and complete target with that
-  // value (or error). This function could chain all Futures, but is slower
-  // for _Future than _chainCoreFuture, so you must use _chainCoreFuture
-  // in that case.
-  static void _chainForeignFuture(Future source, _Future target) {
-    assert(!target._isComplete);
-    assert(source is! _Future);
-
-    // Mark the target as chained (and as such half-completed).
-    target._setPendingComplete();
-    try {
-      source.then((value) {
-          assert(target._isPendingComplete);
-          // The "value" may be another future if the foreign future
-          // implementation is mis-behaving,
-          // so use _complete instead of _completeWithValue.
-          target._clearPendingComplete();  // Clear this first, it's set again.
-          target._complete(value);
-        },
-        // TODO(floitsch): eventually we would like to make this non-optional
-        // and dependent on the listeners of the target future. If none of
-        // the target future's listeners want to have the stack trace we don't
-        // need a trace.
-        onError: (error, [stackTrace]) {
-          assert(target._isPendingComplete);
-          target._completeError(error, stackTrace);
-        });
-    } catch (e, s) {
-      // This only happens if the `then` call threw synchronously when given
-      // valid arguments.
-      // That requires a non-conforming implementation of the Future interface,
-      // which should, hopefully, never happen.
-      scheduleMicrotask(() {
-        target._completeError(e, s);
-      });
-    }
-  }
-
-  // Take the value (when completed) of source and complete target with that
-  // value (or error). This function expects that source is a _Future.
-  static void _chainCoreFuture(_Future source, _Future target) {
-    assert(target._mayAddListener);  // Not completed, not already chained.
-    while (source._isChained) {
-      source = source._chainSource;
-    }
-    if (source._isComplete) {
-      _FutureListener listeners = target._removeListeners();
-      target._cloneResult(source);
-      _propagateToListeners(target, listeners);
-    } else {
-      _FutureListener listeners = target._resultOrListeners;
-      target._setChained(source);
-      source._prependListeners(listeners);
-    }
-  }
-
-  void _complete(value) {
-    assert(!_isComplete);
-    if (value is Future) {
-      if (value is _Future) {
-        _chainCoreFuture(value, this);
-      } else {
-        _chainForeignFuture(value, this);
-      }
-    } else {
-      _FutureListener listeners = _removeListeners();
-      _setValue(value as Object /*=T*/);
-      _propagateToListeners(this, listeners);
-    }
-  }
-
-  void _completeWithValue(T value) {
-    assert(!_isComplete);
-    assert(value is! Future);
-
-    _FutureListener listeners = _removeListeners();
-    _setValue(value);
-    _propagateToListeners(this, listeners);
-  }
-
-  void _completeError(error, [StackTrace stackTrace]) {
-    assert(!_isComplete);
-
-    _FutureListener listeners = _removeListeners();
-    _setError(error, stackTrace);
-    _propagateToListeners(this, listeners);
-  }
-
-  void _asyncComplete(value) {
-    assert(!_isComplete);
-    // Two corner cases if the value is a future:
-    //   1. the future is already completed and an error.
-    //   2. the future is not yet completed but might become an error.
-    // The first case means that we must not immediately complete the Future,
-    // as our code would immediately start propagating the error without
-    // giving the time to install error-handlers.
-    // However the second case requires us to deal with the value immediately.
-    // Otherwise the value could complete with an error and report an
-    // unhandled error, even though we know we are already going to listen to
-    // it.
-
-    if (value is Future) {
-      // Assign to typed variables so we get earlier checks in checked mode.
-      Future<T> typedFuture = value as Object /*=Future<T>*/;
-      if (typedFuture is _Future) {
-        _Future<T> coreFuture = typedFuture;
-        if (coreFuture._hasError) {
-          // Case 1 from above. Delay completion to enable the user to register
-          // callbacks.
-          _setPendingComplete();
-          _zone.scheduleMicrotask(() {
-            _chainCoreFuture(coreFuture, this);
-          });
-        } else {
-          _chainCoreFuture(coreFuture, this);
-        }
-      } else {
-        // Case 2 from above. Chain the future immediately.
-        // Note that we are still completing asynchronously (through
-        // _chainForeignFuture).
-        _chainForeignFuture(typedFuture, this);
-      }
-      return;
-    }
-    T typedValue = value as Object /*=T*/;
-
-    _setPendingComplete();
-    _zone.scheduleMicrotask(() {
-      _completeWithValue(typedValue);
-    });
-  }
-
-  void _asyncCompleteError(error, StackTrace stackTrace) {
-    assert(!_isComplete);
-
-    _setPendingComplete();
-    _zone.scheduleMicrotask(() {
-      _completeError(error, stackTrace);
-    });
-  }
-
-  /**
-   * Propagates the value/error of [source] to its [listeners], executing the
-   * listeners' callbacks.
-   */
-  static void _propagateToListeners(_Future source, _FutureListener listeners) {
-    while (true) {
-      assert(source._isComplete);
-      bool hasError = source._hasError;
-      if (listeners == null) {
-        if (hasError) {
-          AsyncError asyncError = source._error;
-          source._zone.handleUncaughtError(
-              asyncError.error, asyncError.stackTrace);
-        }
-        return;
-      }
-      // Usually futures only have one listener. If they have several, we
-      // call handle them separately in recursive calls, continuing
-      // here only when there is only one listener left.
-      while (listeners._nextListener != null) {
-        _FutureListener listener = listeners;
-        listeners = listener._nextListener;
-        listener._nextListener = null;
-        _propagateToListeners(source, listener);
-      }
-      _FutureListener listener = listeners;
-      final sourceResult = source._resultOrListeners;
-      // Do the actual propagation.
-      // Set initial state of listenerHasError and listenerValueOrError. These
-      // variables are updated with the outcome of potential callbacks.
-      // Non-error results, including futures, are stored in
-      // listenerValueOrError and listenerHasError is set to false. Errors
-      // are stored in listenerValueOrError as an [AsyncError] and
-      // listenerHasError is set to true.
-      bool listenerHasError = hasError;
-      var listenerValueOrError = sourceResult;
-
-      // Only if we either have an error or callbacks, go into this, somewhat
-      // expensive, branch. Here we'll enter/leave the zone. Many futures
-      // don't have callbacks, so this is a significant optimization.
-      if (hasError || listener.handlesValue || listener.handlesComplete) {
-        Zone zone = listener._zone;
-        if (hasError && !source._zone.inSameErrorZone(zone)) {
-          // Don't cross zone boundaries with errors.
-          AsyncError asyncError = source._error;
-          source._zone.handleUncaughtError(
-              asyncError.error, asyncError.stackTrace);
-          return;
-        }
-
-        Zone oldZone;
-        if (!identical(Zone.current, zone)) {
-          // Change zone if it's not current.
-          oldZone = Zone._enter(zone);
-        }
-
-        // These callbacks are abstracted to isolate the try/catch blocks
-        // from the rest of the code to work around a V8 glass jaw.
-        void handleWhenCompleteCallback() {
-          // The whenComplete-handler is not combined with normal value/error
-          // handling. This means at most one handleX method is called per
-          // listener.
-          assert(!listener.handlesValue);
-          assert(!listener.handlesError);
-          var completeResult;
-          try {
-            completeResult = listener.handleWhenComplete();
-          } catch (e, s) {
-            if (hasError && identical(source._error.error, e)) {
-              listenerValueOrError = source._error;
-            } else {
-              listenerValueOrError = new AsyncError(e, s);
-            }
-            listenerHasError = true;
-            return;
-          }
-          if (completeResult is Future) {
-            if (completeResult is _Future && completeResult._isComplete) {
-              if (completeResult._hasError) {
-                listenerValueOrError = completeResult._error;
-                listenerHasError = true;
-              }
-              // Otherwise use the existing result of source.
-              return;
-            }
-            // We have to wait for the completeResult future to complete
-            // before knowing if it's an error or we should use the result
-            // of source.
-            var originalSource = source;
-            listenerValueOrError = completeResult.then((_) => originalSource);
-            listenerHasError = false;
-          }
-        }
-
-        void handleValueCallback() {
-          try {
-            listenerValueOrError = listener.handleValue(sourceResult);
-          } catch (e, s) {
-            listenerValueOrError = new AsyncError(e, s);
-            listenerHasError = true;
-          }
-        }
-
-        void handleError() {
-          try {
-            AsyncError asyncError = source._error;
-            if (listener.matchesErrorTest(asyncError) &&
-                listener.hasErrorCallback) {
-              listenerValueOrError = listener.handleError(asyncError);
-              listenerHasError = false;
-            }
-          } catch (e, s) {
-            if (identical(source._error.error, e)) {
-              listenerValueOrError = source._error;
-            } else {
-              listenerValueOrError = new AsyncError(e, s);
-            }
-            listenerHasError = true;
-          }
-        }
-
-
-        if (listener.handlesComplete) {
-          handleWhenCompleteCallback();
-        } else if (!hasError) {
-          if (listener.handlesValue) {
-            handleValueCallback();
-          }
-        } else {
-          if (listener.handlesError) {
-            handleError();
-          }
-        }
-
-        // If we changed zone, oldZone will not be null.
-        if (oldZone != null) Zone._leave(oldZone);
-
-        // If the listener's value is a future we need to chain it. Note that
-        // this can only happen if there is a callback.
-        if (listenerValueOrError is Future) {
-          Future chainSource = listenerValueOrError;
-          // Shortcut if the chain-source is already completed. Just continue
-          // the loop.
-          _Future result = listener.result;
-          if (chainSource is _Future) {
-            if (chainSource._isComplete) {
-              listeners = result._removeListeners();
-              result._cloneResult(chainSource);
-              source = chainSource;
-              continue;
-            } else {
-              _chainCoreFuture(chainSource, result);
-            }
-          } else {
-            _chainForeignFuture(chainSource, result);
-          }
-          return;
-        }
-      }
-      _Future result = listener.result;
-      listeners = result._removeListeners();
-      if (!listenerHasError) {
-        result._setValue(listenerValueOrError);
-      } else {
-        AsyncError asyncError = listenerValueOrError;
-        result._setErrorObject(asyncError);
-      }
-      // Prepare for next round.
-      source = result;
-    }
-  }
-
-  Future<T> timeout(Duration timeLimit, {onTimeout()}) {
-    if (_isComplete) return new _Future.immediate(this);
-    _Future<T> result = new _Future<T>();
-    Timer timer;
-    if (onTimeout == null) {
-      timer = new Timer(timeLimit, () {
-        result._completeError(new TimeoutException("Future not completed",
-                                                   timeLimit));
-      });
-    } else {
-      Zone zone = Zone.current;
-      onTimeout = zone.registerCallback(onTimeout);
-      timer = new Timer(timeLimit, () {
-        try {
-          result._complete(zone.run(onTimeout));
-        } catch (e, s) {
-          result._completeError(e, s);
-        }
-      });
-    }
-    this.then((T v) {
-      if (timer.isActive) {
-        timer.cancel();
-        result._completeWithValue(v);
-      }
-    }, onError: (e, s) {
-      if (timer.isActive) {
-        timer.cancel();
-        result._completeError(e, s);
-      }
-    });
-    return result;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/schedule_microtask.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/schedule_microtask.dart
deleted file mode 100644
index 70fbeba..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/schedule_microtask.dart
+++ /dev/null
@@ -1,154 +0,0 @@
-// 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.
-
-part of dart.async;
-
-typedef void _AsyncCallback();
-
-class _AsyncCallbackEntry {
-  final _AsyncCallback callback;
-  _AsyncCallbackEntry next;
-  _AsyncCallbackEntry(this.callback);
-}
-
-/** Head of single linked list of pending callbacks. */
-_AsyncCallbackEntry _nextCallback;
-/** Tail of single linked list of pending callbacks. */
-_AsyncCallbackEntry _lastCallback;
-/**
- * Tail of priority callbacks added by the currently executing callback.
- *
- * Priority callbacks are put at the beginning of the
- * callback queue, so that if one callback schedules more than one
- * priority callback, they are still enqueued in scheduling order.
- */
-_AsyncCallbackEntry _lastPriorityCallback;
-/**
- * Whether we are currently inside the callback loop.
- *
- * If we are inside the loop, we never need to schedule the loop,
- * even if adding a first element.
- */
-bool _isInCallbackLoop = false;
-
-void _microtaskLoop() {
-  while (_nextCallback != null) {
-    _lastPriorityCallback = null;
-    _AsyncCallbackEntry entry = _nextCallback;
-    _nextCallback = entry.next;
-    if (_nextCallback == null) _lastCallback = null;
-    (entry.callback)();
-  }
-}
-
-void _startMicrotaskLoop() {
-  _isInCallbackLoop = true;
-  try {
-    // Moved to separate function because try-finally prevents
-    // good optimization.
-    _microtaskLoop();
-  } finally {
-    _lastPriorityCallback = null;
-    _isInCallbackLoop = false;
-    if (_nextCallback != null) {
-      _AsyncRun._scheduleImmediate(_startMicrotaskLoop);
-    }
-  }
-}
-
-/**
- * Schedules a callback to be called as a microtask.
- *
- * The microtask is called after all other currently scheduled
- * microtasks, but as part of the current system event.
- */
-void _scheduleAsyncCallback(_AsyncCallback callback) {
-  _AsyncCallbackEntry newEntry = new _AsyncCallbackEntry(callback);
-  if (_nextCallback == null) {
-    _nextCallback = _lastCallback = newEntry;
-    if (!_isInCallbackLoop) {
-      _AsyncRun._scheduleImmediate(_startMicrotaskLoop);
-    }
-  } else {
-    _lastCallback.next = newEntry;
-    _lastCallback = newEntry;
-  }
-}
-
-/**
- * Schedules a callback to be called before all other currently scheduled ones.
- *
- * This callback takes priority over existing scheduled callbacks.
- * It is only used internally to give higher priority to error reporting.
- *
- * Is always run in the root zone.
- */
-void _schedulePriorityAsyncCallback(_AsyncCallback callback) {
-  if (_nextCallback == null) {
-    _scheduleAsyncCallback(callback);
-    _lastPriorityCallback = _lastCallback;
-    return;
-  }
-  _AsyncCallbackEntry entry = new _AsyncCallbackEntry(callback);
-  if (_lastPriorityCallback == null) {
-    entry.next = _nextCallback;
-    _nextCallback = _lastPriorityCallback = entry;
-  } else {
-    entry.next = _lastPriorityCallback.next;
-    _lastPriorityCallback.next = entry;
-    _lastPriorityCallback = entry;
-    if (entry.next == null) {
-      _lastCallback = entry;
-    }
-  }
-}
-
-/**
- * Runs a function asynchronously.
- *
- * Callbacks registered through this function are always executed in order and
- * are guaranteed to run before other asynchronous events (like [Timer] events,
- * or DOM events).
- *
- * **Warning:** it is possible to starve the DOM by registering asynchronous
- * callbacks through this method. For example the following program runs
- * the callbacks without ever giving the Timer callback a chance to execute:
- *
- *     main() {
- *       Timer.run(() { print("executed"); });  // Will never be executed.
- *       foo() {
- *         scheduleMicrotask(foo);  // Schedules [foo] in front of other events.
- *       }
- *       foo();
- *     }
- *
- * ## Other resources
- *
- * * [The Event Loop and Dart](https://www.dartlang.org/articles/event-loop/):
- * Learn how Dart handles the event queue and microtask queue, so you can write
- * better asynchronous code with fewer surprises.
- */
-void scheduleMicrotask(void callback()) {
-  _Zone currentZone = Zone.current;
-  if (identical(_ROOT_ZONE, currentZone)) {
-    // No need to bind the callback. We know that the root's scheduleMicrotask
-    // will be invoked in the root zone.
-    _rootScheduleMicrotask(null, null, _ROOT_ZONE, callback);
-    return;
-  }
-  _ZoneFunction implementation = currentZone._scheduleMicrotask;
-  if (identical(_ROOT_ZONE, implementation.zone) &&
-      _ROOT_ZONE.inSameErrorZone(currentZone)) {
-    _rootScheduleMicrotask(null, null, currentZone,
-                           currentZone.registerCallback(callback));
-    return;
-  }
-  Zone.current.scheduleMicrotask(
-      Zone.current.bindCallback(callback, runGuarded: true));
-}
-
-class _AsyncRun {
-  /** Schedule the given callback before any other event in the event-loop. */
-  external static void _scheduleImmediate(void callback());
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/stream.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/stream.dart
deleted file mode 100644
index d0b0d0b..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/stream.dart
+++ /dev/null
@@ -1,1820 +0,0 @@
-// 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.
-
-part of dart.async;
-
-// -------------------------------------------------------------------
-// Core Stream types
-// -------------------------------------------------------------------
-
-typedef void _TimerCallback();
-
-/**
- * A source of asynchronous data events.
- *
- * A Stream provides a way to receive a sequence of events.
- * Each event is either a data event or an error event,
- * representing the result of a single computation.
- * When the events provided by a Stream have all been sent,
- * a single "done" event will mark the end.
- *
- * You can [listen] on a stream to make it start generating events,
- * and to set up listeners that receive the events.
- * When you listen, you receive a [StreamSubscription] object
- * which is the active object providing the events,
- * and which can be used to stop listening again,
- * or to temporarily pause events from the subscription.
- *
- * There are two kinds of streams: "Single-subscription" streams and
- * "broadcast" streams.
- *
- * *A single-subscription stream* allows only a single listener during the whole
- * lifetime of the stream.
- * It doesn't start generating events until it has a listener,
- * and it stops sending events when the listener is unsubscribed,
- * even if the source of events could still provide more.
- *
- * Listening twice on a single-subscription stream is not allowed, even after
- * the first subscription has been canceled.
- *
- * Single-subscription streams are generally used for streaming chunks of
- * larger contiguous data like file I/O.
- *
- * *A broadcast stream* allows any number of listeners, and it fires
- * its events when they are ready, whether there are listeners or not.
- *
- * Broadcast streams are used for independent events/observers.
- *
- * If several listeners want to listen to a single subscription stream,
- * use [asBroadcastStream] to create a broadcast stream on top of the
- * non-broadcast stream.
- *
- * On either kind of stream, stream transformations, such as [where] and
- * [skip], return the same type of stream as the one the method was called on,
- * unless otherwise noted.
- *
- * When an event is fired, the listener(s) at that time will receive the event.
- * If a listener is added to a broadcast stream while an event is being fired,
- * that listener will not receive the event currently being fired.
- * If a listener is canceled, it immediately stops receiving events.
- *
- * When the "done" event is fired, subscribers are unsubscribed before
- * receiving the event. After the event has been sent, the stream has no
- * subscribers. Adding new subscribers to a broadcast stream after this point
- * is allowed, but they will just receive a new "done" event as soon
- * as possible.
- *
- * Stream subscriptions always respect "pause" requests. If necessary they need
- * to buffer their input, but often, and preferably, they can simply request
- * their input to pause too.
- *
- * The default implementation of [isBroadcast] returns false.
- * A broadcast stream inheriting from [Stream] must override [isBroadcast]
- * to return `true`.
- */
-abstract class Stream<T> {
-  Stream();
-
-  /**
-   * Internal use only. We do not want to promise that Stream stays const.
-   *
-   * If mixins become compatible with const constructors, we may use a
-   * stream mixin instead of extending Stream from a const class.
-   */
-  const Stream._internal();
-
-  /**
-   * Creates an empty broadcast stream.
-   *
-   * This is a stream which does nothing except sending a done event
-   * when it's listened to.
-   */
-  const factory Stream.empty() = _EmptyStream<T>;
-
-  /**
-   * Creates a new single-subscription stream from the future.
-   *
-   * When the future completes, the stream will fire one event, either
-   * data or error, and then close with a done-event.
-   */
-  factory Stream.fromFuture(Future<T> future) {
-    // Use the controller's buffering to fill in the value even before
-    // the stream has a listener. For a single value, it's not worth it
-    // to wait for a listener before doing the `then` on the future.
-    _StreamController<T> controller = new StreamController<T>(sync: true);
-    future.then((value) {
-        controller._add(value);
-        controller._closeUnchecked();
-      },
-      onError: (error, stackTrace) {
-        controller._addError(error, stackTrace);
-        controller._closeUnchecked();
-      });
-    return controller.stream;
-  }
-
-  /**
-   * Create a stream from a group of futures.
-   *
-   * The stream reports the results of the futures on the stream in the order
-   * in which the futures complete.
-   *
-   * If some futures have completed before calling `Stream.fromFutures`,
-   * their result will be output on the created stream in some unspecified
-   * order.
-   *
-   * When all futures have completed, the stream is closed.
-   *
-   * If no future is passed, the stream closes as soon as possible.
-   */
-  factory Stream.fromFutures(Iterable<Future<T>> futures) {
-    _StreamController<T> controller = new StreamController<T>(sync: true);
-    int count = 0;
-    var onValue = (T value) {
-      if (!controller.isClosed) {
-        controller._add(value);
-        if (--count == 0) controller._closeUnchecked();
-      }
-    };
-    var onError = (error, stack) {
-      if (!controller.isClosed) {
-        controller._addError(error, stack);
-        if (--count == 0) controller._closeUnchecked();
-      }
-    };
-    // The futures are already running, so start listening to them immediately
-    // (instead of waiting for the stream to be listened on).
-    // If we wait, we might not catch errors in the futures in time.
-    for (var future in futures) {
-      count++;
-      future.then(onValue, onError: onError);
-    }
-    // Use schedule microtask since controller is sync.
-    if (count == 0) scheduleMicrotask(controller.close);
-    return controller.stream;
-  }
-
-  /**
-   * Creates a single-subscription stream that gets its data from [data].
-   *
-   * The iterable is iterated when the stream receives a listener, and stops
-   * iterating if the listener cancels the subscription.
-   *
-   * If iterating [data] throws an error, the stream ends immediately with
-   * that error. No done event will be sent (iteration is not complete), but no
-   * further data events will be generated either, since iteration cannot
-   * continue.
-   */
-  factory Stream.fromIterable(Iterable<T> data) {
-    return new _GeneratedStreamImpl<T>(
-        () => new _IterablePendingEvents<T>(data));
-  }
-
-  /**
-   * Creates a stream that repeatedly emits events at [period] intervals.
-   *
-   * The event values are computed by invoking [computation]. The argument to
-   * this callback is an integer that starts with 0 and is incremented for
-   * every event.
-   *
-   * If [computation] is omitted the event values will all be `null`.
-   */
-  factory Stream.periodic(Duration period,
-                          [T computation(int computationCount)]) {
-    Timer timer;
-    int computationCount = 0;
-    StreamController<T> controller;
-    // Counts the time that the Stream was running (and not paused).
-    Stopwatch watch = new Stopwatch();
-
-    void sendEvent() {
-      watch.reset();
-      T data;
-      if (computation != null) {
-        try {
-          data = computation(computationCount++);
-        } catch (e, s) {
-          controller.addError(e, s);
-          return;
-        }
-      }
-      controller.add(data);
-    }
-
-    void startPeriodicTimer() {
-      assert(timer == null);
-      timer = new Timer.periodic(period, (Timer timer) {
-        sendEvent();
-      });
-    }
-
-    controller = new StreamController<T>(sync: true,
-        onListen: () {
-          watch.start();
-          startPeriodicTimer();
-        },
-        onPause: () {
-          timer.cancel();
-          timer = null;
-          watch.stop();
-        },
-        onResume: () {
-          assert(timer == null);
-          Duration elapsed = watch.elapsed;
-          watch.start();
-          timer = new Timer(period - elapsed, () {
-            timer = null;
-            startPeriodicTimer();
-            sendEvent();
-          });
-        },
-        onCancel: () {
-          if (timer != null) timer.cancel();
-          timer = null;
-        });
-    return controller.stream;
-  }
-
-  /**
-   * Creates a stream where all events of an existing stream are piped through
-   * a sink-transformation.
-   *
-   * The given [mapSink] closure is invoked when the returned stream is
-   * listened to. All events from the [source] are added into the event sink
-   * that is returned from the invocation. The transformation puts all
-   * transformed events into the sink the [mapSink] closure received during
-   * its invocation. Conceptually the [mapSink] creates a transformation pipe
-   * with the input sink being the returned [EventSink] and the output sink
-   * being the sink it received.
-   *
-   * This constructor is frequently used to build transformers.
-   *
-   * Example use for a duplicating transformer:
-   *
-   *     class DuplicationSink implements EventSink<String> {
-   *       final EventSink<String> _outputSink;
-   *       DuplicationSink(this._outputSink);
-   *
-   *       void add(String data) {
-   *         _outputSink.add(data);
-   *         _outputSink.add(data);
-   *       }
-   *
-   *       void addError(e, [st]) { _outputSink.addError(e, st); }
-   *       void close() { _outputSink.close(); }
-   *     }
-   *
-   *     class DuplicationTransformer implements StreamTransformer<String, String> {
-   *       // Some generic types ommitted for brevety.
-   *       Stream bind(Stream stream) => new Stream<String>.eventTransformed(
-   *           stream,
-   *           (EventSink sink) => new DuplicationSink(sink));
-   *     }
-   *
-   *     stringStream.transform(new DuplicationTransformer());
-   *
-   * The resulting stream is a broadcast stream if [source] is.
-   */
-  factory Stream.eventTransformed(Stream source,
-                                  EventSink mapSink(EventSink<T> sink)) {
-    return new _BoundSinkStream(source, mapSink);
-  }
-
-  /**
-   * Reports whether this stream is a broadcast stream.
-   */
-  bool get isBroadcast => false;
-
-  /**
-   * Returns a multi-subscription stream that produces the same events as this.
-   *
-   * The returned stream will subscribe to this stream when its first
-   * subscriber is added, and will stay subscribed until this stream ends,
-   * or a callback cancels the subscription.
-   *
-   * If [onListen] is provided, it is called with a subscription-like object
-   * that represents the underlying subscription to this stream. It is
-   * possible to pause, resume or cancel the subscription during the call
-   * to [onListen]. It is not possible to change the event handlers, including
-   * using [StreamSubscription.asFuture].
-   *
-   * If [onCancel] is provided, it is called in a similar way to [onListen]
-   * when the returned stream stops having listener. If it later gets
-   * a new listener, the [onListen] function is called again.
-   *
-   * Use the callbacks, for example, for pausing the underlying subscription
-   * while having no subscribers to prevent losing events, or canceling the
-   * subscription when there are no listeners.
-   */
-  Stream<T> asBroadcastStream({
-      void onListen(StreamSubscription<T> subscription),
-      void onCancel(StreamSubscription<T> subscription) }) {
-    return new _AsBroadcastStream<T>(this, onListen, onCancel);
-  }
-
-  /**
-   * Adds a subscription to this stream.
-   *
-   * On each data event from this stream, the subscriber's [onData] handler
-   * is called. If [onData] is null, nothing happens.
-   *
-   * On errors from this stream, the [onError] handler is given a
-   * object describing the error.
-   *
-   * The [onError] callback must be of type `void onError(error)` or
-   * `void onError(error, StackTrace stackTrace)`. If [onError] accepts
-   * two arguments it is called with the stack trace (which could be `null` if
-   * the stream itself received an error without stack trace).
-   * Otherwise it is called with just the error object.
-   * If [onError] is omitted, any errors on the stream are considered unhandled,
-   * and will be passed to the current [Zone]'s error handler.
-   * By default unhandled async errors are treated
-   * as if they were uncaught top-level errors.
-   *
-   * If this stream closes, the [onDone] handler is called.
-   *
-   * If [cancelOnError] is true, the subscription is ended when
-   * the first error is reported. The default is false.
-   */
-  StreamSubscription<T> listen(void onData(T event),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError});
-
-  /**
-   * Creates a new stream from this stream that discards some data events.
-   *
-   * The new stream sends the same error and done events as this stream,
-   * but it only sends the data events that satisfy the [test].
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will individually perform the `test`.
-   */
-  Stream<T> where(bool test(T event)) {
-    return new _WhereStream<T>(this, test);
-  }
-
-  /**
-   * Creates a new stream that converts each element of this stream
-   * to a new value using the [convert] function.
-   *
-   * For each data event, `o`, in this stream, the returned stream
-   * provides a data event with the value `convert(o)`.
-   * If [convert] throws, the returned stream reports the exception as an error
-   * event instead.
-   *
-   * Error and done events are passed through unchanged to the returned stream.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * The [convert] function is called once per data event per listener.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will individually call [convert] on each data event.
-   */
-  Stream/*<S>*/ map/*<S>*/(/*=S*/ convert(T event)) {
-    return new _MapStream<T, dynamic/*=S*/>(this, convert);
-  }
-
-  /**
-   * Creates a new stream with each data event of this stream asynchronously
-   * mapped to a new event.
-   *
-   * This acts like [map], except that [convert] may return a [Future],
-   * and in that case, the stream waits for that future to complete before
-   * continuing with its result.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   */
-  Stream/*<E>*/ asyncMap/*<E>*/(convert(T event)) {
-    StreamController/*<E>*/ controller;
-    StreamSubscription/*<T>*/ subscription;
-
-    void onListen() {
-      final add = controller.add;
-      assert(controller is _StreamController ||
-             controller is _BroadcastStreamController);
-      final _EventSink/*<E>*/ eventSink =
-          controller as Object /*=_EventSink<E>*/;
-      final addError = eventSink._addError;
-      subscription = this.listen(
-          (T event) {
-            dynamic newValue;
-            try {
-              newValue = convert(event);
-            } catch (e, s) {
-              controller.addError(e, s);
-              return;
-            }
-            if (newValue is Future) {
-              subscription.pause();
-              newValue.then(add, onError: addError)
-                      .whenComplete(subscription.resume);
-            } else {
-              controller.add(newValue as Object/*=E*/);
-            }
-          },
-          onError: addError,
-          onDone: controller.close
-      );
-    }
-
-    if (this.isBroadcast) {
-      controller = new StreamController/*<E>*/.broadcast(
-        onListen: onListen,
-        onCancel: () { subscription.cancel(); },
-        sync: true
-      );
-    } else {
-      controller = new StreamController/*<E>*/(
-        onListen: onListen,
-        onPause: () { subscription.pause(); },
-        onResume: () { subscription.resume(); },
-        onCancel: () { subscription.cancel(); },
-        sync: true
-      );
-    }
-    return controller.stream;
-  }
-
-  /**
-   * Creates a new stream with the events of a stream per original event.
-   *
-   * This acts like [expand], except that [convert] returns a [Stream]
-   * instead of an [Iterable].
-   * The events of the returned stream becomes the events of the returned
-   * stream, in the order they are produced.
-   *
-   * If [convert] returns `null`, no value is put on the output stream,
-   * just as if it returned an empty stream.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   */
-  Stream/*<E>*/ asyncExpand/*<E>*/(Stream/*<E>*/ convert(T event)) {
-    StreamController/*<E>*/ controller;
-    StreamSubscription<T> subscription;
-    void onListen() {
-      assert(controller is _StreamController ||
-             controller is _BroadcastStreamController);
-      final _EventSink/*<E>*/ eventSink =
-          controller as Object /*=_EventSink<E>*/;
-      subscription = this.listen(
-          (T event) {
-            Stream/*<E>*/ newStream;
-            try {
-              newStream = convert(event);
-            } catch (e, s) {
-              controller.addError(e, s);
-              return;
-            }
-            if (newStream != null) {
-              subscription.pause();
-              controller.addStream(newStream)
-                        .whenComplete(subscription.resume);
-            }
-          },
-          onError: eventSink._addError,  // Avoid Zone error replacement.
-          onDone: controller.close
-      );
-    }
-    if (this.isBroadcast) {
-      controller = new StreamController/*<E>*/.broadcast(
-        onListen: onListen,
-        onCancel: () { subscription.cancel(); },
-        sync: true
-      );
-    } else {
-      controller = new StreamController/*<E>*/(
-        onListen: onListen,
-        onPause: () { subscription.pause(); },
-        onResume: () { subscription.resume(); },
-        onCancel: () { subscription.cancel(); },
-        sync: true
-      );
-    }
-    return controller.stream;
-  }
-
-  /**
-   * Creates a wrapper Stream that intercepts some errors from this stream.
-   *
-   * If this stream sends an error that matches [test], then it is intercepted
-   * by the [handle] function.
-   *
-   * The [onError] callback must be of type `void onError(error)` or
-   * `void onError(error, StackTrace stackTrace)`. Depending on the function
-   * type the stream either invokes [onError] with or without a stack
-   * trace. The stack trace argument might be `null` if the stream itself
-   * received an error without stack trace.
-   *
-   * An asynchronous error [:e:] is matched by a test function if [:test(e):]
-   * returns true. If [test] is omitted, every error is considered matching.
-   *
-   * If the error is intercepted, the [handle] function can decide what to do
-   * with it. It can throw if it wants to raise a new (or the same) error,
-   * or simply return to make the stream forget the error.
-   *
-   * If you need to transform an error into a data event, use the more generic
-   * [Stream.transform] to handle the event by writing a data event to
-   * the output sink.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will individually perform the `test` and handle the error.
-   */
-  Stream<T> handleError(Function onError, { bool test(error) }) {
-    return new _HandleErrorStream<T>(this, onError, test);
-  }
-
-  /**
-   * Creates a new stream from this stream that converts each element
-   * into zero or more events.
-   *
-   * Each incoming event is converted to an [Iterable] of new events,
-   * and each of these new events are then sent by the returned stream
-   * in order.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will individually call `convert` and expand the events.
-   */
-  Stream/*<S>*/ expand/*<S>*/(Iterable/*<S>*/ convert(T value)) {
-    return new _ExpandStream<T, dynamic/*=S*/>(this, convert);
-  }
-
-  /**
-   * Pipe the events of this stream into [streamConsumer].
-   *
-   * The events of this stream are added to `streamConsumer` using
-   * [StreamConsumer.addStream].
-   * The `streamConsumer` is closed when this stream has been successfully added
-   * to it - when the future returned by `addStream` completes without an error.
-   *
-   * Returns a future which completes when the stream has been consumed
-   * and the consumer has been closed.
-   *
-   * The returned future completes with the same result as the future returned
-   * by [StreamConsumer.close].
-   * If the adding of the stream itself fails in some way,
-   * then the consumer is expected to be closed, and won't be closed again.
-   * In that case the returned future completes with the error from calling
-   * `addStream`.
-   */
-  Future pipe(StreamConsumer<T> streamConsumer) {
-    return streamConsumer.addStream(this).then((_) => streamConsumer.close());
-  }
-
-  /**
-   * Chains this stream as the input of the provided [StreamTransformer].
-   *
-   * Returns the result of [:streamTransformer.bind:] itself.
-   *
-   * The `streamTransformer` can decide whether it wants to return a
-   * broadcast stream or not.
-   */
-  Stream/*<S>*/ transform/*<S>*/(
-      StreamTransformer<T, dynamic/*=S*/ > streamTransformer) {
-    return streamTransformer.bind(this);
-  }
-
-  /**
-   * Reduces a sequence of values by repeatedly applying [combine].
-   */
-  Future<T> reduce(T combine(T previous, T element)) {
-    _Future<T> result = new _Future<T>();
-    bool seenFirst = false;
-    T value;
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T element) {
-        if (seenFirst) {
-          _runUserCode(() => combine(value, element),
-                       (T newValue) { value = newValue; },
-                       _cancelAndErrorClosure(subscription, result));
-        } else {
-          value = element;
-          seenFirst = true;
-        }
-      },
-      onError: result._completeError,
-      onDone: () {
-        if (!seenFirst) {
-          try {
-            throw IterableElementError.noElement();
-          } catch (e, s) {
-            _completeWithErrorCallback(result, e,  s);
-          }
-        } else {
-          result._complete(value);
-        }
-      },
-      cancelOnError: true
-    );
-    return result;
-  }
-
-  /** Reduces a sequence of values by repeatedly applying [combine]. */
-  Future/*<S>*/ fold/*<S>*/(var/*=S*/ initialValue,
-      /*=S*/ combine(var/*=S*/ previous, T element)) {
-
-    _Future/*<S>*/ result = new _Future/*<S>*/();
-    var/*=S*/ value = initialValue;
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T element) {
-        _runUserCode(
-          () => combine(value, element),
-          (/*=S*/ newValue) { value = newValue; },
-          _cancelAndErrorClosure(subscription, result)
-        );
-      },
-      onError: (e, st) {
-        result._completeError(e, st);
-      },
-      onDone: () {
-        result._complete(value);
-      },
-      cancelOnError: true);
-    return result;
-  }
-
-  /**
-   * Collects string of data events' string representations.
-   *
-   * If [separator] is provided, it is inserted between any two
-   * elements.
-   *
-   * Any error in the stream causes the future to complete with that
-   * error. Otherwise it completes with the collected string when
-   * the "done" event arrives.
-   */
-  Future<String> join([String separator = ""]) {
-    _Future<String> result = new _Future<String>();
-    StringBuffer buffer = new StringBuffer();
-    StreamSubscription subscription;
-    bool first = true;
-    subscription = this.listen(
-      (T element) {
-        if (!first) {
-          buffer.write(separator);
-        }
-        first = false;
-        try {
-          buffer.write(element);
-        } catch (e, s) {
-          _cancelAndErrorWithReplacement(subscription, result, e, s);
-        }
-      },
-      onError: (e) {
-        result._completeError(e);
-      },
-      onDone: () {
-        result._complete(buffer.toString());
-      },
-      cancelOnError: true);
-    return result;
-  }
-
-  /**
-   * Checks whether [needle] occurs in the elements provided by this stream.
-   *
-   * Completes the [Future] when the answer is known.
-   * If this stream reports an error, the [Future] will report that error.
-   */
-  Future<bool> contains(Object needle) {
-    _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(
-            () => (element == needle),
-            (bool isMatch) {
-              if (isMatch) {
-                _cancelAndValue(subscription, future, true);
-              }
-            },
-            _cancelAndErrorClosure(subscription, future)
-          );
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(false);
-        },
-        cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Executes [action] on each data event of the stream.
-   *
-   * Completes the returned [Future] when all events of the stream
-   * have been processed. Completes the future with an error if the
-   * stream has an error event, or if [action] throws.
-   */
-  Future forEach(void action(T element)) {
-    _Future future = new _Future();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(
-            () => action(element),
-            (_) {},
-            _cancelAndErrorClosure(subscription, future)
-          );
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(null);
-        },
-        cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Checks whether [test] accepts all elements provided by this stream.
-   *
-   * Completes the [Future] when the answer is known.
-   * If this stream reports an error, the [Future] will report that error.
-   */
-  Future<bool> every(bool test(T element)) {
-    _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(
-            () => test(element),
-            (bool isMatch) {
-              if (!isMatch) {
-                _cancelAndValue(subscription, future, false);
-              }
-            },
-            _cancelAndErrorClosure(subscription, future)
-          );
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(true);
-        },
-        cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Checks whether [test] accepts any element provided by this stream.
-   *
-   * Completes the [Future] when the answer is known.
-   *
-   * If this stream reports an error, the [Future] reports that error.
-   *
-   * Stops listening to the stream after the first matching element has been
-   * found.
-   *
-   * Internally the method cancels its subscription after this element. This
-   * means that single-subscription (non-broadcast) streams are closed and
-   * cannot be reused after a call to this method.
-   */
-  Future<bool> any(bool test(T element)) {
-    _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-        (T element) {
-          _runUserCode(
-            () => test(element),
-            (bool isMatch) {
-              if (isMatch) {
-                _cancelAndValue(subscription, future, true);
-              }
-            },
-            _cancelAndErrorClosure(subscription, future)
-          );
-        },
-        onError: future._completeError,
-        onDone: () {
-          future._complete(false);
-        },
-        cancelOnError: true);
-    return future;
-  }
-
-
-  /** Counts the elements in the stream. */
-  Future<int> get length {
-    _Future<int> future = new _Future<int>();
-    int count = 0;
-    this.listen(
-      (_) { count++; },
-      onError: future._completeError,
-      onDone: () {
-        future._complete(count);
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Reports whether this stream contains any elements.
-   *
-   * Stops listening to the stream after the first element has been received.
-   *
-   * Internally the method cancels its subscription after the first element.
-   * This means that single-subscription (non-broadcast) streams are closed and
-   * cannot be reused after a call to this getter.
-   */
-  Future<bool> get isEmpty {
-    _Future<bool> future = new _Future<bool>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (_) {
-        _cancelAndValue(subscription, future, false);
-      },
-      onError: future._completeError,
-      onDone: () {
-        future._complete(true);
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /** Collects the data of this stream in a [List]. */
-  Future<List<T>> toList() {
-    List<T> result = <T>[];
-    _Future<List<T>> future = new _Future<List<T>>();
-    this.listen(
-      (T data) {
-        result.add(data);
-      },
-      onError: future._completeError,
-      onDone: () {
-        future._complete(result);
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Collects the data of this stream in a [Set].
-   *
-   * The returned set is the same type as returned by `new Set<T>()`.
-   * If another type of set is needed, either use [forEach] to add each
-   * element to the set, or use
-   * `toList().then((list) => new SomeOtherSet.from(list))`
-   * to create the set.
-   */
-  Future<Set<T>> toSet() {
-    Set<T> result = new Set<T>();
-    _Future<Set<T>> future = new _Future<Set<T>>();
-    this.listen(
-      (T data) {
-        result.add(data);
-      },
-      onError: future._completeError,
-      onDone: () {
-        future._complete(result);
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Discards all data on the stream, but signals when it's done or an error
-   * occured.
-   *
-   * When subscribing using [drain], cancelOnError will be true. This means
-   * that the future will complete with the first error on the stream and then
-   * cancel the subscription.
-   *
-   * In case of a `done` event the future completes with the given
-   * [futureValue].
-   */
-  Future/*<E>*/ drain/*<E>*/([/*=E*/ futureValue])
-      => listen(null, cancelOnError: true).asFuture/*<E>*/(futureValue);
-
-  /**
-   * Provides at most the first [n] values of this stream.
-   *
-   * Forwards the first [n] data events of this stream, and all error
-   * events, to the returned stream, and ends with a done event.
-   *
-   * If this stream produces fewer than [count] values before it's done,
-   * so will the returned stream.
-   *
-   * Stops listening to the stream after the first [n] elements have been
-   * received.
-   *
-   * Internally the method cancels its subscription after these elements. This
-   * means that single-subscription (non-broadcast) streams are closed and
-   * cannot be reused after a call to this method.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * For a broadcast stream, the events are only counted from the time
-   * the returned stream is listened to.
-   */
-  Stream<T> take(int count) {
-    return new _TakeStream<T>(this, count);
-  }
-
-  /**
-   * Forwards data events while [test] is successful.
-   *
-   * The returned stream provides the same events as this stream as long
-   * as [test] returns [:true:] for the event data. The stream is done
-   * when either this stream is done, or when this stream first provides
-   * a value that [test] doesn't accept.
-   *
-   * Stops listening to the stream after the accepted elements.
-   *
-   * Internally the method cancels its subscription after these elements. This
-   * means that single-subscription (non-broadcast) streams are closed and
-   * cannot be reused after a call to this method.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * For a broadcast stream, the events are only tested from the time
-   * the returned stream is listened to.
-   */
-  Stream<T> takeWhile(bool test(T element)) {
-    return new _TakeWhileStream<T>(this, test);
-  }
-
-  /**
-   * Skips the first [count] data events from this stream.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * For a broadcast stream, the events are only counted from the time
-   * the returned stream is listened to.
-   */
-  Stream<T> skip(int count) {
-    return new _SkipStream<T>(this, count);
-  }
-
-  /**
-   * Skip data events from this stream while they are matched by [test].
-   *
-   * Error and done events are provided by the returned stream unmodified.
-   *
-   * Starting with the first data event where [test] returns false for the
-   * event data, the returned stream will have the same events as this stream.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * For a broadcast stream, the events are only tested from the time
-   * the returned stream is listened to.
-   */
-  Stream<T> skipWhile(bool test(T element)) {
-    return new _SkipWhileStream<T>(this, test);
-  }
-
-  /**
-   * Skips data events if they are equal to the previous data event.
-   *
-   * The returned stream provides the same events as this stream, except
-   * that it never provides two consecutive data events that are equal.
-   *
-   * Equality is determined by the provided [equals] method. If that is
-   * omitted, the '==' operator on the last provided data element is used.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will individually perform the `equals` test.
-   */
-  Stream<T> distinct([bool equals(T previous, T next)]) {
-    return new _DistinctStream<T>(this, equals);
-  }
-
-  /**
-   * Returns the first element of the stream.
-   *
-   * Stops listening to the stream after the first element has been received.
-   *
-   * Internally the method cancels its subscription after the first element.
-   * This means that single-subscription (non-broadcast) streams are closed
-   * and cannot be reused after a call to this getter.
-   *
-   * If an error event occurs before the first data event, the resulting future
-   * is completed with that error.
-   *
-   * If this stream is empty (a done event occurs before the first data event),
-   * the resulting future completes with a [StateError].
-   *
-   * Except for the type of the error, this method is equivalent to
-   * [:this.elementAt(0):].
-   */
-  Future<T> get first {
-    _Future<T> future = new _Future<T>();
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T value) {
-        _cancelAndValue(subscription, future, value);
-      },
-      onError: future._completeError,
-      onDone: () {
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Returns the last element of the stream.
-   *
-   * If an error event occurs before the first data event, the resulting future
-   * is completed with that error.
-   *
-   * If this stream is empty (a done event occurs before the first data event),
-   * the resulting future completes with a [StateError].
-   */
-  Future<T> get last {
-    _Future<T> future = new _Future<T>();
-    T result = null;
-    bool foundResult = false;
-    listen(
-      (T value) {
-        foundResult = true;
-        result = value;
-      },
-      onError: future._completeError,
-      onDone: () {
-        if (foundResult) {
-          future._complete(result);
-          return;
-        }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Returns the single element.
-   *
-   * If an error event occurs before or after the first data event, the
-   * resulting future is completed with that error.
-   *
-   * If [this] is empty or has more than one element throws a [StateError].
-   */
-  Future<T> get single {
-    _Future<T> future = new _Future<T>();
-    T result = null;
-    bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T value) {
-        if (foundResult) {
-          // This is the second element we get.
-          try {
-            throw IterableElementError.tooMany();
-          } catch (e, s) {
-            _cancelAndErrorWithReplacement(subscription, future, e, s);
-          }
-          return;
-        }
-        foundResult = true;
-        result = value;
-      },
-      onError: future._completeError,
-      onDone: () {
-        if (foundResult) {
-          future._complete(result);
-          return;
-        }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Finds the first element of this stream matching [test].
-   *
-   * Returns a future that is filled with the first element of this stream
-   * that [test] returns true for.
-   *
-   * If no such element is found before this stream is done, and a
-   * [defaultValue] function is provided, the result of calling [defaultValue]
-   * becomes the value of the future.
-   *
-   * Stops listening to the stream after the first matching element has been
-   * received.
-   *
-   * Internally the method cancels its subscription after the first element that
-   * matches the predicate. This means that single-subscription (non-broadcast)
-   * streams are closed and cannot be reused after a call to this method.
-   *
-   * If an error occurs, or if this stream ends without finding a match and
-   * with no [defaultValue] function provided, the future will receive an
-   * error.
-   */
-  Future<dynamic> firstWhere(bool test(T element), {Object defaultValue()}) {
-    _Future<dynamic> future = new _Future();
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T value) {
-        _runUserCode(
-          () => test(value),
-          (bool isMatch) {
-            if (isMatch) {
-              _cancelAndValue(subscription, future, value);
-            }
-          },
-          _cancelAndErrorClosure(subscription, future)
-        );
-      },
-      onError: future._completeError,
-      onDone: () {
-        if (defaultValue != null) {
-          _runUserCode(defaultValue, future._complete, future._completeError);
-          return;
-        }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Finds the last element in this stream matching [test].
-   *
-   * As [firstWhere], except that the last matching element is found.
-   * That means that the result cannot be provided before this stream
-   * is done.
-   */
-  Future<dynamic> lastWhere(bool test(T element), {Object defaultValue()}) {
-    _Future<dynamic> future = new _Future();
-    T result = null;
-    bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T value) {
-        _runUserCode(
-          () => true == test(value),
-          (bool isMatch) {
-            if (isMatch) {
-              foundResult = true;
-              result = value;
-            }
-          },
-          _cancelAndErrorClosure(subscription, future)
-        );
-      },
-      onError: future._completeError,
-      onDone: () {
-        if (foundResult) {
-          future._complete(result);
-          return;
-        }
-        if (defaultValue != null) {
-          _runUserCode(defaultValue, future._complete, future._completeError);
-          return;
-        }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Finds the single element in this stream matching [test].
-   *
-   * Like [lastMatch], except that it is an error if more than one
-   * matching element occurs in the stream.
-   */
-  Future<T> singleWhere(bool test(T element)) {
-    _Future<T> future = new _Future<T>();
-    T result = null;
-    bool foundResult = false;
-    StreamSubscription subscription;
-    subscription = this.listen(
-      (T value) {
-        _runUserCode(
-          () => true == test(value),
-          (bool isMatch) {
-            if (isMatch) {
-              if (foundResult) {
-                try {
-                  throw IterableElementError.tooMany();
-                } catch (e, s) {
-                  _cancelAndErrorWithReplacement(subscription, future, e, s);
-                }
-                return;
-              }
-              foundResult = true;
-              result = value;
-            }
-          },
-          _cancelAndErrorClosure(subscription, future)
-        );
-      },
-      onError: future._completeError,
-      onDone: () {
-        if (foundResult) {
-          future._complete(result);
-          return;
-        }
-        try {
-          throw IterableElementError.noElement();
-        } catch (e, s) {
-          _completeWithErrorCallback(future, e, s);
-        }
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Returns the value of the [index]th data event of this stream.
-   *
-   * Stops listening to the stream after the [index]th data event has been
-   * received.
-   *
-   * Internally the method cancels its subscription after these elements. This
-   * means that single-subscription (non-broadcast) streams are closed and
-   * cannot be reused after a call to this method.
-   *
-   * If an error event occurs before the value is found, the future completes
-   * with this error.
-   *
-   * If a done event occurs before the value is found, the future completes
-   * with a [RangeError].
-   */
-  Future<T> elementAt(int index) {
-    if (index is! int || index < 0) throw new ArgumentError(index);
-    _Future<T> future = new _Future<T>();
-    StreamSubscription subscription;
-    int elementIndex = 0;
-    subscription = this.listen(
-      (T value) {
-        if (index == elementIndex) {
-          _cancelAndValue(subscription, future, value);
-          return;
-        }
-        elementIndex += 1;
-      },
-      onError: future._completeError,
-      onDone: () {
-        future._completeError(
-            new RangeError.index(index, this, "index", null, elementIndex));
-      },
-      cancelOnError: true);
-    return future;
-  }
-
-  /**
-   * Creates a new stream with the same events as this stream.
-   *
-   * Whenever more than [timeLimit] passes between two events from this stream,
-   * the [onTimeout] function is called.
-   *
-   * The countdown doesn't start until the returned stream is listened to.
-   * The countdown is reset every time an event is forwarded from this stream,
-   * or when the stream is paused and resumed.
-   *
-   * The [onTimeout] function is called with one argument: an
-   * [EventSink] that allows putting events into the returned stream.
-   * This `EventSink` is only valid during the call to `onTimeout`.
-   *
-   * If `onTimeout` is omitted, a timeout will just put a [TimeoutException]
-   * into the error channel of the returned stream.
-   *
-   * The returned stream is a broadcast stream if this stream is.
-   * If a broadcast stream is listened to more than once, each subscription
-   * will have its individually timer that starts counting on listen,
-   * and the subscriptions' timers can be paused individually.
-   */
-  Stream<T> timeout(Duration timeLimit, {void onTimeout(EventSink<T> sink)}) {
-    StreamController<T> controller;
-    // The following variables are set on listen.
-    StreamSubscription<T> subscription;
-    Timer timer;
-    Zone zone;
-    _TimerCallback timeout;
-
-    void onData(T event) {
-      timer.cancel();
-      controller.add(event);
-      timer = zone.createTimer(timeLimit, timeout);
-    }
-    void onError(error, StackTrace stackTrace) {
-      timer.cancel();
-      assert(controller is _StreamController ||
-             controller is _BroadcastStreamController);
-      dynamic eventSink = controller;
-      eventSink._addError(error, stackTrace);  // Avoid Zone error replacement.
-      timer = zone.createTimer(timeLimit, timeout);
-    }
-    void onDone() {
-      timer.cancel();
-      controller.close();
-    }
-    void onListen() {
-      // This is the onListen callback for of controller.
-      // It runs in the same zone that the subscription was created in.
-      // Use that zone for creating timers and running the onTimeout
-      // callback.
-      zone = Zone.current;
-      if (onTimeout == null) {
-        timeout = () {
-          controller.addError(new TimeoutException("No stream event",
-                                                   timeLimit), null);
-        };
-      } else {
-        // TODO(floitsch): the return type should be 'void', and the type
-        // should be inferred.
-        var registeredOnTimeout =
-            zone.registerUnaryCallback/*<dynamic, EventSink<T>>*/(onTimeout);
-        _ControllerEventSinkWrapper wrapper =
-            new _ControllerEventSinkWrapper(null);
-        timeout = () {
-          wrapper._sink = controller;  // Only valid during call.
-          zone.runUnaryGuarded(registeredOnTimeout, wrapper);
-          wrapper._sink = null;
-        };
-      }
-
-      subscription = this.listen(onData, onError: onError, onDone: onDone);
-      timer = zone.createTimer(timeLimit, timeout);
-    }
-    Future onCancel() {
-      timer.cancel();
-      Future result = subscription.cancel();
-      subscription = null;
-      return result;
-    }
-    controller = isBroadcast
-        ? new _SyncBroadcastStreamController<T>(onListen, onCancel)
-        : new _SyncStreamController<T>(
-              onListen,
-              () {
-                // Don't null the timer, onCancel may call cancel again.
-                timer.cancel();
-                subscription.pause();
-              },
-              () {
-                subscription.resume();
-                timer = zone.createTimer(timeLimit, timeout);
-              },
-              onCancel);
-    return controller.stream;
-  }
-}
-
-/**
- * A subscription on events from a [Stream].
- *
- * When you listen on a [Stream] using [Stream.listen],
- * a [StreamSubscription] object is returned.
- *
- * The subscription provides events to the listener,
- * and holds the callbacks used to handle the events.
- * The subscription can also be used to unsubscribe from the events,
- * or to temporarily pause the events from the stream.
- */
-abstract class StreamSubscription<T> {
-  /**
-   * Cancels this subscription.
-   *
-   * After this call, the subscription no longer receives events.
-   *
-   * The stream may need to shut down the source of events and clean up after
-   * the subscription is canceled.
-   *
-   * Returns a future that is completed once the stream has finished
-   * its cleanup. May also return `null` if no cleanup was necessary.
-   *
-   * Typically, futures are returned when the stream needs to release resources.
-   * For example, a stream might need to close an open file (as an asynchronous
-   * operation). If the listener wants to delete the file after having
-   * canceled the subscription, it must wait for the cleanup future to complete.
-   *
-   * A returned future completes with a `null` value.
-   * If the cleanup throws, which it really shouldn't, the returned future
-   * completes with that error.
-   */
-  Future cancel();
-
-  /**
-   * Set or override the data event handler of this subscription.
-   *
-   * This method overrides the handler that has been set at the invocation of
-   * [Stream.listen].
-   */
-  void onData(void handleData(T data));
-
-  /**
-   * Set or override the error event handler of this subscription.
-   *
-   * This method overrides the handler that has been set at the invocation of
-   * [Stream.listen] or by calling [asFuture].
-   */
-  void onError(Function handleError);
-
-  /**
-   * Set or override the done event handler of this subscription.
-   *
-   * This method overrides the handler that has been set at the invocation of
-   * [Stream.listen] or by calling [asFuture].
-   */
-  void onDone(void handleDone());
-
-  /**
-   * Request that the stream pauses events until further notice.
-   *
-   * While paused, the subscription will not fire any events.
-   * If it receives events from its source, they will be buffered until
-   * the subscription is resumed.
-   * The underlying source is usually informed about the pause,
-   * so it can stop generating events until the subscription is resumed.
-   *
-   * To avoid buffering events on a broadcast stream, it is better to
-   * cancel this subscription, and start to listen again when events
-   * are needed.
-   *
-   * If [resumeSignal] is provided, the stream will undo the pause
-   * when the future completes. If the future completes with an error,
-   * the stream will resume, but the error will not be handled!
-   *
-   * A call to [resume] will also undo a pause.
-   *
-   * If the subscription is paused more than once, an equal number
-   * of resumes must be performed to resume the stream.
-   *
-   * Currently DOM streams silently drop events when the stream is paused. This
-   * is a bug and will be fixed.
-   */
-  void pause([Future resumeSignal]);
-
-  /**
-   * Resume after a pause.
-   */
-  void resume();
-
-  /**
-   * Returns true if the [StreamSubscription] is paused.
-   */
-  bool get isPaused;
-
-  /**
-   * Returns a future that handles the [onDone] and [onError] callbacks.
-   *
-   * This method *overwrites* the existing [onDone] and [onError] callbacks
-   * with new ones that complete the returned future.
-   *
-   * In case of an error the subscription will automatically cancel (even
-   * when it was listening with `cancelOnError` set to `false`).
-   *
-   * In case of a `done` event the future completes with the given
-   * [futureValue].
-   */
-  Future/*<E>*/ asFuture/*<E>*/([var/*=E*/ futureValue]);
-}
-
-
-/**
- * An interface that abstracts creation or handling of [Stream] events.
- */
-abstract class EventSink<T> implements Sink<T> {
-  /** Send a data event to a stream. */
-  void add(T event);
-
-  /** Send an async error to a stream. */
-  void addError(errorEvent, [StackTrace stackTrace]);
-
-  /** Close the sink. No further events can be added after closing. */
-  void close();
-}
-
-
-/** [Stream] wrapper that only exposes the [Stream] interface. */
-class StreamView<T> extends Stream<T> {
-  final Stream<T> _stream;
-
-  const StreamView(Stream<T> stream) : _stream = stream, super._internal();
-
-  bool get isBroadcast => _stream.isBroadcast;
-
-  Stream<T> asBroadcastStream(
-      {void onListen(StreamSubscription<T> subscription),
-       void onCancel(StreamSubscription<T> subscription)})
-      => _stream.asBroadcastStream(onListen: onListen, onCancel: onCancel);
-
-  StreamSubscription<T> listen(void onData(T value),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError }) {
-    return _stream.listen(onData, onError: onError, onDone: onDone,
-                          cancelOnError: cancelOnError);
-  }
-}
-
-
-/**
- * Abstract interface for a "sink" accepting multiple entire streams.
- *
- * A consumer can accept a number of consecutive streams using [addStream],
- * and when no further data need to be added, the [close] method tells the
- * consumer to complete its work and shut down.
- *
- * This class is not just a [Sink<Stream>] because it is also combined with
- * other [Sink] classes, like it's combined with [EventSink] in the
- * [StreamSink] class.
- *
- * The [Stream.pipe] accepts a `StreamConsumer` and will pass the stream
- * to the consumer's [addStream] method. When that completes, it will
- * call [close] and then complete its own returned future.
- */
-abstract class StreamConsumer<S> {
-  /**
-   * Consumes the elements of [stream].
-   *
-   * Listens on [stream] and does something for each event.
-   *
-   * Returns a future which is completed when the stream is done being added,
-   * and the consumer is ready to accept a new stream.
-   * No further calls to [addStream] or [close] should happen before the
-   * returned future has completed.
-   *
-   * The consumer may stop listening to the stream after an error,
-   * it may consume all the errors and only stop at a done event,
-   * or it may be canceled early if the receiver don't want any further events.
-   *
-   * If the consumer stops listening because of some error preventing it
-   * from continuing, it may report this error in the returned future,
-   * otherwise it will just complete the future with `null`.
-   */
-  Future addStream(Stream<S> stream);
-
-  /**
-   * Tells the consumer that no further streams will be added.
-   *
-   * This allows the consumer to complete any remaining work and release
-   * resources that are no longer needed
-   *
-   * Returns a future which is completed when the consumer has shut down.
-   * If cleaning up can fail, the error may be reported in the returned future,
-   * otherwise it completes with `null`.
-   */
-  Future close();
-}
-
-
-/**
- * A object that accepts stream events both synchronously and asynchronously.
- *
- * A [StreamSink] unifies the asynchronous methods from [StreamConsumer] and
- * the synchronous methods from [EventSink].
- *
- * The [EventSink] methods can't be used while the [addStream] is called.
- * As soon as the [addStream]'s [Future] completes with a value, the
- * [EventSink] methods can be used again.
- *
- * If [addStream] is called after any of the [EventSink] methods, it'll
- * be delayed until the underlying system has consumed the data added by the
- * [EventSink] methods.
- *
- * When [EventSink] methods are used, the [done] [Future] can be used to
- * catch any errors.
- *
- * When [close] is called, it will return the [done] [Future].
- */
-abstract class StreamSink<S> implements EventSink<S>, StreamConsumer<S> {
-  /**
-   * Tells the stream sink that no further streams will be added.
-   *
-   * This allows the stream sink to complete any remaining work and release
-   * resources that are no longer needed
-   *
-   * Returns a future which is completed when the stream sink has shut down.
-   * If cleaning up can fail, the error may be reported in the returned future,
-   * otherwise it completes with `null`.
-   *
-   * Returns the same future as [done].
-   *
-   * The stream sink may close before the [close] method is called, either due
-   * to an error or because it is itself providing events to someone who has
-   * stopped listening. In that case, the [done] future is completed first,
-   * and the `close` method will return the `done` future when called.
-   *
-   * Unifies [StreamConsumer.close] and [EventSink.close] which both mark their
-   * object as not expecting any further events.
-   */
-  Future close();
-
-  /**
-   * Return a future which is completed when the [StreamSink] is finished.
-   *
-   * If the `StreamSink` fails with an error,
-   * perhaps in response to adding events using [add], [addError] or [close],
-   * the [done] future will complete with that error.
-   *
-   * Otherwise, the returned future will complete when either:
-   *
-   * * all events have been processed and the sink has been closed, or
-   * * the sink has otherwise been stopped from handling more events
-   *   (for example by cancelling a stream subscription).
-   */
-  Future get done;
-}
-
-
-/**
- * The target of a [Stream.transform] call.
- *
- * The [Stream.transform] call will pass itself to this object and then return
- * the resulting stream.
- *
- * It is good practice to write transformers that can be used multiple times.
- */
-abstract class StreamTransformer<S, T> {
-  /**
-   * Creates a [StreamTransformer].
-   *
-   * The returned instance takes responsibility of implementing ([bind]).
-   * When the user invokes `bind` it returns a new "bound" stream. Only when
-   * the user starts listening to the bound stream, the `listen` method
-   * invokes the given closure [transformer].
-   *
-   * The [transformer] closure receives the stream, that was bound, as argument
-   * and returns a [StreamSubscription]. In almost all cases the closure
-   * listens itself to the stream that is given as argument.
-   *
-   * The result of invoking the [transformer] closure is a [StreamSubscription].
-   * The bound stream-transformer (created by the `bind` method above) then sets
-   * the handlers it received as part of the `listen` call.
-   *
-   * Conceptually this can be summarized as follows:
-   *
-   * 1. `var transformer = new StreamTransformer(transformerClosure);`
-   *   creates a `StreamTransformer` that supports the `bind` method.
-   * 2. `var boundStream = stream.transform(transformer);` binds the `stream`
-   *   and returns a bound stream that has a pointer to `stream`.
-   * 3. `boundStream.listen(f1, onError: f2, onDone: f3, cancelOnError: b)`
-   *   starts the listening and transformation. This is accomplished
-   *   in 2 steps: first the `boundStream` invokes the `transformerClosure` with
-   *   the `stream` it captured: `transformerClosure(stream, b)`.
-   *   The result `subscription`, a [StreamSubscription], is then
-   *   updated to receive its handlers: `subscription.onData(f1)`,
-   *   `subscription.onError(f2)`, `subscription(f3)`. Finally the subscription
-   *   is returned as result of the `listen` call.
-   *
-   * There are two common ways to create a StreamSubscription:
-   *
-   * 1. by creating a new class that implements [StreamSubscription].
-   *    Note that the subscription should run callbacks in the [Zone] the
-   *    stream was listened to.
-   * 2. by allocating a [StreamController] and to return the result of
-   *    listening to its stream.
-   *
-   * Example use of a duplicating transformer:
-   *
-   *     stringStream.transform(new StreamTransformer<String, String>(
-   *         (Stream<String> input, bool cancelOnError) {
-   *           StreamController<String> controller;
-   *           StreamSubscription<String> subscription;
-   *           controller = new StreamController<String>(
-   *             onListen: () {
-   *               subscription = input.listen((data) {
-   *                   // Duplicate the data.
-   *                   controller.add(data);
-   *                   controller.add(data);
-   *                 },
-   *                 onError: controller.addError,
-   *                 onDone: controller.close,
-   *                 cancelOnError: cancelOnError);
-   *             },
-   *             onPause: () { subscription.pause(); },
-   *             onResume: () { subscription.resume(); },
-   *             onCancel: () { subscription.cancel(); },
-   *             sync: true);
-   *           return controller.stream.listen(null);
-   *         });
-   */
-  const factory StreamTransformer(
-      StreamSubscription<T> transformer(Stream<S> stream, bool cancelOnError))
-      = _StreamSubscriptionTransformer<S, T>;
-
-  /**
-   * Creates a [StreamTransformer] that delegates events to the given functions.
-   *
-   * Example use of a duplicating transformer:
-   *
-   *     stringStream.transform(new StreamTransformer<String, String>.fromHandlers(
-   *         handleData: (String value, EventSink<String> sink) {
-   *           sink.add(value);
-   *           sink.add(value);  // Duplicate the incoming events.
-   *         }));
-   */
-  factory StreamTransformer.fromHandlers({
-      void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)})
-          = _StreamHandlerTransformer<S, T>;
-
-  /**
-   * Transform the incoming [stream]'s events.
-   *
-   * Creates a new stream.
-   * When this stream is listened to, it will start listening on [stream],
-   * and generate events on the new stream based on the events from [stream].
-   *
-   * Subscriptions on the returned stream should propagate pause state
-   * to the subscription on [stream].
-   */
-  Stream<T> bind(Stream<S> stream);
-}
-
-/**
- * An [Iterator] like interface for the values of a [Stream].
- *
- * This wraps a [Stream] and a subscription on the stream. It listens
- * on the stream, and completes the future returned by [moveNext] when the
- * next value becomes available.
- */
-abstract class StreamIterator<T> {
-
-  /** Create a [StreamIterator] on [stream]. */
-  factory StreamIterator(Stream<T> stream)
-      // TODO(lrn): use redirecting factory constructor when type
-      // arguments are supported.
-      => new _StreamIteratorImpl<T>(stream);
-
-  /**
-   * Wait for the next stream value to be available.
-   *
-   * Returns a future which will complete with either `true` or `false`.
-   * Completing with `true` means that another event has been received and
-   * can be read as [current].
-   * Completing with `false` means that the stream itearation is done and
-   * no further events will ever be available.
-   * The future may complete with an error, if the stream produces an error,
-   * which also ends iteration.
-   *
-   * The function must not be called again until the future returned by a
-   * previous call is completed.
-   */
-  Future<bool> moveNext();
-
-  /**
-   * The current value of the stream.
-   *
-   * Is `null` before the first call to [moveNext] and after a call to
-   * `moveNext` completes with a `false` result or an error.
-   *
-   * When a `moveNext` call completes with `true`, the `current` field holds
-   * the most recent event of the stream, and it stays like that until the next
-   * call to `moveNext`.
-   * Between a call to `moveNext` and when its returned future completes,
-   * the value is unspecified.
-   */
-  T get current;
-
-  /**
-   * Cancels the stream iterator (and the underlying stream subscription) early.
-   *
-   * The stream iterator is automatically canceled if the [moveNext] future
-   * completes with either `false` or an error.
-   *
-   * If you need to stop listening for values before the stream iterator is
-   * automatically closed, you must call [cancel] to ensure that the stream
-   * is properly closed.
-   *
-   * If [moveNext] has been called when the iterator is cancelled,
-   * its returned future will complete with `false` as value,
-   * as will all further calls to [moveNext].
-   *
-   * Returns a future if the cancel-operation is not completed synchronously.
-   * Otherwise returns `null`.
-   */
-  Future cancel();
-}
-
-
-/**
- * Wraps an [_EventSink] so it exposes only the [EventSink] interface.
- */
-class _ControllerEventSinkWrapper<T> implements EventSink<T> {
-  EventSink _sink;
-  _ControllerEventSinkWrapper(this._sink);
-
-  void add(T data) { _sink.add(data); }
-  void addError(error, [StackTrace stackTrace]) {
-    _sink.addError(error, stackTrace);
-  }
-  void close() { _sink.close(); }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_controller.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/stream_controller.dart
deleted file mode 100644
index 87b64e8..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_controller.dart
+++ /dev/null
@@ -1,948 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-// -------------------------------------------------------------------
-// Controller for creating and adding events to a stream.
-// -------------------------------------------------------------------
-
-/**
- * Type of a stream controller's `onListen`, `onPause` and `onResume` callbacks.
- */
-typedef void ControllerCallback();
-
-/**
- * Type of stream controller `onCancel` callbacks.
- *
- * The callback may return either `void` or a future.
- */
-typedef ControllerCancelCallback();
-
-/**
- * A controller with the stream it controls.
- *
- * This controller allows sending data, error and done events on
- * its [stream].
- * This class can be used to create a simple stream that others
- * can listen on, and to push events to that stream.
- *
- * It's possible to check whether the stream is paused or not, and whether
- * it has subscribers or not, as well as getting a callback when either of
- * these change.
- *
- * If the stream starts or stops having listeners (first listener subscribing,
- * last listener unsubscribing), the `onSubscriptionStateChange` callback
- * is notified as soon as possible. If the subscription stat changes during
- * an event firing or a callback being executed, the change will not be reported
- * until the current event or callback has finished.
- * If the pause state has also changed during an event or callback, only the
- * subscription state callback is notified.
- *
- * If the subscriber state has not changed, but the pause state has, the
- * `onPauseStateChange` callback is notified as soon as possible, after firing
- * a current event or completing another callback. This happens if the stream
- * is not paused, and a listener pauses it, or if the stream has been resumed
- * from pause and has no pending events. If the listeners resume a paused stream
- * while it still has queued events, the controller will still consider the
- * stream paused until all queued events have been dispatched.
- *
- * Whether to invoke a callback depends only on the state before and after
- * a stream action, for example firing an event. If the state changes multiple
- * times during the action, and then ends up in the same state as before, no
- * callback is performed.
- *
- * If listeners are added after the stream has completed (sent a "done" event),
- * the listeners will be sent a "done" event eventually, but they won't affect
- * the stream at all, and won't trigger callbacks. From the controller's point
- * of view, the stream is completely inert when has completed.
- */
-abstract class StreamController<T> implements StreamSink<T> {
-  /** The stream that this controller is controlling. */
-  Stream<T> get stream;
-
-  /**
-   * A controller with a [stream] that supports only one single subscriber.
-   *
-   * If [sync] is true, the returned stream controller is a
-   * [SynchronousStreamController], and must be used with the care
-   * and attention necessary to not break the [Stream] contract.
-   * See [Completer.sync] for some explanations on when a synchronous
-   * dispatching can be used.
-   * If in doubt, keep the controller non-sync.
-   *
-   * A Stream should be inert until a subscriber starts listening on it (using
-   * the [onListen] callback to start producing events). Streams should not
-   * leak resources (like websockets) when no user ever listens on the stream.
-   *
-   * The controller buffers all incoming events until a subscriber is
-   * registered, but this feature should only be used in rare circumstances.
-   *
-   * The [onPause] function is called when the stream becomes
-   * paused. [onResume] is called when the stream resumed.
-   *
-   * The [onListen] callback is called when the stream
-   * receives its listener and [onCancel] when the listener ends
-   * its subscription. If [onCancel] needs to perform an asynchronous operation,
-   * [onCancel] should return a future that completes when the cancel operation
-   * is done.
-   *
-   * If the stream is canceled before the controller needs new data the
-   * [onResume] call might not be executed.
-   */
-  factory StreamController({void onListen(),
-                            void onPause(),
-                            void onResume(),
-                            onCancel(),
-                            bool sync: false}) {
-    return sync
-         ? new _SyncStreamController<T>(onListen, onPause, onResume, onCancel)
-         : new _AsyncStreamController<T>(onListen, onPause, onResume, onCancel);
-  }
-
-  /**
-   * A controller where [stream] can be listened to more than once.
-   *
-   * The [Stream] returned by [stream] is a broadcast stream.
-   * It can be listened to more than once.
-   *
-   * A Stream should be inert until a subscriber starts listening on it (using
-   * the [onListen] callback to start producing events). Streams should not
-   * leak resources (like websockets) when no user ever listens on the stream.
-   *
-   * Broadcast streams do not buffer events when there is no listener.
-   *
-   * The controller distributes any events to all currently subscribed
-   * listeners at the time when [add], [addError] or [close] is called.
-   * It is not allowed to call `add`, `addError`, or `close` before a previous
-   * call has returned. The controller does not have any internal queue of
-   * events, and if there are no listeners at the time the event is added,
-   * it will just be dropped, or, if it is an error, be reported as uncaught.
-   *
-   * Each listener subscription is handled independently,
-   * and if one pauses, only the pausing listener is affected.
-   * A paused listener will buffer events internally until unpaused or canceled.
-   *
-   * If [sync] is true, events may be fired directly by the stream's
-   * subscriptions during an [add], [addError] or [close] call.
-   * The returned stream controller is a [SynchronousStreamController],
-   * and must be used with the care and attention necessary to not break
-   * the [Stream] contract.
-   * See [Completer.sync] for some explanations on when a synchronous
-   * dispatching can be used.
-   * If in doubt, keep the controller non-sync.
-   *
-   * If [sync] is false, the event will always be fired at a later time,
-   * after the code adding the event has completed.
-   * In that case, no guarantees are given with regard to when
-   * multiple listeners get the events, except that each listener will get
-   * all events in the correct order. Each subscription handles the events
-   * individually.
-   * If two events are sent on an async controller with two listeners,
-   * one of the listeners may get both events
-   * before the other listener gets any.
-   * A listener must be subscribed both when the event is initiated
-   * (that is, when [add] is called)
-   * and when the event is later delivered,
-   * in order to receive the event.
-   *
-   * The [onListen] callback is called when the first listener is subscribed,
-   * and the [onCancel] is called when there are no longer any active listeners.
-   * If a listener is added again later, after the [onCancel] was called,
-   * the [onListen] will be called again.
-   */
-  factory StreamController.broadcast({void onListen(),
-                                      void onCancel(),
-                                      bool sync: false}) {
-    return sync
-        ? new _SyncBroadcastStreamController<T>(onListen, onCancel)
-        : new _AsyncBroadcastStreamController<T>(onListen, onCancel);
-  }
-
-  /**
-   * The callback which is called when the stream is listened to.
-   *
-   * May be set to `null`, in which case no callback will happen.
-   */
-  ControllerCallback get onListen;
-
-  void set onListen(void onListenHandler());
-
-  /**
-   * The callback which is called when the stream is paused.
-   *
-   * May be set to `null`, in which case no callback will happen.
-   *
-   * Pause related callbacks are not supported on broadcast stream controllers.
-   */
-  ControllerCallback get onPause;
-
-  void set onPause(void onPauseHandler());
-
-  /**
-   * The callback which is called when the stream is resumed.
-   *
-   * May be set to `null`, in which case no callback will happen.
-   *
-   * Pause related callbacks are not supported on broadcast stream controllers.
-   */
-  ControllerCallback get onResume;
-
-  void set onResume(void onResumeHandler());
-
-  /**
-   * The callback which is called when the stream is canceled.
-   *
-   * May be set to `null`, in which case no callback will happen.
-   */
-  ControllerCancelCallback get onCancel;
-
-  void set onCancel(onCancelHandler());
-
-  /**
-   * Returns a view of this object that only exposes the [StreamSink] interface.
-   */
-  StreamSink<T> get sink;
-
-  /**
-   * Whether the stream controller is closed for adding more events.
-   *
-   * The controller becomes closed by calling the [close] method.
-   * New events cannot be added, by calling [add] or [addError],
-   * to a closed controller.
-   *
-   * If the controller is closed,
-   * the "done" event might not have been delivered yet,
-   * but it has been scheduled, and it is too late to add more events.
-   */
-  bool get isClosed;
-
-  /**
-   * Whether the subscription would need to buffer events.
-   *
-   * This is the case if the controller's stream has a listener and it is
-   * paused, or if it has not received a listener yet. In that case, the
-   * controller is considered paused as well.
-   *
-   * A broadcast stream controller is never considered paused. It always
-   * forwards its events to all uncanceled subscriptions, if any,
-   * and let the subscriptions handle their own pausing and buffering.
-   */
-  bool get isPaused;
-
-  /** Whether there is a subscriber on the [Stream]. */
-  bool get hasListener;
-
-  /**
-   * Send or enqueue an error event.
-   *
-   * If [error] is `null`, it is replaced by a [NullThrownError].
-   */
-  void addError(Object error, [StackTrace stackTrace]);
-
-  /**
-   * Receives events from [source] and puts them into this controller's stream.
-   *
-   * Returns a future which completes when the source stream is done.
-   *
-   * Events must not be added directly to this controller using [add],
-   * [addError], [close] or [addStream], until the returned future
-   * is complete.
-   *
-   * Data and error events are forwarded to this controller's stream. A done
-   * event on the source will end the `addStream` operation and complete the
-   * returned future.
-   *
-   * If [cancelOnError] is true, only the first error on [source] is
-   * forwarded to the controller's stream, and the `addStream` ends
-   * after this. If [cancelOnError] is false, all errors are forwarded
-   * and only a done event will end the `addStream`.
-   */
-  Future addStream(Stream<T> source, {bool cancelOnError: true});
-}
-
-
-/**
- * A stream controller that delivers its events synchronously.
- *
- * A synchronous stream controller is intended for cases where
- * an already asynchronous event triggers an event on a stream.
- *
- * Instead of adding the event to the stream in a later microtask,
- * causing extra latency, the event is instead fired immediately by the
- * synchronous stream controller, as if the stream event was
- * the current event or microtask.
- *
- * The synchronous stream controller can be used to break the contract
- * on [Stream], and it must be used carefully to avoid doing so.
- *
- * The only advantage to using a [SynchronousStreamController] over a
- * normal [StreamController] is the improved latency.
- * Only use the synchronous version if the improvement is significant,
- * and if its use is safe. Otherwise just use a normal stream controller,
- * which will always have the correct behavior for a [Stream], and won't
- * accidentally break other code.
- *
- * Adding events to a synchronous controller should only happen as the
- * very last part of a the handling of the original event.
- * At that point, adding an event to the stream is equivalent to
- * returning to the event loop and adding the event in the next microtask.
- *
- * Each listener callback will be run as if it was a top-level event
- * or microtask. This means that if it throws, the error will be reported as
- * uncaught as soon as possible.
- * This is one reason to add the event as the last thing in the original event
- * handler - any action done after adding the event will delay the report of
- * errors in the event listener callbacks.
- *
- * If an event is added in a setting that isn't known to be another event,
- * it may cause the stream's listener to get that event before the listener
- * is ready to handle it. We promise that after calling [Stream.listen],
- * you won't get any events until the code doing the listen has completed.
- * Calling [add] in response to a function call of unknown origin may break
- * that promise.
- *
- * An [onListen] callback from the controller is *not* an asynchronous event,
- * and adding events to the controller in the `onListen` callback is always
- * wrong. The events will be delivered before the listener has even received
- * the subscription yet.
- *
- * The synchronous broadcast stream controller also has a restrictions that a
- * normal stream controller does not:
- * The [add], [addError], [close] and [addStream] methods *must not* be
- * called while an event is being delivered.
- * That is, if a callback on a subscription on the controller's stream causes
- * a call to any of the functions above, the call will fail.
- * A broadcast stream may have more than one listener, and if an
- * event is added synchronously while another is being also in the process
- * of being added, the latter event might reach some listeners before
- * the former. To prevent that, an event cannot be added while a previous
- * event is being fired.
- * This guarantees that an event is fully delivered when the
- * first [add], [addError] or [close] returns,
- * and further events will be delivered in the correct order.
- *
- * This still only guarantees that the event is delivered to the subscription.
- * If the subscription is paused, the actual callback may still happen later,
- * and the event will instead be buffered by the subscription.
- * Barring pausing, and the following buffered events that haven't been
- * delivered yet, callbacks will be called synchronously when an event is added.
- *
- * Adding an event to a synchronous non-broadcast stream controller while
- * another event is in progress may cause the second event to be delayed
- * and not be delivered synchronously, and until that event is delivered,
- * the controller will not act synchronously.
- */
-abstract class SynchronousStreamController<T> implements StreamController<T> {
-  /**
-   * Adds event to the controller's stream.
-   *
-   * As [StreamController.add], but must not be called while an event is
-   * being added by [add], [addError] or [close].
-   */
-  void add(T data);
-
-  /**
-   * Adds error to the controller's stream.
-   *
-   * As [StreamController.addError], but must not be called while an event is
-   * being added by [add], [addError] or [close].
-   */
-  void addError(Object error, [StackTrace stackTrace]);
-
-  /**
-   * Closes the controller's stream.
-   *
-   * As [StreamController.close], but must not be called while an event is
-   * being added by [add], [addError] or [close].
-   */
-  Future close();
-}
-
-abstract class _StreamControllerLifecycle<T> {
-  StreamSubscription<T> _subscribe(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError);
-  void _recordPause(StreamSubscription<T> subscription) {}
-  void _recordResume(StreamSubscription<T> subscription) {}
-  Future _recordCancel(StreamSubscription<T> subscription) => null;
-}
-
-/**
- * Default implementation of [StreamController].
- *
- * Controls a stream that only supports a single controller.
- */
-abstract class _StreamController<T> implements StreamController<T>,
-                                               _StreamControllerLifecycle<T>,
-                                               _EventSink<T>,
-                                               _EventDispatch<T> {
-  // The states are bit-flags. More than one can be set at a time.
-  //
-  // The "subscription state" goes through the states:
-  //   initial -> subscribed -> canceled.
-  // These are mutually exclusive.
-  // The "closed" state records whether the [close] method has been called
-  // on the controller. This can be done at any time. If done before
-  // subscription, the done event is queued. If done after cancel, the done
-  // event is ignored (just as any other event after a cancel).
-
-  /** The controller is in its initial state with no subscription. */
-  static const int _STATE_INITIAL = 0;
-  /** The controller has a subscription, but hasn't been closed or canceled. */
-  static const int _STATE_SUBSCRIBED = 1;
-  /** The subscription is canceled. */
-  static const int _STATE_CANCELED = 2;
-  /** Mask for the subscription state. */
-  static const int _STATE_SUBSCRIPTION_MASK = 3;
-
-  // The following state relate to the controller, not the subscription.
-  // If closed, adding more events is not allowed.
-  // If executing an [addStream], new events are not allowed either, but will
-  // be added by the stream.
-
-  /**
-   * The controller is closed due to calling [close].
-   *
-   * When the stream is closed, you can neither add new events nor add new
-   * listeners.
-   */
-  static const int _STATE_CLOSED = 4;
-  /**
-   * The controller is in the middle of an [addStream] operation.
-   *
-   * While adding events from a stream, no new events can be added directly
-   * on the controller.
-   */
-  static const int _STATE_ADDSTREAM = 8;
-
-  /**
-   * Field containing different data depending on the current subscription
-   * state.
-   *
-   * If [_state] is [_STATE_INITIAL], the field may contain a [_PendingEvents]
-   * for events added to the controller before a subscription.
-   *
-   * While [_state] is [_STATE_SUBSCRIBED], the field contains the subscription.
-   *
-   * When [_state] is [_STATE_CANCELED] the field is currently not used.
-   */
-  var _varData;
-
-  /** Current state of the controller. */
-  int _state = _STATE_INITIAL;
-
-  /**
-   * Future completed when the stream sends its last event.
-   *
-   * This is also the future returned by [close].
-   */
-  // TODO(lrn): Could this be stored in the varData field too, if it's not
-  // accessed until the call to "close"? Then we need to special case if it's
-  // accessed earlier, or if close is called before subscribing.
-  _Future _doneFuture;
-
-  ControllerCallback onListen;
-  ControllerCallback onPause;
-  ControllerCallback onResume;
-  ControllerCancelCallback onCancel;
-
-  _StreamController(this.onListen,
-                    this.onPause,
-                    this.onResume,
-                    this.onCancel);
-
-  // Return a new stream every time. The streams are equal, but not identical.
-  Stream<T> get stream => new _ControllerStream<T>(this);
-
-  /**
-   * Returns a view of this object that only exposes the [StreamSink] interface.
-   */
-  StreamSink<T> get sink => new _StreamSinkWrapper<T>(this);
-
-  /**
-   * Whether a listener has existed and been canceled.
-   *
-   * After this, adding more events will be ignored.
-   */
-  bool get _isCanceled => (_state & _STATE_CANCELED) != 0;
-
-  /** Whether there is an active listener. */
-  bool get hasListener => (_state & _STATE_SUBSCRIBED) != 0;
-
-  /** Whether there has not been a listener yet. */
-  bool get _isInitialState =>
-      (_state & _STATE_SUBSCRIPTION_MASK) == _STATE_INITIAL;
-
-  bool get isClosed => (_state & _STATE_CLOSED) != 0;
-
-  bool get isPaused => hasListener ? _subscription._isInputPaused
-                                   : !_isCanceled;
-
-  bool get _isAddingStream => (_state & _STATE_ADDSTREAM) != 0;
-
-  /** New events may not be added after close, or during addStream. */
-  bool get _mayAddEvent => (_state < _STATE_CLOSED);
-
-  // Returns the pending events.
-  // Pending events are events added before a subscription exists.
-  // They are added to the subscription when it is created.
-  // Pending events, if any, are kept in the _varData field until the
-  // stream is listened to.
-  // While adding a stream, pending events are moved into the
-  // state object to allow the state object to use the _varData field.
-  _PendingEvents<T> get _pendingEvents {
-    assert(_isInitialState);
-    if (!_isAddingStream) {
-      return _varData as Object /*=_PendingEvents<T>*/;
-    }
-    _StreamControllerAddStreamState<T> state =
-      _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-    return state.varData as Object /*=_PendingEvents<T>*/;
-  }
-
-  // Returns the pending events, and creates the object if necessary.
-  _StreamImplEvents<T> _ensurePendingEvents() {
-    assert(_isInitialState);
-    if (!_isAddingStream) {
-      if (_varData == null) _varData = new _StreamImplEvents<T>();
-      return _varData as Object /*=_StreamImplEvents<T>*/;
-    }
-    _StreamControllerAddStreamState<T> state =
-        _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-    if (state.varData == null) state.varData = new _StreamImplEvents<T>();
-    return state.varData as Object /*=_StreamImplEvents<T>*/;
-  }
-
-  // Get the current subscription.
-  // If we are adding a stream, the subscription is moved into the state
-  // object to allow the state object to use the _varData field.
-  _ControllerSubscription<T> get _subscription {
-    assert(hasListener);
-    if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState =
-          _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-      return addState.varData as Object /*=_ControllerSubscription<T>*/;
-    }
-    return _varData as Object /*=_ControllerSubscription<T>*/;
-  }
-
-  /**
-   * Creates an error describing why an event cannot be added.
-   *
-   * The reason, and therefore the error message, depends on the current state.
-   */
-  Error _badEventState() {
-    if (isClosed) {
-      return new StateError("Cannot add event after closing");
-    }
-    assert(_isAddingStream);
-    return new StateError("Cannot add event while adding a stream");
-  }
-
-  // StreamSink interface.
-  Future addStream(Stream<T> source, {bool cancelOnError: true}) {
-    if (!_mayAddEvent) throw _badEventState();
-    if (_isCanceled) return new _Future.immediate(null);
-    _StreamControllerAddStreamState<T> addState =
-        new _StreamControllerAddStreamState<T>(this,
-                                               _varData,
-                                               source,
-                                               cancelOnError);
-    _varData = addState;
-    _state |= _STATE_ADDSTREAM;
-    return addState.addStreamFuture;
-  }
-
-  /**
-   * Returns a future that is completed when the stream is done
-   * processing events.
-   *
-   * This happens either when the done event has been sent, or if the
-   * subscriber of a single-subscription stream is cancelled.
-   */
-  Future get done => _ensureDoneFuture();
-
-  Future _ensureDoneFuture() {
-    if (_doneFuture == null) {
-      _doneFuture = _isCanceled ? Future._nullFuture : new _Future();
-    }
-    return _doneFuture;
-  }
-
-  /**
-   * Send or enqueue a data event.
-   */
-  void add(T value) {
-    if (!_mayAddEvent) throw _badEventState();
-    _add(value);
-  }
-
-  /**
-   * Send or enqueue an error event.
-   */
-  void addError(Object error, [StackTrace stackTrace]) {
-    if (!_mayAddEvent) throw _badEventState();
-    error = _nonNullError(error);
-    AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-    if (replacement != null) {
-      error = _nonNullError(replacement.error);
-      stackTrace = replacement.stackTrace;
-    }
-    _addError(error, stackTrace);
-  }
-
-  /**
-   * Closes this controller and sends a done event on the stream.
-   *
-   * The first time a controller is closed, a "done" event is added to its
-   * stream.
-   *
-   * You are allowed to close the controller more than once, but only the first
-   * call has any effect.
-   *
-   * After closing, no further events may be added using [add], [addError]
-   * or [addStream].
-   *
-   * The returned future is completed when the done event has been delivered.
-   */
-  Future close() {
-    if (isClosed) {
-      return _ensureDoneFuture();
-    }
-    if (!_mayAddEvent) throw _badEventState();
-    _closeUnchecked();
-    return _ensureDoneFuture();
-  }
-
-  void _closeUnchecked() {
-    _state |= _STATE_CLOSED;
-    if (hasListener) {
-      _sendDone();
-    } else if (_isInitialState) {
-      _ensurePendingEvents().add(const _DelayedDone());
-    }
-  }
-
-  // EventSink interface. Used by the [addStream] events.
-
-  // Add data event, used both by the [addStream] events and by [add].
-  void _add(T value) {
-    if (hasListener) {
-      _sendData(value);
-    } else if (_isInitialState) {
-      _ensurePendingEvents().add(new _DelayedData<T>(value));
-    }
-  }
-
-  void _addError(Object error, StackTrace stackTrace) {
-    if (hasListener) {
-      _sendError(error, stackTrace);
-    } else if (_isInitialState) {
-      _ensurePendingEvents().add(new _DelayedError(error, stackTrace));
-    }
-  }
-
-  void _close() {
-    // End of addStream stream.
-    assert(_isAddingStream);
-    _StreamControllerAddStreamState<T> addState =
-        _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-    _varData = addState.varData;
-    _state &= ~_STATE_ADDSTREAM;
-    addState.complete();
-  }
-
-  // _StreamControllerLifeCycle interface
-
-  StreamSubscription<T> _subscribe(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    if (!_isInitialState) {
-      throw new StateError("Stream has already been listened to.");
-    }
-    _ControllerSubscription<T> subscription =
-        new _ControllerSubscription<T>(this, onData, onError, onDone,
-                                       cancelOnError);
-
-    _PendingEvents<T> pendingEvents = _pendingEvents;
-    _state |= _STATE_SUBSCRIBED;
-    if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState =
-          _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-      addState.varData = subscription;
-      addState.resume();
-    } else {
-      _varData = subscription;
-    }
-    subscription._setPendingEvents(pendingEvents);
-    subscription._guardCallback(() {
-      _runGuarded(onListen);
-    });
-
-    return subscription;
-  }
-
-  Future _recordCancel(StreamSubscription<T> subscription) {
-    // When we cancel, we first cancel any stream being added,
-    // Then we call `onCancel`, and finally the _doneFuture is completed.
-    // If either of addStream's cancel or `onCancel` returns a future,
-    // we wait for it before continuing.
-    // Any error during this process ends up in the returned future.
-    // If more errors happen, we act as if it happens inside nested try/finallys
-    // or whenComplete calls, and only the last error ends up in the
-    // returned future.
-    Future result;
-    if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState =
-          _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-      result = addState.cancel();
-    }
-    _varData = null;
-    _state =
-        (_state & ~(_STATE_SUBSCRIBED | _STATE_ADDSTREAM)) | _STATE_CANCELED;
-
-    if (onCancel != null) {
-      if (result == null) {
-        // Only introduce a future if one is needed.
-        // If _onCancel returns null, no future is needed.
-        try {
-          result = onCancel();
-        } catch (e, s) {
-          // Return the error in the returned future.
-          // Complete it asynchronously, so there is time for a listener
-          // to handle the error.
-          result = new _Future().._asyncCompleteError(e, s);
-        }
-      } else {
-        // Simpler case when we already know that we will return a future.
-        result = result.whenComplete(onCancel);
-      }
-    }
-
-    void complete() {
-      if (_doneFuture != null && _doneFuture._mayComplete) {
-        _doneFuture._asyncComplete(null);
-      }
-    }
-
-    if (result != null) {
-      result = result.whenComplete(complete);
-    } else {
-      complete();
-    }
-
-    return result;
-  }
-
-  void _recordPause(StreamSubscription<T> subscription) {
-    if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState =
-          _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-      addState.pause();
-    }
-    _runGuarded(onPause);
-  }
-
-  void _recordResume(StreamSubscription<T> subscription) {
-    if (_isAddingStream) {
-      _StreamControllerAddStreamState<T> addState =
-          _varData as Object /*=_StreamControllerAddStreamState<T>*/;
-      addState.resume();
-    }
-    _runGuarded(onResume);
-  }
-}
-
-abstract class _SyncStreamControllerDispatch<T>
-    implements _StreamController<T>, SynchronousStreamController<T> {
-  int get _state;
-  void set _state(int state);
-
-  void _sendData(T data) {
-    _subscription._add(data);
-  }
-
-  void _sendError(Object error, StackTrace stackTrace) {
-    _subscription._addError(error, stackTrace);
-  }
-
-  void _sendDone() {
-    _subscription._close();
-  }
-}
-
-abstract class _AsyncStreamControllerDispatch<T>
-    implements _StreamController<T> {
-  void _sendData(T data) {
-    _subscription._addPending(new _DelayedData<dynamic /*=T*/>(data));
-  }
-
-  void _sendError(Object error, StackTrace stackTrace) {
-    _subscription._addPending(new _DelayedError(error, stackTrace));
-  }
-
-  void _sendDone() {
-    _subscription._addPending(const _DelayedDone());
-  }
-}
-
-// TODO(lrn): Use common superclass for callback-controllers when VM supports
-// constructors in mixin superclasses.
-
-class _AsyncStreamController<T> = _StreamController<T>
-                                  with _AsyncStreamControllerDispatch<T>;
-
-class _SyncStreamController<T> = _StreamController<T>
-                                 with _SyncStreamControllerDispatch<T>;
-
-typedef _NotificationHandler();
-
-Future _runGuarded(_NotificationHandler notificationHandler) {
-  if (notificationHandler == null) return null;
-  try {
-    var result = notificationHandler();
-    if (result is Future) return result;
-    return null;
-  } catch (e, s) {
-    Zone.current.handleUncaughtError(e, s);
-  }
-}
-
-class _ControllerStream<T> extends _StreamImpl<T> {
-  _StreamControllerLifecycle<T> _controller;
-
-  _ControllerStream(this._controller);
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) =>
-    _controller._subscribe(onData, onError, onDone, cancelOnError);
-
-  // Override == and hashCode so that new streams returned by the same
-  // controller are considered equal. The controller returns a new stream
-  // each time it's queried, but doesn't have to cache the result.
-
-  int get hashCode => _controller.hashCode ^ 0x35323532;
-
-  bool operator==(Object other) {
-    if (identical(this, other)) return true;
-    if (other is! _ControllerStream) return false;
-    _ControllerStream otherStream = other;
-    return identical(otherStream._controller, this._controller);
-  }
-}
-
-class _ControllerSubscription<T> extends _BufferingStreamSubscription<T> {
-  final _StreamControllerLifecycle<T> _controller;
-
-  _ControllerSubscription(this._controller, void onData(T data),
-                          Function onError, void onDone(), bool cancelOnError)
-      : super(onData, onError, onDone, cancelOnError);
-
-  Future _onCancel() {
-    return _controller._recordCancel(this);
-  }
-
-  void _onPause() {
-    _controller._recordPause(this);
-  }
-
-  void _onResume() {
-    _controller._recordResume(this);
-  }
-}
-
-
-/** A class that exposes only the [StreamSink] interface of an object. */
-class _StreamSinkWrapper<T> implements StreamSink<T> {
-  final StreamController _target;
-  _StreamSinkWrapper(this._target);
-  void add(T data) { _target.add(data); }
-  void addError(Object error, [StackTrace stackTrace]) {
-    _target.addError(error, stackTrace);
-  }
-  Future close() => _target.close();
-  Future addStream(Stream<T> source, {bool cancelOnError: true}) =>
-      _target.addStream(source, cancelOnError: cancelOnError);
-  Future get done => _target.done;
-}
-
-/**
- * Object containing the state used to handle [StreamController.addStream].
- */
-class _AddStreamState<T> {
-  // [_Future] returned by call to addStream.
-  final _Future addStreamFuture;
-
-  // Subscription on stream argument to addStream.
-  final StreamSubscription addSubscription;
-
-  _AddStreamState(_EventSink<T> controller, Stream source, bool cancelOnError)
-      : addStreamFuture = new _Future(),
-        addSubscription = source.listen(controller._add,
-                                        onError: cancelOnError
-                                             ? makeErrorHandler(controller)
-                                             : controller._addError,
-                                        onDone: controller._close,
-                                        cancelOnError: cancelOnError);
-
-  static makeErrorHandler(_EventSink controller) =>
-      (e, StackTrace s) {
-        controller._addError(e, s);
-        controller._close();
-      };
-
-  void pause() {
-    addSubscription.pause();
-  }
-
-  void resume() {
-    addSubscription.resume();
-  }
-
-  /**
-   * Stop adding the stream.
-   *
-   * Complete the future returned by `StreamController.addStream` when
-   * the cancel is complete.
-   *
-   * Return a future if the cancel takes time, otherwise return `null`.
-   */
-  Future cancel() {
-    var cancel = addSubscription.cancel();
-    if (cancel == null) {
-      addStreamFuture._asyncComplete(null);
-      return null;
-    }
-    return cancel.whenComplete(() { addStreamFuture._asyncComplete(null); });
-  }
-
-  void complete() {
-    addStreamFuture._asyncComplete(null);
-  }
-}
-
-class _StreamControllerAddStreamState<T> extends _AddStreamState<T> {
-  // The subscription or pending data of a _StreamController.
-  // Stored here because we reuse the `_varData` field  in the _StreamController
-  // to store this state object.
-  var varData;
-
-  _StreamControllerAddStreamState(_StreamController<T> controller,
-                                  this.varData,
-                                  Stream source,
-                                  bool cancelOnError)
-      : super(controller, source, cancelOnError) {
-    if (controller.isPaused) {
-      addSubscription.pause();
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/stream_impl.dart
deleted file mode 100644
index 7099973..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_impl.dart
+++ /dev/null
@@ -1,1096 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-/** Abstract and private interface for a place to put events. */
-abstract class _EventSink<T> {
-  void _add(T data);
-  void _addError(Object error, StackTrace stackTrace);
-  void _close();
-}
-
-/**
- * Abstract and private interface for a place to send events.
- *
- * Used by event buffering to finally dispatch the pending event, where
- * [_EventSink] is where the event first enters the stream subscription,
- * and may yet be buffered.
- */
-abstract class _EventDispatch<T> {
-  void _sendData(T data);
-  void _sendError(Object error, StackTrace stackTrace);
-  void _sendDone();
-}
-
-/**
- * Default implementation of stream subscription of buffering events.
- *
- * The only public methods are those of [StreamSubscription], so instances of
- * [_BufferingStreamSubscription] can be returned directly as a
- * [StreamSubscription] without exposing internal functionality.
- *
- * The [StreamController] is a public facing version of [Stream] and this class,
- * with some methods made public.
- *
- * The user interface of [_BufferingStreamSubscription] are the following
- * methods:
- *
- * * [_add]: Add a data event to the stream.
- * * [_addError]: Add an error event to the stream.
- * * [_close]: Request to close the stream.
- * * [_onCancel]: Called when the subscription will provide no more events,
- *     either due to being actively canceled, or after sending a done event.
- * * [_onPause]: Called when the subscription wants the event source to pause.
- * * [_onResume]: Called when allowing new events after a pause.
- *
- * The user should not add new events when the subscription requests a paused,
- * but if it happens anyway, the subscription will enqueue the events just as
- * when new events arrive while still firing an old event.
- */
-class _BufferingStreamSubscription<T> implements StreamSubscription<T>,
-                                                 _EventSink<T>,
-                                                 _EventDispatch<T> {
-  /** The `cancelOnError` flag from the `listen` call. */
-  static const int _STATE_CANCEL_ON_ERROR = 1;
-  /**
-   * Whether the "done" event has been received.
-   * No further events are accepted after this.
-   */
-  static const int _STATE_CLOSED = 2;
-  /**
-   * Set if the input has been asked not to send events.
-   *
-   * This is not the same as being paused, since the input will remain paused
-   * after a call to [resume] if there are pending events.
-   */
-  static const int _STATE_INPUT_PAUSED = 4;
-  /**
-   * Whether the subscription has been canceled.
-   *
-   * Set by calling [cancel], or by handling a "done" event, or an "error" event
-   * when `cancelOnError` is true.
-   */
-  static const int _STATE_CANCELED = 8;
-  /**
-   * Set when either:
-   *
-   *   * an error is sent, and [cancelOnError] is true, or
-   *   * a done event is sent.
-   *
-   * If the subscription is canceled while _STATE_WAIT_FOR_CANCEL is set, the
-   * state is unset, and no furher events must be delivered.
-   */
-  static const int _STATE_WAIT_FOR_CANCEL = 16;
-  static const int _STATE_IN_CALLBACK = 32;
-  static const int _STATE_HAS_PENDING = 64;
-  static const int _STATE_PAUSE_COUNT = 128;
-  static const int _STATE_PAUSE_COUNT_SHIFT = 7;
-
-  /* Event handlers provided in constructor. */
-  _DataHandler<T> _onData;
-  Function _onError;
-  _DoneHandler _onDone;
-  final Zone _zone = Zone.current;
-
-  /** Bit vector based on state-constants above. */
-  int _state;
-
-  // TODO(floitsch): reuse another field
-  /** The future [_onCancel] may return. */
-  Future _cancelFuture;
-
-  /**
-   * Queue of pending events.
-   *
-   * Is created when necessary, or set in constructor for preconfigured events.
-   */
-  _PendingEvents<T> _pending;
-
-  _BufferingStreamSubscription(void onData(T data),
-                               Function onError,
-                               void onDone(),
-                               bool cancelOnError)
-      : _state = (cancelOnError ? _STATE_CANCEL_ON_ERROR : 0) {
-    this.onData(onData);
-    this.onError(onError);
-    this.onDone(onDone);
-  }
-
-  /**
-   * Sets the subscription's pending events object.
-   *
-   * This can only be done once. The pending events object is used for the
-   * rest of the subscription's life cycle.
-   */
-  void _setPendingEvents(_PendingEvents<T> pendingEvents) {
-    assert(_pending == null);
-    if (pendingEvents == null) return;
-    _pending = pendingEvents;
-    if (!pendingEvents.isEmpty) {
-      _state |= _STATE_HAS_PENDING;
-      _pending.schedule(this);
-    }
-  }
-
-  // StreamSubscription interface.
-
-  void onData(void handleData(T event)) {
-    if (handleData == null) handleData = _nullDataHandler;
-    // TODO(floitsch): the return type should be 'void', and the type
-    // should be inferred.
-    _onData = _zone.registerUnaryCallback/*<dynamic, T>*/(handleData);
-  }
-
-  void onError(Function handleError) {
-    if (handleError == null) handleError = _nullErrorHandler;
-    _onError = _registerErrorHandler/*<T>*/(handleError, _zone);
-  }
-
-  void onDone(void handleDone()) {
-    if (handleDone == null) handleDone = _nullDoneHandler;
-    _onDone = _zone.registerCallback(handleDone);
-  }
-
-  void pause([Future resumeSignal]) {
-    if (_isCanceled) return;
-    bool wasPaused = _isPaused;
-    bool wasInputPaused = _isInputPaused;
-    // Increment pause count and mark input paused (if it isn't already).
-    _state = (_state + _STATE_PAUSE_COUNT) | _STATE_INPUT_PAUSED;
-    if (resumeSignal != null) resumeSignal.whenComplete(resume);
-    if (!wasPaused && _pending != null) _pending.cancelSchedule();
-    if (!wasInputPaused && !_inCallback) _guardCallback(_onPause);
-  }
-
-  void resume() {
-    if (_isCanceled) return;
-    if (_isPaused) {
-      _decrementPauseCount();
-      if (!_isPaused) {
-        if (_hasPending && !_pending.isEmpty) {
-          // Input is still paused.
-          _pending.schedule(this);
-        } else {
-          assert(_mayResumeInput);
-          _state &= ~_STATE_INPUT_PAUSED;
-          if (!_inCallback) _guardCallback(_onResume);
-        }
-      }
-    }
-  }
-
-  Future cancel() {
-    // The user doesn't want to receive any further events. If there is an
-    // error or done event pending (waiting for the cancel to be done) discard
-    // that event.
-    _state &= ~_STATE_WAIT_FOR_CANCEL;
-    if (_isCanceled) return _cancelFuture;
-    _cancel();
-    return _cancelFuture;
-  }
-
-  Future/*<E>*/ asFuture/*<E>*/([var/*=E*/ futureValue]) {
-    _Future/*<E>*/ result = new _Future/*<E>*/();
-
-    // Overwrite the onDone and onError handlers.
-    _onDone = () { result._complete(futureValue); };
-    _onError = (error, stackTrace) {
-      cancel();
-      result._completeError(error, stackTrace);
-    };
-
-    return result;
-  }
-
-  // State management.
-
-  bool get _isInputPaused => (_state & _STATE_INPUT_PAUSED) != 0;
-  bool get _isClosed => (_state & _STATE_CLOSED) != 0;
-  bool get _isCanceled => (_state & _STATE_CANCELED) != 0;
-  bool get _waitsForCancel => (_state & _STATE_WAIT_FOR_CANCEL) != 0;
-  bool get _inCallback => (_state & _STATE_IN_CALLBACK) != 0;
-  bool get _hasPending => (_state & _STATE_HAS_PENDING) != 0;
-  bool get _isPaused => _state >= _STATE_PAUSE_COUNT;
-  bool get _canFire => _state < _STATE_IN_CALLBACK;
-  bool get _mayResumeInput =>
-      !_isPaused && (_pending == null || _pending.isEmpty);
-  bool get _cancelOnError => (_state & _STATE_CANCEL_ON_ERROR) != 0;
-
-  bool get isPaused => _isPaused;
-
-  void _cancel() {
-    _state |= _STATE_CANCELED;
-    if (_hasPending) {
-      _pending.cancelSchedule();
-    }
-    if (!_inCallback) _pending = null;
-    _cancelFuture = _onCancel();
-  }
-
-  /**
-   * Increment the pause count.
-   *
-   * Also marks input as paused.
-   */
-  void _incrementPauseCount() {
-    _state = (_state + _STATE_PAUSE_COUNT) | _STATE_INPUT_PAUSED;
-  }
-
-  /**
-   * Decrements the pause count.
-   *
-   * Does not automatically unpause the input (call [_onResume]) when
-   * the pause count reaches zero. This is handled elsewhere, and only
-   * if there are no pending events buffered.
-   */
-  void _decrementPauseCount() {
-    assert(_isPaused);
-    _state -= _STATE_PAUSE_COUNT;
-  }
-
-  // _EventSink interface.
-
-  void _add(T data) {
-    assert(!_isClosed);
-    if (_isCanceled) return;
-    if (_canFire) {
-      _sendData(data);
-    } else {
-      _addPending(new _DelayedData<dynamic /*=T*/>(data));
-    }
-  }
-
-  void _addError(Object error, StackTrace stackTrace) {
-    if (_isCanceled) return;
-    if (_canFire) {
-      _sendError(error, stackTrace);  // Reports cancel after sending.
-    } else {
-      _addPending(new _DelayedError(error, stackTrace));
-    }
-  }
-
-  void _close() {
-    assert(!_isClosed);
-    if (_isCanceled) return;
-    _state |= _STATE_CLOSED;
-    if (_canFire) {
-      _sendDone();
-    } else {
-      _addPending(const _DelayedDone());
-    }
-  }
-
-  // Hooks called when the input is paused, unpaused or canceled.
-  // These must not throw. If overwritten to call user code, include suitable
-  // try/catch wrapping and send any errors to
-  // [_Zone.current.handleUncaughtError].
-  void _onPause() {
-    assert(_isInputPaused);
-  }
-
-  void _onResume() {
-    assert(!_isInputPaused);
-  }
-
-  Future _onCancel() {
-    assert(_isCanceled);
-    return null;
-  }
-
-  // Handle pending events.
-
-  /**
-   * Add a pending event.
-   *
-   * If the subscription is not paused, this also schedules a firing
-   * of pending events later (if necessary).
-   */
-  void _addPending(_DelayedEvent event) {
-    _StreamImplEvents<T> pending = _pending;
-    if (_pending == null) {
-      pending = _pending = new _StreamImplEvents<dynamic /*=T*/>();
-    }
-    pending.add(event);
-    if (!_hasPending) {
-      _state |= _STATE_HAS_PENDING;
-      if (!_isPaused) {
-        _pending.schedule(this);
-      }
-    }
-  }
-
-  /* _EventDispatch interface. */
-
-  void _sendData(T data) {
-    assert(!_isCanceled);
-    assert(!_isPaused);
-    assert(!_inCallback);
-    bool wasInputPaused = _isInputPaused;
-    _state |= _STATE_IN_CALLBACK;
-    _zone.runUnaryGuarded(_onData, data);
-    _state &= ~_STATE_IN_CALLBACK;
-    _checkState(wasInputPaused);
-  }
-
-  void _sendError(var error, StackTrace stackTrace) {
-    assert(!_isCanceled);
-    assert(!_isPaused);
-    assert(!_inCallback);
-    bool wasInputPaused = _isInputPaused;
-
-    void sendError() {
-      // If the subscription has been canceled while waiting for the cancel
-      // future to finish we must not report the error.
-      if (_isCanceled && !_waitsForCancel) return;
-      _state |= _STATE_IN_CALLBACK;
-      if (_onError is ZoneBinaryCallback<dynamic, Object, StackTrace>) {
-        ZoneBinaryCallback<dynamic, Object, StackTrace> errorCallback = _onError
-            as Object /*=ZoneBinaryCallback<dynamic, Object, StackTrace>*/;
-        _zone.runBinaryGuarded(errorCallback, error, stackTrace);
-      } else {
-        _zone.runUnaryGuarded/*<dynamic, dynamic>*/(
-            _onError as Object /*=ZoneUnaryCallback<dynamic, dynamic>*/, error);
-      }
-      _state &= ~_STATE_IN_CALLBACK;
-    }
-
-    if (_cancelOnError) {
-      _state |= _STATE_WAIT_FOR_CANCEL;
-      _cancel();
-      if (_cancelFuture is Future) {
-        _cancelFuture.whenComplete(sendError);
-      } else {
-        sendError();
-      }
-    } else {
-      sendError();
-      // Only check state if not cancelOnError.
-      _checkState(wasInputPaused);
-    }
-  }
-
-  void _sendDone() {
-    assert(!_isCanceled);
-    assert(!_isPaused);
-    assert(!_inCallback);
-
-    void sendDone() {
-      // If the subscription has been canceled while waiting for the cancel
-      // future to finish we must not report the done event.
-      if (!_waitsForCancel) return;
-      _state |= (_STATE_CANCELED | _STATE_CLOSED | _STATE_IN_CALLBACK);
-      _zone.runGuarded(_onDone);
-      _state &= ~_STATE_IN_CALLBACK;
-    }
-
-    _cancel();
-    _state |= _STATE_WAIT_FOR_CANCEL;
-    if (_cancelFuture is Future) {
-      _cancelFuture.whenComplete(sendDone);
-    } else {
-      sendDone();
-    }
-  }
-
-  /**
-   * Call a hook function.
-   *
-   * The call is properly wrapped in code to avoid other callbacks
-   * during the call, and it checks for state changes after the call
-   * that should cause further callbacks.
-   */
-  void _guardCallback(void callback()) {
-    assert(!_inCallback);
-    bool wasInputPaused = _isInputPaused;
-    _state |= _STATE_IN_CALLBACK;
-    callback();
-    _state &= ~_STATE_IN_CALLBACK;
-    _checkState(wasInputPaused);
-  }
-
-  /**
-   * Check if the input needs to be informed of state changes.
-   *
-   * State changes are pausing, resuming and canceling.
-   *
-   * After canceling, no further callbacks will happen.
-   *
-   * The cancel callback is called after a user cancel, or after
-   * the final done event is sent.
-   */
-  void _checkState(bool wasInputPaused) {
-    assert(!_inCallback);
-    if (_hasPending && _pending.isEmpty) {
-      _state &= ~_STATE_HAS_PENDING;
-      if (_isInputPaused && _mayResumeInput) {
-        _state &= ~_STATE_INPUT_PAUSED;
-      }
-    }
-    // If the state changes during a callback, we immediately
-    // make a new state-change callback. Loop until the state didn't change.
-    while (true) {
-      if (_isCanceled) {
-        _pending = null;
-        return;
-      }
-      bool isInputPaused = _isInputPaused;
-      if (wasInputPaused == isInputPaused) break;
-      _state ^= _STATE_IN_CALLBACK;
-      if (isInputPaused) {
-        _onPause();
-      } else {
-        _onResume();
-      }
-      _state &= ~_STATE_IN_CALLBACK;
-      wasInputPaused = isInputPaused;
-    }
-    if (_hasPending && !_isPaused) {
-      _pending.schedule(this);
-    }
-  }
-}
-
-// -------------------------------------------------------------------
-// Common base class for single and multi-subscription streams.
-// -------------------------------------------------------------------
-abstract class _StreamImpl<T> extends Stream<T> {
-  // ------------------------------------------------------------------
-  // Stream interface.
-
-  StreamSubscription<T> listen(void onData(T data),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError }) {
-    cancelOnError = identical(true, cancelOnError);
-    StreamSubscription<T> subscription =
-        _createSubscription(onData, onError, onDone, cancelOnError);
-    _onListen(subscription);
-    return subscription;
-  }
-
-  // -------------------------------------------------------------------
-  /** Create a subscription object. Called by [subcribe]. */
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    return new _BufferingStreamSubscription<T>(onData, onError, onDone,
-                                               cancelOnError);
-  }
-
-  /** Hook called when the subscription has been created. */
-  void _onListen(StreamSubscription subscription) {}
-}
-
-typedef _PendingEvents<T> _EventGenerator<T>();
-
-/** Stream that generates its own events. */
-class _GeneratedStreamImpl<T> extends _StreamImpl<T> {
-  final _EventGenerator<T> _pending;
-  bool _isUsed = false;
-  /**
-   * Initializes the stream to have only the events provided by a
-   * [_PendingEvents].
-   *
-   * A new [_PendingEvents] must be generated for each listen.
-   */
-  _GeneratedStreamImpl(this._pending);
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    if (_isUsed) throw new StateError("Stream has already been listened to.");
-    _isUsed = true;
-    return new _BufferingStreamSubscription<T>(
-        onData, onError, onDone, cancelOnError).._setPendingEvents(_pending());
-  }
-}
-
-
-/** Pending events object that gets its events from an [Iterable]. */
-class _IterablePendingEvents<T> extends _PendingEvents<T> {
-  // The iterator providing data for data events.
-  // Set to null when iteration has completed.
-  Iterator<T> _iterator;
-
-  _IterablePendingEvents(Iterable<T> data) : _iterator = data.iterator;
-
-  bool get isEmpty => _iterator == null;
-
-  void handleNext(_EventDispatch<T> dispatch) {
-    if (_iterator == null) {
-      throw new StateError("No events pending.");
-    }
-    // Send one event per call to moveNext.
-    // If moveNext returns true, send the current element as data.
-    // If moveNext returns false, send a done event and clear the _iterator.
-    // If moveNext throws an error, send an error and clear the _iterator.
-    // After an error, no further events will be sent.
-    bool isDone;
-    try {
-      isDone = !_iterator.moveNext();
-    } catch (e, s) {
-      _iterator = null;
-      dispatch._sendError(e, s);
-      return;
-    }
-    if (!isDone) {
-      dispatch._sendData(_iterator.current);
-    } else {
-      _iterator = null;
-      dispatch._sendDone();
-    }
-  }
-
-  void clear() {
-    if (isScheduled) cancelSchedule();
-    _iterator = null;
-  }
-}
-
-
-// Internal helpers.
-
-// Types of the different handlers on a stream. Types used to type fields.
-typedef void _DataHandler<T>(T value);
-typedef void _DoneHandler();
-
-
-/** Default data handler, does nothing. */
-void _nullDataHandler(var value) {}
-
-/** Default error handler, reports the error to the current zone's handler. */
-void _nullErrorHandler(error, [StackTrace stackTrace]) {
-  Zone.current.handleUncaughtError(error, stackTrace);
-}
-
-/** Default done handler, does nothing. */
-void _nullDoneHandler() {}
-
-
-/** A delayed event on a buffering stream subscription. */
-abstract class _DelayedEvent<T> {
-  /** Added as a linked list on the [StreamController]. */
-  _DelayedEvent next;
-  /** Execute the delayed event on the [StreamController]. */
-  void perform(_EventDispatch<T> dispatch);
-}
-
-/** A delayed data event. */
-class _DelayedData<T> extends _DelayedEvent<T> {
-  final T value;
-  _DelayedData(this.value);
-  void perform(_EventDispatch<T> dispatch) {
-    dispatch._sendData(value);
-  }
-}
-
-/** A delayed error event. */
-class _DelayedError extends _DelayedEvent {
-  final error;
-  final StackTrace stackTrace;
-
-  _DelayedError(this.error, this.stackTrace);
-  void perform(_EventDispatch dispatch) {
-    dispatch._sendError(error, stackTrace);
-  }
-}
-
-/** A delayed done event. */
-class _DelayedDone implements _DelayedEvent {
-  const _DelayedDone();
-  void perform(_EventDispatch dispatch) {
-    dispatch._sendDone();
-  }
-
-  _DelayedEvent get next => null;
-
-  void set next(_DelayedEvent _) {
-    throw new StateError("No events after a done.");
-  }
-}
-
-/** Superclass for provider of pending events. */
-abstract class _PendingEvents<T> {
-  // No async event has been scheduled.
-  static const int _STATE_UNSCHEDULED = 0;
-  // An async event has been scheduled to run a function.
-  static const int _STATE_SCHEDULED = 1;
-  // An async event has been scheduled, but it will do nothing when it runs.
-  // Async events can't be preempted.
-  static const int _STATE_CANCELED = 3;
-
-  /**
-   * State of being scheduled.
-   *
-   * Set to [_STATE_SCHEDULED] when pending events are scheduled for
-   * async dispatch. Since we can't cancel a [scheduleMicrotask] call, if
-   * scheduling is "canceled", the _state is simply set to [_STATE_CANCELED]
-   * which will make the async code do nothing except resetting [_state].
-   *
-   * If events are scheduled while the state is [_STATE_CANCELED], it is
-   * merely switched back to [_STATE_SCHEDULED], but no new call to
-   * [scheduleMicrotask] is performed.
-   */
-  int _state = _STATE_UNSCHEDULED;
-
-  bool get isEmpty;
-
-  bool get isScheduled => _state == _STATE_SCHEDULED;
-  bool get _eventScheduled => _state >= _STATE_SCHEDULED;
-
-  /**
-   * Schedule an event to run later.
-   *
-   * If called more than once, it should be called with the same dispatch as
-   * argument each time. It may reuse an earlier argument in some cases.
-   */
-  void schedule(_EventDispatch<T> dispatch) {
-    if (isScheduled) return;
-    assert(!isEmpty);
-    if (_eventScheduled) {
-      assert(_state == _STATE_CANCELED);
-      _state = _STATE_SCHEDULED;
-      return;
-    }
-    scheduleMicrotask(() {
-      int oldState = _state;
-      _state = _STATE_UNSCHEDULED;
-      if (oldState == _STATE_CANCELED) return;
-      handleNext(dispatch);
-    });
-    _state = _STATE_SCHEDULED;
-  }
-
-  void cancelSchedule() {
-    if (isScheduled) _state = _STATE_CANCELED;
-  }
-
-  void handleNext(_EventDispatch<T> dispatch);
-
-  /** Throw away any pending events and cancel scheduled events. */
-  void clear();
-}
-
-
-/** Class holding pending events for a [_StreamImpl]. */
-class _StreamImplEvents<T> extends _PendingEvents<T> {
-  /// Single linked list of [_DelayedEvent] objects.
-  _DelayedEvent firstPendingEvent = null;
-  /// Last element in the list of pending events. New events are added after it.
-  _DelayedEvent lastPendingEvent = null;
-
-  bool get isEmpty => lastPendingEvent == null;
-
-  void add(_DelayedEvent event) {
-    if (lastPendingEvent == null) {
-      firstPendingEvent = lastPendingEvent = event;
-    } else {
-      lastPendingEvent = lastPendingEvent.next = event;
-    }
-  }
-
-  void handleNext(_EventDispatch<T> dispatch) {
-    assert(!isScheduled);
-    _DelayedEvent event = firstPendingEvent;
-    firstPendingEvent = event.next;
-    if (firstPendingEvent == null) {
-      lastPendingEvent = null;
-    }
-    event.perform(dispatch);
-  }
-
-  void clear() {
-    if (isScheduled) cancelSchedule();
-    firstPendingEvent = lastPendingEvent = null;
-  }
-}
-
-class _BroadcastLinkedList {
-  _BroadcastLinkedList _next;
-  _BroadcastLinkedList _previous;
-
-  void _unlink() {
-    _previous._next = _next;
-    _next._previous = _previous;
-    _next = _previous = this;
-  }
-
-  void _insertBefore(_BroadcastLinkedList newNext) {
-    _BroadcastLinkedList newPrevious = newNext._previous;
-    newPrevious._next = this;
-    newNext._previous = _previous;
-    _previous._next = newNext;
-    _previous = newPrevious;
-  }
-}
-
-typedef void _BroadcastCallback<T>(StreamSubscription<T> subscription);
-
-/**
- * Done subscription that will send one done event as soon as possible.
- */
-class _DoneStreamSubscription<T> implements StreamSubscription<T> {
-  static const int _DONE_SENT = 1;
-  static const int _SCHEDULED = 2;
-  static const int _PAUSED = 4;
-
-  final Zone _zone;
-  int _state = 0;
-  _DoneHandler _onDone;
-
-  _DoneStreamSubscription(this._onDone) : _zone = Zone.current {
-    _schedule();
-  }
-
-  bool get _isSent => (_state & _DONE_SENT) != 0;
-  bool get _isScheduled => (_state & _SCHEDULED) != 0;
-  bool get isPaused => _state >= _PAUSED;
-
-  void _schedule() {
-    if (_isScheduled) return;
-    _zone.scheduleMicrotask(_sendDone);
-    _state |= _SCHEDULED;
-  }
-
-  void onData(void handleData(T data)) {}
-  void onError(Function handleError) {}
-  void onDone(void handleDone()) { _onDone = handleDone; }
-
-  void pause([Future resumeSignal]) {
-    _state += _PAUSED;
-    if (resumeSignal != null) resumeSignal.whenComplete(resume);
-  }
-
-  void resume() {
-    if (isPaused) {
-      _state -= _PAUSED;
-      if (!isPaused && !_isSent) {
-        _schedule();
-      }
-    }
-  }
-
-  Future cancel() => null;
-
-  Future/*<E>*/ asFuture/*<E>*/([var/*=E*/ futureValue]) {
-    _Future/*<E>*/ result = new _Future/*<E>*/();
-    _onDone = () { result._completeWithValue(null); };
-    return result;
-  }
-
-  void _sendDone() {
-    _state &= ~_SCHEDULED;
-    if (isPaused) return;
-    _state |= _DONE_SENT;
-    if (_onDone != null) _zone.runGuarded(_onDone);
-  }
-}
-
-class _AsBroadcastStream<T> extends Stream<T> {
-  final Stream<T> _source;
-  final _BroadcastCallback<T> _onListenHandler;
-  final _BroadcastCallback<T> _onCancelHandler;
-  final Zone _zone;
-
-  _AsBroadcastStreamController<T> _controller;
-  StreamSubscription<T> _subscription;
-
-  _AsBroadcastStream(this._source,
-                     void onListenHandler(StreamSubscription<T> subscription),
-                     void onCancelHandler(StreamSubscription<T> subscription))
-      // TODO(floitsch): the return type should be void and should be
-      // inferred.
-      : _onListenHandler = Zone.current.registerUnaryCallback
-            /*<dynamic, StreamSubscription<T>>*/(onListenHandler),
-        _onCancelHandler = Zone.current.registerUnaryCallback
-            /*<dynamic, StreamSubscription<T>>*/(onCancelHandler),
-        _zone = Zone.current {
-    _controller = new _AsBroadcastStreamController<T>(_onListen, _onCancel);
-  }
-
-  bool get isBroadcast => true;
-
-  StreamSubscription<T> listen(void onData(T data),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError}) {
-    if (_controller == null || _controller.isClosed) {
-      // Return a dummy subscription backed by nothing, since
-      // it will only ever send one done event.
-      return new _DoneStreamSubscription<T>(onDone);
-    }
-    if (_subscription == null) {
-      _subscription = _source.listen(_controller.add,
-                                     onError: _controller.addError,
-                                     onDone: _controller.close);
-    }
-    cancelOnError = identical(true, cancelOnError);
-    return _controller._subscribe(onData, onError, onDone, cancelOnError);
-  }
-
-  void _onCancel() {
-    bool shutdown = (_controller == null) || _controller.isClosed;
-    if (_onCancelHandler != null) {
-      _zone.runUnary(
-          _onCancelHandler, new _BroadcastSubscriptionWrapper<T>(this));
-    }
-    if (shutdown) {
-      if (_subscription != null) {
-        _subscription.cancel();
-        _subscription = null;
-      }
-    }
-  }
-
-  void _onListen() {
-    if (_onListenHandler != null) {
-      _zone.runUnary(
-          _onListenHandler, new _BroadcastSubscriptionWrapper<T>(this));
-    }
-  }
-
-  // Methods called from _BroadcastSubscriptionWrapper.
-  void _cancelSubscription() {
-    if (_subscription == null) return;
-    // Called by [_controller] when it has no subscribers left.
-    StreamSubscription subscription = _subscription;
-    _subscription = null;
-    _controller = null;  // Marks the stream as no longer listenable.
-    subscription.cancel();
-  }
-
-  void _pauseSubscription(Future resumeSignal) {
-    if (_subscription == null) return;
-    _subscription.pause(resumeSignal);
-  }
-
-  void _resumeSubscription() {
-    if (_subscription == null) return;
-    _subscription.resume();
-  }
-
-  bool get _isSubscriptionPaused {
-    if (_subscription == null) return false;
-    return _subscription.isPaused;
-  }
-}
-
-/**
- * Wrapper for subscription that disallows changing handlers.
- */
-class _BroadcastSubscriptionWrapper<T> implements StreamSubscription<T> {
-  final _AsBroadcastStream _stream;
-
-  _BroadcastSubscriptionWrapper(this._stream);
-
-  void onData(void handleData(T data)) {
-    throw new UnsupportedError(
-        "Cannot change handlers of asBroadcastStream source subscription.");
-  }
-
-  void onError(Function handleError) {
-    throw new UnsupportedError(
-        "Cannot change handlers of asBroadcastStream source subscription.");
-  }
-
-  void onDone(void handleDone()) {
-    throw new UnsupportedError(
-        "Cannot change handlers of asBroadcastStream source subscription.");
-  }
-
-  void pause([Future resumeSignal]) {
-    _stream._pauseSubscription(resumeSignal);
-  }
-
-  void resume() {
-    _stream._resumeSubscription();
-  }
-
-  Future cancel() {
-    _stream._cancelSubscription();
-    return null;
-  }
-
-  bool get isPaused {
-    return _stream._isSubscriptionPaused;
-  }
-
-  Future/*<E>*/ asFuture/*<E>*/([var/*=E*/ futureValue]) {
-    throw new UnsupportedError(
-        "Cannot change handlers of asBroadcastStream source subscription.");
-  }
-}
-
-
-/**
- * Simple implementation of [StreamIterator].
- */
-class _StreamIteratorImpl<T> implements StreamIterator<T> {
-  // Internal state of the stream iterator.
-  // At any time, it is in one of these states.
-  // The interpretation of the [_futureOrPrefecth] field depends on the state.
-  // In _STATE_MOVING, the _data field holds the most recently returned
-  // future.
-  // When in one of the _STATE_EXTRA_* states, the it may hold the
-  // next data/error object, and the subscription is paused.
-
-  /// The simple state where [_data] holds the data to return, and [moveNext]
-  /// is allowed. The subscription is actively listening.
-  static const int _STATE_FOUND = 0;
-  /// State set after [moveNext] has returned false or an error,
-  /// or after calling [cancel]. The subscription is always canceled.
-  static const int _STATE_DONE = 1;
-  /// State set after calling [moveNext], but before its returned future has
-  /// completed. Calling [moveNext] again is not allowed in this state.
-  /// The subscription is actively listening.
-  static const int _STATE_MOVING = 2;
-  /// States set when another event occurs while in _STATE_FOUND.
-  /// This extra overflow event is cached until the next call to [moveNext],
-  /// which will complete as if it received the event normally.
-  /// The subscription is paused in these states, so we only ever get one
-  /// event too many.
-  static const int _STATE_EXTRA_DATA = 3;
-  static const int _STATE_EXTRA_ERROR = 4;
-  static const int _STATE_EXTRA_DONE = 5;
-
-  /// Subscription being listened to.
-  StreamSubscription _subscription;
-
-  /// The current element represented by the most recent call to moveNext.
-  ///
-  /// Is null between the time moveNext is called and its future completes.
-  T _current = null;
-
-  /// The future returned by the most recent call to [moveNext].
-  ///
-  /// Also used to store the next value/error in case the stream provides an
-  /// event before [moveNext] is called again. In that case, the stream will
-  /// be paused to prevent further events.
-  var/*Future<bool> or T*/ _futureOrPrefetch = null;
-
-  /// The current state.
-  int _state = _STATE_FOUND;
-
-  _StreamIteratorImpl(final Stream<T> stream) {
-    _subscription = stream.listen(_onData,
-                                  onError: _onError,
-                                  onDone: _onDone,
-                                  cancelOnError: true);
-  }
-
-  T get current => _current;
-
-  Future<bool> moveNext() {
-    if (_state == _STATE_DONE) {
-      return new _Future<bool>.immediate(false);
-    }
-    if (_state == _STATE_MOVING) {
-      throw new StateError("Already waiting for next.");
-    }
-    if (_state == _STATE_FOUND) {
-      _state = _STATE_MOVING;
-      _current = null;
-      var result = new _Future<bool>();
-      _futureOrPrefetch = result;
-      return result;
-    } else {
-      assert(_state >= _STATE_EXTRA_DATA);
-      switch (_state) {
-        case _STATE_EXTRA_DATA:
-          _state = _STATE_FOUND;
-          _current = _futureOrPrefetch as Object /*=T*/;
-          _futureOrPrefetch = null;
-          _subscription.resume();
-          return new _Future<bool>.immediate(true);
-        case _STATE_EXTRA_ERROR:
-          AsyncError prefetch = _futureOrPrefetch;
-          _clear();
-          return new _Future<bool>.immediateError(prefetch.error,
-                                                  prefetch.stackTrace);
-        case _STATE_EXTRA_DONE:
-          _clear();
-          return new _Future<bool>.immediate(false);
-      }
-    }
-  }
-
-  /** Clears up the internal state when the iterator ends. */
-  void _clear() {
-    _subscription = null;
-    _futureOrPrefetch = null;
-    _current = null;
-    _state = _STATE_DONE;
-  }
-
-  Future cancel() {
-    StreamSubscription subscription = _subscription;
-    if (subscription == null) return null;
-    if (_state == _STATE_MOVING) {
-      _Future<bool> hasNext = _futureOrPrefetch as Object /*=_Future<bool>*/;
-      _clear();
-      hasNext._complete(false);
-    } else {
-      _clear();
-    }
-    return subscription.cancel();
-  }
-
-  void _onData(T data) {
-    if (_state == _STATE_MOVING) {
-      _current = data;
-      _Future<bool> hasNext = _futureOrPrefetch as Object /*=_Future<bool>*/;
-      _futureOrPrefetch = null;
-      _state = _STATE_FOUND;
-      hasNext._complete(true);
-      return;
-    }
-    _subscription.pause();
-    assert(_futureOrPrefetch == null);
-    _futureOrPrefetch = data;
-    _state = _STATE_EXTRA_DATA;
-  }
-
-  void _onError(Object error, [StackTrace stackTrace]) {
-    if (_state == _STATE_MOVING) {
-      _Future<bool> hasNext = _futureOrPrefetch as Object /*=_Future<bool>*/;
-      // We have cancelOnError: true, so the subscription is canceled.
-      _clear();
-      hasNext._completeError(error, stackTrace);
-      return;
-    }
-    _subscription.pause();
-    assert(_futureOrPrefetch == null);
-    _futureOrPrefetch = new AsyncError(error, stackTrace);
-    _state = _STATE_EXTRA_ERROR;
-  }
-
-  void _onDone() {
-     if (_state == _STATE_MOVING) {
-      _Future<bool> hasNext = _futureOrPrefetch as Object /*=_Future<bool>*/;
-      _clear();
-      hasNext._complete(false);
-      return;
-    }
-    _subscription.pause();
-    _futureOrPrefetch = null;
-    _state = _STATE_EXTRA_DONE;
-  }
-}
-
-/** An empty broadcast stream, sending a done event as soon as possible. */
-class _EmptyStream<T> extends Stream<T> {
-  const _EmptyStream() : super._internal();
-  bool get isBroadcast => true;
-  StreamSubscription<T> listen(void onData(T data),
-                               {Function onError,
-                                void onDone(),
-                                bool cancelOnError}) {
-    return new _DoneStreamSubscription<T>(onDone);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_pipe.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/stream_pipe.dart
deleted file mode 100644
index 1125620..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_pipe.dart
+++ /dev/null
@@ -1,495 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-/** Runs user code and takes actions depending on success or failure. */
-_runUserCode(userCode(),
-             onSuccess(value),
-             onError(error, StackTrace stackTrace)) {
-  try {
-    onSuccess(userCode());
-  } catch (e, s) {
-    AsyncError replacement = Zone.current.errorCallback(e, s);
-    if (replacement == null) {
-      onError(e, s);
-    } else {
-      var error = _nonNullError(replacement.error);
-      var stackTrace = replacement.stackTrace;
-      onError(error, stackTrace);
-    }
-  }
-}
-
-/** Helper function to cancel a subscription and wait for the potential future,
-  before completing with an error. */
-void _cancelAndError(StreamSubscription subscription,
-                     _Future future,
-                     error,
-                     StackTrace stackTrace) {
-  var cancelFuture = subscription.cancel();
-  if (cancelFuture is Future) {
-    cancelFuture.whenComplete(() => future._completeError(error, stackTrace));
-  } else {
-    future._completeError(error, stackTrace);
-  }
-}
-
-void _cancelAndErrorWithReplacement(StreamSubscription subscription,
-                                    _Future future,
-                                    error, StackTrace stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-  if (replacement != null) {
-    error = _nonNullError(replacement.error);
-    stackTrace = replacement.stackTrace;
-  }
-  _cancelAndError(subscription, future, error, stackTrace);
-}
-
-typedef void _ErrorCallback(error, StackTrace stackTrace);
-
-/** Helper function to make an onError argument to [_runUserCode]. */
-_ErrorCallback _cancelAndErrorClosure(
-    StreamSubscription subscription, _Future future) {
-  return (error, StackTrace stackTrace) {
-    _cancelAndError(subscription, future, error, stackTrace);
-  };
-}
-
-/** Helper function to cancel a subscription and wait for the potential future,
-  before completing with a value. */
-void _cancelAndValue(StreamSubscription subscription, _Future future, value) {
-  var cancelFuture = subscription.cancel();
-  if (cancelFuture is Future) {
-    cancelFuture.whenComplete(() => future._complete(value));
-  } else {
-    future._complete(value);
-  }
-}
-
-
-/**
- * A [Stream] that forwards subscriptions to another stream.
- *
- * This stream implements [Stream], but forwards all subscriptions
- * to an underlying stream, and wraps the returned subscription to
- * modify the events on the way.
- *
- * This class is intended for internal use only.
- */
-abstract class _ForwardingStream<S, T> extends Stream<T> {
-  final Stream<S> _source;
-
-  _ForwardingStream(this._source);
-
-  bool get isBroadcast => _source.isBroadcast;
-
-  StreamSubscription<T> listen(void onData(T value),
-                              { Function onError,
-                                void onDone(),
-                                bool cancelOnError }) {
-    cancelOnError = identical(true, cancelOnError);
-    return _createSubscription(onData, onError, onDone, cancelOnError);
-  }
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    return new _ForwardingStreamSubscription<S, T>(
-        this, onData, onError, onDone, cancelOnError);
-  }
-
-  // Override the following methods in subclasses to change the behavior.
-
-  void _handleData(S data, _EventSink<T> sink) {
-    sink._add(data as Object /*=T*/);
-  }
-
-  void _handleError(error, StackTrace stackTrace, _EventSink<T> sink) {
-    sink._addError(error, stackTrace);
-  }
-
-  void _handleDone(_EventSink<T> sink) {
-    sink._close();
-  }
-}
-
-/**
- * Abstract superclass for subscriptions that forward to other subscriptions.
- */
-class _ForwardingStreamSubscription<S, T>
-    extends _BufferingStreamSubscription<T> {
-  final _ForwardingStream<S, T> _stream;
-
-  StreamSubscription<S> _subscription;
-
-  _ForwardingStreamSubscription(this._stream, void onData(T data),
-                                Function onError, void onDone(),
-                                bool cancelOnError)
-      : super(onData, onError, onDone, cancelOnError) {
-    _subscription = _stream._source.listen(_handleData,
-                                           onError: _handleError,
-                                           onDone: _handleDone);
-  }
-
-  // _StreamSink interface.
-  // Transformers sending more than one event have no way to know if the stream
-  // is canceled or closed after the first, so we just ignore remaining events.
-
-  void _add(T data) {
-    if (_isClosed) return;
-    super._add(data);
-  }
-
-  void _addError(Object error, StackTrace stackTrace) {
-    if (_isClosed) return;
-    super._addError(error, stackTrace);
-  }
-
-  // StreamSubscription callbacks.
-
-  void _onPause() {
-    if (_subscription == null) return;
-    _subscription.pause();
-  }
-
-  void _onResume() {
-    if (_subscription == null) return;
-    _subscription.resume();
-  }
-
-  Future _onCancel() {
-    if (_subscription != null) {
-      StreamSubscription subscription = _subscription;
-      _subscription = null;
-      return subscription.cancel();
-    }
-    return null;
-  }
-
-  // Methods used as listener on source subscription.
-
-  void _handleData(S data) {
-    _stream._handleData(data, this);
-  }
-
-  void _handleError(error, StackTrace stackTrace) {
-    _stream._handleError(error, stackTrace, this);
-  }
-
-  void _handleDone() {
-    _stream._handleDone(this);
-  }
-}
-
-// -------------------------------------------------------------------
-// Stream transformers used by the default Stream implementation.
-// -------------------------------------------------------------------
-
-typedef bool _Predicate<T>(T value);
-
-void _addErrorWithReplacement(_EventSink sink, error, stackTrace) {
-  AsyncError replacement = Zone.current.errorCallback(error, stackTrace);
-  if (replacement != null) {
-    error = _nonNullError(replacement.error);
-    stackTrace = replacement.stackTrace;
-  }
-  sink._addError(error, stackTrace);
-}
-
-
-class _WhereStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
-
-  _WhereStream(Stream<T> source, bool test(T value))
-      : _test = test, super(source);
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    bool satisfies;
-    try {
-      satisfies = _test(inputEvent);
-    } catch (e, s) {
-      _addErrorWithReplacement(sink, e, s);
-      return;
-    }
-    if (satisfies) {
-      sink._add(inputEvent);
-    }
-  }
-}
-
-
-typedef T _Transformation<S, T>(S value);
-
-/**
- * A stream pipe that converts data events before passing them on.
- */
-class _MapStream<S, T> extends _ForwardingStream<S, T> {
-  final _Transformation<S, T> _transform;
-
-  _MapStream(Stream<S> source, T transform(S event))
-      : this._transform = transform, super(source);
-
-  void _handleData(S inputEvent, _EventSink<T> sink) {
-    T outputEvent;
-    try {
-      outputEvent = _transform(inputEvent);
-    } catch (e, s) {
-      _addErrorWithReplacement(sink, e, s);
-      return;
-    }
-    sink._add(outputEvent);
-  }
-}
-
-/**
- * A stream pipe that converts data events before passing them on.
- */
-class _ExpandStream<S, T> extends _ForwardingStream<S, T> {
-  final _Transformation<S, Iterable<T>> _expand;
-
-  _ExpandStream(Stream<S> source, Iterable<T> expand(S event))
-      : this._expand = expand, super(source);
-
-  void _handleData(S inputEvent, _EventSink<T> sink) {
-    try {
-      for (T value in _expand(inputEvent)) {
-        sink._add(value);
-      }
-    } catch (e, s) {
-      // If either _expand or iterating the generated iterator throws,
-      // we abort the iteration.
-      _addErrorWithReplacement(sink, e, s);
-    }
-  }
-}
-
-
-typedef bool _ErrorTest(error);
-
-/**
- * A stream pipe that converts or disposes error events
- * before passing them on.
- */
-class _HandleErrorStream<T> extends _ForwardingStream<T, T> {
-  final Function _transform;
-  final _ErrorTest _test;
-
-  _HandleErrorStream(Stream<T> source,
-                     Function onError,
-                     bool test(error))
-      : this._transform = onError, this._test = test, super(source);
-
-  void _handleError(Object error, StackTrace stackTrace, _EventSink<T> sink) {
-    bool matches = true;
-    if (_test != null) {
-      try {
-        matches = _test(error);
-      } catch (e, s) {
-        _addErrorWithReplacement(sink, e, s);
-        return;
-      }
-    }
-    if (matches) {
-      try {
-        _invokeErrorHandler(_transform, error, stackTrace);
-      } catch (e, s) {
-        if (identical(e, error)) {
-          sink._addError(error, stackTrace);
-        } else {
-          _addErrorWithReplacement(sink, e, s);
-        }
-        return;
-      }
-    } else {
-      sink._addError(error, stackTrace);
-    }
-  }
-}
-
-
-class _TakeStream<T> extends _ForwardingStream<T, T> {
-  final int _count;
-
-  _TakeStream(Stream<T> source, int count)
-      : this._count = count, super(source) {
-    // This test is done early to avoid handling an async error
-    // in the _handleData method.
-    if (count is! int) throw new ArgumentError(count);
-  }
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
-        this, onData, onError, onDone, cancelOnError, _count);
-  }
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    int count = subscription._count;
-    if (count > 0) {
-      sink._add(inputEvent);
-      count -= 1;
-      subscription._count = count;
-      if (count == 0) {
-        // Closing also unsubscribes all subscribers, which unsubscribes
-        // this from source.
-        sink._close();
-      }
-    }
-  }
-}
-
-/**
- * A [_ForwardingStreamSubscription] with one extra state field.
- *
- * Use by several different classes, some storing an integer, others a bool.
- */
-class _StateStreamSubscription<T> extends _ForwardingStreamSubscription<T, T> {
-  // Raw state field. Typed access provided by getters and setters below.
-  var _sharedState;
-
-  _StateStreamSubscription(_ForwardingStream<T, T> stream, void onData(T data),
-                           Function onError, void onDone(),
-                           bool cancelOnError, this._sharedState)
-      : super(stream, onData, onError, onDone, cancelOnError);
-
-  bool get _flag => _sharedState;
-  void set _flag(bool flag) { _sharedState = flag; }
-  int get _count => _sharedState;
-  void set _count(int count) { _sharedState = count; }
-}
-
-
-class _TakeWhileStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
-
-  _TakeWhileStream(Stream<T> source, bool test(T value))
-      : this._test = test, super(source);
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    bool satisfies;
-    try {
-      satisfies = _test(inputEvent);
-    } catch (e, s) {
-      _addErrorWithReplacement(sink, e, s);
-      // The test didn't say true. Didn't say false either, but we stop anyway.
-      sink._close();
-      return;
-    }
-    if (satisfies) {
-      sink._add(inputEvent);
-    } else {
-      sink._close();
-    }
-  }
-}
-
-class _SkipStream<T> extends _ForwardingStream<T, T> {
-  final int _count;
-
-  _SkipStream(Stream<T> source, int count)
-      : this._count = count, super(source) {
-    // This test is done early to avoid handling an async error
-    // in the _handleData method.
-    if (count is! int || count < 0) throw new ArgumentError(count);
-  }
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
-        this, onData, onError, onDone, cancelOnError, _count);
-  }
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    int count = subscription._count;
-    if (count > 0) {
-      subscription._count = count - 1;
-      return;
-    }
-    sink._add(inputEvent);
-  }
-}
-
-class _SkipWhileStream<T> extends _ForwardingStream<T, T> {
-  final _Predicate<T> _test;
-
-  _SkipWhileStream(Stream<T> source, bool test(T value))
-      : this._test = test, super(source);
-
-  StreamSubscription<T> _createSubscription(
-      void onData(T data),
-      Function onError,
-      void onDone(),
-      bool cancelOnError) {
-    return new _StateStreamSubscription<T>(
-        this, onData, onError, onDone, cancelOnError, false);
-  }
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    _StateStreamSubscription<T> subscription = sink;
-    bool hasFailed = subscription._flag;
-    if (hasFailed) {
-      sink._add(inputEvent);
-      return;
-    }
-    bool satisfies;
-    try {
-      satisfies = _test(inputEvent);
-    } catch (e, s) {
-      _addErrorWithReplacement(sink, e, s);
-      // A failure to return a boolean is considered "not matching".
-      subscription._flag = true;
-      return;
-    }
-    if (!satisfies) {
-      subscription._flag = true;
-      sink._add(inputEvent);
-    }
-  }
-}
-
-typedef bool _Equality<T>(T a, T b);
-
-class _DistinctStream<T> extends _ForwardingStream<T, T> {
-  static var _SENTINEL = new Object();
-
-  _Equality<T> _equals;
-  var _previous = _SENTINEL;
-
-  _DistinctStream(Stream<T> source, bool equals(T a, T b))
-      : _equals = equals, super(source);
-
-  void _handleData(T inputEvent, _EventSink<T> sink) {
-    if (identical(_previous, _SENTINEL)) {
-      _previous = inputEvent;
-      return sink._add(inputEvent);
-    } else {
-      bool isEqual;
-      try {
-        if (_equals == null) {
-          isEqual = (_previous == inputEvent);
-        } else {
-          isEqual = _equals(_previous as Object /*=T*/, inputEvent);
-        }
-      } catch (e, s) {
-        _addErrorWithReplacement(sink, e, s);
-        return null;
-      }
-      if (!isEqual) {
-        sink._add(inputEvent);
-        _previous = inputEvent;
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_transformers.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/stream_transformers.dart
deleted file mode 100644
index e0982da..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/stream_transformers.dart
+++ /dev/null
@@ -1,313 +0,0 @@
-// 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.
-
-part of dart.async;
-
-/**
- * Wraps an [_EventSink] so it exposes only the [EventSink] interface.
- */
-class _EventSinkWrapper<T> implements EventSink<T> {
-  _EventSink _sink;
-  _EventSinkWrapper(this._sink);
-
-  void add(T data) { _sink._add(data); }
-  void addError(error, [StackTrace stackTrace]) {
-    _sink._addError(error, stackTrace);
-  }
-  void close() { _sink._close(); }
-}
-
-/**
- * A StreamSubscription that pipes data through a sink.
- *
- * The constructor of this class takes a [_SinkMapper] which maps from
- * [EventSink] to [EventSink]. The input to the mapper is the output of
- * the transformation. The returned sink is the transformation's input.
- */
-class _SinkTransformerStreamSubscription<S, T>
-    extends _BufferingStreamSubscription<T> {
-  /// The transformer's input sink.
-  EventSink<S> _transformerSink;
-
-  /// The subscription to the input stream.
-  StreamSubscription<S> _subscription;
-
-  _SinkTransformerStreamSubscription(Stream<S> source,
-                                     _SinkMapper<S, T> mapper,
-                                     void onData(T data),
-                                     Function onError,
-                                     void onDone(),
-                                     bool cancelOnError)
-      // We set the adapter's target only when the user is allowed to send data.
-      : super(onData, onError, onDone, cancelOnError) {
-    _EventSinkWrapper<T> eventSink = new _EventSinkWrapper<T>(this);
-    _transformerSink = mapper(eventSink);
-    _subscription = source.listen(_handleData,
-                                  onError: _handleError,
-                                  onDone: _handleDone);
-  }
-
-  /** Whether this subscription is still subscribed to its source. */
-  bool get _isSubscribed => _subscription != null;
-
-  // _EventSink interface.
-
-  /**
-   * Adds an event to this subscriptions.
-   *
-   * Contrary to normal [_BufferingStreamSubscription]s we may receive
-   * events when the stream is already closed. Report them as state
-   * error.
-   */
-  void _add(T data) {
-    if (_isClosed) {
-      throw new StateError("Stream is already closed");
-    }
-    super._add(data);
-  }
-
-  /**
-   * Adds an error event to this subscriptions.
-   *
-   * Contrary to normal [_BufferingStreamSubscription]s we may receive
-   * events when the stream is already closed. Report them as state
-   * error.
-   */
-  void _addError(Object error, StackTrace stackTrace) {
-    if (_isClosed) {
-      throw new StateError("Stream is already closed");
-    }
-    super._addError(error, stackTrace);
-  }
-
-  /**
-   * Adds a close event to this subscriptions.
-   *
-   * Contrary to normal [_BufferingStreamSubscription]s we may receive
-   * events when the stream is already closed. Report them as state
-   * error.
-   */
-  void _close() {
-    if (_isClosed) {
-      throw new StateError("Stream is already closed");
-    }
-    super._close();
-  }
-
-  // _BufferingStreamSubscription hooks.
-
-  void _onPause() {
-    if (_isSubscribed) _subscription.pause();
-  }
-
-  void _onResume() {
-    if (_isSubscribed) _subscription.resume();
-  }
-
-  Future _onCancel() {
-    if (_isSubscribed) {
-      StreamSubscription subscription = _subscription;
-      _subscription = null;
-      subscription.cancel();
-    }
-    return null;
-  }
-
-  void _handleData(S data) {
-    try {
-      _transformerSink.add(data);
-    } catch (e, s) {
-      _addError(e, s);
-    }
-  }
-
-  void _handleError(error, [stackTrace]) {
-    try {
-      _transformerSink.addError(error, stackTrace);
-    } catch (e, s) {
-      if (identical(e, error)) {
-        _addError(error, stackTrace);
-      } else {
-        _addError(e, s);
-      }
-    }
-  }
-
-  void _handleDone() {
-    try {
-      _subscription = null;
-      _transformerSink.close();
-    } catch (e, s) {
-      _addError(e, s);
-    }
-  }
-}
-
-
-typedef EventSink<S> _SinkMapper<S, T>(EventSink<T> output);
-
-/**
- * A StreamTransformer for Sink-mappers.
- *
- * A Sink-mapper takes an [EventSink] (its output) and returns another
- * EventSink (its input).
- *
- * Note that this class can be `const`.
- */
-class _StreamSinkTransformer<S, T> implements StreamTransformer<S, T> {
-  final _SinkMapper<S, T> _sinkMapper;
-  const _StreamSinkTransformer(this._sinkMapper);
-
-  Stream<T> bind(Stream<S> stream)
-      => new _BoundSinkStream<S, T>(stream, _sinkMapper);
-}
-
-/**
- * The result of binding a StreamTransformer for Sink-mappers.
- *
- * It contains the bound Stream and the sink-mapper. Only when the user starts
- * listening to this stream is the sink-mapper invoked. The result is used
- * to create a StreamSubscription that transforms events.
- */
-class _BoundSinkStream<S, T> extends Stream<T> {
-  final _SinkMapper<S, T> _sinkMapper;
-  final Stream<S> _stream;
-
-  bool get isBroadcast => _stream.isBroadcast;
-
-  _BoundSinkStream(this._stream, this._sinkMapper);
-
-  StreamSubscription<T> listen(void onData(T event),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError }) {
-    cancelOnError = identical(true, cancelOnError);
-    StreamSubscription<T> subscription =
-        new _SinkTransformerStreamSubscription<S, T>(
-            _stream, _sinkMapper, onData, onError, onDone, cancelOnError);
-    return subscription;
-  }
-}
-
-/// Data-handler coming from [StreamTransformer.fromHandlers].
-typedef void _TransformDataHandler<S, T>(S data, EventSink<T> sink);
-/// Error-handler coming from [StreamTransformer.fromHandlers].
-typedef void _TransformErrorHandler<T>(
-    Object error, StackTrace stackTrace, EventSink<T> sink);
-/// Done-handler coming from [StreamTransformer.fromHandlers].
-typedef void _TransformDoneHandler<T>(EventSink<T> sink);
-
-/**
- * Wraps handlers (from [StreamTransformer.fromHandlers]) into an `EventSink`.
- *
- * This way we can reuse the code from [_StreamSinkTransformer].
- */
-class _HandlerEventSink<S, T> implements EventSink<S> {
-  final _TransformDataHandler<S, T> _handleData;
-  final _TransformErrorHandler<T> _handleError;
-  final _TransformDoneHandler<T> _handleDone;
-
-  /// The output sink where the handlers should send their data into.
-  final EventSink<T> _sink;
-
-  _HandlerEventSink(this._handleData, this._handleError, this._handleDone,
-                    this._sink);
-
-  void add(S data) { _handleData(data, _sink); }
-  void addError(Object error, [StackTrace stackTrace]) {
-    _handleError(error, stackTrace, _sink);
-  }
-  void close() { _handleDone(_sink); }
-}
-
-/**
- * A StreamTransformer that transformers events with the given handlers.
- *
- * Note that this transformer can only be used once.
- */
-class _StreamHandlerTransformer<S, T> extends _StreamSinkTransformer<S, T> {
-
-  _StreamHandlerTransformer({
-      void handleData(S data, EventSink<T> sink),
-      void handleError(Object error, StackTrace stackTrace, EventSink<T> sink),
-      void handleDone(EventSink<T> sink)})
-      : super((EventSink<T> outputSink) {
-          if (handleData == null) handleData = _defaultHandleData;
-          if (handleError == null) handleError = _defaultHandleError;
-          if (handleDone == null) handleDone = _defaultHandleDone;
-          return new _HandlerEventSink<S, T>(
-              handleData, handleError, handleDone, outputSink);
-        });
-
-  Stream<T> bind(Stream<S> stream) {
-    return super.bind(stream);
-  }
-
-  /** Default data handler forwards all data. */
-  static void _defaultHandleData(var data, EventSink sink) {
-    sink.add(data);
-  }
-
-  /** Default error handler forwards all errors. */
-  static void _defaultHandleError(error, StackTrace stackTrace,
-                                  EventSink sink) {
-    sink.addError(error, stackTrace);
-  }
-
-  /** Default done handler forwards done. */
-  static void _defaultHandleDone(EventSink sink) {
-    sink.close();
-  }
-}
-
-/// A closure mapping a stream and cancelOnError to a StreamSubscription.
-typedef StreamSubscription<T> _SubscriptionTransformer<S, T>(
-    Stream<S> stream, bool cancelOnError);
-
-/**
- * A [StreamTransformer] that minimizes the number of additional classes.
- *
- * Instead of implementing three classes: a [StreamTransformer], a [Stream]
- * (as the result of a `bind` call) and a [StreamSubscription] (which does the
- * actual work), this class only requires a fincution that is invoked when the
- * last bit (the subscription) of the transformer-workflow is needed.
- *
- * The given transformer function maps from Stream and cancelOnError to a
- * `StreamSubscription`. As such it can also act on `cancel` events, making it
- * fully general.
- */
-class _StreamSubscriptionTransformer<S, T> implements StreamTransformer<S, T> {
-  final _SubscriptionTransformer<S, T> _transformer;
-
-  const _StreamSubscriptionTransformer(this._transformer);
-
-  Stream<T> bind(Stream<S> stream) =>
-      new _BoundSubscriptionStream<S, T>(stream, _transformer);
-}
-
-/**
- * A stream transformed by a [_StreamSubscriptionTransformer].
- *
- * When this stream is listened to it invokes the [_transformer] function with
- * the stored [_stream]. Usually the transformer starts listening at this
- * moment.
- */
-class _BoundSubscriptionStream<S, T> extends Stream<T> {
-  final _SubscriptionTransformer<S, T> _transformer;
-  final Stream<S> _stream;
-
-  _BoundSubscriptionStream(this._stream, this._transformer);
-
-  StreamSubscription<T> listen(void onData(T event),
-                               { Function onError,
-                                 void onDone(),
-                                 bool cancelOnError }) {
-    cancelOnError = identical(true, cancelOnError);
-    StreamSubscription<T> result = _transformer(_stream, cancelOnError);
-    result.onData(onData);
-    result.onError(onError);
-    result.onDone(onDone);
-    return result;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/timer.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/timer.dart
deleted file mode 100644
index 1bbb65b..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/timer.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.async;
-
-/**
- * A count-down timer that can be configured to fire once or repeatedly.
- *
- * The timer counts down from the specified duration to 0.
- * When the timer reaches 0, the timer invokes the specified callback function.
- * Use a periodic timer to repeatedly count down the same interval.
- *
- * A negative duration is treated the same as a duration of 0.
- * If the duration is statically known to be 0, consider using [run].
- *
- * Frequently the duration is either a constant or computed as in the
- * following example (taking advantage of the multiplication operator of
- * the [Duration] class):
- *
- *     const TIMEOUT = const Duration(seconds: 3);
- *     const ms = const Duration(milliseconds: 1);
- *
- *     startTimeout([int milliseconds]) {
- *       var duration = milliseconds == null ? TIMEOUT : ms * milliseconds;
- *       return new Timer(duration, handleTimeout);
- *     }
- *     ...
- *     void handleTimeout() {  // callback function
- *       ...
- *     }
- *
- * Note: If Dart code using Timer is compiled to JavaScript, the finest
- * granularity available in the browser is 4 milliseconds.
- *
- * See [Stopwatch] for measuring elapsed time.
- */
-abstract class Timer {
-
-  /**
-   * Creates a new timer.
-   *
-   * The [callback] function is invoked after the given [duration].
-   *
-   */
-  factory Timer(Duration duration, void callback()) {
-    if (Zone.current == Zone.ROOT) {
-      // No need to bind the callback. We know that the root's timer will
-      // be invoked in the root zone.
-      return Zone.current.createTimer(duration, callback);
-    }
-    return Zone.current.createTimer(
-        duration, Zone.current.bindCallback(callback, runGuarded: true));
-  }
-
-  /**
-   * Creates a new repeating timer.
-   *
-   * The [callback] is invoked repeatedly with [duration] intervals until
-   * canceled with the [cancel] function.
-   *
-   * The exact timing depends on the underlying timer implementation.
-   * No more than `n` callbacks will be made in `duration * n` time,
-   * but the time between two consecutive callbacks
-   * can be shorter and longer than `duration`.
-   *
-   * In particular, an implementation may schedule the next callback, e.g.,
-   * a `duration` after either when the previous callback ended,
-   * when the previous callback started, or when the previous callback was
-   * scheduled for - even if the actual callback was delayed.
-   */
-  factory Timer.periodic(Duration duration,
-                         void callback(Timer timer)) {
-    if (Zone.current == Zone.ROOT) {
-      // No need to bind the callback. We know that the root's timer will
-      // be invoked in the root zone.
-      return Zone.current.createPeriodicTimer(duration, callback);
-    }
-    // TODO(floitsch): the return type should be 'void', and the type
-    // should be inferred.
-    var boundCallback = Zone.current.bindUnaryCallback/*<dynamic, Timer>*/(
-        callback, runGuarded: true);
-    return Zone.current.createPeriodicTimer(duration, boundCallback);
-  }
-
-  /**
-   * Runs the given [callback] asynchronously as soon as possible.
-   *
-   * This function is equivalent to `new Timer(Duration.ZERO, callback)`.
-   */
-  static void run(void callback()) {
-    new Timer(Duration.ZERO, callback);
-  }
-
-  /**
-   * Cancels the timer.
-   */
-  void cancel();
-
-  /**
-   * Returns whether the timer is still active.
-   *
-   * A non-periodic timer is active if the callback has not been executed,
-   * and the timer has not been canceled.
-   *
-   * A periodic timer is active if it has not been canceled.
-   */
-  bool get isActive;
-
-  external static Timer _createTimer(Duration duration, void callback());
-  external static Timer _createPeriodicTimer(Duration duration,
-                                             void callback(Timer timer));
-}
-
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart b/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart
deleted file mode 100644
index 6b13e66..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/async/zone.dart
+++ /dev/null
@@ -1,1308 +0,0 @@
-// 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.
-
-part of dart.async;
-
-typedef R ZoneCallback<R>();
-typedef R ZoneUnaryCallback<R, T>(T arg);
-typedef R ZoneBinaryCallback<R, T1, T2>(T1 arg1, T2 arg2);
-
-// TODO(floitsch): we are abusing generic typedefs as typedefs for generic
-// functions.
-/*ABUSE*/
-typedef R HandleUncaughtErrorHandler<R>(
-    Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace);
-/*ABUSE*/
-typedef R RunHandler<R>(Zone self, ZoneDelegate parent, Zone zone, R f());
-/*ABUSE*/
-typedef R RunUnaryHandler<R, T>(
-    Zone self, ZoneDelegate parent, Zone zone, R f(T arg), T arg);
-/*ABUSE*/
-typedef R RunBinaryHandler<R, T1, T2>(
-    Zone self, ZoneDelegate parent, Zone zone,
-    R f(T1 arg1, T2 arg2), T1 arg1, T2 arg2);
-/*ABUSE*/
-typedef ZoneCallback<R> RegisterCallbackHandler<R>(
-    Zone self, ZoneDelegate parent, Zone zone, R f());
-/*ABUSE*/
-typedef ZoneUnaryCallback<R, T> RegisterUnaryCallbackHandler<R, T>(
-    Zone self, ZoneDelegate parent, Zone zone, R f(T arg));
-/*ABUSE*/
-typedef ZoneBinaryCallback<R, T1, T2> RegisterBinaryCallbackHandler<R, T1, T2>(
-    Zone self, ZoneDelegate parent, Zone zone, R f(T1 arg1, T2 arg2));
-typedef AsyncError ErrorCallbackHandler(Zone self, ZoneDelegate parent,
-    Zone zone, Object error, StackTrace stackTrace);
-typedef void ScheduleMicrotaskHandler(
-    Zone self, ZoneDelegate parent, Zone zone, void f());
-typedef Timer CreateTimerHandler(
-    Zone self, ZoneDelegate parent, Zone zone, Duration duration, void f());
-typedef Timer CreatePeriodicTimerHandler(
-    Zone self, ZoneDelegate parent, Zone zone,
-    Duration period, void f(Timer timer));
-typedef void PrintHandler(
-    Zone self, ZoneDelegate parent, Zone zone, String line);
-typedef Zone ForkHandler(Zone self, ZoneDelegate parent, Zone zone,
-                         ZoneSpecification specification,
-                         Map zoneValues);
-
-/** Pair of error and stack trace. Returned by [Zone.errorCallback]. */
-class AsyncError implements Error {
-  final Object error;
-  final StackTrace stackTrace;
-
-  AsyncError(this.error, this.stackTrace);
-
-  String toString() => '$error';
-}
-
-
-class _ZoneFunction<T extends Function> {
-  final _Zone zone;
-  final T function;
-  const _ZoneFunction(this.zone, this.function);
-}
-
-/**
- * This class provides the specification for a forked zone.
- *
- * When forking a new zone (see [Zone.fork]) one can override the default
- * behavior of the zone by providing callbacks. These callbacks must be
- * given in an instance of this class.
- *
- * Handlers have the same signature as the same-named methods on [Zone] but
- * receive three additional arguments:
- *
- *   1. the zone the handlers are attached to (the "self" zone).
- *   2. a [ZoneDelegate] to the parent zone.
- *   3. the zone that first received the request (before the request was
- *     bubbled up).
- *
- * Handlers can either stop propagation the request (by simply not calling the
- * parent handler), or forward to the parent zone, potentially modifying the
- * arguments on the way.
- */
-abstract class ZoneSpecification {
-  /**
-   * Creates a specification with the provided handlers.
-   */
-  const factory ZoneSpecification({
-      HandleUncaughtErrorHandler handleUncaughtError,
-      RunHandler run,
-      RunUnaryHandler runUnary,
-      RunBinaryHandler runBinary,
-      RegisterCallbackHandler registerCallback,
-      RegisterUnaryCallbackHandler registerUnaryCallback,
-      RegisterBinaryCallbackHandler registerBinaryCallback,
-      ErrorCallbackHandler errorCallback,
-      ScheduleMicrotaskHandler scheduleMicrotask,
-      CreateTimerHandler createTimer,
-      CreatePeriodicTimerHandler createPeriodicTimer,
-      PrintHandler print,
-      ForkHandler fork
-  }) = _ZoneSpecification;
-
-  /**
-   * Creates a specification from [other] with the provided handlers overriding
-   * the ones in [other].
-   */
-  factory ZoneSpecification.from(ZoneSpecification other, {
-      HandleUncaughtErrorHandler handleUncaughtError: null,
-      RunHandler run: null,
-      RunUnaryHandler runUnary: null,
-      RunBinaryHandler runBinary: null,
-      RegisterCallbackHandler registerCallback: null,
-      RegisterUnaryCallbackHandler registerUnaryCallback: null,
-      RegisterBinaryCallbackHandler registerBinaryCallback: null,
-      ErrorCallbackHandler errorCallback: null,
-      ScheduleMicrotaskHandler scheduleMicrotask: null,
-      CreateTimerHandler createTimer: null,
-      CreatePeriodicTimerHandler createPeriodicTimer: null,
-      PrintHandler print: null,
-      ForkHandler fork: null
-  }) {
-    return new ZoneSpecification(
-      handleUncaughtError: handleUncaughtError ?? other.handleUncaughtError,
-      run: run ?? other.run,
-      runUnary: runUnary ?? other.runUnary,
-      runBinary: runBinary ?? other.runBinary,
-      registerCallback: registerCallback ?? other.registerCallback,
-      registerUnaryCallback: registerUnaryCallback ??
-                             other.registerUnaryCallback,
-      registerBinaryCallback: registerBinaryCallback ??
-                              other.registerBinaryCallback,
-      errorCallback: errorCallback ?? other.errorCallback,
-      scheduleMicrotask: scheduleMicrotask ?? other.scheduleMicrotask,
-      createTimer : createTimer ?? other.createTimer,
-      createPeriodicTimer: createPeriodicTimer ?? other.createPeriodicTimer,
-      print : print ?? other.print,
-      fork: fork ?? other.fork);
-  }
-
-  HandleUncaughtErrorHandler get handleUncaughtError;
-  RunHandler get run;
-  RunUnaryHandler get runUnary;
-  RunBinaryHandler get runBinary;
-  RegisterCallbackHandler get registerCallback;
-  RegisterUnaryCallbackHandler get registerUnaryCallback;
-  RegisterBinaryCallbackHandler get registerBinaryCallback;
-  ErrorCallbackHandler get errorCallback;
-  ScheduleMicrotaskHandler get scheduleMicrotask;
-  CreateTimerHandler get createTimer;
-  CreatePeriodicTimerHandler get createPeriodicTimer;
-  PrintHandler get print;
-  ForkHandler get fork;
-}
-
-/**
- * Internal [ZoneSpecification] class.
- *
- * The implementation wants to rely on the fact that the getters cannot change
- * dynamically. We thus require users to go through the redirecting
- * [ZoneSpecification] constructor which instantiates this class.
- */
-class _ZoneSpecification implements ZoneSpecification {
-  const _ZoneSpecification({
-    this.handleUncaughtError: null,
-    this.run: null,
-    this.runUnary: null,
-    this.runBinary: null,
-    this.registerCallback: null,
-    this.registerUnaryCallback: null,
-    this.registerBinaryCallback: null,
-    this.errorCallback: null,
-    this.scheduleMicrotask: null,
-    this.createTimer: null,
-    this.createPeriodicTimer: null,
-    this.print: null,
-    this.fork: null
-  });
-
-  final HandleUncaughtErrorHandler handleUncaughtError;
-  final RunHandler run;
-  final RunUnaryHandler runUnary;
-  final RunBinaryHandler runBinary;
-  final RegisterCallbackHandler registerCallback;
-  final RegisterUnaryCallbackHandler registerUnaryCallback;
-  final RegisterBinaryCallbackHandler registerBinaryCallback;
-  final ErrorCallbackHandler errorCallback;
-  final ScheduleMicrotaskHandler scheduleMicrotask;
-  final CreateTimerHandler createTimer;
-  final CreatePeriodicTimerHandler createPeriodicTimer;
-  final PrintHandler print;
-  final ForkHandler fork;
-}
-
-/**
- * This class wraps zones for delegation.
- *
- * When forwarding to parent zones one can't just invoke the parent zone's
- * exposed functions (like [Zone.run]), but one needs to provide more
- * information (like the zone the `run` was initiated). Zone callbacks thus
- * receive more information including this [ZoneDelegate] class. When delegating
- * to the parent zone one should go through the given instance instead of
- * directly invoking the parent zone.
- */
-abstract class ZoneDelegate {
-  /*=R*/ handleUncaughtError/*<R>*/(
-      Zone zone, error, StackTrace stackTrace);
-  /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f());
-  /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg);
-  /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone,
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
-  ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f());
-  ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
-      Zone zone, /*=R*/ f(/*=T*/ arg));
-  ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
-      Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2));
-  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace);
-  void scheduleMicrotask(Zone zone, void f());
-  Timer createTimer(Zone zone, Duration duration, void f());
-  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer));
-  void print(Zone zone, String line);
-  Zone fork(Zone zone, ZoneSpecification specification, Map zoneValues);
-}
-
-/**
- * A Zone represents the asynchronous version of a dynamic extent. Asynchronous
- * callbacks are executed in the zone they have been queued in. For example,
- * the callback of a `future.then` is executed in the same zone as the one where
- * the `then` was invoked.
- */
-abstract class Zone {
-  // Private constructor so that it is not possible instantiate a Zone class.
-  Zone._();
-
-  /** The root zone that is implicitly created. */
-  static const Zone ROOT = _ROOT_ZONE;
-
-  /** The currently running zone. */
-  static Zone _current = _ROOT_ZONE;
-
-  static Zone get current => _current;
-
-  /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace);
-
-  /**
-   * Returns the parent zone.
-   *
-   * Returns `null` if `this` is the [ROOT] zone.
-   */
-  Zone get parent;
-
-  /**
-   * The error zone is the one that is responsible for dealing with uncaught
-   * errors.
-   * Errors are not allowed to cross between zones with different error-zones.
-   *
-   * This is the closest parent or ancestor zone of this zone that has a custom
-   * [handleUncaughtError] method.
-   */
-  Zone get errorZone;
-
-  /**
-   * Returns true if `this` and [otherZone] are in the same error zone.
-   *
-   * Two zones are in the same error zone if they inherit their
-   * [handleUncaughtError] callback from the same [errorZone].
-   */
-  bool inSameErrorZone(Zone otherZone);
-
-  /**
-   * Creates a new zone as a child of `this`.
-   *
-   * The new zone will have behavior like the current zone, except where
-   * overridden by functions in [specification].
-   *
-   * The new zone will have the same stored values (accessed through
-   * `operator []`) as this zone, but updated with the keys and values
-   * in [zoneValues]. If a key is in both this zone's values and in
-   * `zoneValues`, the new zone will use the value from `zoneValues``.
-   */
-  Zone fork({ ZoneSpecification specification,
-              Map zoneValues });
-
-  /**
-   * Executes the given function [f] in this zone.
-   */
-  /*=R*/ run/*<R>*/(/*=R*/ f());
-
-  /**
-   * Executes the given callback [f] with argument [arg] in this zone.
-   */
-  /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg);
-
-  /**
-   * Executes the given callback [f] with argument [arg1] and [arg2] in this
-   * zone.
-   */
-  /*=R*/ runBinary/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
-
-  /**
-   * Executes the given function [f] in this zone.
-   *
-   * Same as [run] but catches uncaught errors and gives them to
-   * [handleUncaughtError].
-   */
-  /*=R*/ runGuarded/*<R>*/(/*=R*/ f());
-
-  /**
-   * Executes the given callback [f] in this zone.
-   *
-   * Same as [runUnary] but catches uncaught errors and gives them to
-   * [handleUncaughtError].
-   */
-  /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg);
-
-  /**
-   * Executes the given callback [f] in this zone.
-   *
-   * Same as [runBinary] but catches uncaught errors and gives them to
-   * [handleUncaughtError].
-   */
-  /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2);
-
-  /**
-   * Registers the given callback in this zone.
-   *
-   * It is good practice to register asynchronous or delayed callbacks before
-   * invoking [run]. This gives the zone a chance to wrap the callback and
-   * to store information with the callback. For example, a zone may decide
-   * to store the stack trace (at the time of the registration) with the
-   * callback.
-   *
-   * Returns a potentially new callback that should be used in place of the
-   * given [callback].
-   */
-  ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback());
-
-  /**
-   * Registers the given callback in this zone.
-   *
-   * Similar to [registerCallback] but with a unary callback.
-   */
-  ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
-      /*=R*/ callback(/*=T*/ arg));
-
-  /**
-   * Registers the given callback in this zone.
-   *
-   * Similar to [registerCallback] but with a unary callback.
-   */
-  ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2));
-
-  /**
-   *  Equivalent to:
-   *
-   *      ZoneCallback registered = registerCallback(f);
-   *      if (runGuarded) return () => this.runGuarded(registered);
-   *      return () => this.run(registered);
-   *
-   */
-  ZoneCallback/*<R>*/ bindCallback/*<R>*/(
-      /*=R*/ f(), { bool runGuarded: true });
-
-  /**
-   *  Equivalent to:
-   *
-   *      ZoneCallback registered = registerUnaryCallback(f);
-   *      if (runGuarded) return (arg) => this.runUnaryGuarded(registered, arg);
-   *      return (arg) => thin.runUnary(registered, arg);
-   */
-  ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
-      /*=R*/ f(/*=T*/ arg), { bool runGuarded: true });
-
-  /**
-   *  Equivalent to:
-   *
-   *      ZoneCallback registered = registerBinaryCallback(f);
-   *      if (runGuarded) {
-   *        return (arg1, arg2) => this.runBinaryGuarded(registered, arg);
-   *      }
-   *      return (arg1, arg2) => thin.runBinary(registered, arg1, arg2);
-   */
-  ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true });
-
-  /**
-   * Intercepts errors when added programmatically to a `Future` or `Stream`.
-   *
-   * When caling [Completer.completeError], [Stream.addError],
-   * or [Future] constructors that take an error or a callback that may throw,
-   * the current zone is allowed to intercept and replace the error.
-   *
-   * When other libraries use intermediate controllers or completers, such
-   * calls may contain errors that have already been processed.
-   *
-   * Return `null` if no replacement is desired.
-   * The original error is used unchanged in that case.
-   * Otherwise return an instance of [AsyncError] holding
-   * the new pair of error and stack trace.
-   * If the [AsyncError.error] is `null`, it is replaced by a [NullThrownError].
-   */
-  AsyncError errorCallback(Object error, StackTrace stackTrace);
-
-  /**
-   * Runs [f] asynchronously in this zone.
-   */
-  void scheduleMicrotask(void f());
-
-  /**
-   * Creates a Timer where the callback is executed in this zone.
-   */
-  Timer createTimer(Duration duration, void callback());
-
-  /**
-   * Creates a periodic Timer where the callback is executed in this zone.
-   */
-  Timer createPeriodicTimer(Duration period, void callback(Timer timer));
-
-  /**
-   * Prints the given [line].
-   */
-  void print(String line);
-
-  /**
-   * Call to enter the Zone.
-   *
-   * The previous current zone is returned.
-   */
-  static Zone _enter(Zone zone) {
-    assert(zone != null);
-    assert(!identical(zone, _current));
-    Zone previous = _current;
-    _current = zone;
-    return previous;
-  }
-
-  /**
-   * Call to leave the Zone.
-   *
-   * The previous Zone must be provided as `previous`.
-   */
-  static void _leave(Zone previous) {
-    assert(previous != null);
-    Zone._current = previous;
-  }
-
-  /**
-   * Retrieves the zone-value associated with [key].
-   *
-   * If this zone does not contain the value looks up the same key in the
-   * parent zone. If the [key] is not found returns `null`.
-   *
-   * Any object can be used as key, as long as it has compatible `operator ==`
-   * and `hashCode` implementations.
-   * By controlling access to the key, a zone can grant or deny access to the
-   * zone value.
-   */
-  operator [](Object key);
-}
-
-ZoneDelegate _parentDelegate(_Zone zone) {
-  if (zone.parent == null) return null;
-  return zone.parent._delegate;
-}
-
-class _ZoneDelegate implements ZoneDelegate {
-  final _Zone _delegationTarget;
-
-  _ZoneDelegate(this._delegationTarget);
-
-  /*=R*/ handleUncaughtError/*<R>*/(
-      Zone zone, error, StackTrace stackTrace) {
-    var implementation = _delegationTarget._handleUncaughtError;
-    _Zone implZone = implementation.zone;
-    HandleUncaughtErrorHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(
-        implZone, _parentDelegate(implZone), zone, error, stackTrace)
-        as Object/*=R*/;
-  }
-
-  /*=R*/ run/*<R>*/(Zone zone, /*=R*/ f()) {
-    var implementation = _delegationTarget._run;
-    _Zone implZone = implementation.zone;
-    RunHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implZone, _parentDelegate(implZone), zone, f)
-        as Object/*=R*/;
-  }
-
-  /*=R*/ runUnary/*<R, T>*/(Zone zone, /*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-    var implementation = _delegationTarget._runUnary;
-    _Zone implZone = implementation.zone;
-    RunUnaryHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(
-        implZone, _parentDelegate(implZone), zone, f, arg) as Object/*=R*/;
-  }
-
-  /*=R*/ runBinary/*<R, T1, T2>*/(Zone zone,
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-    var implementation = _delegationTarget._runBinary;
-    _Zone implZone = implementation.zone;
-    RunBinaryHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
-    // it's supported. Remove the unnecessary cast.
-    return handler(
-        implZone, _parentDelegate(implZone), zone, f, arg1, arg2)
-        as Object/*=R*/;
-  }
-
-  ZoneCallback/*<R>*/ registerCallback/*<R>*/(Zone zone, /*=R*/ f()) {
-    var implementation = _delegationTarget._registerCallback;
-    _Zone implZone = implementation.zone;
-    RegisterCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implZone, _parentDelegate(implZone), zone, f)
-        as Object/*=ZoneCallback<R>*/;
-  }
-
-  ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
-      Zone zone, /*=R*/ f(/*=T*/ arg)) {
-    var implementation = _delegationTarget._registerUnaryCallback;
-    _Zone implZone = implementation.zone;
-    RegisterUnaryCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implZone, _parentDelegate(implZone), zone, f)
-        as Object/*=ZoneUnaryCallback<R, T>*/;
-  }
-
-  ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
-      Zone zone, /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) {
-    var implementation = _delegationTarget._registerBinaryCallback;
-    _Zone implZone = implementation.zone;
-    RegisterBinaryCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
-    // it's supported. Remove the unnecessary cast.
-    return handler(implZone, _parentDelegate(implZone), zone, f)
-        as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
-  }
-
-  AsyncError errorCallback(Zone zone, Object error, StackTrace stackTrace) {
-    var implementation = _delegationTarget._errorCallback;
-    _Zone implZone = implementation.zone;
-    if (identical(implZone, _ROOT_ZONE)) return null;
-    ErrorCallbackHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone,
-                   error, stackTrace);
-  }
-
-  void scheduleMicrotask(Zone zone, f()) {
-    var implementation = _delegationTarget._scheduleMicrotask;
-    _Zone implZone = implementation.zone;
-    ScheduleMicrotaskHandler handler = implementation.function;
-    handler(implZone, _parentDelegate(implZone), zone, f);
-  }
-
-  Timer createTimer(Zone zone, Duration duration, void f()) {
-    var implementation = _delegationTarget._createTimer;
-    _Zone implZone = implementation.zone;
-    CreateTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, duration, f);
-  }
-
-  Timer createPeriodicTimer(Zone zone, Duration period, void f(Timer timer)) {
-    var implementation = _delegationTarget._createPeriodicTimer;
-    _Zone implZone = implementation.zone;
-    CreatePeriodicTimerHandler handler = implementation.function;
-    return handler(implZone, _parentDelegate(implZone), zone, period, f);
-  }
-
-  void print(Zone zone, String line) {
-    var implementation = _delegationTarget._print;
-    _Zone implZone = implementation.zone;
-    PrintHandler handler = implementation.function;
-    handler(implZone, _parentDelegate(implZone), zone, line);
-  }
-
-  Zone fork(Zone zone, ZoneSpecification specification,
-            Map zoneValues) {
-    var implementation = _delegationTarget._fork;
-    _Zone implZone = implementation.zone;
-    ForkHandler handler = implementation.function;
-    return handler(
-        implZone, _parentDelegate(implZone), zone, specification, zoneValues);
-  }
-}
-
-
-/**
- * Base class for Zone implementations.
- */
-abstract class _Zone implements Zone {
-  const _Zone();
-
-  _ZoneFunction<RunHandler> get _run;
-  _ZoneFunction<RunUnaryHandler> get _runUnary;
-  _ZoneFunction<RunBinaryHandler> get _runBinary;
-  _ZoneFunction<RegisterCallbackHandler> get _registerCallback;
-  _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback;
-  _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback;
-  _ZoneFunction<ErrorCallbackHandler> get _errorCallback;
-  _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask;
-  _ZoneFunction<CreateTimerHandler> get _createTimer;
-  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer;
-  _ZoneFunction<PrintHandler> get _print;
-  _ZoneFunction<ForkHandler> get _fork;
-  _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError;
-  _Zone get parent;
-  ZoneDelegate get _delegate;
-  Map get _map;
-
-  bool inSameErrorZone(Zone otherZone) {
-    return identical(this, otherZone) ||
-           identical(errorZone, otherZone.errorZone);
-  }
-}
-
-class _CustomZone extends _Zone {
-  // The actual zone and implementation of each of these
-  // inheritable zone functions.
-  _ZoneFunction<RunHandler> _run;
-  _ZoneFunction<RunUnaryHandler> _runUnary;
-  _ZoneFunction<RunBinaryHandler> _runBinary;
-  _ZoneFunction<RegisterCallbackHandler> _registerCallback;
-  _ZoneFunction<RegisterUnaryCallbackHandler> _registerUnaryCallback;
-  _ZoneFunction<RegisterBinaryCallbackHandler> _registerBinaryCallback;
-  _ZoneFunction<ErrorCallbackHandler> _errorCallback;
-  _ZoneFunction<ScheduleMicrotaskHandler> _scheduleMicrotask;
-  _ZoneFunction<CreateTimerHandler> _createTimer;
-  _ZoneFunction<CreatePeriodicTimerHandler> _createPeriodicTimer;
-  _ZoneFunction<PrintHandler> _print;
-  _ZoneFunction<ForkHandler> _fork;
-  _ZoneFunction<HandleUncaughtErrorHandler> _handleUncaughtError;
-
-  // A cached delegate to this zone.
-  ZoneDelegate _delegateCache;
-
-  /// The parent zone.
-  final _Zone parent;
-
-  /// The zone's scoped value declaration map.
-  ///
-  /// This is always a [HashMap].
-  final Map _map;
-
-  ZoneDelegate get _delegate {
-    if (_delegateCache != null) return _delegateCache;
-    _delegateCache = new _ZoneDelegate(this);
-    return _delegateCache;
-  }
-
-  _CustomZone(this.parent, ZoneSpecification specification, this._map) {
-    // The root zone will have implementations of all parts of the
-    // specification, so it will never try to access the (null) parent.
-    // All other zones have a non-null parent.
-    _run = (specification.run != null)
-        ? new _ZoneFunction<RunHandler>(this, specification.run)
-        : parent._run;
-    _runUnary = (specification.runUnary != null)
-        ? new _ZoneFunction<RunUnaryHandler>(this, specification.runUnary)
-        : parent._runUnary;
-    _runBinary = (specification.runBinary != null)
-        ? new _ZoneFunction<RunBinaryHandler>(this, specification.runBinary)
-        : parent._runBinary;
-    _registerCallback = (specification.registerCallback != null)
-        ? new _ZoneFunction<RegisterCallbackHandler>(
-            this, specification.registerCallback)
-        : parent._registerCallback;
-    _registerUnaryCallback = (specification.registerUnaryCallback != null)
-        ? new _ZoneFunction<RegisterUnaryCallbackHandler>(
-            this, specification.registerUnaryCallback)
-        : parent._registerUnaryCallback;
-    _registerBinaryCallback = (specification.registerBinaryCallback != null)
-        ? new _ZoneFunction<RegisterBinaryCallbackHandler>(
-            this, specification.registerBinaryCallback)
-        : parent._registerBinaryCallback;
-    _errorCallback = (specification.errorCallback != null)
-        ? new _ZoneFunction<ErrorCallbackHandler>(
-            this, specification.errorCallback)
-        : parent._errorCallback;
-    _scheduleMicrotask = (specification.scheduleMicrotask != null)
-        ? new _ZoneFunction<ScheduleMicrotaskHandler>(
-            this, specification.scheduleMicrotask)
-        : parent._scheduleMicrotask;
-    _createTimer = (specification.createTimer != null)
-        ? new _ZoneFunction<CreateTimerHandler>(this, specification.createTimer)
-        : parent._createTimer;
-    _createPeriodicTimer = (specification.createPeriodicTimer != null)
-        ? new _ZoneFunction<CreatePeriodicTimerHandler>(
-            this, specification.createPeriodicTimer)
-        : parent._createPeriodicTimer;
-    _print = (specification.print != null)
-        ? new _ZoneFunction<PrintHandler>(this, specification.print)
-        : parent._print;
-    _fork = (specification.fork != null)
-        ? new _ZoneFunction<ForkHandler>(this, specification.fork)
-        : parent._fork;
-    _handleUncaughtError = (specification.handleUncaughtError != null)
-        ? new _ZoneFunction<HandleUncaughtErrorHandler>(
-            this, specification.handleUncaughtError)
-        : parent._handleUncaughtError;
-  }
-
-  /**
-   * The closest error-handling zone.
-   *
-   * Returns `this` if `this` has an error-handler. Otherwise returns the
-   * parent's error-zone.
-   */
-  Zone get errorZone => _handleUncaughtError.zone;
-
-  /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) {
-    try {
-      return run(f);
-    } catch (e, s) {
-      return handleUncaughtError(e, s);
-    }
-  }
-
-  /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-    try {
-      return runUnary(f, arg);
-    } catch (e, s) {
-      return handleUncaughtError(e, s);
-    }
-  }
-
-  /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-    try {
-      return runBinary(f, arg1, arg2);
-    } catch (e, s) {
-      return handleUncaughtError(e, s);
-    }
-  }
-
-  ZoneCallback/*<R>*/ bindCallback/*<R>*/(
-      /*=R*/ f(), { bool runGuarded: true }) {
-    var registered = registerCallback(f);
-    if (runGuarded) {
-      return () => this.runGuarded(registered);
-    } else {
-      return () => this.run(registered);
-    }
-  }
-
-  ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
-      /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) {
-    var registered = registerUnaryCallback(f);
-    if (runGuarded) {
-      return (arg) => this.runUnaryGuarded(registered, arg);
-    } else {
-      return (arg) => this.runUnary(registered, arg);
-    }
-  }
-
-  ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) {
-    var registered = registerBinaryCallback(f);
-    if (runGuarded) {
-      return (arg1, arg2) => this.runBinaryGuarded(registered, arg1, arg2);
-    } else {
-      return (arg1, arg2) => this.runBinary(registered, arg1, arg2);
-    }
-  }
-
-  operator [](Object key) {
-    var result = _map[key];
-    if (result != null || _map.containsKey(key)) return result;
-    // If we are not the root zone, look up in the parent zone.
-    if (parent != null) {
-      // We do not optimize for repeatedly looking up a key which isn't
-      // there. That would require storing the key and keeping it alive.
-      // Copying the key/value from the parent does not keep any new values
-      // alive.
-      var value = parent[key];
-      if (value != null) {
-        _map[key] = value;
-      }
-      return value;
-    }
-    assert(this == _ROOT_ZONE);
-    return null;
-  }
-
-  // Methods that can be customized by the zone specification.
-
-  /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) {
-    var implementation = this._handleUncaughtError;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    HandleUncaughtErrorHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(
-        implementation.zone, parentDelegate, this, error, stackTrace)
-        as Object/*=R*/;
-  }
-
-  Zone fork({ZoneSpecification specification, Map zoneValues}) {
-    var implementation = this._fork;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    ForkHandler handler = implementation.function;
-    return handler(implementation.zone, parentDelegate, this,
-                   specification, zoneValues);
-  }
-
-  /*=R*/ run/*<R>*/(/*=R*/ f()) {
-    var implementation = this._run;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implementation.zone, parentDelegate, this, f)
-        as Object/*=R*/;
-  }
-
-  /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-    var implementation = this._runUnary;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunUnaryHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implementation.zone, parentDelegate, this, f, arg)
-        as Object/*=R*/;
-  }
-
-  /*=R*/ runBinary/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-    var implementation = this._runBinary;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RunBinaryHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
-    // it's supported. Remove the unnecessary cast.
-    return handler(
-        implementation.zone, parentDelegate, this, f, arg1, arg2)
-        as Object/*=R*/;
-  }
-
-  ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ callback()) {
-    var implementation = this._registerCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implementation.zone, parentDelegate, this, callback)
-        as Object/*=ZoneCallback<R>*/;
-  }
-
-  ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
-      /*=R*/ callback(/*=T*/ arg)) {
-    var implementation = this._registerUnaryCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterUnaryCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T>' once it's
-    // supported. Remove the unnecessary cast.
-    return handler(implementation.zone, parentDelegate, this, callback)
-        as Object/*=ZoneUnaryCallback<R, T>*/;
-  }
-
-  ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ callback(/*=T1*/ arg1, /*=T2*/ arg2)) {
-    var implementation = this._registerBinaryCallback;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    RegisterBinaryCallbackHandler handler = implementation.function;
-    // TODO(floitsch): make this a generic method call on '<R, T1, T2>' once
-    // it's supported. Remove the unnecessary cast.
-    return handler(implementation.zone, parentDelegate, this, callback)
-        as Object/*=ZoneBinaryCallback<R, T1, T2>*/;
-  }
-
-  AsyncError errorCallback(Object error, StackTrace stackTrace) {
-    var implementation = this._errorCallback;
-    assert(implementation != null);
-    final Zone implementationZone = implementation.zone;
-    if (identical(implementationZone, _ROOT_ZONE)) return null;
-    final ZoneDelegate parentDelegate = _parentDelegate(implementationZone);
-    ErrorCallbackHandler handler = implementation.function;
-    return handler(
-        implementationZone, parentDelegate, this, error, stackTrace);
-  }
-
-  void scheduleMicrotask(void f()) {
-    var implementation = this._scheduleMicrotask;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    ScheduleMicrotaskHandler handler = implementation.function;
-    return handler(implementation.zone, parentDelegate, this, f);
-  }
-
-  Timer createTimer(Duration duration, void f()) {
-    var implementation = this._createTimer;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    CreateTimerHandler handler = implementation.function;
-    return handler(implementation.zone, parentDelegate, this, duration, f);
-  }
-
-  Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
-    var implementation = this._createPeriodicTimer;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    CreatePeriodicTimerHandler handler = implementation.function;
-    return handler(
-        implementation.zone, parentDelegate, this, duration, f);
-  }
-
-  void print(String line) {
-    var implementation = this._print;
-    assert(implementation != null);
-    ZoneDelegate parentDelegate = _parentDelegate(implementation.zone);
-    PrintHandler handler = implementation.function;
-    return handler(implementation.zone, parentDelegate, this, line);
-  }
-}
-
-/*=R*/ _rootHandleUncaughtError/*<R>*/(
-    Zone self, ZoneDelegate parent, Zone zone, error, StackTrace stackTrace) {
-  _schedulePriorityAsyncCallback(() {
-    if (error == null) error = new NullThrownError();
-    if (stackTrace == null) throw error;
-    _rethrow(error, stackTrace);
-  });
-}
-
-external void _rethrow(Object error, StackTrace stackTrace);
-
-/*=R*/ _rootRun/*<R>*/(Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) {
-  if (Zone._current == zone) return f();
-
-  Zone old = Zone._enter(zone);
-  try {
-    return f();
-  } finally {
-    Zone._leave(old);
-  }
-}
-
-/*=R*/ _rootRunUnary/*<R, T>*/(Zone self, ZoneDelegate parent, Zone zone,
-    /*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-  if (Zone._current == zone) return f(arg);
-
-  Zone old = Zone._enter(zone);
-  try {
-    return f(arg);
-  } finally {
-    Zone._leave(old);
-  }
-}
-
-/*=R*/ _rootRunBinary/*<R, T1, T2>*/(Zone self, ZoneDelegate parent, Zone zone,
-    /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-  if (Zone._current == zone) return f(arg1, arg2);
-
-  Zone old = Zone._enter(zone);
-  try {
-    return f(arg1, arg2);
-  } finally {
-    Zone._leave(old);
-  }
-}
-
-ZoneCallback/*<R>*/ _rootRegisterCallback/*<R>*/(
-    Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f()) {
-  return f;
-}
-
-ZoneUnaryCallback/*<R, T>*/ _rootRegisterUnaryCallback/*<R, T>*/(
-    Zone self, ZoneDelegate parent, Zone zone, /*=R*/ f(/*=T*/ arg)) {
-  return f;
-}
-
-ZoneBinaryCallback/*<R, T1, T2>*/ _rootRegisterBinaryCallback/*<R, T1, T2>*/(
-    Zone self, ZoneDelegate parent, Zone zone,
-    /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) {
-  return f;
-}
-
-AsyncError _rootErrorCallback(Zone self, ZoneDelegate parent, Zone zone,
-                              Object error, StackTrace stackTrace) => null;
-
-void _rootScheduleMicrotask(Zone self, ZoneDelegate parent, Zone zone, f()) {
-  if (!identical(_ROOT_ZONE, zone)) {
-    bool hasErrorHandler = !_ROOT_ZONE.inSameErrorZone(zone);
-    f = zone.bindCallback(f, runGuarded: hasErrorHandler);
-    // Use root zone as event zone if the function is already bound.
-    zone = _ROOT_ZONE;
-  }
-  _scheduleAsyncCallback(f);
-}
-
-Timer _rootCreateTimer(Zone self, ZoneDelegate parent, Zone zone,
-                       Duration duration, void callback()) {
-  if (!identical(_ROOT_ZONE, zone)) {
-    callback = zone.bindCallback(callback);
-  }
-  return Timer._createTimer(duration, callback);
-}
-
-Timer _rootCreatePeriodicTimer(
-    Zone self, ZoneDelegate parent, Zone zone,
-    Duration duration, void callback(Timer timer)) {
-  if (!identical(_ROOT_ZONE, zone)) {
-    // TODO(floitsch): the return type should be 'void'.
-    callback = zone.bindUnaryCallback/*<dynamic, Timer>*/(callback);
-  }
-  return Timer._createPeriodicTimer(duration, callback);
-}
-
-void _rootPrint(Zone self, ZoneDelegate parent, Zone zone, String line) {
-  printToConsole(line);
-}
-
-void _printToZone(String line) {
-  Zone.current.print(line);
-}
-
-Zone _rootFork(Zone self, ZoneDelegate parent, Zone zone,
-               ZoneSpecification specification,
-               Map zoneValues) {
-  // TODO(floitsch): it would be nice if we could get rid of this hack.
-  // Change the static zoneOrDirectPrint function to go through zones
-  // from now on.
-  printToZone = _printToZone;
-
-  if (specification == null) {
-    specification = const ZoneSpecification();
-  } else if (specification is! _ZoneSpecification) {
-    throw new ArgumentError("ZoneSpecifications must be instantiated"
-        " with the provided constructor.");
-  }
-  Map valueMap;
-  if (zoneValues == null) {
-    if (zone is _Zone) {
-      valueMap = zone._map;
-    } else {
-      valueMap = new HashMap();
-    }
-  } else {
-    valueMap = new HashMap.from(zoneValues);
-  }
-  return new _CustomZone(zone, specification, valueMap);
-}
-
-class _RootZone extends _Zone {
-  const _RootZone();
-
-  _ZoneFunction<RunHandler> get _run =>
-      const _ZoneFunction<RunHandler>(_ROOT_ZONE, _rootRun);
-  _ZoneFunction<RunUnaryHandler> get _runUnary =>
-      const _ZoneFunction<RunUnaryHandler>(_ROOT_ZONE, _rootRunUnary);
-  _ZoneFunction<RunBinaryHandler> get _runBinary =>
-      const _ZoneFunction<RunBinaryHandler>(_ROOT_ZONE, _rootRunBinary);
-  _ZoneFunction<RegisterCallbackHandler> get _registerCallback =>
-      const _ZoneFunction<RegisterCallbackHandler>(
-          _ROOT_ZONE, _rootRegisterCallback);
-  _ZoneFunction<RegisterUnaryCallbackHandler> get _registerUnaryCallback =>
-      const _ZoneFunction<RegisterUnaryCallbackHandler>(
-          _ROOT_ZONE, _rootRegisterUnaryCallback);
-  _ZoneFunction<RegisterBinaryCallbackHandler> get _registerBinaryCallback =>
-      const _ZoneFunction<RegisterBinaryCallbackHandler>(
-          _ROOT_ZONE, _rootRegisterBinaryCallback);
-  _ZoneFunction<ErrorCallbackHandler> get _errorCallback =>
-      const _ZoneFunction<ErrorCallbackHandler>(_ROOT_ZONE, _rootErrorCallback);
-  _ZoneFunction<ScheduleMicrotaskHandler> get _scheduleMicrotask =>
-      const _ZoneFunction<ScheduleMicrotaskHandler>(
-          _ROOT_ZONE, _rootScheduleMicrotask);
-  _ZoneFunction<CreateTimerHandler> get _createTimer =>
-      const _ZoneFunction<CreateTimerHandler>(_ROOT_ZONE, _rootCreateTimer);
-  _ZoneFunction<CreatePeriodicTimerHandler> get _createPeriodicTimer =>
-      const _ZoneFunction<CreatePeriodicTimerHandler>(_ROOT_ZONE, _rootCreatePeriodicTimer);
-  _ZoneFunction<PrintHandler> get _print =>
-      const _ZoneFunction<PrintHandler>(_ROOT_ZONE, _rootPrint);
-  _ZoneFunction<ForkHandler> get _fork =>
-      const _ZoneFunction<ForkHandler>(_ROOT_ZONE, _rootFork);
-  _ZoneFunction<HandleUncaughtErrorHandler> get _handleUncaughtError =>
-      const _ZoneFunction<HandleUncaughtErrorHandler>(
-          _ROOT_ZONE, _rootHandleUncaughtError);
-
-  // The parent zone.
-  _Zone get parent => null;
-
-  /// The zone's scoped value declaration map.
-  ///
-  /// This is always a [HashMap].
-  Map get _map => _rootMap;
-
-  static Map _rootMap = new HashMap();
-
-  static ZoneDelegate _rootDelegate;
-
-  ZoneDelegate get _delegate {
-    if (_rootDelegate != null) return _rootDelegate;
-    return _rootDelegate = new _ZoneDelegate(this);
-  }
-
-  /**
-   * The closest error-handling zone.
-   *
-   * Returns `this` if `this` has an error-handler. Otherwise returns the
-   * parent's error-zone.
-   */
-  Zone get errorZone => this;
-
-  // Zone interface.
-
-  /*=R*/ runGuarded/*<R>*/(/*=R*/ f()) {
-    try {
-      if (identical(_ROOT_ZONE, Zone._current)) {
-        return f();
-      }
-      return _rootRun/*<R>*/(null, null, this, f);
-    } catch (e, s) {
-      return handleUncaughtError/*<R>*/(e, s);
-    }
-  }
-
-  /*=R*/ runUnaryGuarded/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-    try {
-      if (identical(_ROOT_ZONE, Zone._current)) {
-        return f(arg);
-      }
-      return _rootRunUnary/*<R, T>*/(null, null, this, f, arg);
-    } catch (e, s) {
-      return handleUncaughtError/*<R>*/(e, s);
-    }
-  }
-
-  /*=R*/ runBinaryGuarded/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-    try {
-      if (identical(_ROOT_ZONE, Zone._current)) {
-        return f(arg1, arg2);
-      }
-      return _rootRunBinary/*<R, T1, T2>*/(null, null, this, f, arg1, arg2);
-    } catch (e, s) {
-      return handleUncaughtError/*<R>*/(e, s);
-    }
-  }
-
-  ZoneCallback/*<R>*/ bindCallback/*<R>*/(
-      /*=R*/ f(), { bool runGuarded: true }) {
-    if (runGuarded) {
-      return () => this.runGuarded/*<R>*/(f);
-    } else {
-      return () => this.run/*<R>*/(f);
-    }
-  }
-
-  ZoneUnaryCallback/*<R, T>*/ bindUnaryCallback/*<R, T>*/(
-      /*=R*/ f(/*=T*/ arg), { bool runGuarded: true }) {
-    if (runGuarded) {
-      return (arg) => this.runUnaryGuarded/*<R, T>*/(f, arg);
-    } else {
-      return (arg) => this.runUnary/*<R, T>*/(f, arg);
-    }
-  }
-
-  ZoneBinaryCallback/*<R, T1, T2>*/ bindBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), { bool runGuarded: true }) {
-    if (runGuarded) {
-      return (arg1, arg2) =>
-          this.runBinaryGuarded/*<R, T1, T2>*/(f, arg1, arg2);
-    } else {
-      return (arg1, arg2) => this.runBinary/*<R, T1, T2>*/(f, arg1, arg2);
-    }
-  }
-
-  operator [](Object key) => null;
-
-  // Methods that can be customized by the zone specification.
-
-  /*=R*/ handleUncaughtError/*<R>*/(error, StackTrace stackTrace) {
-    return _rootHandleUncaughtError(null, null, this, error, stackTrace);
-  }
-
-  Zone fork({ZoneSpecification specification, Map zoneValues}) {
-    return _rootFork(null, null, this, specification, zoneValues);
-  }
-
-  /*=R*/ run/*<R>*/(/*=R*/ f()) {
-    if (identical(Zone._current, _ROOT_ZONE)) return f();
-    return _rootRun(null, null, this, f);
-  }
-
-  /*=R*/ runUnary/*<R, T>*/(/*=R*/ f(/*=T*/ arg), /*=T*/ arg) {
-    if (identical(Zone._current, _ROOT_ZONE)) return f(arg);
-    return _rootRunUnary(null, null, this, f, arg);
-  }
-
-  /*=R*/ runBinary/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2), /*=T1*/ arg1, /*=T2*/ arg2) {
-    if (identical(Zone._current, _ROOT_ZONE)) return f(arg1, arg2);
-    return _rootRunBinary(null, null, this, f, arg1, arg2);
-  }
-
-  ZoneCallback/*<R>*/ registerCallback/*<R>*/(/*=R*/ f()) => f;
-
-  ZoneUnaryCallback/*<R, T>*/ registerUnaryCallback/*<R, T>*/(
-      /*=R*/ f(/*=T*/ arg)) => f;
-
-  ZoneBinaryCallback/*<R, T1, T2>*/ registerBinaryCallback/*<R, T1, T2>*/(
-      /*=R*/ f(/*=T1*/ arg1, /*=T2*/ arg2)) => f;
-
-  AsyncError errorCallback(Object error, StackTrace stackTrace) => null;
-
-  void scheduleMicrotask(void f()) {
-    _rootScheduleMicrotask(null, null, this, f);
-  }
-
-  Timer createTimer(Duration duration, void f()) {
-    return Timer._createTimer(duration, f);
-  }
-
-  Timer createPeriodicTimer(Duration duration, void f(Timer timer)) {
-    return Timer._createPeriodicTimer(duration, f);
-  }
-
-  void print(String line) {
-    printToConsole(line);
-  }
-}
-
-const _ROOT_ZONE = const _RootZone();
-
-/**
- * Runs [body] in its own zone.
- *
- * If [onError] is non-null the zone is considered an error zone. All uncaught
- * errors, synchronous or asynchronous, in the zone are caught and handled
- * by the callback.
- *
- * Errors may never cross error-zone boundaries. This is intuitive for leaving
- * a zone, but it also applies for errors that would enter an error-zone.
- * Errors that try to cross error-zone boundaries are considered uncaught.
- *
- *     var future = new Future.value(499);
- *     runZoned(() {
- *       future = future.then((_) { throw "error in first error-zone"; });
- *       runZoned(() {
- *         future = future.catchError((e) { print("Never reached!"); });
- *       }, onError: (e) { print("unused error handler"); });
- *     }, onError: (e) { print("catches error of first error-zone."); });
- *
- * Example:
- *
- *     runZoned(() {
- *       new Future(() { throw "asynchronous error"; });
- *     }, onError: print);  // Will print "asynchronous error".
- */
-/*=R*/ runZoned/*<R>*/(/*=R*/ body(),
-                 { Map zoneValues,
-                   ZoneSpecification zoneSpecification,
-                   Function onError }) {
-  HandleUncaughtErrorHandler errorHandler;
-  if (onError != null) {
-    errorHandler = (Zone self, ZoneDelegate parent, Zone zone,
-                    error, StackTrace stackTrace) {
-      try {
-        // Change this is check back to
-        // onError is ZoneBinaryCallback<dynamic/*=R*/, dynamic, StackTrace>
-        // once is checks for that type are handled correctly.
-        if (onError is ZoneBinaryCallback<dynamic, dynamic, StackTrace>) {
-          return self.parent.runBinary(onError, error, stackTrace) as Object/*=R*/;
-        }
-        return self.parent.runUnary(onError, error);
-      } catch(e, s) {
-        if (identical(e, error)) {
-          return parent.handleUncaughtError(zone, error, stackTrace);
-        } else {
-          return parent.handleUncaughtError(zone, e, s);
-        }
-      }
-    };
-  }
-  if (zoneSpecification == null) {
-    zoneSpecification =
-        new ZoneSpecification(handleUncaughtError: errorHandler);
-  } else if (errorHandler != null) {
-    zoneSpecification =
-        new ZoneSpecification.from(zoneSpecification,
-                                   handleUncaughtError: errorHandler);
-  }
-  Zone zone = Zone.current.fork(specification: zoneSpecification,
-                                zoneValues: zoneValues);
-  if (onError != null) {
-    return zone.runGuarded(body);
-  } else {
-    return zone.run(body);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/collection.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/collection.dart
deleted file mode 100644
index 5a2a906..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/collection.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Classes and utilities that supplement the collection support in dart:core.
- * 
- * To use this library in your code:
- *
- *     import 'dart:collection';
- */
-library dart.collection;
-
-import 'dart:_internal';
-import 'dart:math' show Random;  // Used by ListMixin.shuffle.
-
-part 'collections.dart';
-part 'hash_map.dart';
-part 'hash_set.dart';
-part 'iterable.dart';
-part 'iterator.dart';
-part 'linked_hash_map.dart';
-part 'linked_hash_set.dart';
-part 'linked_list.dart';
-part 'list.dart';
-part 'maps.dart';
-part 'queue.dart';
-part 'set.dart';
-part 'splay_tree.dart';
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/collections.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/collections.dart
deleted file mode 100644
index 5756544..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/collections.dart
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/**
- * An unmodifiable [List] view of another List.
- *
- * The source of the elements may be a [List] or any [Iterable] with
- * efficient [Iterable.length] and [Iterable.elementAt].
- */
-class UnmodifiableListView<E> extends UnmodifiableListBase<E> {
-  final Iterable<E> _source;
-
-  /**
-   * Creates an unmodifiable list backed by [source].
-   *
-   * The [source] of the elements may be a [List] or any [Iterable] with
-   * efficient [Iterable.length] and [Iterable.elementAt].
-   */
-  UnmodifiableListView(Iterable<E> source) : _source = source;
-  int get length => _source.length;
-  E operator[](int index) => _source.elementAt(index);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_map.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_map.dart
deleted file mode 100644
index c8c31c5..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_map.dart
+++ /dev/null
@@ -1,145 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/** Default function for equality comparison in customized HashMaps */
-bool _defaultEquals(a, b) => a == b;
-/** Default function for hash-code computation in customized HashMaps */
-int _defaultHashCode(a) => a.hashCode;
-
-/** Type of custom equality function */
-typedef bool _Equality<K>(K a, K b);
-/** Type of custom hash code function. */
-typedef int _Hasher<K>(K object);
-
-/**
- * A hash-table based implementation of [Map].
- *
- * The keys of a `HashMap` must have consistent [Object.operator==]
- * and [Object.hashCode] implementations. This means that the `==` operator
- * must define a stable equivalence relation on the keys (reflexive,
- * symmetric, transitive, and consistent over time), and that `hashCode`
- * must be the same for objects that are considered equal by `==`.
- *
- * The map allows `null` as a key.
- *
- * Iterating the map's keys, values or entries (through [forEach])
- * may happen in any order.
- * The iteration order only changes when the map is modified.
- * Values are iterated in the same order as their associated keys,
- * so iterating the [keys] and [values] in parallel
- * will give matching key and value pairs.
- */
-abstract class HashMap<K, V> implements Map<K, V> {
-  /**
-   * Creates an unordered hash-table based [Map].
-   *
-   * The created map is not ordered in any way. When iterating the keys or
-   * values, the iteration order is unspecified except that it will stay the
-   * same as long as the map isn't changed.
-   *
-   * If [equals] is provided, it is used to compare the keys in the table with
-   * new keys. If [equals] is omitted, the key's own [Object.operator==] is used
-   * instead.
-   *
-   * Similar, if [hashCode] is provided, it is used to produce a hash value
-   * for keys in order to place them in the hash table. If it is omitted, the
-   * key's own [Object.hashCode] is used.
-   *
-   * If using methods like [operator[]], [remove] and [containsKey] together
-   * with a custom equality and hashcode, an extra `isValidKey` function
-   * can be supplied. This function is called before calling [equals] or
-   * [hashCode] with an argument that may not be a [K] instance, and if the
-   * call returns false, the key is assumed to not be in the set.
-   * The [isValidKey] function defaults to just testing if the object is a
-   * [K] instance.
-   *
-   * Example:
-   *
-   *     new HashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
-   *                          hashCode: (int e) => e % 5)
-   *
-   * This example map does not need an `isValidKey` function to be passed.
-   * The default function accepts only `int` values, which can safely be
-   * passed to both the `equals` and `hashCode` functions.
-   *
-   * If neither `equals`, `hashCode`, nor `isValidKey` is provided,
-   * the default `isValidKey` instead accepts all keys.
-   * The default equality and hashcode operations are assumed to work on all
-   * objects.
-   *
-   * Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
-   * and `isValidKey` is omitted, the resulting map is identity based,
-   * and the `isValidKey` defaults to accepting all keys.
-   * Such a map can be created directly using [HashMap.identity].
-   *
-   * The used `equals` and `hashCode` method should always be consistent,
-   * so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-   * of an object, or what it compares equal to, should not change while the
-   * object is a key in the map. If it does change, the result is unpredictable.
-   *
-   * If you supply one of [equals] and [hashCode],
-   * you should generally also to supply the other.
-   */
-  external factory HashMap({bool equals(K key1, K key2),
-                            int hashCode(K key),
-                            bool isValidKey(potentialKey)});
-
-  /**
-   * Creates an unordered identity-based map.
-   *
-   * Effectively a shorthand for:
-   *
-   *     new HashMap(equals: identical,
-   *                 hashCode: identityHashCode)
-   */
-  external factory HashMap.identity();
-
-  /**
-   * Creates a [HashMap] that contains all key/value pairs of [other].
-   */
-  factory HashMap.from(Map other) {
-    HashMap<K, V> result = new HashMap<K, V>();
-    other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
-    return result;
-  }
-
-  /**
-   * Creates a [HashMap] where the keys and values are computed from the
-   * [iterable].
-   *
-   * For each element of the [iterable] this constructor computes a key/value
-   * pair, by applying [key] and [value] respectively.
-   *
-   * The keys of the key/value pairs do not need to be unique. The last
-   * occurrence of a key will simply overwrite any previous value.
-   *
-   * If no values are specified for [key] and [value] the default is the
-   * identity function.
-   */
-  factory HashMap.fromIterable(Iterable iterable,
-      {K key(element), V value(element)}) {
-    HashMap<K, V> map = new HashMap<K, V>();
-    Maps._fillMapWithMappedIterable(map, iterable, key, value);
-    return map;
-  }
-
-  /**
-   * Creates a [HashMap] associating the given [keys] to [values].
-   *
-   * This constructor iterates over [keys] and [values] and maps each element of
-   * [keys] to the corresponding element of [values].
-   *
-   * If [keys] contains the same object multiple times, the last occurrence
-   * overwrites the previous value.
-   *
-   * It is an error if the two [Iterable]s don't have the same length.
-   */
-  factory HashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
-    HashMap<K, V> map = new HashMap<K, V>();
-    Maps._fillMapWithIterables(map, keys, values);
-    return map;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_set.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_set.dart
deleted file mode 100644
index 726037a..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/hash_set.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/** Common parts of [HashSet] and [LinkedHashSet] implementations. */
-abstract class _HashSetBase<E> extends SetBase<E> {
-
-  // The following two methods override the ones in SetBase.
-  // It's possible to be more efficient if we have a way to create an empty
-  // set of the correct type.
-
-  Set<E> difference(Set<Object> other) {
-    Set<E> result = _newSet();
-    for (var element in this) {
-      if (!other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  Set<E> intersection(Set<Object> other) {
-    Set<E> result = _newSet();
-    for (var element in this) {
-      if (other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  Set<E> _newSet();
-
-  // Subclasses can optimize this further.
-  Set<E> toSet() => _newSet()..addAll(this);
-}
-
-/**
- * An unordered hash-table based [Set] implementation.
- *
- * The elements of a `HashSet` must have consistent equality
- * and hashCode implementations. This means that the equals operation
- * must define a stable equivalence relation on the elements (reflexive,
- * symmetric, transitive, and consistent over time), and that the hashCode
- * must consistent with equality, so that the same for objects that are
- * considered equal.
- *
- * The set allows `null` as an element.
- *
- * Most simple operations on `HashSet` are done in (potentially amorteized)
- * constant time: [add], [contains], [remove], and [length], provided the hash
- * codes of objects are well distributed.
- */
-abstract class HashSet<E> implements Set<E> {
-  /**
-   * Create a hash set using the provided [equals] as equality.
-   *
-   * The provided [equals] must define a stable equivalence relation, and
-   * [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-   * methods won't work on all objects, but only on some instances of E, the
-   * [isValidKey] predicate can be used to restrict the keys that the functions
-   * are applied to.
-   * Any key for which [isValidKey] returns false is automatically assumed
-   * to not be in the set when asking `contains`.
-   *
-   * If [equals] or [hashCode] are omitted, the set uses
-   * the elements' intrinsic [Object.operator==] and [Object.hashCode].
-   *
-   * If you supply one of [equals] and [hashCode],
-   * you should generally also to supply the other.
-   *
-   * If the supplied `equals` or `hashCode` functions won't work on all [E]
-   * objects, and the map will be used in a setting where a non-`E` object
-   * is passed to, e.g., `contains`, then the [isValidKey] function should
-   * also be supplied.
-   *
-   * If [isValidKey] is omitted, it defaults to testing if the object is an
-   * [E] instance. That means that:
-   *
-   *     new HashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
-   *                      hashCode: (int e) => e % 5)
-   *
-   * does not need an `isValidKey` argument, because it defaults to only
-   * accepting `int` values which are accepted by both `equals` and `hashCode`.
-   *
-   * If neither `equals`, `hashCode`, nor `isValidKey` is provided,
-   * the default `isValidKey` instead accepts all values.
-   * The default equality and hashcode operations are assumed to work on all
-   * objects.
-   *
-   * Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
-   * and `isValidKey` is omitted, the resulting set is identity based,
-   * and the `isValidKey` defaults to accepting all keys.
-   * Such a map can be created directly using [HashSet.identity].
-   */
-  external factory HashSet({bool equals(E e1, E e2),
-                            int hashCode(E e),
-                            bool isValidKey(Object potentialKey)});
-
-  /**
-   * Creates an unordered identity-based set.
-   *
-   * Effectively a shorthand for:
-   *
-   *     new HashSet<E>(equals: identical,
-   *                    hashCode: identityHashCode)
-   */
-  external factory HashSet.identity();
-
-  /**
-   * Create a hash set containing all [elements].
-   *
-   * Creates a hash set as by `new HashSet<E>()` and adds each element of
-   * `elements` to this set in the order they are iterated.
-   *
-   * All the [elements] should be assignable to [E].
-   * The `elements` iterable itself may have any element type, so this
-   * constructor can be used to down-cast a `Set`, for example as:
-   *
-   *     Set<SuperType> superSet = ...;
-   *     Set<SubType> subSet =
-   *         new HashSet<SubType>.from(superSet.where((e) => e is SubType));
-   */
-  factory HashSet.from(Iterable elements) {
-    HashSet<E> result = new HashSet<E>();
-    for (final e in elements) {
-      E element = e as Object/*=E*/;
-      result.add(element);
-    }
-    return result;
-  }
-
-  /**
-   * Provides an iterator that iterates over the elements of this set.
-   *
-   * The order of iteration is unspecified,
-   * but consistent between changes to the set.
-   */
-  Iterator<E> get iterator;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/iterable.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/iterable.dart
deleted file mode 100644
index 26ccb5c..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/iterable.dart
+++ /dev/null
@@ -1,400 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.collection;
-
-/**
- * This [Iterable] mixin implements all [Iterable] members except `iterator`.
- *
- * All other methods are implemented in terms of `iterator`.
- */
-abstract class IterableMixin<E> implements Iterable<E> {
-  // This class has methods copied verbatim into:
-  // - IterableBase
-  // - SetMixin
-  // If changing a method here, also change the other copies.
-
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) =>
-      new MappedIterable<E, dynamic/*=T*/>(this, f);
-
-  Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
-
-  Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) =>
-      new ExpandIterable<E, dynamic/*=T*/>(this, f);
-
-  bool contains(Object element) {
-    for (E e in this) {
-      if (e == element) return true;
-    }
-    return false;
-  }
-
-  void forEach(void f(E element)) {
-    for (E element in this) f(element);
-  }
-
-  E reduce(E combine(E value, E element)) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E value = iterator.current;
-    while (iterator.moveNext()) {
-      value = combine(value, iterator.current);
-    }
-    return value;
-  }
-
-  dynamic/*=T*/ fold/*<T>*/(var/*=T*/ initialValue,
-               dynamic/*=T*/ combine(var/*=T*/ previousValue, E element)) {
-    var value = initialValue;
-    for (E element in this) value = combine(value, element);
-    return value;
-  }
-
-  bool every(bool f(E element)) {
-    for (E element in this) {
-      if (!f(element)) return false;
-    }
-    return true;
-  }
-
-  String join([String separator = ""]) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) return "";
-    StringBuffer buffer = new StringBuffer();
-    if (separator == null || separator == "") {
-      do {
-        buffer.write("${iterator.current}");
-      } while (iterator.moveNext());
-    } else {
-      buffer.write("${iterator.current}");
-      while (iterator.moveNext()) {
-        buffer.write(separator);
-        buffer.write("${iterator.current}");
-      }
-    }
-    return buffer.toString();
-  }
-
-  bool any(bool f(E element)) {
-    for (E element in this) {
-      if (f(element)) return true;
-    }
-    return false;
-  }
-
-  List<E> toList({ bool growable: true }) =>
-      new List<E>.from(this, growable: growable);
-
-  Set<E> toSet() => new Set<E>.from(this);
-
-  int get length {
-    assert(this is! EfficientLength);
-    int count = 0;
-    Iterator it = iterator;
-    while (it.moveNext()) {
-      count++;
-    }
-    return count;
-  }
-
-  bool get isEmpty => !iterator.moveNext();
-
-  bool get isNotEmpty => !isEmpty;
-
-  Iterable<E> take(int count) {
-    return new TakeIterable<E>(this, count);
-  }
-
-  Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
-  }
-
-  Iterable<E> skip(int count) {
-    return new SkipIterable<E>(this, count);
-  }
-
-  Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
-  }
-
-  E get first {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    return it.current;
-  }
-
-  E get last {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E result;
-    do {
-      result = it.current;
-    } while(it.moveNext());
-    return result;
-  }
-
-  E get single {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) throw IterableElementError.noElement();
-    E result = it.current;
-    if (it.moveNext()) throw IterableElementError.tooMany();
-    return result;
-  }
-
-  E firstWhere(bool test(E value), { E orElse() }) {
-    for (E element in this) {
-      if (test(element)) return element;
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E lastWhere(bool test(E value), { E orElse() }) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E singleWhere(bool test(E value)) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        if (foundMatching) {
-          throw IterableElementError.tooMany();
-        }
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    throw IterableElementError.noElement();
-  }
-
-  E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
-    RangeError.checkNotNegative(index, "index");
-    int elementIndex = 0;
-    for (E element in this) {
-      if (index == elementIndex) return element;
-      elementIndex++;
-    }
-    throw new RangeError.index(index, this, "index", null, elementIndex);
-  }
-
-
-  String toString() => IterableBase.iterableToShortString(this, '(', ')');
-}
-
-/**
- * Base class for implementing [Iterable].
- *
- * This class implements all methods of [Iterable] except [Iterable.iterator]
- * in terms of `iterator`.
- */
-abstract class IterableBase<E> extends Iterable<E> {
-  const IterableBase();
-
-  /**
-   * Convert an `Iterable` to a string like [IterableBase.toString].
-   *
-   * Allows using other delimiters than '(' and ')'.
-   *
-   * Handles circular references where converting one of the elements
-   * to a string ends up converting [iterable] to a string again.
-   */
-  static String iterableToShortString(Iterable iterable,
-                                      [String leftDelimiter = '(',
-                                       String rightDelimiter = ')']) {
-    if (_isToStringVisiting(iterable)) {
-      if (leftDelimiter == "(" && rightDelimiter == ")") {
-        // Avoid creating a new string in the "common" case.
-        return "(...)";
-      }
-      return "$leftDelimiter...$rightDelimiter";
-    }
-    List parts = [];
-    _toStringVisiting.add(iterable);
-    try {
-      _iterablePartsToStrings(iterable, parts);
-    } finally {
-      assert(identical(_toStringVisiting.last, iterable));
-      _toStringVisiting.removeLast();
-    }
-    return (new StringBuffer(leftDelimiter)
-                ..writeAll(parts, ", ")
-                ..write(rightDelimiter)).toString();
-  }
-
-  /**
-   * Converts an `Iterable` to a string.
-   *
-   * Converts each elements to a string, and separates the results by ", ".
-   * Then wraps the result in [leftDelimiter] and [rightDelimiter].
-   *
-   * Unlike [iterableToShortString], this conversion doesn't omit any
-   * elements or puts any limit on the size of the result.
-   *
-   * Handles circular references where converting one of the elements
-   * to a string ends up converting [iterable] to a string again.
-   */
-  static String iterableToFullString(Iterable iterable,
-                                     [String leftDelimiter = '(',
-                                      String rightDelimiter = ')']) {
-    if (_isToStringVisiting(iterable)) {
-      return "$leftDelimiter...$rightDelimiter";
-    }
-    StringBuffer buffer = new StringBuffer(leftDelimiter);
-    _toStringVisiting.add(iterable);
-    try {
-      buffer.writeAll(iterable, ", ");
-    } finally {
-      assert(identical(_toStringVisiting.last, iterable));
-      _toStringVisiting.removeLast();
-    }
-    buffer.write(rightDelimiter);
-    return buffer.toString();
-  }
-}
-
-/** A set used to identify cyclic lists during toString() calls. */
-final List _toStringVisiting = [];
-
-/** Check if we are currently visiting `o` in a toString call. */
-bool _isToStringVisiting(Object o) {
-  for (int i = 0; i < _toStringVisiting.length; i++) {
-    if (identical(o, _toStringVisiting[i])) return true;
-  }
-  return false;
-}
-
-/**
- * Convert elments of [iterable] to strings and store them in [parts].
- */
-void _iterablePartsToStrings(Iterable iterable, List parts) {
-  /*
-   * This is the complicated part of [iterableToShortString].
-   * It is extracted as a separate function to avoid having too much code
-   * inside the try/finally.
-   */
-  /// Try to stay below this many characters.
-  const int LENGTH_LIMIT = 80;
-  /// Always at least this many elements at the start.
-  const int HEAD_COUNT = 3;
-  /// Always at least this many elements at the end.
-  const int TAIL_COUNT = 2;
-  /// Stop iterating after this many elements. Iterables can be infinite.
-  const int MAX_COUNT = 100;
-  // Per entry length overhead. It's for ", " for all after the first entry,
-  // and for "(" and ")" for the initial entry. By pure luck, that's the same
-  // number.
-  const int OVERHEAD = 2;
-  const int ELLIPSIS_SIZE = 3;  // "...".length.
-
-  int length = 0;
-  int count = 0;
-  Iterator it = iterable.iterator;
-  // Initial run of elements, at least HEAD_COUNT, and then continue until
-  // passing at most LENGTH_LIMIT characters.
-  while (length < LENGTH_LIMIT || count < HEAD_COUNT) {
-    if (!it.moveNext()) return;
-    String next = "${it.current}";
-    parts.add(next);
-    length += next.length + OVERHEAD;
-    count++;
-  }
-
-  String penultimateString;
-  String ultimateString;
-
-  // Find last two elements. One or more of them may already be in the
-  // parts array. Include their length in `length`.
-  var penultimate = null;
-  var ultimate = null;
-  if (!it.moveNext()) {
-    if (count <= HEAD_COUNT + TAIL_COUNT) return;
-    ultimateString = parts.removeLast();
-    penultimateString = parts.removeLast();
-  } else {
-    penultimate = it.current;
-    count++;
-    if (!it.moveNext()) {
-      if (count <= HEAD_COUNT + 1) {
-        parts.add("$penultimate");
-        return;
-      }
-      ultimateString = "$penultimate";
-      penultimateString = parts.removeLast();
-      length += ultimateString.length + OVERHEAD;
-    } else {
-      ultimate = it.current;
-      count++;
-      // Then keep looping, keeping the last two elements in variables.
-      assert(count < MAX_COUNT);
-      while (it.moveNext()) {
-        penultimate = ultimate;
-        ultimate = it.current;
-        count++;
-        if (count > MAX_COUNT) {
-          // If we haven't found the end before MAX_COUNT, give up.
-          // This cannot happen in the code above because each entry
-          // increases length by at least two, so there is no way to
-          // visit more than ~40 elements before this loop.
-
-          // Remove any surplus elements until length, including ", ...)",
-          // is at most LENGTH_LIMIT.
-          while (length > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD &&
-                 count > HEAD_COUNT) {
-            length -= parts.removeLast().length + OVERHEAD;
-            count--;
-          }
-          parts.add("...");
-          return;
-        }
-      }
-      penultimateString = "$penultimate";
-      ultimateString = "$ultimate";
-      length +=
-          ultimateString.length + penultimateString.length + 2 * OVERHEAD;
-    }
-  }
-
-  // If there is a gap between the initial run and the last two,
-  // prepare to add an ellipsis.
-  String elision = null;
-  if (count > parts.length + TAIL_COUNT) {
-    elision = "...";
-    length += ELLIPSIS_SIZE + OVERHEAD;
-  }
-
-  // If the last two elements were very long, and we have more than
-  // HEAD_COUNT elements in the initial run, drop some to make room for
-  // the last two.
-  while (length > LENGTH_LIMIT && parts.length > HEAD_COUNT) {
-    length -= parts.removeLast().length + OVERHEAD;
-    if (elision == null) {
-      elision = "...";
-      length += ELLIPSIS_SIZE + OVERHEAD;
-    }
-  }
-  if (elision != null) {
-    parts.add(elision);
-  }
-  parts.add(penultimateString);
-  parts.add(ultimateString);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/iterator.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/iterator.dart
deleted file mode 100644
index f870711..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/iterator.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.collection;
-
-/**
- * The [HasNextIterator] class wraps an [Iterator] and provides methods to
- * iterate over an object using `hasNext` and `next`.
- *
- * An [HasNextIterator] does not implement the [Iterator] interface.
- */
-class HasNextIterator<E> {
-  static const int _HAS_NEXT_AND_NEXT_IN_CURRENT = 0;
-  static const int _NO_NEXT = 1;
-  static const int _NOT_MOVED_YET = 2;
-
-  Iterator<E> _iterator;
-  int _state = _NOT_MOVED_YET;
-
-  HasNextIterator(this._iterator);
-
-  bool get hasNext {
-    if (_state == _NOT_MOVED_YET) _move();
-    return _state == _HAS_NEXT_AND_NEXT_IN_CURRENT;
-  }
-
-  E next() {
-    // Call to hasNext is necessary to make sure we are positioned at the first
-    // element when we start iterating.
-    if (!hasNext) throw new StateError("No more elements");
-    assert(_state == _HAS_NEXT_AND_NEXT_IN_CURRENT);
-    E result = _iterator.current;
-    _move();
-    return result;
-  }
-
-  void _move() {
-    if (_iterator.moveNext()) {
-      _state = _HAS_NEXT_AND_NEXT_IN_CURRENT;
-    } else {
-      _state = _NO_NEXT;
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_map.dart
deleted file mode 100644
index 9423a6d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_map.dart
+++ /dev/null
@@ -1,132 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/**
- * A hash-table based implementation of [Map].
- *
- * The insertion order of keys is remembered,
- * and keys are iterated in the order they were inserted into the map.
- * Values are iterated in their corresponding key's order.
- * Changing a key's value, when the key is already in the map,
- * does not change the iteration order,
- * but removing the key and adding it again
- * will make it be last in the iteration order.
- *
- * The keys of a `LinkedHashMap` must have consistent [Object.operator==]
- * and [Object.hashCode] implementations. This means that the `==` operator
- * must define a stable equivalence relation on the keys (reflexive,
- * symmetric, transitive, and consistent over time), and that `hashCode`
- * must be the same for objects that are considered equal by `==`.
- *
- * The map allows `null` as a key.
- */
-abstract class LinkedHashMap<K, V> implements HashMap<K, V> {
-  /**
-   * Creates an insertion-ordered hash-table based [Map].
-   *
-   * If [equals] is provided, it is used to compare the keys in the table with
-   * new keys. If [equals] is omitted, the key's own [Object.operator==] is used
-   * instead.
-   *
-   * Similar, if [hashCode] is provided, it is used to produce a hash value
-   * for keys in order to place them in the hash table. If it is omitted, the
-   * key's own [Object.hashCode] is used.
-   *
-   * If using methods like [operator[]], [remove] and [containsKey] together
-   * with a custom equality and hashcode, an extra `isValidKey` function
-   * can be supplied. This function is called before calling [equals] or
-   * [hashCode] with an argument that may not be a [K] instance, and if the
-   * call returns false, the key is assumed to not be in the set.
-   * The [isValidKey] function defaults to just testing if the object is a
-   * [K] instance.
-   *
-   * Example:
-   *
-   *     new LinkedHashMap<int,int>(equals: (int a, int b) => (b - a) % 5 == 0,
-   *                                hashCode: (int e) => e % 5)
-   *
-   * This example map does not need an `isValidKey` function to be passed.
-   * The default function accepts only `int` values, which can safely be
-   * passed to both the `equals` and `hashCode` functions.
-   *
-   * If neither `equals`, `hashCode`, nor `isValidKey` is provided,
-   * the default `isValidKey` instead accepts all keys.
-   * The default equality and hashcode operations are assumed to work on all
-   * objects.
-   *
-   * Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
-   * and `isValidKey` is omitted, the resulting map is identity based,
-   * and the `isValidKey` defaults to accepting all keys.
-   * Such a map can be created directly using [LinkedHashMap.identity].
-   *
-   * The used `equals` and `hashCode` method should always be consistent,
-   * so that if `equals(a, b)` then `hashCode(a) == hashCode(b)`. The hash
-   * of an object, or what it compares equal to, should not change while the
-   * object is in the table. If it does change, the result is unpredictable.
-   *
-   * If you supply one of [equals] and [hashCode],
-   * you should generally also to supply the other.
-   */
-  external factory LinkedHashMap({bool equals(K key1, K key2),
-                                  int hashCode(K key),
-                                  bool isValidKey(Object potentialKey)});
-
-  /**
-   * Creates an insertion-ordered identity-based map.
-   *
-   * Effectively a shorthand for:
-   *
-   *     new LinkedHashMap(equals: identical,
-   *                       hashCode: identityHashCode)
-   */
-  external factory LinkedHashMap.identity();
-
-  /**
-   * Creates a [LinkedHashMap] that contains all key value pairs of [other].
-   */
-  factory LinkedHashMap.from(Map other) {
-    LinkedHashMap<K, V> result = new LinkedHashMap<K, V>();
-    other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
-    return result;
-  }
-
-  /**
-   * Creates a [LinkedHashMap] where the keys and values are computed from the
-   * [iterable].
-   *
-   * For each element of the [iterable] this constructor computes a key/value
-   * pair, by applying [key] and [value] respectively.
-   *
-   * The keys of the key/value pairs do not need to be unique. The last
-   * occurrence of a key will simply overwrite any previous value.
-   *
-   * If no values are specified for [key] and [value] the default is the
-   * identity function.
-   */
-  factory LinkedHashMap.fromIterable(Iterable iterable,
-      {K key(element), V value(element)}) {
-    LinkedHashMap<K, V> map = new LinkedHashMap<K, V>();
-    Maps._fillMapWithMappedIterable(map, iterable, key, value);
-    return map;
-  }
-
-  /**
-   * Creates a [LinkedHashMap] associating the given [keys] to [values].
-   *
-   * This constructor iterates over [keys] and [values] and maps each element of
-   * [keys] to the corresponding element of [values].
-   *
-   * If [keys] contains the same object multiple times, the last occurrence
-   * overwrites the previous value.
-   *
-   * It is an error if the two [Iterable]s don't have the same length.
-   */
-  factory LinkedHashMap.fromIterables(Iterable<K> keys, Iterable<V> values) {
-    LinkedHashMap<K, V> map = new LinkedHashMap<K, V>();
-    Maps._fillMapWithIterables(map, keys, values);
-    return map;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_set.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_set.dart
deleted file mode 100644
index 231ef8e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_hash_set.dart
+++ /dev/null
@@ -1,125 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/**
- * A [LinkedHashSet] is a hash-table based [Set] implementation.
- *
- * The `LinkedHashSet` also keep track of the order that elements were inserted
- * in, and iteration happens in first-to-last insertion order.
- *
- * The elements of a `LinkedHashSet` must have consistent [Object.operator==]
- * and [Object.hashCode] implementations. This means that the `==` operator
- * must define a stable equivalence relation on the elements (reflexive,
- * symmetric, transitive, and consistent over time), and that `hashCode`
- * must be the same for objects that are considered equal by `==`.
- *
- * The set allows `null` as an element.
- *
- * Iteration of elements is done in element insertion order.
- * An element that was added after another will occur later in the iteration.
- * Adding an element that is already in the set
- * does not change its position in the iteration order,
- * but removing an element and adding it again,
- * will make it the last element of an iteration.
- *
- * Most simple operations on `HashSet` are done in (potentially amortized)
- * constant time: [add], [contains], [remove], and [length], provided the hash
- * codes of objects are well distributed..
- */
-abstract class LinkedHashSet<E> implements HashSet<E> {
-  /**
-   * Create an insertion-ordered hash set using the provided
-   * [equals] and [hashCode].
-   *
-   * The provided [equals] must define a stable equivalence relation, and
-   * [hashCode] must be consistent with [equals]. If the [equals] or [hashCode]
-   * methods won't work on all objects, but only on some instances of E, the
-   * [isValidKey] predicate can be used to restrict the keys that the functions
-   * are applied to.
-   * Any key for which [isValidKey] returns false is automatically assumed
-   * to not be in the set when asking `contains`.
-   *
-   * If [equals] or [hashCode] are omitted, the set uses
-   * the elements' intrinsic [Object.operator==] and [Object.hashCode],
-   * and [isValidKey] is ignored since these operations are assumed
-   * to work on all objects.
-   *
-   * If you supply one of [equals] and [hashCode],
-   * you should generally also to supply the other.
-   *
-   * If the supplied `equals` or `hashCode` functions won't work on all [E]
-   * objects, and the map will be used in a setting where a non-`E` object
-   * is passed to, e.g., `contains`, then the [isValidKey] function should
-   * also be supplied.
-   *
-   * If [isValidKey] is omitted, it defaults to testing if the object is an
-   * [E] instance. That means that:
-   *
-   *     new LinkedHashSet<int>(equals: (int e1, int e2) => (e1 - e2) % 5 == 0,
-   *                            hashCode: (int e) => e % 5)
-   *
-   * does not need an `isValidKey` argument, because it defaults to only
-   * accepting `int` values which are accepted by both `equals` and `hashCode`.
-   *
-   * If neither `equals`, `hashCode`, nor `isValidKey` is provided,
-   * the default `isValidKey` instead accepts all values.
-   * The default equality and hashcode operations are assumed to work on all
-   * objects.
-   *
-   * Likewise, if `equals` is [identical], `hashCode` is [identityHashCode]
-   * and `isValidKey` is omitted, the resulting set is identity based,
-   * and the `isValidKey` defaults to accepting all keys.
-   * Such a map can be created directly using [LinkedHashSet.identity].
-   */
-  external factory LinkedHashSet({bool equals(E e1, E e2),
-                                  int hashCode(E e),
-                                  bool isValidKey(Object potentialKey)});
-
-  /**
-   * Creates an insertion-ordered identity-based set.
-   *
-   * Effectively a shorthand for:
-   *
-   *     new LinkedHashSet(equals: identical,
-   *                       hashCode: identityHashCode)
-   */
-  external factory LinkedHashSet.identity();
-
-  /**
-   * Create a linked hash set containing all [elements].
-   *
-   * Creates a linked hash set as by `new LinkedHashSet<E>()` and adds each
-   * element of`elements` to this set in the order they are iterated.
-   *
-   * All the [elements] should be assignable to [E].
-   * The `elements` iterable itself may have any element type,
-   * so this constructor can be used to down-cast a `Set`, for example as:
-   *
-   *     Set<SuperType> superSet = ...;
-   *     Iterable<SuperType> tmp = superSet.where((e) => e is SubType);
-   *     Set<SubType> subSet = new LinkedHashSet<SubType>.from(tmp);
-   */
-  factory LinkedHashSet.from(Iterable elements) {
-    LinkedHashSet<E> result = new LinkedHashSet<E>();
-    for (final element in elements) {
-      E e = element as Object/*=E*/;
-      result.add(e);
-    }
-    return result;
-  }
-
-  /**
-   * Executes a function on each element of the set.
-   *
-   * The elements are iterated in insertion order.
-   */
-  void forEach(void action(E element));
-
-  /**
-   * Provides an iterator that iterates over the elements in insertion order.
-   */
-  Iterator<E> get iterator;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart
deleted file mode 100644
index 481f04d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/linked_list.dart
+++ /dev/null
@@ -1,301 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-
-/**
- * A specialized double-linked list of elements that extends [LinkedListEntry].
- *
- * This is not a generic data structure. It only accepts elements that extend
- * the [LinkedListEntry] class. See the [Queue] implementations for
- * generic collections that allow constant time adding and removing at the ends.
- *
- * This is not a [List] implementation. Despite its name, this class does not
- * implement the [List] interface. It does not allow constant time lookup by
- * index.
- *
- * Because the elements themselves contain the links of this linked list,
- * each element can be in only one list at a time. To add an element to another
- * list, it must first be removed from its current list (if any).
- *
- * In return, each element knows its own place in the linked list, as well as
- * which list it is in. This allows constant time [LinkedListEntry.addAfter],
- * [LinkedListEntry.addBefore] and [LinkedListEntry.unlink] operations
- * when all you have is the element.
- *
- * A `LinkedList` also allows constant time adding and removing at either end,
- * and a constant time length getter.
- */
-class LinkedList<E extends LinkedListEntry<E>>
-    extends Iterable<E> {
-
-  int _modificationCount = 0;
-  int _length = 0;
-  E _first;
-
-  /**
-   * Construct a new empty linked list.
-   */
-  LinkedList();
-
-  /**
-   * Add [entry] to the beginning of the linked list.
-   */
-  void addFirst(E entry) {
-    _insertBefore(_first, entry, updateFirst: true);
-    _first = entry;
-  }
-
-  /**
-   * Add [entry] to the end of the linked list.
-   */
-  void add(E entry) {
-    _insertBefore(_first, entry, updateFirst: false);
-  }
-
-  /**
-   * Add [entries] to the end of the linked list.
-   */
-  void addAll(Iterable<E> entries) {
-    entries.forEach(add);
-  }
-
-  /**
-   * Remove [entry] from the linked list.
-   *
-   * Returns false and does nothing if [entry] is not in this linked list.
-   *
-   * This is equivalent to calling `entry.unlink()` if the entry is in this
-   * list.
-   */
-  bool remove(E entry) {
-    if (entry._list != this) return false;
-    _unlink(entry);  // Unlink will decrement length.
-    return true;
-  }
-
-  Iterator<E> get iterator => new _LinkedListIterator<E>(this);
-
-  int get length => _length;
-
-  /**
-   * Remove all elements from this linked list.
-   */
-  void clear() {
-    _modificationCount++;
-    if (isEmpty) return;
-
-    E next = _first;
-    do {
-      E entry = next;
-      next = entry._next;
-      entry._next = entry._previous = entry._list = null;
-    } while (!identical(next, _first));
-
-    _first = null;
-    _length = 0;
-  }
-
-  E get first {
-    if (isEmpty) {
-      throw new StateError('No such element');
-    }
-    return _first;
-  }
-
-  E get last {
-    if (isEmpty) {
-      throw new StateError('No such element');
-    }
-    return _first._previous;
-  }
-
-  E get single {
-    if (isEmpty) {
-      throw new StateError('No such element');
-    }
-    if (_length > 1) {
-      throw new StateError('Too many elements');
-    }
-    return _first;
-  }
-
-  /**
-   * Call [action] with each entry in this linked list.
-   *
-   * It's an error if [action] modify the linked list.
-   */
-  void forEach(void action(E entry)) {
-    int modificationCount = _modificationCount;
-    if (isEmpty) return;
-
-    E current = _first;
-    do {
-      action(current);
-      if (modificationCount != _modificationCount) {
-        throw new ConcurrentModificationError(this);
-      }
-      current = current._next;
-    } while (!identical(current, _first));
-  }
-
-  bool get isEmpty => _length == 0;
-
-  /// Inserts [newEntry] as last entry of the list.
-  ///
-  /// If [updateFirst] is true and [entry] is the first entry in the list,
-  /// updates the [_first] field to point to the [newEntry] as first entry.
-  void _insertBefore(E entry, E newEntry, {bool updateFirst}) {
-    if (newEntry.list != null) {
-      throw new StateError(
-          'LinkedListEntry is already in a LinkedList');
-    }
-    _modificationCount++;
-
-    newEntry._list = this;
-    if (isEmpty) {
-      assert(entry == null);
-      newEntry._previous = newEntry._next = newEntry;
-      _first = newEntry;
-      _length++;
-      return;
-    }
-    E predecessor = entry._previous;
-    E successor = entry;
-    newEntry._previous = predecessor;
-    newEntry._next = successor;
-    predecessor._next = newEntry;
-    successor._previous = newEntry;
-    if (updateFirst && identical(entry, _first)) {
-      _first = newEntry;
-    }
-    _length++;
-  }
-
-  void _unlink(E entry) {
-    _modificationCount++;
-    entry._next._previous = entry._previous;
-    E next = entry._previous._next = entry._next;
-    _length--;
-    entry._list = entry._next = entry._previous = null;
-    if (isEmpty) {
-      _first = null;
-    } else if (identical(entry, _first)) {
-      _first = next;
-    }
-  }
-}
-
-
-class _LinkedListIterator<E extends LinkedListEntry<E>>
-    implements Iterator<E> {
-  final LinkedList<E> _list;
-  final int _modificationCount;
-  E _current;
-  LinkedListEntry<E> _next;
-  bool _visitedFirst;
-
-  _LinkedListIterator(LinkedList<E> list)
-    : _list = list,
-      _modificationCount = list._modificationCount,
-      _next = list._first,
-      _visitedFirst = false;
-
-  E get current => _current;
-
-  bool moveNext() {
-    if (_modificationCount != _list._modificationCount) {
-      throw new ConcurrentModificationError(this);
-    }
-    if (_list.isEmpty ||
-        (_visitedFirst && identical(_next, _list.first))) {
-      _current = null;
-      return false;
-    }
-    _visitedFirst = true;
-    _current = _next;
-    _next = _next._next;
-    return true;
-  }
-}
-
-
-/**
- * An object that can be an element in a [LinkedList].
- *
- * All elements of a `LinkedList` must extend this class.
- * The class provides the internal links that link elements together
- * in the `LinkedList`, and a reference to the linked list itself
- * that an element is currently part of.
- *
- * An entry can be in at most one linked list at a time.
- * While an entry is in a linked list, the [list] property points to that
- * linked list, and otherwise the `list` property is `null`.
- *
- * When created, an entry is not in any linked list.
- */
-abstract class LinkedListEntry<E extends LinkedListEntry<E>> {
-  LinkedList<E> _list;
-  E _next;
-  E _previous;
-
-  /**
-   * Get the linked list containing this element.
-   *
-   * Returns `null` if this entry is not currently in any list.
-   */
-  LinkedList<E> get list => _list;
-
-  /**
-   * Unlink the element from its linked list.
-   *
-   * The entry must currently be in a linked list when this method is called.
-   */
-  void unlink() {
-    _list._unlink(this);
-  }
-
-  /**
-   * Return the succeessor of this element in its linked list.
-   *
-   * Returns `null` if there is no successor in the linked list, or if this
-   * entry is not currently in any list.
-   */
-  E get next {
-    if (identical(this, _next)) return null;
-    return _next;
-  }
-
-  /**
-   * Return the predecessor of this element in its linked list.
-   *
-   * Returns `null` if there is no predecessor in the linked list, or if this
-   * entry is not currently in any list.
-   */
-  E get previous {
-    if (identical(this, _previous)) return null;
-    return _previous;
-  }
-
-  /**
-   * Insert an element after this element in this element's linked list.
-   *
-   * This entry must be in a linked list when this method is called.
-   * The [entry] must not be in a linked list.
-   */
-  void insertAfter(E entry) {
-    _list._insertBefore(_next, entry, updateFirst: false);
-  }
-
-  /**
-   * Insert an element before this element in this element's linked list.
-   *
-   * This entry must be in a linked list when this method is called.
-   * The [entry] must not be in a linked list.
-   */
-  void insertBefore(E entry) {
-    _list._insertBefore(this as dynamic/*=E*/, entry, updateFirst: true);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/list.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/list.dart
deleted file mode 100644
index f999447..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/list.dart
+++ /dev/null
@@ -1,515 +0,0 @@
-// 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.
-
-part of dart.collection;
-
-/**
- * Abstract implementation of a list.
- *
- * `ListBase` can be used as a base class for implementing the `List` interface.
- *
- * All operations are defined in terms of `length`, `operator[]`,
- * `operator[]=` and `length=`, which need to be implemented.
- *
- * *NOTICE*: Forwarding just these four operations to a normal growable [List]
- * (as created by `new List()`) will give very bad performance for `add` and
- * `addAll` operations of `ListBase`. These operations are implemented by
- * increasing the length of the list by one for each `add` operation, and
- * repeatedly increasing the length of a growable list is not efficient.
- * To avoid this, either override 'add' and 'addAll' to also forward directly
- * to the growable list, or, preferably, use `DelegatingList` from
- * "package:collection/wrappers.dart" instead.
- */
-abstract class ListBase<E> extends Object with ListMixin<E> {
-  /**
-   * Convert a `List` to a string as `[each, element, as, string]`.
-   *
-   * Handles circular references where converting one of the elements
-   * to a string ends up converting [list] to a string again.
-   */
-  static String listToString(List list) =>
-      IterableBase.iterableToFullString(list, '[', ']');
-}
-
-/**
- * Base implementation of a [List] class.
- *
- * `ListMixin` can be used as a mixin to make a class implement
- * the `List` interface.
- *
- * This implements all read operations using only the `length` and
- * `operator[]` members. It implements write operations using those and
- * `length=` and `operator[]=`
- *
- * *NOTICE*: Forwarding just these four operations to a normal growable [List]
- * (as created by `new List()`) will give very bad performance for `add` and
- * `addAll` operations of `ListBase`. These operations are implemented by
- * increasing the length of the list by one for each `add` operation, and
- * repeatedly increasing the length of a growable list is not efficient.
- * To avoid this, either override 'add' and 'addAll' to also forward directly
- * to the growable list, or, if possible, use `DelegatingList` from
- * "package:collection/wrappers.dart" instead.
- */
-abstract class ListMixin<E> implements List<E> {
-  // Iterable interface.
-  Iterator<E> get iterator => new ListIterator<E>(this);
-
-  E elementAt(int index) => this[index];
-
-  void forEach(void action(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      action(this[i]);
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-  }
-
-  bool get isEmpty => length == 0;
-
-  bool get isNotEmpty => !isEmpty;
-
-  E get first {
-    if (length == 0) throw IterableElementError.noElement();
-    return this[0];
-  }
-
-  E get last {
-    if (length == 0) throw IterableElementError.noElement();
-    return this[length - 1];
-  }
-
-  E get single {
-    if (length == 0) throw IterableElementError.noElement();
-    if (length > 1) throw IterableElementError.tooMany();
-    return this[0];
-  }
-
-  bool contains(Object element) {
-    int length = this.length;
-    for (int i = 0; i < this.length; i++) {
-      if (this[i] == element) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  bool every(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (!test(this[i])) return false;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return true;
-  }
-
-  bool any(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (test(this[i])) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  E firstWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      E element = this[i];
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E lastWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = length - 1; i >= 0; i--) {
-      E element = this[i];
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E singleWhere(bool test(E element)) {
-    int length = this.length;
-    E match = null;
-    bool matchFound = false;
-    for (int i = 0; i < length; i++) {
-      E element = this[i];
-      if (test(element)) {
-        if (matchFound) {
-          throw IterableElementError.tooMany();
-        }
-        matchFound = true;
-        match = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (matchFound) return match;
-    throw IterableElementError.noElement();
-  }
-
-  String join([String separator = ""]) {
-    if (length == 0) return "";
-    StringBuffer buffer = new StringBuffer()..writeAll(this, separator);
-    return buffer.toString();
-  }
-
-  Iterable<E> where(bool test(E element)) => new WhereIterable<E>(this, test);
-
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) =>
-      new MappedListIterable/*<E, T>*/(this, f);
-
-  Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) =>
-      new ExpandIterable<E, dynamic/*=T*/>(this, f);
-
-  E reduce(E combine(E previousValue, E element)) {
-    int length = this.length;
-    if (length == 0) throw IterableElementError.noElement();
-    E value = this[0];
-    for (int i = 1; i < length; i++) {
-      value = combine(value, this[i]);
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return value;
-  }
-
-  dynamic/*=T*/ fold/*<T>*/(var/*=T*/ initialValue,
-               dynamic/*=T*/ combine(var/*=T*/ previousValue, E element)) {
-    var value = initialValue;
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      value = combine(value, this[i]);
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return value;
-  }
-
-  Iterable<E> skip(int count) => new SubListIterable<E>(this, count, null);
-
-  Iterable<E> skipWhile(bool test(E element)) {
-    return new SkipWhileIterable<E>(this, test);
-  }
-
-  Iterable<E> take(int count) => new SubListIterable<E>(this, 0, count);
-
-  Iterable<E> takeWhile(bool test(E element)) {
-    return new TakeWhileIterable<E>(this, test);
-  }
-
-  List<E> toList({ bool growable: true }) {
-    List<E> result;
-    if (growable) {
-      result = new List<E>()..length = length;
-    } else {
-      result = new List<E>(length);
-    }
-    for (int i = 0; i < length; i++) {
-      result[i] = this[i];
-    }
-    return result;
-  }
-
-  Set<E> toSet() {
-    Set<E> result = new Set<E>();
-    for (int i = 0; i < length; i++) {
-      result.add(this[i]);
-    }
-    return result;
-  }
-
-  // Collection interface.
-  void add(E element) {
-    this[this.length++] = element;
-  }
-
-  void addAll(Iterable<E> iterable) {
-    int i = this.length;
-    for (E element in iterable) {
-      assert(this.length == i || (throw new ConcurrentModificationError(this)));
-      this.length = i + 1;
-      this[i] = element;
-      i++;
-    }
-  }
-
-  bool remove(Object element) {
-    for (int i = 0; i < this.length; i++) {
-      if (this[i] == element) {
-        this.setRange(i, this.length - 1, this, i + 1);
-        this.length -= 1;
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void removeWhere(bool test(E element)) {
-    _filter(test, false);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _filter(test, true);
-  }
-
-  void _filter(bool test(var element), bool retainMatching) {
-    var source = this;
-    var retained = <E>[];
-    int length = source.length;
-    for (int i = 0; i < length; i++) {
-      var element = source[i];
-      if (test(element) == retainMatching) {
-        retained.add(element);
-      }
-      if (length != source.length) {
-        throw new ConcurrentModificationError(source);
-      }
-    }
-    if (retained.length != source.length) {
-      source.setRange(0, retained.length, retained);
-      source.length = retained.length;
-    }
-  }
-
-  void clear() { this.length = 0; }
-
-  // List interface.
-
-  E removeLast() {
-    if (length == 0) {
-      throw IterableElementError.noElement();
-    }
-    E result = this[length - 1];
-    length--;
-    return result;
-  }
-
-  void sort([int compare(E a, E b)]) {
-    if (compare == null) {
-      Sort.sort(this, (a, b) => Comparable.compare(a, b));
-    } else {
-      Sort.sort(this, compare);
-    }
-  }
-
-  void shuffle([Random random]) {
-    if (random == null) random = new Random();
-    int length = this.length;
-    while (length > 1) {
-      int pos = random.nextInt(length);
-      length -= 1;
-      var tmp = this[length];
-      this[length] = this[pos];
-      this[pos] = tmp;
-    }
-  }
-
-  Map<int, E> asMap() {
-    return new ListMapView<E>(this);
-  }
-
-  List<E> sublist(int start, [int end]) {
-    int listLength = this.length;
-    if (end == null) end = listLength;
-    RangeError.checkValidRange(start, end, listLength);
-    int length = end - start;
-    List<E> result = new List<E>()..length = length;
-    for (int i = 0; i < length; i++) {
-      result[i] = this[start + i];
-    }
-    return result;
-  }
-
-  Iterable<E> getRange(int start, int end) {
-    RangeError.checkValidRange(start, end, this.length);
-    return new SubListIterable<E>(this, start, end);
-  }
-
-  void removeRange(int start, int end) {
-    RangeError.checkValidRange(start, end, this.length);
-    int length = end - start;
-    setRange(start, this.length - length, this, end);
-    this.length -= length;
-  }
-
-  void fillRange(int start, int end, [E fill]) {
-    RangeError.checkValidRange(start, end, this.length);
-    for (int i = start; i < end; i++) {
-      this[i] = fill;
-    }
-  }
-
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    RangeError.checkValidRange(start, end, this.length);
-    int length = end - start;
-    if (length == 0) return;
-    RangeError.checkNotNegative(skipCount, "skipCount");
-
-    List<E> otherList;
-    int otherStart;
-    // TODO(floitsch): Make this accept more.
-    if (iterable is List/*<E>*/) {
-      otherList = iterable;
-      otherStart = skipCount;
-    } else {
-      otherList = iterable.skip(skipCount).toList(growable: false);
-      otherStart = 0;
-    }
-    if (otherStart + length > otherList.length) {
-      throw IterableElementError.tooFew();
-    }
-    if (otherStart < start) {
-      // Copy backwards to ensure correct copy if [from] is this.
-      for (int i = length - 1; i >= 0; i--) {
-        this[start + i] = otherList[otherStart + i];
-      }
-    } else {
-      for (int i = 0; i < length; i++) {
-        this[start + i] = otherList[otherStart + i];
-      }
-    }
-  }
-
-  void replaceRange(int start, int end, Iterable<E> newContents) {
-    RangeError.checkValidRange(start, end, this.length);
-    if (newContents is! EfficientLength) {
-      newContents = newContents.toList();
-    }
-    int removeLength = end - start;
-    int insertLength = newContents.length;
-    if (removeLength >= insertLength) {
-      int delta = removeLength - insertLength;
-      int insertEnd = start + insertLength;
-      int newLength = this.length - delta;
-      this.setRange(start, insertEnd, newContents);
-      if (delta != 0) {
-        this.setRange(insertEnd, newLength, this, end);
-        this.length = newLength;
-      }
-    } else {
-      int delta = insertLength - removeLength;
-      int newLength = this.length + delta;
-      int insertEnd = start + insertLength;  // aka. end + delta.
-      this.length = newLength;
-      this.setRange(insertEnd, newLength, this, end);
-      this.setRange(start, insertEnd, newContents);
-    }
-  }
-
-  int indexOf(Object element, [int startIndex = 0]) {
-    if (startIndex >= this.length) {
-      return -1;
-    }
-    if (startIndex < 0) {
-      startIndex = 0;
-    }
-    for (int i = startIndex; i < this.length; i++) {
-      if (this[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns the last index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to 0.
-   * Returns -1 if [element] is not found.
-   */
-  int lastIndexOf(Object element, [int startIndex]) {
-    if (startIndex == null) {
-      startIndex = this.length - 1;
-    } else {
-      if (startIndex < 0) {
-        return -1;
-      }
-      if (startIndex >= this.length) {
-        startIndex = this.length - 1;
-      }
-    }
-    for (int i = startIndex; i >= 0; i--) {
-      if (this[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  void insert(int index, E element) {
-    RangeError.checkValueInInterval(index, 0, length, "index");
-    if (index == this.length) {
-      add(element);
-      return;
-    }
-    // We are modifying the length just below the is-check. Without the check
-    // Array.copy could throw an exception, leaving the list in a bad state
-    // (with a length that has been increased, but without a new element).
-    if (index is! int) throw new ArgumentError(index);
-    this.length++;
-    setRange(index + 1, this.length, this, index);
-    this[index] = element;
-  }
-
-  E removeAt(int index) {
-    E result = this[index];
-    setRange(index, this.length - 1, this, index + 1);
-    length--;
-    return result;
-  }
-
-  void insertAll(int index, Iterable<E> iterable) {
-    RangeError.checkValueInInterval(index, 0, length, "index");
-    if (iterable is! EfficientLength || identical(iterable, this)) {
-      iterable = iterable.toList();
-    }
-    int insertionLength = iterable.length;
-    // There might be errors after the length change, in which case the list
-    // will end up being modified but the operation not complete. Unless we
-    // always go through a "toList" we can't really avoid that.
-    this.length += insertionLength;
-    if (iterable.length != insertionLength) {
-      // If the iterable's length is linked to this list's length somehow,
-      // we can't insert one in the other.
-      this.length -= insertionLength;
-      throw new ConcurrentModificationError(iterable);
-    }
-    setRange(index + insertionLength, this.length, this, index);
-    setAll(index, iterable);
-  }
-
-  void setAll(int index, Iterable<E> iterable) {
-    if (iterable is List) {
-      setRange(index, index + iterable.length, iterable);
-    } else {
-      for (E element in iterable) {
-        this[index++] = element;
-      }
-    }
-  }
-
-  Iterable<E> get reversed => new ReversedListIterable<E>(this);
-
-  String toString() => IterableBase.iterableToFullString(this, '[', ']');
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/maps.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/maps.dart
deleted file mode 100644
index 7871b87..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/maps.dart
+++ /dev/null
@@ -1,355 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.collection;
-
-/**
- * Base class for implementing a [Map].
- *
- * This class has a basic implementation of all but five of the members of
- * [Map].
- * A basic `Map` class can be implemented by extending this class and
- * implementing `keys`, `operator[]`, `operator[]=`, `remove` and `clear`.
- * The remaining operations are implemented in terms of these five.
- *
- * The `keys` iterable should have efficient [length] and [contains]
- * operations, and it should catch concurrent modifications of the keys
- * while iterating.
- *
- * A more efficient implementation is usually possible by overriding
- * some of the other members as well.
- */
-abstract class MapBase<K, V> = Object with MapMixin<K, V>;
-
-
-/**
- * Mixin implementing a [Map].
- *
- * This mixin has a basic implementation of all but five of the members of
- * [Map].
- * A basic `Map` class can be implemented by mixin in this class and
- * implementing `keys`, `operator[]`, `operator[]=`, `remove` and `clear`.
- * The remaining operations are implemented in terms of these five.
- *
- * The `keys` iterable should have efficient [length] and [contains]
- * operations, and it should catch concurrent modifications of the keys
- * while iterating.
- *
- * A more efficient implementation is usually possible by overriding
- * some of the other members as well.
- */
-abstract class MapMixin<K, V> implements Map<K, V> {
-  Iterable<K> get keys;
-  V operator[](Object key);
-  operator []=(K key, V value);
-  V remove(Object key);
-  // The `clear` operation should not be based on `remove`.
-  // It should clear the map even if some keys are not equal to themselves.
-  void clear();
-
-  void forEach(void action(K key, V value)) {
-    for (K key in keys) {
-      action(key, this[key]);
-    }
-  }
-
-  void addAll(Map<K, V> other) {
-    for (K key in other.keys) {
-      this[key] = other[key];
-    }
-  }
-
-  bool containsValue(Object value) {
-    for (K key in keys) {
-      if (this[key] == value) return true;
-    }
-    return false;
-  }
-
-  V putIfAbsent(K key, V ifAbsent()) {
-    if (containsKey(key)) {
-      return this[key];
-    }
-    return this[key] = ifAbsent();
-  }
-
-  bool containsKey(Object key) => keys.contains(key);
-  int get length => keys.length;
-  bool get isEmpty => keys.isEmpty;
-  bool get isNotEmpty => keys.isNotEmpty;
-  Iterable<V> get values => new _MapBaseValueIterable<K, V>(this);
-  String toString() => Maps.mapToString(this);
-}
-
-/**
- * Basic implementation of an unmodifiable [Map].
- *
- * This class has a basic implementation of all but two of the members of
- * an umodifiable [Map].
- * A simple unmodifiable `Map` class can be implemented by extending this
- * class and implementing `keys` and `operator[]`.
- *
- * Modifying operations throw when used.
- * The remaining non-modifying operations are implemented in terms of `keys`
- * and `operator[]`.
- *
- * The `keys` iterable should have efficient [length] and [contains]
- * operations, and it should catch concurrent modifications of the keys
- * while iterating.
- *
- * A more efficient implementation is usually possible by overriding
- * some of the other members as well.
- */
-abstract class UnmodifiableMapBase<K, V> =
-    MapBase<K, V> with _UnmodifiableMapMixin<K, V>;
-
-/**
- * Implementation of [Map.values] based on the map and its [Map.keys] iterable.
- *
- * Iterable that iterates over the values of a `Map`.
- * It accesses the values by iterating over the keys of the map, and using the
- * map's `operator[]` to lookup the keys.
- */
-class _MapBaseValueIterable<K, V> extends Iterable<V>
-                                  implements EfficientLength {
-  final Map<K, V> _map;
-  _MapBaseValueIterable(this._map);
-
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-  V get first => _map[_map.keys.first];
-  V get single => _map[_map.keys.single];
-  V get last => _map[_map.keys.last];
-
-  Iterator<V> get iterator => new _MapBaseValueIterator<K, V>(_map);
-}
-
-/**
- * Iterator created by [_MapBaseValueIterable].
- *
- * Iterates over the values of a map by iterating its keys and lookup up the
- * values.
- */
-class _MapBaseValueIterator<K, V> implements Iterator<V> {
-  final Iterator<K> _keys;
-  final Map<K, V> _map;
-  V _current = null;
-
-  _MapBaseValueIterator(Map<K, V> map)
-      : _map = map,
-        _keys = map.keys.iterator;
-
-  bool moveNext() {
-    if (_keys.moveNext()) {
-      _current = _map[_keys.current];
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-
-  V get current => _current;
-}
-
-/**
- * Mixin that overrides mutating map operations with implementations that throw.
- */
-abstract class _UnmodifiableMapMixin<K, V> implements Map<K, V> {
-  void operator[]=(K key, V value) {
-    throw new UnsupportedError("Cannot modify unmodifiable map");
-  }
-  void addAll(Map<K, V> other) {
-    throw new UnsupportedError("Cannot modify unmodifiable map");
-  }
-  void clear() {
-    throw new UnsupportedError("Cannot modify unmodifiable map");
-  }
-  V remove(Object key) {
-    throw new UnsupportedError("Cannot modify unmodifiable map");
-  }
-  V putIfAbsent(K key, V ifAbsent()) {
-    throw new UnsupportedError("Cannot modify unmodifiable map");
-  }
-}
-
-/**
- * Wrapper around a class that implements [Map] that only exposes `Map` members.
- *
- * A simple wrapper that delegates all `Map` members to the map provided in the
- * constructor.
- *
- * Base for delegating map implementations like [UnmodifiableMapView].
- */
-class MapView<K, V> implements Map<K, V> {
-  final Map<K, V> _map;
-  const MapView(Map<K, V> map) : _map = map;
-
-  V operator[](Object key) => _map[key];
-  void operator[]=(K key, V value) { _map[key] = value; }
-  void addAll(Map<K, V> other) { _map.addAll(other); }
-  void clear() { _map.clear(); }
-  V putIfAbsent(K key, V ifAbsent()) => _map.putIfAbsent(key, ifAbsent);
-  bool containsKey(Object key) => _map.containsKey(key);
-  bool containsValue(Object value) => _map.containsValue(value);
-  void forEach(void action(K key, V value)) { _map.forEach(action); }
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-  int get length => _map.length;
-  Iterable<K> get keys => _map.keys;
-  V remove(Object key) => _map.remove(key);
-  String toString() => _map.toString();
-  Iterable<V> get values => _map.values;
-}
-
-/**
- * View of a [Map] that disallow modifying the map.
- *
- * A wrapper around a `Map` that forwards all members to the map provided in
- * the constructor, except for operations that modify the map.
- * Modifying operations throw instead.
- */
-class UnmodifiableMapView<K, V> =
-    MapView<K, V> with _UnmodifiableMapMixin<K, V>;
-
-/**
- * Helper class which implements complex [Map] operations
- * in term of basic ones ([Map.keys], [Map.operator []],
- * [Map.operator []=] and [Map.remove].)  Not all methods are
- * necessary to implement each particular operation.
- */
-class Maps {
-  static bool containsValue(Map map, Object value) {
-    for (final v in map.values) {
-      if (v == value) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static bool containsKey(Map map, Object key) {
-    for (final k in map.keys) {
-      if (k == key) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  static putIfAbsent(Map map, key, ifAbsent()) {
-    if (map.containsKey(key)) {
-      return map[key];
-    }
-    final v = ifAbsent();
-    map[key] = v;
-    return v;
-  }
-
-  static clear(Map map) {
-    for (final k in map.keys.toList()) {
-      map.remove(k);
-    }
-  }
-
-  static forEach(Map map, void f(key, value)) {
-    for (final k in map.keys) {
-      f(k, map[k]);
-    }
-  }
-
-  static Iterable getValues(Map map) {
-    return map.keys.map((key) => map[key]);
-  }
-
-  static int length(Map map) => map.keys.length;
-
-  static bool isEmpty(Map map) => map.keys.isEmpty;
-
-  static bool isNotEmpty(Map map) => map.keys.isNotEmpty;
-
-  /**
-   * Returns a string representing the specified map. The returned string
-   * looks like this: [:'{key0: value0, key1: value1, ... keyN: valueN}':].
-   * The value returned by its [toString] method is used to represent each
-   * key or value.
-   *
-   * If the map collection contains a reference to itself, either
-   * directly as a key or value, or indirectly through other collections
-   * or maps, the contained reference is rendered as [:'{...}':]. This
-   * prevents the infinite regress that would otherwise occur. So, for example,
-   * calling this method on a map whose sole entry maps the string key 'me'
-   * to a reference to the map would return [:'{me: {...}}':].
-   *
-   * A typical implementation of a map's [toString] method will
-   * simply return the results of this method applied to the collection.
-   */
-  static String mapToString(Map m) {
-    // Reuse the list in IterableBase for detecting toString cycles.
-    if (_isToStringVisiting(m)) { return '{...}'; }
-
-    var result = new StringBuffer();
-    try {
-      _toStringVisiting.add(m);
-      result.write('{');
-      bool first = true;
-      m.forEach((k, v) {
-        if(!first) {
-          result.write(', ');
-        }
-        first = false;
-        result.write(k);
-        result.write(': ');
-        result.write(v);
-      });
-      result.write('}');
-    } finally {
-      assert(identical(_toStringVisiting.last, m));
-      _toStringVisiting.removeLast();
-    }
-
-    return result.toString();
-  }
-
-  static _id(x) => x;
-
-  /**
-   * Fills a map with key/value pairs computed from [iterable].
-   *
-   * This method is used by Map classes in the named constructor fromIterable.
-   */
-  static void _fillMapWithMappedIterable(Map map, Iterable iterable,
-                                         key(element), value(element)) {
-    if (key == null) key = _id;
-    if (value == null) value = _id;
-
-    for (var element in iterable) {
-      map[key(element)] = value(element);
-    }
-  }
-
-  /**
-   * Fills a map by associating the [keys] to [values].
-   *
-   * This method is used by Map classes in the named constructor fromIterables.
-   */
-  static void _fillMapWithIterables(Map map, Iterable keys,
-                                    Iterable values) {
-    Iterator keyIterator = keys.iterator;
-    Iterator valueIterator = values.iterator;
-
-    bool hasNextKey = keyIterator.moveNext();
-    bool hasNextValue = valueIterator.moveNext();
-
-    while (hasNextKey && hasNextValue) {
-      map[keyIterator.current] = valueIterator.current;
-      hasNextKey = keyIterator.moveNext();
-      hasNextValue = valueIterator.moveNext();
-    }
-
-    if (hasNextKey || hasNextValue) {
-      throw new ArgumentError("Iterables do not have same length.");
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/queue.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/queue.dart
deleted file mode 100644
index db7160d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/queue.dart
+++ /dev/null
@@ -1,842 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.collection;
-
-/**
- * A [Queue] is a collection that can be manipulated at both ends. One
- * can iterate over the elements of a queue through [forEach] or with
- * an [Iterator].
- *
- * It is generally not allowed to modify the queue (add or remove entries) while
- * an operation on the queue is being performed, for example during a call to
- * [forEach].
- * Modifying the queue while it is being iterated will most likely break the
- * iteration.
- * This goes both for using the [iterator] directly, or for iterating an
- * `Iterable` returned by a method like [map] or [where].
- */
-abstract class Queue<E> implements Iterable<E>, EfficientLength {
-
-  /**
-   * Creates a queue.
-   */
-  factory Queue() = ListQueue<E>;
-
-  /**
-   * Creates a queue containing all [elements].
-   *
-   * The element order in the queue is as if the elements were added using
-   * [addLast] in the order provided by [elements.iterator].
-   */
-  factory Queue.from(Iterable elements) = ListQueue<E>.from;
-
-  /**
-   * Removes and returns the first element of this queue.
-   *
-   * The queue must not be empty when this method is called.
-   */
-  E removeFirst();
-
-  /**
-   * Removes and returns the last element of the queue.
-   *
-   * The queue must not be empty when this method is called.
-   */
-  E removeLast();
-
-  /**
-   * Adds [value] at the beginning of the queue.
-   */
-  void addFirst(E value);
-
-  /**
-   * Adds [value] at the end of the queue.
-   */
-  void addLast(E value);
-
-  /**
-   * Adds [value] at the end of the queue.
-   */
-  void add(E value);
-
-  /**
-   * Remove a single instance of [value] from the queue.
-   *
-   * Returns `true` if a value was removed, or `false` if the queue
-   * contained no element equal to [value].
-   */
-  bool remove(Object value);
-
-  /**
-   * Adds all elements of [iterable] at the end of the queue. The
-   * length of the queue is extended by the length of [iterable].
-   */
-  void addAll(Iterable<E> iterable);
-
-  /**
-   * Removes all elements matched by [test] from the queue.
-   *
-   * The `test` function must not throw or modify the queue.
-   */
-  void removeWhere(bool test(E element));
-
-  /**
-   * Removes all elements not matched by [test] from the queue.
-   *
-   * The `test` function must not throw or modify the queue.
-   */
-  void retainWhere(bool test(E element));
-
-  /**
-   * Removes all elements in the queue. The size of the queue becomes zero.
-   */
-  void clear();
-}
-
-
-class _DoubleLink<E extends _DoubleLink> {
-  E _previousLink;
-  E _nextLink;
-
-  void _link(E previous, E next) {
-    _nextLink = next;
-    _previousLink = previous;
-    if (previous != null) previous._nextLink = this;
-    if (next != null) next._previousLink = this;
-  }
-
-  void _unlink() {
-    if (_previousLink != null) _previousLink._nextLink = _nextLink;
-    if (_nextLink != null) _nextLink._previousLink = _previousLink;
-    _nextLink = null;
-    _previousLink = null;
-  }
-}
-
-/**
- * An entry in a doubly linked list. It contains a pointer to the next
- * entry, the previous entry, and the boxed element.
- */
-abstract class DoubleLinkedQueueEntry<E> {
-  factory DoubleLinkedQueueEntry(E element) = _UserDoubleLinkedQueueEntry<E>;
-
-  /// The element in the queue.
-  E get element;
-
-  /// Appends the given [e] as entry just after this entry.
-  void append(E e);
-
-  /// Prepends the given [e] as entry just before this entry.
-  void prepend(E e);
-
-  /// Returns the previous entry or `null` if there is none.
-  DoubleLinkedQueueEntry<E> previousEntry();
-
-  /// Returns the next entry or `null` if there is none.
-  DoubleLinkedQueueEntry<E> nextEntry();
-}
-
-/// Default implementation of a doubly linked queue entry.
-///
-/// This implementation is only used if a user instantiates a
-/// [DoubleLinkedQueueEntry] directly. The internal implementations don't use
-/// this class.
-class _UserDoubleLinkedQueueEntry<E>
-    extends _DoubleLink<_UserDoubleLinkedQueueEntry<E>>
-    implements DoubleLinkedQueueEntry<E> {
-  E element;
-
-  _UserDoubleLinkedQueueEntry(this.element);
-
-  void append(E e) {
-    new _UserDoubleLinkedQueueEntry<E>(e)._link(this, _nextLink);
-  }
-
-  void prepend(E e) {
-    new _UserDoubleLinkedQueueEntry<E>(e)._link(_previousLink, this);
-  }
-
-  E remove() {
-    _unlink();
-    return element;
-  }
-
-  DoubleLinkedQueueEntry<E> previousEntry() => _previousLink;
-
-  DoubleLinkedQueueEntry<E> nextEntry() => _nextLink;
-}
-
-/**
- * Interface for the link classes used by [DoubleLinkedQueue].
- *
- * Both the [_DoubleLinkedQueueElement] and [_DoubleLinkedQueueSentinel]
- * implement this interface.
- * The entry contains a link back to the queue, so calling `append`
- * or `prepend` can correctly update the element count.
- */
-abstract class _DoubleLinkedQueueEntry<E>
-    extends _DoubleLink<_DoubleLinkedQueueEntry<E>> {
-  DoubleLinkedQueue<E> _queue;
-  _DoubleLinkedQueueEntry(this._queue);
-
-  DoubleLinkedQueueEntry<E> _asNonSentinelEntry();
-
-  void _append(E e) {
-    new _DoubleLinkedQueueElement<E>(e, _queue)._link(this, _nextLink);
-  }
-
-  void _prepend(E e) {
-    new _DoubleLinkedQueueElement<E>(e, _queue)._link(_previousLink, this);
-  }
-
-  E _remove();
-
-  E get element;
-
-  DoubleLinkedQueueEntry<E> nextEntry() {
-    return _nextLink._asNonSentinelEntry();
-  }
-
-  DoubleLinkedQueueEntry<E> previousEntry() {
-    return _previousLink._asNonSentinelEntry();
-  }
-}
-
-/**
- * The actual entry type used by the [DoubleLinkedQueue].
- *
- * The entry contains a reference to the queue, allowing
- * [append]/[prepend] to update the list length.
- */
-class _DoubleLinkedQueueElement<E> extends _DoubleLinkedQueueEntry<E>
-                                   implements DoubleLinkedQueueEntry<E> {
-  E element;
-  _DoubleLinkedQueueElement(this.element, DoubleLinkedQueue<E> queue)
-      : super(queue);
-
-  void append(E e) {
-    _append(e);
-    if (_queue != null) _queue._elementCount++;
-  }
-
-  void prepend(E e) {
-    _prepend(e);
-    if (_queue != null) _queue._elementCount++;
-  }
-
-  E _remove() {
-    _queue = null;
-    _unlink();
-    return element;
-  }
-
-  E remove() {
-    if (_queue != null) _queue._elementCount--;
-    return _remove();
-  }
-
-  _DoubleLinkedQueueElement<E> _asNonSentinelEntry() {
-    return this;
-  }
-}
-
-/**
- * A sentinel in a double linked list is used to manipulate the list
- * at both ends.
- * A double linked list has exactly one sentinel,
- * which is the only entry when the list is constructed.
- * Initially, a sentinel has its next and previous entry point to itself.
- * A sentinel does not box any user element.
- */
-class _DoubleLinkedQueueSentinel<E> extends _DoubleLinkedQueueEntry<E> {
-  _DoubleLinkedQueueSentinel(DoubleLinkedQueue<E> queue) : super(queue) {
-    _previousLink = this;
-    _nextLink = this;
-  }
-
-  DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
-    return null;
-  }
-
-  /** Hit by, e.g., [DoubleLinkedQueue.removeFirst] if the queue is empty. */
-  E _remove() {
-    throw IterableElementError.noElement();
-  }
-
-  /** Hit by, e.g., [DoubleLinkedQueue.first] if the queue is empty. */
-  E get element {
-    throw IterableElementError.noElement();
-  }
-}
-
-/**
- * A [Queue] implementation based on a double-linked list.
- *
- * Allows constant time add, remove-at-ends and peek operations.
- */
-class DoubleLinkedQueue<E> extends Iterable<E> implements Queue<E> {
-  _DoubleLinkedQueueSentinel<E> _sentinel;
-  int _elementCount = 0;
-
-  DoubleLinkedQueue() {
-    _sentinel = new _DoubleLinkedQueueSentinel<E>(this);
-  }
-
-  /**
-   * Creates a double-linked queue containing all [elements].
-   *
-   * The element order in the queue is as if the elements were added using
-   * [addLast] in the order provided by [elements.iterator].
-   */
-  factory DoubleLinkedQueue.from(Iterable elements) {
-    Queue<E> list = new DoubleLinkedQueue<E>();
-    for (final e in elements) {
-      E element = e as Object/*=E*/;
-      list.addLast(element);
-    }
-    return list;
-  }
-
-  int get length => _elementCount;
-
-  void addLast(E value) {
-    _sentinel._prepend(value);
-    _elementCount++;
-  }
-
-  void addFirst(E value) {
-    _sentinel._append(value);
-    _elementCount++;
-  }
-
-  void add(E value) {
-    _sentinel._prepend(value);
-    _elementCount++;
-  }
-
-  void addAll(Iterable<E> iterable) {
-    for (final E value in iterable) {
-      _sentinel._prepend(value);
-      _elementCount++;
-    }
-  }
-
-  E removeLast() {
-    _DoubleLinkedQueueEntry<E> lastEntry = _sentinel._previousLink;
-    E result = lastEntry._remove();
-    _elementCount--;
-    return result;
-  }
-
-  E removeFirst() {
-    _DoubleLinkedQueueEntry<E> firstEntry = _sentinel._nextLink;
-    E result = firstEntry._remove();
-    _elementCount--;
-    return result;
-  }
-
-  bool remove(Object o) {
-    _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
-    while (!identical(entry, _sentinel)) {
-      if (entry.element == o) {
-        entry._remove();
-        _elementCount--;
-        return true;
-      }
-      entry = entry._nextLink;
-    }
-    return false;
-  }
-
-  void _filter(bool test(E element), bool removeMatching) {
-    _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
-    while (!identical(entry, _sentinel)) {
-      _DoubleLinkedQueueEntry<E> next = entry._nextLink;
-      if (identical(removeMatching, test(entry.element))) {
-        entry._remove();
-        _elementCount--;
-      }
-      entry = next;
-    }
-  }
-
-  void removeWhere(bool test(E element)) {
-    _filter(test, true);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _filter(test, false);
-  }
-
-  E get first {
-    _DoubleLinkedQueueEntry<E> firstEntry = _sentinel._nextLink;
-    return firstEntry.element;
-  }
-
-  E get last {
-    _DoubleLinkedQueueEntry<E> lastEntry = _sentinel._previousLink;
-    return lastEntry.element;
-  }
-
-  E get single {
-    // Note that this throws correctly if the queue is empty
-    // because reading element on the sentinel throws.
-    if (identical(_sentinel._nextLink, _sentinel._previousLink)) {
-      _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
-      return entry.element;
-    }
-    throw IterableElementError.tooMany();
-  }
-
-  DoubleLinkedQueueEntry<E> lastEntry() {
-    return _sentinel.previousEntry();
-  }
-
-  DoubleLinkedQueueEntry<E> firstEntry() {
-    return _sentinel.nextEntry();
-  }
-
-  bool get isEmpty {
-    return (identical(_sentinel._nextLink, _sentinel));
-  }
-
-  void clear() {
-    _sentinel._nextLink = _sentinel;
-    _sentinel._previousLink = _sentinel;
-    _elementCount = 0;
-  }
-
-  void forEachEntry(void f(DoubleLinkedQueueEntry<E> element)) {
-    _DoubleLinkedQueueEntry<E> entry = _sentinel._nextLink;
-    while (!identical(entry, _sentinel)) {
-      _DoubleLinkedQueueEntry<E> nextEntry = entry._nextLink;
-      _DoubleLinkedQueueElement<E> element = entry;
-      f(element);
-      entry = nextEntry;
-    }
-  }
-
-  _DoubleLinkedQueueIterator<E> get iterator {
-    return new _DoubleLinkedQueueIterator<E>(_sentinel);
-  }
-
-  String toString() => IterableBase.iterableToFullString(this, '{', '}');
-}
-
-class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
-  _DoubleLinkedQueueSentinel<E> _sentinel;
-  _DoubleLinkedQueueEntry<E> _nextEntry = null;
-  E _current;
-
-  _DoubleLinkedQueueIterator(_DoubleLinkedQueueSentinel<E> sentinel)
-      : _sentinel = sentinel,
-        _nextEntry = sentinel._nextLink;
-
-  bool moveNext() {
-    if (identical(_nextEntry, _sentinel)) {
-      _current = null;
-      _nextEntry = null;
-      _sentinel = null;
-      return false;
-    }
-    _DoubleLinkedQueueElement<E> elementEntry = _nextEntry;
-    if (elementEntry._queue == null) {
-      throw new ConcurrentModificationError(_sentinel._queue);
-    }
-    _current = elementEntry.element;
-    _nextEntry = elementEntry._nextLink;
-    return true;
-  }
-
-  E get current => _current;
-}
-
-/**
- * List based [Queue].
- *
- * Keeps a cyclic buffer of elements, and grows to a larger buffer when
- * it fills up. This guarantees constant time peek and remove operations, and
- * amortized constant time add operations.
- *
- * The structure is efficient for any queue or stack usage.
- */
-class ListQueue<E> extends Iterable<E> implements Queue<E> {
-  static const int _INITIAL_CAPACITY = 8;
-  List<E> _table;
-  int _head;
-  int _tail;
-  int _modificationCount = 0;
-
-  /**
-   * Create an empty queue.
-   *
-   * If [initialCapacity] is given, prepare the queue for at least that many
-   * elements.
-   */
-  ListQueue([int initialCapacity]) : _head = 0, _tail = 0 {
-    if (initialCapacity == null || initialCapacity < _INITIAL_CAPACITY) {
-      initialCapacity = _INITIAL_CAPACITY;
-    } else if (!_isPowerOf2(initialCapacity)) {
-      initialCapacity = _nextPowerOf2(initialCapacity);
-    }
-    assert(_isPowerOf2(initialCapacity));
-    _table = new List<E>(initialCapacity);
-  }
-
-  /**
-   * Create a `ListQueue` containing all [elements].
-   *
-   * The elements are added to the queue, as by [addLast], in the order given by
-   * `elements.iterator`.
-   *
-   * All `elements` should be assignable to [E].
-   */
-  factory ListQueue.from(Iterable elements) {
-    if (elements is List) {
-      int length = elements.length;
-      ListQueue<E> queue = new ListQueue(length + 1);
-      assert(queue._table.length > length);
-      for (int i = 0; i < length; i++) {
-        queue._table[i] = elements[i] as Object/*=E*/;
-      }
-      queue._tail = length;
-      return queue;
-    } else {
-      int capacity = _INITIAL_CAPACITY;
-      if (elements is EfficientLength) {
-        capacity = elements.length;
-      }
-      ListQueue<E> result = new ListQueue<E>(capacity);
-      for (final element in elements) {
-        result.addLast(element as Object/*=E*/);
-      }
-      return result;
-    }
-  }
-
-  // Iterable interface.
-
-  Iterator<E> get iterator => new _ListQueueIterator<E>(this);
-
-  void forEach(void action (E element)) {
-    int modificationCount = _modificationCount;
-    for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) {
-      action(_table[i]);
-      _checkModification(modificationCount);
-    }
-  }
-
-  bool get isEmpty => _head == _tail;
-
-  int get length => (_tail - _head) & (_table.length - 1);
-
-  E get first {
-    if (_head == _tail) throw IterableElementError.noElement();
-    return _table[_head];
-  }
-
-  E get last {
-    if (_head == _tail) throw IterableElementError.noElement();
-    return _table[(_tail - 1) & (_table.length - 1)];
-  }
-
-  E get single {
-    if (_head == _tail) throw IterableElementError.noElement();
-    if (length > 1) throw IterableElementError.tooMany();
-    return _table[_head];
-  }
-
-  E elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return _table[(_head + index) & (_table.length - 1)];
-  }
-
-  List<E> toList({ bool growable: true }) {
-    List<E> list;
-    if (growable) {
-      list = new List<E>()..length = length;
-    } else {
-      list = new List<E>(length);
-    }
-    _writeToList(list);
-    return list;
-  }
-
-  // Collection interface.
-
-  void add(E value) {
-    _add(value);
-  }
-
-  void addAll(Iterable<E> elements) {
-    if (elements is List/*<E>*/) {
-      List<E> list = elements;
-      int addCount = list.length;
-      int length = this.length;
-      if (length + addCount >= _table.length) {
-        _preGrow(length + addCount);
-        // After preGrow, all elements are at the start of the list.
-        _table.setRange(length, length + addCount, list, 0);
-        _tail += addCount;
-      } else {
-        // Adding addCount elements won't reach _head.
-        int endSpace = _table.length - _tail;
-        if (addCount < endSpace) {
-          _table.setRange(_tail, _tail + addCount, list, 0);
-          _tail += addCount;
-        } else {
-          int preSpace = addCount - endSpace;
-          _table.setRange(_tail, _tail + endSpace, list, 0);
-          _table.setRange(0, preSpace, list, endSpace);
-          _tail = preSpace;
-        }
-      }
-      _modificationCount++;
-    } else {
-      for (E element in elements) _add(element);
-    }
-  }
-
-  bool remove(Object value) {
-    for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) {
-      E element = _table[i];
-      if (element == value) {
-        _remove(i);
-        _modificationCount++;
-        return true;
-      }
-    }
-    return false;
-  }
-
-  void _filterWhere(bool test(E element), bool removeMatching) {
-    int modificationCount = _modificationCount;
-    int i = _head;
-    while (i != _tail) {
-      E element = _table[i];
-      bool remove = identical(removeMatching, test(element));
-      _checkModification(modificationCount);
-      if (remove) {
-        i = _remove(i);
-        modificationCount = ++_modificationCount;
-      } else {
-        i = (i + 1) & (_table.length - 1);
-      }
-    }
-  }
-
-  /**
-   * Remove all elements matched by [test].
-   *
-   * This method is inefficient since it works by repeatedly removing single
-   * elements, each of which can take linear time.
-   */
-  void removeWhere(bool test(E element)) {
-    _filterWhere(test, true);
-  }
-
-  /**
-   * Remove all elements not matched by [test].
-   *
-   * This method is inefficient since it works by repeatedly removing single
-   * elements, each of which can take linear time.
-   */
-  void retainWhere(bool test(E element)) {
-    _filterWhere(test, false);
-  }
-
-  void clear() {
-    if (_head != _tail) {
-      for (int i = _head; i != _tail; i = (i + 1) & (_table.length - 1)) {
-        _table[i] = null;
-      }
-      _head = _tail = 0;
-      _modificationCount++;
-    }
-  }
-
-  String toString() => IterableBase.iterableToFullString(this, "{", "}");
-
-  // Queue interface.
-
-  void addLast(E value) { _add(value); }
-
-  void addFirst(E value) {
-    _head = (_head - 1) & (_table.length - 1);
-    _table[_head] = value;
-    if (_head == _tail) _grow();
-    _modificationCount++;
-  }
-
-  E removeFirst() {
-    if (_head == _tail) throw IterableElementError.noElement();
-    _modificationCount++;
-    E result = _table[_head];
-    _table[_head] = null;
-    _head = (_head + 1) & (_table.length - 1);
-    return result;
-  }
-
-  E removeLast() {
-    if (_head == _tail) throw IterableElementError.noElement();
-    _modificationCount++;
-    _tail = (_tail - 1) & (_table.length - 1);
-    E result = _table[_tail];
-    _table[_tail] = null;
-    return result;
-  }
-
-  // Internal helper functions.
-
-  /**
-   * Whether [number] is a power of two.
-   *
-   * Only works for positive numbers.
-   */
-  static bool _isPowerOf2(int number) => (number & (number - 1)) == 0;
-
-  /**
-   * Rounds [number] up to the nearest power of 2.
-   *
-   * If [number] is a power of 2 already, it is returned.
-   *
-   * Only works for positive numbers.
-   */
-  static int _nextPowerOf2(int number) {
-    assert(number > 0);
-    number = (number << 1) - 1;
-    for(;;) {
-      int nextNumber = number & (number - 1);
-      if (nextNumber == 0) return number;
-      number = nextNumber;
-    }
-  }
-
-  /** Check if the queue has been modified during iteration. */
-  void _checkModification(int expectedModificationCount) {
-    if (expectedModificationCount != _modificationCount) {
-      throw new ConcurrentModificationError(this);
-    }
-  }
-
-  /** Adds element at end of queue. Used by both [add] and [addAll]. */
-  void _add(E element) {
-    _table[_tail] = element;
-    _tail = (_tail + 1) & (_table.length - 1);
-    if (_head == _tail) _grow();
-    _modificationCount++;
-  }
-
-  /**
-   * Removes the element at [offset] into [_table].
-   *
-   * Removal is performed by linerarly moving elements either before or after
-   * [offset] by one position.
-   *
-   * Returns the new offset of the following element. This may be the same
-   * offset or the following offset depending on how elements are moved
-   * to fill the hole.
-   */
-  int _remove(int offset) {
-    int mask = _table.length - 1;
-    int startDistance = (offset - _head) & mask;
-    int endDistance = (_tail - offset) & mask;
-    if (startDistance < endDistance) {
-      // Closest to start.
-      int i = offset;
-      while (i != _head) {
-        int prevOffset = (i - 1) & mask;
-        _table[i] = _table[prevOffset];
-        i = prevOffset;
-      }
-      _table[_head] = null;
-      _head = (_head + 1) & mask;
-      return (offset + 1) & mask;
-    } else {
-      _tail = (_tail - 1) & mask;
-      int i = offset;
-      while (i != _tail) {
-        int nextOffset = (i + 1) & mask;
-        _table[i] = _table[nextOffset];
-        i = nextOffset;
-      }
-      _table[_tail] = null;
-      return offset;
-    }
-  }
-
-  /**
-   * Grow the table when full.
-   */
-  void _grow() {
-    List<E> newTable = new List<E>(_table.length * 2);
-    int split = _table.length - _head;
-    newTable.setRange(0, split, _table, _head);
-    newTable.setRange(split, split + _head, _table, 0);
-    _head = 0;
-    _tail = _table.length;
-    _table = newTable;
-  }
-
-  int _writeToList(List<E> target) {
-    assert(target.length >= length);
-    if (_head <= _tail) {
-      int length = _tail - _head;
-      target.setRange(0, length, _table, _head);
-      return length;
-    } else {
-      int firstPartSize = _table.length - _head;
-      target.setRange(0, firstPartSize, _table, _head);
-      target.setRange(firstPartSize, firstPartSize + _tail, _table, 0);
-      return _tail + firstPartSize;
-    }
-  }
-
-  /** Grows the table even if it is not full. */
-  void _preGrow(int newElementCount) {
-    assert(newElementCount >= length);
-
-    // Add some extra room to ensure that there's room for more elements after
-    // expansion.
-    newElementCount += newElementCount >> 1;
-    int newCapacity = _nextPowerOf2(newElementCount);
-    List<E> newTable = new List<E>(newCapacity);
-    _tail = _writeToList(newTable);
-    _table = newTable;
-    _head = 0;
-  }
-}
-
-/**
- * Iterator for a [ListQueue].
- *
- * Considers any add or remove operation a concurrent modification.
- */
-class _ListQueueIterator<E> implements Iterator<E> {
-  final ListQueue<E> _queue;
-  final int _end;
-  final int _modificationCount;
-  int _position;
-  E _current;
-
-  _ListQueueIterator(ListQueue<E> queue)
-      : _queue = queue,
-        _end = queue._tail,
-        _modificationCount = queue._modificationCount,
-        _position = queue._head;
-
-  E get current => _current;
-
-  bool moveNext() {
-    _queue._checkModification(_modificationCount);
-    if (_position == _end) {
-      _current = null;
-      return false;
-    }
-    _current = _queue._table[_position];
-    _position = (_position + 1) & (_queue._table.length - 1);
-    return true;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/set.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/set.dart
deleted file mode 100644
index 499225d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/set.dart
+++ /dev/null
@@ -1,311 +0,0 @@
-// 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.
-
-/**
- * Base implementations of [Set].
- */
-part of dart.collection;
-
-/**
- * Mixin implementation of [Set].
- *
- * This class provides a base implementation of a `Set` that depends only
- * on the abstract members: [add], [contains], [lookup], [remove],
- * [iterator], [length] and [toSet].
- *
- * Some of the methods assume that `toSet` creates a modifiable set.
- * If using this mixin for an unmodifiable set,
- * where `toSet` should return an unmodifiable set,
- * it's necessary to reimplement
- * [retainAll], [union], [intersection] and [difference].
- *
- * Implementations of `Set` using this mixin should consider also implementing
- * `clear` in constant time. The default implementation works by removing every
- * element.
- */
-abstract class SetMixin<E> implements Set<E> {
-  // This class reimplements all of [IterableMixin].
-  // If/when Dart mixins get more powerful, we should just create a single
-  // Mixin class from IterableMixin and the new methods of thisclass.
-
-  bool add(E element);
-
-  bool contains(Object element);
-
-  E lookup(Object element);
-
-  bool remove(Object element);
-
-  Iterator<E> get iterator;
-
-  Set<E> toSet();
-
-  int get length;
-
-  bool get isEmpty => length == 0;
-
-  bool get isNotEmpty => length != 0;
-
-  void clear() {
-    removeAll(toList());
-  }
-
-  void addAll(Iterable<E> elements) {
-    for (E element in elements) add(element);
-  }
-
-  void removeAll(Iterable<Object> elements) {
-    for (Object element in elements) remove(element);
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    // Create a copy of the set, remove all of elements from the copy,
-    // then remove all remaining elements in copy from this.
-    Set<E> toRemove = toSet();
-    for (Object o in elements) {
-      toRemove.remove(o);
-    }
-    removeAll(toRemove);
-  }
-
-  void removeWhere(bool test(E element)) {
-    List toRemove = [];
-    for (E element in this) {
-      if (test(element)) toRemove.add(element);
-    }
-    removeAll(toRemove);
-  }
-
-  void retainWhere(bool test(E element)) {
-    List toRemove = [];
-    for (E element in this) {
-      if (!test(element)) toRemove.add(element);
-    }
-    removeAll(toRemove);
-  }
-
-  bool containsAll(Iterable<Object> other) {
-    for (Object o in other) {
-      if (!contains(o)) return false;
-    }
-    return true;
-  }
-
-  Set<E> union(Set<E> other) {
-    return toSet()..addAll(other);
-  }
-
-  Set<E> intersection(Set<Object> other) {
-    Set<E> result = toSet();
-    for (E element in this) {
-      if (!other.contains(element)) result.remove(element);
-    }
-    return result;
-  }
-
-  Set<E> difference(Set<Object> other) {
-    Set<E> result = toSet();
-    for (E element in this) {
-      if (other.contains(element)) result.remove(element);
-    }
-    return result;
-  }
-
-  List<E> toList({bool growable: true}) {
-    List<E> result = growable ? (new List<E>()..length = length)
-                              : new List<E>(length);
-    int i = 0;
-    for (E element in this) result[i++] = element;
-    return result;
-  }
-
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/f(E element)) =>
-      new EfficientLengthMappedIterable<E, dynamic/*=T*/>(this, f);
-
-  E get single {
-    if (length > 1) throw IterableElementError.tooMany();
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) throw IterableElementError.noElement();
-    E result = it.current;
-    return result;
-  }
-
-  String toString() => IterableBase.iterableToFullString(this, '{', '}');
-
-  // Copied from IterableMixin.
-  // Should be inherited if we had multi-level mixins.
-
-  Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
-
-  Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) =>
-      new ExpandIterable<E, dynamic/*=T*/>(this, f);
-
-  void forEach(void f(E element)) {
-    for (E element in this) f(element);
-  }
-
-  E reduce(E combine(E value, E element)) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E value = iterator.current;
-    while (iterator.moveNext()) {
-      value = combine(value, iterator.current);
-    }
-    return value;
-  }
-
-  dynamic/*=T*/ fold/*<T>*/(var/*=T*/ initialValue,
-      dynamic/*=T*/ combine(var/*=T*/ previousValue, E element)) {
-    var value = initialValue;
-    for (E element in this) value = combine(value, element);
-    return value;
-  }
-
-  bool every(bool f(E element)) {
-    for (E element in this) {
-      if (!f(element)) return false;
-    }
-    return true;
-  }
-
-  String join([String separator = ""]) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) return "";
-    StringBuffer buffer = new StringBuffer();
-    if (separator == null || separator == "") {
-      do {
-        buffer.write("${iterator.current}");
-      } while (iterator.moveNext());
-    } else {
-      buffer.write("${iterator.current}");
-      while (iterator.moveNext()) {
-        buffer.write(separator);
-        buffer.write("${iterator.current}");
-      }
-    }
-    return buffer.toString();
-  }
-
-  bool any(bool test(E element)) {
-    for (E element in this) {
-      if (test(element)) return true;
-    }
-    return false;
-  }
-
-  Iterable<E> take(int n) {
-    return new TakeIterable<E>(this, n);
-  }
-
-  Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
-  }
-
-  Iterable<E> skip(int n) {
-    return new SkipIterable<E>(this, n);
-  }
-
-  Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
-  }
-
-  E get first {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    return it.current;
-  }
-
-  E get last {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E result;
-    do {
-      result = it.current;
-    } while(it.moveNext());
-    return result;
-  }
-
-  E firstWhere(bool test(E value), { E orElse() }) {
-    for (E element in this) {
-      if (test(element)) return element;
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E lastWhere(bool test(E value), { E orElse() }) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E singleWhere(bool test(E value)) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        if (foundMatching) {
-          throw IterableElementError.tooMany();
-        }
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    throw IterableElementError.noElement();
-  }
-
-  E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
-    RangeError.checkNotNegative(index, "index");
-    int elementIndex = 0;
-    for (E element in this) {
-      if (index == elementIndex) return element;
-      elementIndex++;
-    }
-    throw new RangeError.index(index, this, "index", null, elementIndex);
-  }
-}
-
-/**
- * Base implementation of [Set].
- *
- * This class provides a base implementation of a `Set` that depends only
- * on the abstract members: [add], [contains], [lookup], [remove],
- * [iterator], [length] and [toSet].
- *
- * Some of the methods assume that `toSet` creates a modifiable set.
- * If using this base class for an unmodifiable set,
- * where `toSet` should return an unmodifiable set,
- * it's necessary to reimplement
- * [retainAll], [union], [intersection] and [difference].
- *
- * Implementations of `Set` using this base should consider also implementing
- * `clear` in constant time. The default implementation works by removing every
- * element.
- */
-abstract class SetBase<E> extends SetMixin<E> {
-  /**
-   * Convert a `Set` to a string as `{each, element, as, string}`.
-   *
-   * Handles circular references where converting one of the elements
-   * to a string ends up converting [set] to a string again.
-   */
-  static String setToString(Set set) =>
-      IterableBase.iterableToFullString(set, '{', '}');
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/collection/splay_tree.dart b/pkg/dev_compiler/tool/input_sdk/lib/collection/splay_tree.dart
deleted file mode 100644
index 72a2f52..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/collection/splay_tree.dart
+++ /dev/null
@@ -1,858 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.collection;
-
-typedef bool _Predicate<T>(T value);
-
-/**
- * A node in a splay tree. It holds the sorting key and the left
- * and right children in the tree.
- */
-class _SplayTreeNode<K> {
-  final K key;
-  _SplayTreeNode<K> left;
-  _SplayTreeNode<K> right;
-
-  _SplayTreeNode(K this.key);
-}
-
-/**
- * A node in a splay tree based map.
- *
- * A [_SplayTreeNode] that also contains a value
- */
-class _SplayTreeMapNode<K, V> extends _SplayTreeNode<K> {
-  V value;
-  _SplayTreeMapNode(K key, V this.value) : super(key);
-}
-
-/**
- * A splay tree is a self-balancing binary search tree.
- *
- * It has the additional property that recently accessed elements
- * are quick to access again.
- * It performs basic operations such as insertion, look-up and
- * removal, in O(log(n)) amortized time.
- */
-abstract class _SplayTree<K, Node extends _SplayTreeNode<K>> {
-  // The root node of the splay tree. It will contain either the last
-  // element inserted or the last element looked up.
-  Node get _root;
-  set _root(Node newValue);
-
-  // The dummy node used when performing a splay on the tree. Reusing it
-  // avoids allocating a node each time a splay is performed.
-  Node get _dummy;
-
-  // Number of elements in the splay tree.
-  int _count = 0;
-
-  /**
-   * Counter incremented whenever the keys in the map changes.
-   *
-   * Used to detect concurrent modifications.
-   */
-  int _modificationCount = 0;
-
-  /**
-   * Counter incremented whenever the tree structure changes.
-   *
-   * Used to detect that an in-place traversal cannot use
-   * cached information that relies on the tree structure.
-   */
-  int _splayCount = 0;
-
-  /** The comparator that is used for this splay tree. */
-  Comparator<K> get _comparator;
-
-  /** The predicate to determine that a given object is a valid key. */
-  _Predicate get _validKey;
-
-  /** Comparison used to compare keys. */
-  int _compare(K key1, K key2);
-
-  /**
-   * Perform the splay operation for the given key. Moves the node with
-   * the given key to the top of the tree.  If no node has the given
-   * key, the last node on the search path is moved to the top of the
-   * tree. This is the simplified top-down splaying algorithm from:
-   * "Self-adjusting Binary Search Trees" by Sleator and Tarjan.
-   *
-   * Returns the result of comparing the new root of the tree to [key].
-   * Returns -1 if the table is empty.
-   */
-  int _splay(K key) {
-    if (_root == null) return -1;
-
-    // The right child of the dummy node will hold
-    // the L tree of the algorithm.  The left child of the dummy node
-    // will hold the R tree of the algorithm.  Using a dummy node, left
-    // and right will always be nodes and we avoid special cases.
-    Node left = _dummy;
-    Node right = _dummy;
-    Node current = _root;
-    int comp;
-    while (true) {
-      comp = _compare(current.key, key);
-      if (comp > 0) {
-        if (current.left == null) break;
-        comp = _compare(current.left.key, key);
-        if (comp > 0) {
-          // Rotate right.
-          _SplayTreeNode<K> tmp = current.left;
-          current.left = tmp.right;
-          tmp.right = current;
-          current = tmp;
-          if (current.left == null) break;
-        }
-        // Link right.
-        right.left = current;
-        right = current;
-        current = current.left;
-      } else if (comp < 0) {
-        if (current.right == null) break;
-        comp = _compare(current.right.key, key);
-        if (comp < 0) {
-          // Rotate left.
-          Node tmp = current.right;
-          current.right = tmp.left;
-          tmp.left = current;
-          current = tmp;
-          if (current.right == null) break;
-        }
-        // Link left.
-        left.right = current;
-        left = current;
-        current = current.right;
-      } else {
-        break;
-      }
-    }
-    // Assemble.
-    left.right = current.left;
-    right.left = current.right;
-    current.left = _dummy.right;
-    current.right = _dummy.left;
-    _root = current;
-
-    _dummy.right = null;
-    _dummy.left = null;
-    _splayCount++;
-    return comp;
-  }
-
-  // Emulates splaying with a key that is smaller than any in the subtree
-  // anchored at [node].
-  // and that node is returned. It should replace the reference to [node]
-  // in any parent tree or root pointer.
-  Node _splayMin(Node node) {
-    Node current = node;
-    while (current.left != null) {
-      Node left = current.left;
-      current.left = left.right;
-      left.right = current;
-      current = left;
-    }
-    return current;
-  }
-
-  // Emulates splaying with a key that is greater than any in the subtree
-  // anchored at [node].
-  // After this, the largest element in the tree is the root of the subtree,
-  // and that node is returned. It should replace the reference to [node]
-  // in any parent tree or root pointer.
-  Node _splayMax(Node node) {
-    Node current = node;
-    while (current.right != null) {
-      Node right = current.right;
-      current.right = right.left;
-      right.left = current;
-      current = right;
-    }
-    return current;
-  }
-
-  Node _remove(K key) {
-    if (_root == null) return null;
-    int comp = _splay(key);
-    if (comp != 0) return null;
-    Node result = _root;
-    _count--;
-    // assert(_count >= 0);
-    if (_root.left == null) {
-      _root = _root.right;
-    } else {
-      Node right = _root.right;
-      // Splay to make sure that the new root has an empty right child.
-      _root = _splayMax(_root.left);
-      // Insert the original right child as the right child of the new
-      // root.
-      _root.right = right;
-    }
-    _modificationCount++;
-    return result;
-  }
-
-  /**
-   * Adds a new root node with the given [key] or [value].
-   *
-   * The [comp] value is the result of comparing the existing root's key
-   * with key.
-   */
-  void _addNewRoot(Node node, int comp) {
-    _count++;
-    _modificationCount++;
-    if (_root == null) {
-      _root = node;
-      return;
-    }
-    // assert(_count >= 0);
-    if (comp < 0) {
-      node.left = _root;
-      node.right = _root.right;
-      _root.right = null;
-    } else {
-      node.right = _root;
-      node.left = _root.left;
-      _root.left = null;
-    }
-    _root = node;
-  }
-
-  Node get _first {
-    if (_root == null) return null;
-    _root = _splayMin(_root);
-    return _root;
-  }
-
-  Node get _last {
-    if (_root == null) return null;
-    _root = _splayMax(_root);
-    return _root;
-  }
-
-  void _clear() {
-    _root = null;
-    _count = 0;
-    _modificationCount++;
-  }
-}
-
-class _TypeTest<T> {
-  bool test(v) => v is T;
-}
-
-/**
- * A [Map] of objects that can be ordered relative to each other.
- *
- * The map is based on a self-balancing binary tree. It allows most operations
- * in amortized logarithmic time.
- *
- * Keys of the map are compared using the `compare` function passed in
- * the constructor, both for ordering and for equality.
- * If the map contains only the key `a`, then `map.containsKey(b)`
- * will return `true` if and only if `compare(a, b) == 0`,
- * and the value of `a == b` is not even checked.
- * If the compare function is omitted, the objects are assumed to be
- * [Comparable], and are compared using their [Comparable.compareTo] method.
- * Non-comparable objects (including `null`) will not work as keys
- * in that case.
- *
- * To allow calling [operator[]], [remove] or [containsKey] with objects
- * that are not supported by the `compare` function, an extra `isValidKey`
- * predicate function can be supplied. This function is tested before
- * using the `compare` function on an argument value that may not be a [K]
- * value. If omitted, the `isValidKey` function defaults to testing if the
- * value is a [K].
- */
-class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
-    implements Map<K, V> {
-  _SplayTreeMapNode<K, V> _root;
-  final _SplayTreeMapNode<K, V> _dummy =
-      new _SplayTreeMapNode<K, V>(null, null);
-
-  Comparator<K> _comparator;
-  _Predicate _validKey;
-
-  SplayTreeMap([int compare(K key1, K key2), bool isValidKey(potentialKey)])
-      : _comparator = compare ?? Comparable.compare as Comparator<K>,
-        _validKey = isValidKey ?? ((v) => v is K);
-
-  /**
-   * Creates a [SplayTreeMap] that contains all key/value pairs of [other].
-   */
-  factory SplayTreeMap.from(Map other,
-                            [int compare(K key1, K key2),
-                             bool isValidKey(potentialKey)]) {
-    SplayTreeMap<K, V> result = new SplayTreeMap<K, V>(compare, isValidKey);
-    other.forEach((k, v) { result[k as Object/*=K*/] = v as Object/*=V*/; });
-    return result;
-  }
-
-  /**
-   * Creates a [SplayTreeMap] where the keys and values are computed from the
-   * [iterable].
-   *
-   * For each element of the [iterable] this constructor computes a key/value
-   * pair, by applying [key] and [value] respectively.
-   *
-   * The keys of the key/value pairs do not need to be unique. The last
-   * occurrence of a key will simply overwrite any previous value.
-   *
-   * If no functions are specified for [key] and [value] the default is to
-   * use the iterable value itself.
-   */
-  factory SplayTreeMap.fromIterable(Iterable iterable,
-                                    {K key(element),
-                                     V value(element),
-                                     int compare(K key1, K key2),
-                                     bool isValidKey(potentialKey) }) {
-    SplayTreeMap<K, V> map = new SplayTreeMap<K, V>(compare, isValidKey);
-    Maps._fillMapWithMappedIterable(map, iterable, key, value);
-    return map;
-  }
-
-  /**
-   * Creates a [SplayTreeMap] associating the given [keys] to [values].
-   *
-   * This constructor iterates over [keys] and [values] and maps each element of
-   * [keys] to the corresponding element of [values].
-   *
-   * If [keys] contains the same object multiple times, the last occurrence
-   * overwrites the previous value.
-   *
-   * It is an error if the two [Iterable]s don't have the same length.
-   */
-  factory SplayTreeMap.fromIterables(Iterable<K> keys, Iterable<V> values,
-      [int compare(K key1, K key2), bool isValidKey(potentialKey)]) {
-    SplayTreeMap<K, V> map = new SplayTreeMap<K, V>(compare, isValidKey);
-    Maps._fillMapWithIterables(map, keys, values);
-    return map;
-  }
-
-  int _compare(K key1, K key2) => _comparator(key1, key2);
-
-  SplayTreeMap._internal();
-
-  V operator [](Object key) {
-    if (!_validKey(key)) return null;
-    if (_root != null) {
-      int comp = _splay(key as dynamic/*=K*/);
-      if (comp == 0) {
-        return _root.value;
-      }
-    }
-    return null;
-  }
-
-  V remove(Object key) {
-    if (!_validKey(key)) return null;
-    _SplayTreeMapNode<K, V> mapRoot = _remove(key as dynamic/*=K*/);
-    if (mapRoot != null) return mapRoot.value;
-    return null;
-  }
-
-  void operator []=(K key, V value) {
-    if (key == null) throw new ArgumentError(key);
-    // Splay on the key to move the last node on the search path for
-    // the key to the root of the tree.
-    int comp = _splay(key);
-    if (comp == 0) {
-      _root.value = value;
-      return;
-    }
-    _addNewRoot(new _SplayTreeMapNode(key, value), comp);
-  }
-
-
-  V putIfAbsent(K key, V ifAbsent()) {
-    if (key == null) throw new ArgumentError(key);
-    int comp = _splay(key);
-    if (comp == 0) {
-      return _root.value;
-    }
-    int modificationCount = _modificationCount;
-    int splayCount = _splayCount;
-    V value = ifAbsent();
-    if (modificationCount != _modificationCount) {
-      throw new ConcurrentModificationError(this);
-    }
-    if (splayCount != _splayCount) {
-      comp = _splay(key);
-      // Key is still not there, otherwise _modificationCount would be changed.
-      assert(comp != 0);
-    }
-    _addNewRoot(new _SplayTreeMapNode(key, value), comp);
-    return value;
-  }
-
-  void addAll(Map<K, V> other) {
-    other.forEach((K key, V value) { this[key] = value; });
-  }
-
-  bool get isEmpty {
-    return (_root == null);
-  }
-
-  bool get isNotEmpty => !isEmpty;
-
-  void forEach(void f(K key, V value)) {
-    Iterator<_SplayTreeNode<K>> nodes =
-        new _SplayTreeNodeIterator<K>(this);
-    while (nodes.moveNext()) {
-      _SplayTreeMapNode<K, V> node = nodes.current;
-      f(node.key, node.value);
-    }
-  }
-
-  int get length {
-    return _count;
-  }
-
-  void clear() {
-    _clear();
-  }
-
-  bool containsKey(Object key) {
-    return _validKey(key) && _splay(key as dynamic/*=K*/) == 0;
-  }
-
-  bool containsValue(Object value) {
-    bool found = false;
-    int initialSplayCount = _splayCount;
-    bool visit(_SplayTreeMapNode node) {
-      while (node != null) {
-        if (node.value == value) return true;
-        if (initialSplayCount != _splayCount) {
-          throw new ConcurrentModificationError(this);
-        }
-        if (node.right != null && visit(node.right)) return true;
-        node = node.left;
-      }
-      return false;
-    }
-    return visit(_root);
-  }
-
-  Iterable<K> get keys => new _SplayTreeKeyIterable<K>(this);
-
-  Iterable<V> get values => new _SplayTreeValueIterable<K, V>(this);
-
-  String toString() {
-    return Maps.mapToString(this);
-  }
-
-  /**
-   * Get the first key in the map. Returns [:null:] if the map is empty.
-   */
-  K firstKey() {
-    if (_root == null) return null;
-    return _first.key;
-  }
-
-  /**
-   * Get the last key in the map. Returns [:null:] if the map is empty.
-   */
-  K lastKey() {
-    if (_root == null) return null;
-    return _last.key;
-  }
-
-  /**
-   * Get the last key in the map that is strictly smaller than [key]. Returns
-   * [:null:] if no key was not found.
-   */
-  K lastKeyBefore(K key) {
-    if (key == null) throw new ArgumentError(key);
-    if (_root == null) return null;
-    int comp = _splay(key);
-    if (comp < 0) return _root.key;
-    _SplayTreeNode<K> node = _root.left;
-    if (node == null) return null;
-    while (node.right != null) {
-      node = node.right;
-    }
-    return node.key;
-  }
-
-  /**
-   * Get the first key in the map that is strictly larger than [key]. Returns
-   * [:null:] if no key was not found.
-   */
-  K firstKeyAfter(K key) {
-    if (key == null) throw new ArgumentError(key);
-    if (_root == null) return null;
-    int comp = _splay(key);
-    if (comp > 0) return _root.key;
-    _SplayTreeNode<K> node = _root.right;
-    if (node == null) return null;
-    while (node.left != null) {
-      node = node.left;
-    }
-    return node.key;
-  }
-}
-
-abstract class _SplayTreeIterator<K, T> implements Iterator<T> {
-  final _SplayTree<K, _SplayTreeNode<K>> _tree;
-  /**
-   * Worklist of nodes to visit.
-   *
-   * These nodes have been passed over on the way down in a
-   * depth-first left-to-right traversal. Visiting each node,
-   * and their right subtrees will visit the remainder of
-   * the nodes of a full traversal.
-   *
-   * Only valid as long as the original tree isn't reordered.
-   */
-  final List<_SplayTreeNode<K>> _workList = <_SplayTreeNode<K>>[];
-
-  /**
-   * Original modification counter of [_tree].
-   *
-   * Incremented on [_tree] when a key is added or removed.
-   * If it changes, iteration is aborted.
-   *
-   * Not final because some iterators may modify the tree knowingly,
-   * and they update the modification count in that case.
-   */
-  int _modificationCount;
-
-  /**
-   * Count of splay operations on [_tree] when [_workList] was built.
-   *
-   * If the splay count on [_tree] increases, [_workList] becomes invalid.
-   */
-  int _splayCount;
-
-  /** Current node. */
-  _SplayTreeNode<K> _currentNode;
-
-  _SplayTreeIterator(_SplayTree<K, _SplayTreeNode<K>> tree)
-      : _tree = tree,
-        _modificationCount = tree._modificationCount,
-        _splayCount = tree._splayCount {
-    _findLeftMostDescendent(tree._root);
-  }
-
-  _SplayTreeIterator.startAt(_SplayTree<K, _SplayTreeNode<K>> tree, K startKey)
-      : _tree = tree,
-        _modificationCount = tree._modificationCount {
-    if (tree._root == null) return;
-    int compare = tree._splay(startKey);
-    _splayCount = tree._splayCount;
-    if (compare < 0) {
-      // Don't include the root, start at the next element after the root.
-      _findLeftMostDescendent(tree._root.right);
-    } else {
-      _workList.add(tree._root);
-    }
-  }
-
-  T get current {
-    if (_currentNode == null) return null;
-    return _getValue(_currentNode);
-  }
-
-  void _findLeftMostDescendent(_SplayTreeNode<K> node) {
-    while (node != null) {
-      _workList.add(node);
-      node = node.left;
-    }
-  }
-
-  /**
-   * Called when the tree structure of the tree has changed.
-   *
-   * This can be caused by a splay operation.
-   * If the key-set changes, iteration is aborted before getting
-   * here, so we know that the keys are the same as before, it's
-   * only the tree that has been reordered.
-   */
-  void _rebuildWorkList(_SplayTreeNode<K> currentNode) {
-    assert(!_workList.isEmpty);
-    _workList.clear();
-    if (currentNode == null) {
-      _findLeftMostDescendent(_tree._root);
-    } else {
-      _tree._splay(currentNode.key);
-      _findLeftMostDescendent(_tree._root.right);
-      assert(!_workList.isEmpty);
-    }
-  }
-
-  bool moveNext() {
-    if (_modificationCount != _tree._modificationCount) {
-      throw new ConcurrentModificationError(_tree);
-    }
-    // Picks the next element in the worklist as current.
-    // Updates the worklist with the left-most path of the current node's
-    // right-hand child.
-    // If the worklist is no longer valid (after a splay), it is rebuild
-    // from scratch.
-    if (_workList.isEmpty) {
-      _currentNode = null;
-      return false;
-    }
-    if (_tree._splayCount != _splayCount && _currentNode != null) {
-      _rebuildWorkList(_currentNode);
-    }
-    _currentNode = _workList.removeLast();
-    _findLeftMostDescendent(_currentNode.right);
-    return true;
-  }
-
-  T _getValue(_SplayTreeNode<K> node);
-}
-
-class _SplayTreeKeyIterable<K> extends Iterable<K>
-                               implements EfficientLength {
-  _SplayTree<K, _SplayTreeNode<K>> _tree;
-  _SplayTreeKeyIterable(this._tree);
-  int get length => _tree._count;
-  bool get isEmpty => _tree._count == 0;
-  Iterator<K> get iterator => new _SplayTreeKeyIterator<K>(_tree);
-
-  Set<K> toSet() {
-    SplayTreeSet<K> set =
-        new SplayTreeSet<K>(_tree._comparator, _tree._validKey);
-    set._count = _tree._count;
-    set._root = set._copyNode(_tree._root);
-    return set;
-  }
-}
-
-class _SplayTreeValueIterable<K, V> extends Iterable<V>
-                                    implements EfficientLength {
-  SplayTreeMap<K, V> _map;
-  _SplayTreeValueIterable(this._map);
-  int get length => _map._count;
-  bool get isEmpty => _map._count == 0;
-  Iterator<V> get iterator => new _SplayTreeValueIterator<K, V>(_map);
-}
-
-class _SplayTreeKeyIterator<K> extends _SplayTreeIterator<K, K> {
-  _SplayTreeKeyIterator(_SplayTree<K, _SplayTreeNode<K>> map): super(map);
-  K _getValue(_SplayTreeNode<K> node) => node.key;
-}
-
-class _SplayTreeValueIterator<K, V> extends _SplayTreeIterator<K, V> {
-  _SplayTreeValueIterator(SplayTreeMap<K, V> map): super(map);
-  V _getValue(_SplayTreeNode<K> node) {
-    _SplayTreeMapNode<K, V> mapNode =
-        node as dynamic/*=_SplayTreeMapNode<K, V>*/;
-    return mapNode.value;
-  }
-}
-
-class _SplayTreeNodeIterator<K>
-    extends _SplayTreeIterator<K, _SplayTreeNode<K>> {
-  _SplayTreeNodeIterator(_SplayTree<K, _SplayTreeNode<K>> tree): super(tree);
-  _SplayTreeNodeIterator.startAt(
-      _SplayTree<K, _SplayTreeNode<K>> tree, K startKey)
-      : super.startAt(tree, startKey);
-  _SplayTreeNode<K> _getValue(_SplayTreeNode<K> node) => node;
-}
-
-
-/**
- * A [Set] of objects that can be ordered relative to each other.
- *
- * The set is based on a self-balancing binary tree. It allows most operations
- * in amortized logarithmic time.
- *
- * Elements of the set are compared using the `compare` function passed in
- * the constructor, both for ordering and for equality.
- * If the set contains only an object `a`, then `set.contains(b)`
- * will return `true` if and only if `compare(a, b) == 0`,
- * and the value of `a == b` is not even checked.
- * If the compare function is omitted, the objects are assumed to be
- * [Comparable], and are compared using their [Comparable.compareTo] method.
- * Non-comparable objects (including `null`) will not work as an element
- * in that case.
- */
-class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeNode<E>>
-    with IterableMixin<E>, SetMixin<E> {
-  _SplayTreeNode<E> _root;
-  final _SplayTreeNode<E> _dummy = new _SplayTreeNode<E>(null);
-
-  Comparator<E> _comparator;
-  _Predicate _validKey;
-
-  /**
-   * Create a new [SplayTreeSet] with the given compare function.
-   *
-   * If the [compare] function is omitted, it defaults to [Comparable.compare],
-   * and the elements must be comparable.
-   *
-   * A provided `compare` function may not work on all objects. It may not even
-   * work on all `E` instances.
-   *
-   * For operations that add elements to the set, the user is supposed to not
-   * pass in objects that doesn't work with the compare function.
-   *
-   * The methods [contains], [remove], [lookup], [removeAll] or [retainAll]
-   * are typed to accept any object(s), and the [isValidKey] test can used to
-   * filter those objects before handing them to the `compare` function.
-   *
-   * If [isValidKey] is provided, only values satisfying `isValidKey(other)`
-   * are compared using the `compare` method in the methods mentioned above.
-   * If the `isValidKey` function returns false for an object, it is assumed to
-   * not be in the set.
-   *
-   * If omitted, the `isValidKey` function defaults to checking against the
-   * type parameter: `other is E`.
-   */
-  SplayTreeSet([int compare(E key1, E key2), bool isValidKey(potentialKey)])
-      : _comparator =
-            compare ?? Comparable.compare as dynamic/*=Comparator<E>*/,
-        _validKey = isValidKey ?? ((v) => v is E);
-
-  /**
-   * Creates a [SplayTreeSet] that contains all [elements].
-   *
-   * The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
-   *
-   * All the [elements] should be valid as arguments to the [compare] function.
-   */
-  factory SplayTreeSet.from(Iterable elements,
-                            [int compare(E key1, E key2),
-                             bool isValidKey(potentialKey)]) {
-    SplayTreeSet<E> result = new SplayTreeSet<E>(compare, isValidKey);
-    for (final element in elements) {
-      E e = element as Object/*=E*/;
-      result.add(e);
-    }
-    return result;
-  }
-
-  int _compare(E e1, E e2) => _comparator(e1, e2);
-
-  // From Iterable.
-
-  Iterator<E> get iterator => new _SplayTreeKeyIterator<E>(this);
-
-  int get length => _count;
-  bool get isEmpty => _root == null;
-  bool get isNotEmpty => _root != null;
-
-  E get first {
-    if (_count == 0) throw IterableElementError.noElement();
-    return _first.key;
-  }
-
-  E get last {
-    if (_count == 0) throw IterableElementError.noElement();
-    return _last.key;
-  }
-
-  E get single {
-    if (_count == 0) throw IterableElementError.noElement();
-    if (_count > 1) throw IterableElementError.tooMany();
-    return _root.key;
-  }
-
-  // From Set.
-  bool contains(Object object) {
-    return _validKey(object) && _splay(object as dynamic/*=E*/) == 0;
-  }
-
-  bool add(E element) {
-    int compare = _splay(element);
-    if (compare == 0) return false;
-    _addNewRoot(new _SplayTreeNode(element), compare);
-    return true;
-  }
-
-  bool remove(Object object) {
-    if (!_validKey(object)) return false;
-    return _remove(object as dynamic/*=E*/) != null;
-  }
-
-  void addAll(Iterable<E> elements) {
-    for (E element in elements) {
-      int compare = _splay(element);
-      if (compare != 0) {
-        _addNewRoot(new _SplayTreeNode(element), compare);
-      }
-    }
-  }
-
-  void removeAll(Iterable<Object> elements) {
-    for (Object element in elements) {
-      if (_validKey(element)) _remove(element as dynamic/*=E*/);
-    }
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    // Build a set with the same sense of equality as this set.
-    SplayTreeSet<E> retainSet = new SplayTreeSet<E>(_comparator, _validKey);
-    int modificationCount = _modificationCount;
-    for (Object object in elements) {
-      if (modificationCount != _modificationCount) {
-        // The iterator should not have side effects.
-        throw new ConcurrentModificationError(this);
-      }
-      // Equivalent to this.contains(object).
-      if (_validKey(object) && _splay(object as dynamic/*=E*/) == 0) {
-        retainSet.add(_root.key);
-      }
-    }
-    // Take over the elements from the retained set, if it differs.
-    if (retainSet._count != _count) {
-      _root = retainSet._root;
-      _count = retainSet._count;
-      _modificationCount++;
-    }
-  }
-
-  E lookup(Object object) {
-    if (!_validKey(object)) return null;
-    int comp = _splay(object as dynamic/*=E*/);
-    if (comp != 0) return null;
-    return _root.key;
-  }
-
-  Set<E> intersection(Set<Object> other) {
-    Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
-    for (E element in this) {
-      if (other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  Set<E> difference(Set<Object> other) {
-    Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
-    for (E element in this) {
-      if (!other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  Set<E> union(Set<E> other) {
-    return _clone()..addAll(other);
-  }
-
-  SplayTreeSet<E> _clone() {
-    var set = new SplayTreeSet<E>(_comparator, _validKey);
-    set._count = _count;
-    set._root = _copyNode(_root);
-    return set;
-  }
-
-  // Copies the structure of a SplayTree into a new similar structure.
-  // Works on _SplayTreeMapNode as well, but only copies the keys,
-  _SplayTreeNode<E> _copyNode(_SplayTreeNode<E> node) {
-    if (node == null) return null;
-    return new _SplayTreeNode<E>(node.key)..left = _copyNode(node.left)
-                                          ..right = _copyNode(node.right);
-  }
-
-  void clear() { _clear(); }
-
-  Set<E> toSet() => _clone();
-
-  String toString() => IterableBase.iterableToFullString(this, '{', '}');
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/ascii.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/ascii.dart
deleted file mode 100644
index a076210..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/ascii.dart
+++ /dev/null
@@ -1,310 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * An instance of the default implementation of the [AsciiCodec].
- *
- * This instance provides a convenient access to the most common ASCII
- * use cases.
- *
- * Examples:
- *
- *     var encoded = ASCII.encode("This is ASCII!");
- *     var decoded = ASCII.decode([0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
- *                                 0x20, 0x41, 0x53, 0x43, 0x49, 0x49, 0x21]);
- */
-const AsciiCodec ASCII = const AsciiCodec();
-
-const int _ASCII_MASK = 0x7F;
-
-/**
- * An [AsciiCodec] allows encoding strings as ASCII bytes
- * and decoding ASCII bytes to strings.
- */
-class AsciiCodec extends Encoding {
-  final bool _allowInvalid;
-  /**
-   * Instantiates a new [AsciiCodec].
-   *
-   * If [allowInvalid] is true, the [decode] method and the converter
-   * returned by [decoder] will default to allowing invalid values.
-   * If allowing invalid values, the values will be decoded into the Unicode
-   * Replacement character (U+FFFD). If not, an exception will be thrown.
-   * Calls to the [decode] method can choose to override this default.
-   *
-   * Encoders will not accept invalid (non Latin-1) characters.
-   */
-  const AsciiCodec({bool allowInvalid: false}) : _allowInvalid = allowInvalid;
-
-  String get name => "us-ascii";
-
-  /**
-   * Decodes the ASCII [bytes] (a list of unsigned 7-bit integers) to the
-   * corresponding string.
-   *
-   * If [bytes] contains values that are not in the range 0 .. 127, the decoder
-   * will eventually throw a [FormatException].
-   *
-   * If [allowInvalid] is not provided, it defaults to the value used to create
-   * this [AsciiCodec].
-   */
-  String decode(List<int> bytes, { bool allowInvalid }) {
-    if (allowInvalid == null) allowInvalid = _allowInvalid;
-    if (allowInvalid) {
-      return const AsciiDecoder(allowInvalid: true).convert(bytes);
-    } else {
-      return const AsciiDecoder(allowInvalid: false).convert(bytes);
-    }
-  }
-
-  AsciiEncoder get encoder => const AsciiEncoder();
-
-  AsciiDecoder get decoder =>
-      _allowInvalid ? const AsciiDecoder(allowInvalid: true)
-                    : const AsciiDecoder(allowInvalid: false);
-}
-
-// Superclass for [AsciiEncoder] and [Latin1Encoder].
-// Generalizes common operations that only differ by a mask;
-class _UnicodeSubsetEncoder extends Converter<String, List<int>> {
-  final int _subsetMask;
-
-  const _UnicodeSubsetEncoder(this._subsetMask);
-
-  /**
-   * Converts the [String] into a list of its code units.
-   *
-   * If [start] and [end] are provided, only the substring
-   * `string.substring(start, end)` is used as input to the conversion.
-   */
-  List<int> convert(String string, [int start = 0, int end]) {
-    int stringLength = string.length;
-    RangeError.checkValidRange(start, end, stringLength);
-    if (end == null) end = stringLength;
-    int length = end - start;
-    List<int> result = new Uint8List(length);
-    for (int i = 0; i < length; i++) {
-      var codeUnit = string.codeUnitAt(start + i);
-      if ((codeUnit & ~_subsetMask) != 0) {
-        throw new ArgumentError("String contains invalid characters.");
-      }
-      result[i] = codeUnit;
-    }
-    return result;
-  }
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [ByteConversionSink].
-   */
-  StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _UnicodeSubsetEncoderSink(_subsetMask, sink);
-  }
-
-  // Override the base-class' bind, to provide a better type.
-  Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
-}
-
-/**
- * This class converts strings of only ASCII characters to bytes.
- */
-class AsciiEncoder extends _UnicodeSubsetEncoder {
-  const AsciiEncoder() : super(_ASCII_MASK);
-}
-
-/**
- * This class encodes chunked strings to bytes (unsigned 8-bit
- * integers).
- */
-class _UnicodeSubsetEncoderSink extends StringConversionSinkBase {
-  final ByteConversionSink _sink;
-  final int _subsetMask;
-
-  _UnicodeSubsetEncoderSink(this._subsetMask, this._sink);
-
-  void close() {
-    _sink.close();
-  }
-
-  void addSlice(String source, int start, int end, bool isLast) {
-    RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
-      int codeUnit = source.codeUnitAt(i);
-      if ((codeUnit & ~_subsetMask) != 0) {
-        throw new ArgumentError(
-            "Source contains invalid character with code point: $codeUnit.");
-      }
-    }
-    _sink.add(source.codeUnits.sublist(start, end));
-    if (isLast) {
-      close();
-    }
-  }
-}
-
-/**
- * This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
- * to a string.
- */
-abstract class _UnicodeSubsetDecoder extends Converter<List<int>, String> {
-  final bool _allowInvalid;
-  final int _subsetMask;
-
-  /**
-   * Instantiates a new decoder.
-   *
-   * The [_allowInvalid] argument defines how [convert] deals
-   * with invalid bytes.
-   *
-   * The [_subsetMask] argument is a bit mask used to define the subset
-   * of Unicode being decoded. Use [_LATIN1_MASK] for Latin-1 (8-bit) or
-   * [_ASCII_MASK] for ASCII (7-bit).
-   *
-   * If [_allowInvalid] is `true`, [convert] replaces invalid bytes with the
-   * Unicode Replacement character `U+FFFD` (�).
-   * Otherwise it throws a [FormatException].
-   */
-  const _UnicodeSubsetDecoder(this._allowInvalid, this._subsetMask);
-
-  /**
-   * Converts the [bytes] (a list of unsigned 7- or 8-bit integers) to the
-   * corresponding string.
-   *
-   * If [start] and [end] are provided, only the sub-list of bytes from
-   * `start` to `end` (`end` not inclusive) is used as input to the conversion.
-   */
-  String convert(List<int> bytes, [int start = 0, int end]) {
-    int byteCount = bytes.length;
-    RangeError.checkValidRange(start, end, byteCount);
-    if (end == null) end = byteCount;
-
-    for (int i = start; i < end; i++) {
-      int byte = bytes[i];
-      if ((byte & ~_subsetMask) != 0) {
-        if (!_allowInvalid) {
-          throw new FormatException("Invalid value in input: $byte");
-        }
-        return _convertInvalid(bytes, start, end);
-      }
-    }
-    return new String.fromCharCodes(bytes, start, end);
-  }
-
-  String _convertInvalid(List<int> bytes, int start, int end) {
-    StringBuffer buffer = new StringBuffer();
-    for (int i = start; i < end; i++) {
-      int value = bytes[i];
-      if ((value & ~_subsetMask) != 0) value = 0xFFFD;
-      buffer.writeCharCode(value);
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<String> sink);
-
-  // Override the base-class's bind, to provide a better type.
-  Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
-}
-
-class AsciiDecoder extends _UnicodeSubsetDecoder {
-  const AsciiDecoder({bool allowInvalid: false})
-      : super(allowInvalid, _ASCII_MASK);
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<String> sink) {
-    StringConversionSink stringSink;
-    if (sink is StringConversionSink) {
-      stringSink = sink;
-    } else {
-      stringSink = new StringConversionSink.from(sink);
-    }
-    // TODO(lrn): Use asUtf16Sink when it becomes available. It
-    // works just as well, is likely to have less decoding overhead,
-    // and make adding U+FFFD easier.
-    // At that time, merge this with _Latin1DecoderSink;
-    if (_allowInvalid) {
-      return new _ErrorHandlingAsciiDecoderSink(stringSink.asUtf8Sink(false));
-    } else {
-      return new _SimpleAsciiDecoderSink(stringSink);
-    }
-  }
-}
-
-class _ErrorHandlingAsciiDecoderSink extends ByteConversionSinkBase {
-  ByteConversionSink _utf8Sink;
-  _ErrorHandlingAsciiDecoderSink(this._utf8Sink);
-
-  void close() {
-    _utf8Sink.close();
-  }
-
-  void add(List<int> source) {
-    addSlice(source, 0, source.length, false);
-  }
-
-  void addSlice(List<int> source, int start, int end, bool isLast) {
-    RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
-      if ((source[i] & ~_ASCII_MASK) != 0) {
-        if (i > start) _utf8Sink.addSlice(source, start, i, false);
-        // Add UTF-8 encoding of U+FFFD.
-        _utf8Sink.add(const<int>[0xEF, 0xBF, 0xBD]);
-        start = i + 1;
-      }
-    }
-    if (start < end) {
-      _utf8Sink.addSlice(source, start, end, isLast);
-    } else if (isLast) {
-      close();
-    }
-  }
-}
-
-class _SimpleAsciiDecoderSink extends ByteConversionSinkBase {
-  Sink _sink;
-  _SimpleAsciiDecoderSink(this._sink);
-
-  void close() {
-    _sink.close();
-  }
-
-  void add(List<int> source) {
-    for (int i = 0; i < source.length; i++) {
-      if ((source[i] & ~_ASCII_MASK) != 0) {
-        throw new FormatException("Source contains non-ASCII bytes.");
-      }
-    }
-    _sink.add(new String.fromCharCodes(source));
-  }
-
-  void addSlice(List<int> source, int start, int end, bool isLast) {
-    final int length = source.length;
-    RangeError.checkValidRange(start, end, length);
-    if (start < end) {
-      if (start != 0 || end != length) {
-        source = source.sublist(start, end);
-      }
-      add(source);
-    }
-    if (isLast) close();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/base64.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/base64.dart
deleted file mode 100644
index 3fe1357..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/base64.dart
+++ /dev/null
@@ -1,750 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * It encodes using the default base64 alphabet,
- * decodes using both the base64 and base64url alphabets,
- * does not allow invalid characters and requires padding.
- *
- * Examples:
- *
- *     var encoded = BASE64.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                  0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- *     var decoded = BASE64.decode("YmzDpWLDpnJncsO4ZAo=");
- */
-const Base64Codec BASE64 = const Base64Codec();
-
-/**
- * A [base64url](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * It encodes and decodes using the base64url alphabet,
- * decodes using both the base64 and base64url alphabets,
- * does not allow invalid characters and requires padding.
- *
- * Examples:
- *
- *     var encoded = BASE64URL.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                     0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- *     var decoded = BASE64URL.decode("YmzDpWLDpnJncsO4ZAo=");
- */
-const Base64Codec BASE64URL = const Base64Codec.urlSafe();
-
-// Constants used in more than one class.
-const int _paddingChar = 0x3d;  // '='.
-
-/**
- * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
- *
- * A [Base64Codec] allows base64 encoding bytes into ASCII strings and
- * decoding valid encodings back to bytes.
- *
- * This implementation only handles the simplest RFC 4648 base64 and base64url
- * encodings.
- * It does not allow invalid characters when decoding and it requires,
- * and generates, padding so that the input is always a multiple of four
- * characters.
- */
-class Base64Codec extends Codec<List<int>, String> {
-  final Base64Encoder _encoder;
-  const Base64Codec() : _encoder = const Base64Encoder();
-  const Base64Codec.urlSafe() : _encoder = const Base64Encoder.urlSafe();
-
-  Base64Encoder get encoder => _encoder;
-
-  Base64Decoder get decoder => const Base64Decoder();
-}
-
-// ------------------------------------------------------------------------
-// Encoder
-// ------------------------------------------------------------------------
-
-/**
- * Base64 and base64url encoding converter.
- *
- * Encodes lists of bytes using base64 or base64url encoding.
- *
- * The results are ASCII strings using a restricted alphabet.
- */
-class Base64Encoder extends Converter<List<int>, String> {
-  final bool _urlSafe;
-
-  const Base64Encoder() : _urlSafe = false;
-  const Base64Encoder.urlSafe() : _urlSafe = true;
-
-  String convert(List<int> input) {
-    if (input.isEmpty) return "";
-    var encoder = new _Base64Encoder(_urlSafe);
-    Uint8List buffer = encoder.encode(input, 0, input.length, true);
-    return new String.fromCharCodes(buffer);
-  }
-
-  ByteConversionSink startChunkedConversion(Sink<String> sink) {
-    if (sink is StringConversionSink) {
-      return new _Utf8Base64EncoderSink(sink.asUtf8Sink(false), _urlSafe);
-    }
-    return new _AsciiBase64EncoderSink(sink, _urlSafe);
-  }
-}
-
-/**
- * Helper class for encoding bytes to base64.
- */
-class _Base64Encoder {
-  /** The RFC 4648 base64 encoding alphabet. */
-  static const String _base64Alphabet =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-  /** The RFC 4648 base64url encoding alphabet. */
-  static const String _base64urlAlphabet =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-
-  /** Shift-count to extract the values stored in [_state]. */
-  static const int _valueShift = 2;
-
-  /** Mask to extract the count value stored in [_state]. */
-  static const int _countMask = 3;
-
-  static const int _sixBitMask = 0x3F;
-
-  /**
-   * Intermediate state between chunks.
-   *
-   * Encoding handles three bytes at a time.
-   * If fewer than three bytes has been seen, this value encodes
-   * the number of bytes seen (0, 1 or 2) and their values.
-   */
-  int _state = 0;
-
-  /** Alphabet used for encoding. */
-  final String _alphabet;
-
-  _Base64Encoder(bool urlSafe)
-      : _alphabet = urlSafe ? _base64urlAlphabet : _base64Alphabet;
-
-  /** Encode count and bits into a value to be stored in [_state]. */
-  static int _encodeState(int count, int bits) {
-    assert(count <= _countMask);
-    return bits << _valueShift | count;
-  }
-
-  /** Extract bits from encoded state. */
-  static int _stateBits(int state) => state >> _valueShift;
-
-  /** Extract count from encoded state. */
-  static int _stateCount(int state) => state & _countMask;
-
-  /**
-   * Create a [Uint8List] with the provided length.
-   */
-  Uint8List createBuffer(int bufferLength) => new Uint8List(bufferLength);
-
-  /**
-   * Encode [bytes] from [start] to [end] and the bits in [_state].
-   *
-   * Returns a [Uint8List] of the ASCII codes of the encoded data.
-   *
-   * If the input, including left over [_state] from earlier encodings,
-   * are not a multiple of three bytes, then the partial state is stored
-   * back into [_state].
-   * If [isLast] is true, partial state is encoded in the output instead,
-   * with the necessary padding.
-   *
-   * Returns `null` if there is no output.
-   */
-  Uint8List encode(List<int> bytes, int start, int end, bool isLast) {
-    assert(0 <= start);
-    assert(start <= end);
-    assert(bytes == null || end <= bytes.length);
-    int length = end - start;
-
-    int count = _stateCount(_state);
-    int byteCount = (count + length);
-    int fullChunks = byteCount ~/ 3;
-    int partialChunkLength = byteCount - fullChunks * 3;
-    int bufferLength = fullChunks * 4;
-    if (isLast && partialChunkLength > 0) {
-      bufferLength += 4;  // Room for padding.
-    }
-    var output = createBuffer(bufferLength);
-    _state = encodeChunk(_alphabet, bytes, start, end, isLast,
-                         output, 0, _state);
-    if (bufferLength > 0) return output;
-    // If the input plus the data in state is still less than three bytes,
-    // there may not be any output.
-    return null;
-  }
-
-  static int encodeChunk(String alphabet,
-                         List<int> bytes, int start, int end, bool isLast,
-                         Uint8List output, int outputIndex, int state) {
-    int bits = _stateBits(state);
-    // Count number of missing bytes in three-byte chunk.
-    int expectedChars = 3 - _stateCount(state);
-
-    // The input must be a list of bytes (integers in the range 0..255).
-    // The value of `byteOr` will be the bitwise or of all the values in
-    // `bytes` and a later check will validate that they were all valid bytes.
-    int byteOr = 0;
-    for (int i = start; i < end; i++) {
-      int byte = bytes[i];
-      byteOr |= byte;
-      bits = ((bits << 8) | byte) & 0xFFFFFF;  // Never store more than 24 bits.
-      expectedChars--;
-      if (expectedChars == 0) {
-        output[outputIndex++] =
-            alphabet.codeUnitAt((bits >> 18) & _sixBitMask);
-        output[outputIndex++] =
-            alphabet.codeUnitAt((bits >> 12) & _sixBitMask);
-        output[outputIndex++] =
-            alphabet.codeUnitAt((bits >> 6) & _sixBitMask);
-        output[outputIndex++] =
-            alphabet.codeUnitAt(bits & _sixBitMask);
-        expectedChars = 3;
-        bits = 0;
-      }
-    }
-    if (byteOr >= 0 && byteOr <= 255) {
-      if (isLast && expectedChars < 3) {
-        writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
-        return 0;
-      }
-      return _encodeState(3 - expectedChars, bits);
-    }
-
-    // There was an invalid byte value somewhere in the input - find it!
-    int i = start;
-    while (i < end) {
-      int byte = bytes[i];
-      if (byte < 0 || byte > 255) break;
-      i++;
-    }
-    throw new ArgumentError.value(bytes,
-        "Not a byte value at index $i: 0x${bytes[i].toRadixString(16)}");
-  }
-
-  /**
-   * Writes a final encoded four-character chunk.
-   *
-   * Only used when the [_state] contains a partial (1 or 2 byte)
-   * input.
-   */
-  static void writeFinalChunk(String alphabet,
-                              Uint8List output, int outputIndex,
-                              int count, int bits) {
-    assert(count > 0);
-    if (count == 1) {
-      output[outputIndex++] =
-          alphabet.codeUnitAt((bits >> 2) & _sixBitMask);
-      output[outputIndex++] =
-          alphabet.codeUnitAt((bits << 4) & _sixBitMask);
-      output[outputIndex++] = _paddingChar;
-      output[outputIndex++] = _paddingChar;
-    } else {
-      assert(count == 2);
-      output[outputIndex++] =
-          alphabet.codeUnitAt((bits >> 10) & _sixBitMask);
-      output[outputIndex++] =
-          alphabet.codeUnitAt((bits >> 4) & _sixBitMask);
-      output[outputIndex++] =
-          alphabet.codeUnitAt((bits << 2) & _sixBitMask);
-      output[outputIndex++] = _paddingChar;
-    }
-  }
-}
-
-class _BufferCachingBase64Encoder extends _Base64Encoder {
-  /**
-   * Reused buffer.
-   *
-   * When the buffer isn't released to the sink, only used to create another
-   * value (a string), the buffer can be reused between chunks.
-   */
-  Uint8List bufferCache;
-
-  _BufferCachingBase64Encoder(bool urlSafe) : super(urlSafe);
-
-  Uint8List createBuffer(int bufferLength) {
-    if (bufferCache == null || bufferCache.length < bufferLength) {
-      bufferCache = new Uint8List(bufferLength);
-    }
-    // Return a view of the buffer, so it has the reuested length.
-    return new Uint8List.view(bufferCache.buffer, 0, bufferLength);
-  }
-}
-
-abstract class _Base64EncoderSink extends ByteConversionSinkBase {
-  void add(List<int> source) {
-    _add(source, 0, source.length, false);
-  }
-
-  void close() {
-    _add(null, 0, 0, true);
-  }
-
-  void addSlice(List<int> source, int start, int end, bool isLast) {
-    if (end == null) throw new ArgumentError.notNull("end");
-    RangeError.checkValidRange(start, end, source.length);
-    _add(source, start, end, isLast);
-  }
-
-  void _add(List<int> source, int start, int end, bool isLast);
-}
-
-class _AsciiBase64EncoderSink extends _Base64EncoderSink {
-  final Sink<String> _sink;
-  final _Base64Encoder _encoder;
-
-  _AsciiBase64EncoderSink(this._sink, bool urlSafe)
-      : _encoder = new _BufferCachingBase64Encoder(urlSafe);
-
-  void _add(List<int> source, int start, int end, bool isLast) {
-    Uint8List buffer = _encoder.encode(source, start, end, isLast);
-    if (buffer != null) {
-      String string = new String.fromCharCodes(buffer);
-      _sink.add(string);
-    }
-    if (isLast) {
-      _sink.close();
-    }
-  }
-}
-
-class _Utf8Base64EncoderSink extends _Base64EncoderSink {
-  final ByteConversionSink _sink;
-  final _Base64Encoder _encoder;
-
-  _Utf8Base64EncoderSink(this._sink, bool urlSafe)
-      : _encoder = new _Base64Encoder(urlSafe);
-
-  void _add(List<int> source, int start, int end, bool isLast) {
-    Uint8List buffer = _encoder.encode(source, start, end, isLast);
-    if (buffer != null) {
-      _sink.addSlice(buffer, 0, buffer.length, isLast);
-    }
-  }
-}
-
-// ------------------------------------------------------------------------
-// Decoder
-// ------------------------------------------------------------------------
-
-/**
- * Decoder for base64 encoded data.
- *
- * This decoder accepts both base64 and base64url ("url-safe") encodings.
- *
- * The encoding is required to be properly padded.
- */
-class Base64Decoder extends Converter<String, List<int>> {
-
-  const Base64Decoder();
-
-  List<int> convert(String input, [int start = 0, int end]) {
-    end = RangeError.checkValidRange(start, end, input.length);
-    if (start == end) return new Uint8List(0);
-    var decoder = new _Base64Decoder();
-    Uint8List buffer = decoder.decode(input, start, end);
-    decoder.close(input, end);
-    return buffer;
-  }
-
-  StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    return new _Base64DecoderSink(sink);
-  }
-}
-
-/**
- * Helper class implementing base64 decoding with intermediate state.
- */
-class _Base64Decoder {
-  /** Shift-count to extract the values stored in [_state]. */
-  static const int _valueShift = 2;
-
-  /** Mask to extract the count value stored in [_state]. */
-  static const int _countMask = 3;
-
-  /** Invalid character in decoding table. */
-  static const int _invalid = -2;
-
-  /** Padding character in decoding table. */
-  static const int _padding = -1;
-
-  // Shorthands to make the table more readable.
-  static const int __ = _invalid;
-  static const int _p = _padding;
-
-  /**
-   * Mapping from ASCII characters to their index in the base64 alphabet.
-   *
-   * Uses [_invalid] for invalid indices and [_padding] for the padding
-   * character.
-   *
-   * Accepts the "URL-safe" alphabet as well (`-` and `_` are the
-   * 62nd and 63rd alphabet characters), and considers `%` a padding
-   * character, which mush then be followed by `3D`, the percent-escape
-   * for `=`.
-   */
-  static final List<int> _inverseAlphabet = new Int8List.fromList([
-    __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
-    __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __,
-    __, __, __, __, __, _p, __, __, __, __, __, 62, __, 62, __, 63,
-    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, __, __, __, _p, __, __,
-    __,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, __, __, __, __, 63,
-    __, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, __, __, __, __,
-  ]);
-
-  // Character constants.
-  static const int _char_percent = 0x25;  // '%'.
-  static const int _char_3       = 0x33;  // '3'.
-  static const int _char_d       = 0x64;  // 'd'.
-
-  /**
-   * Maintains the intermediate state of a partly-decoded input.
-   *
-   * Base64 is decoded in chunks of four characters. If a chunk does not
-   * contain a full block, the decoded bits (six per character) of the
-   * available characters are stored in [_state] until the next call to
-   * [_decode] or [_close].
-   *
-   * If no padding has been seen, the value is
-   *   `numberOfCharactersSeen | (decodedBits << 2)`
-   * where `numberOfCharactersSeen` is between 0 and 3 and decoded bits
-   * contains six bits per seen character.
-   *
-   * If padding has been seen the value is negative. It's the bitwise negation
-   * of the number of remanining allowed padding characters (always ~0 or ~1).
-   *
-   * A state of `0` or `~0` are valid places to end decoding, all other values
-   * mean that a four-character block has not been completed.
-   */
-  int _state = 0;
-
-  /**
-   * Encodes [count] and [bits] as a value to be stored in [_state].
-   */
-  static int _encodeCharacterState(int count, int bits) {
-    assert(count == (count & _countMask));
-    return (bits << _valueShift | count);
-  }
-
-  /**
-   * Extracts count from a [_state] value.
-   */
-  static int _stateCount(int state) {
-    assert(state >= 0);
-    return state & _countMask;
-  }
-
-  /**
-   * Extracts value bits from a [_state] value.
-   */
-  static int _stateBits(int state) {
-    assert(state >= 0);
-    return state >> _valueShift;
-  }
-
-  /**
-   * Encodes a number of expected padding characters to be stored in [_state].
-   */
-  static int _encodePaddingState(int expectedPadding) {
-    assert(expectedPadding >= 0);
-    assert(expectedPadding <= 5);
-    return -expectedPadding - 1;  // ~expectedPadding adapted to dart2js.
-  }
-
-  /**
-   * Extracts expected padding character count from a [_state] value.
-   */
-  static int _statePadding(int state) {
-    assert(state < 0);
-    return -state - 1;  // ~state adapted to dart2js.
-  }
-
-  static bool _hasSeenPadding(int state) => state < 0;
-
-  /**
-   * Decodes [input] from [start] to [end].
-   *
-   * Returns a [Uint8List] with the decoded bytes.
-   * If a previous call had an incomplete four-character block, the bits from
-   * those are included in decoding
-   */
-  Uint8List decode(String input, int start, int end) {
-    assert(0 <= start);
-    assert(start <= end);
-    assert(end <= input.length);
-    if (_hasSeenPadding(_state)) {
-      _state = _checkPadding(input, start, end, _state);
-      return null;
-    }
-    if (start == end) return new Uint8List(0);
-    Uint8List buffer = _allocateBuffer(input, start, end, _state);
-    _state = decodeChunk(input, start, end, buffer, 0, _state);
-    return buffer;
-  }
-
-  /** Checks that [_state] represents a valid decoding. */
-  void close(String input, int end) {
-    if (_state < _encodePaddingState(0)) {
-      throw new FormatException("Missing padding character", input, end);
-    }
-    if (_state > 0) {
-      throw new FormatException("Invalid length, must be multiple of four",
-                                input, end);
-    }
-    _state = _encodePaddingState(0);
-  }
-
-  /**
-   * Decodes [input] from [start] to [end].
-   *
-   * Includes the state returned by a previous call in the decoding.
-   * Writes the decoding to [output] at [outIndex], and there must
-   * be room in the output.
-   */
-  static int decodeChunk(String input, int start, int end,
-                          Uint8List output, int outIndex,
-                          int state) {
-    assert(!_hasSeenPadding(state));
-    const int asciiMask = 127;
-    const int asciiMax = 127;
-    const int eightBitMask = 0xFF;
-    const int bitsPerCharacter = 6;
-
-    int bits = _stateBits(state);
-    int count = _stateCount(state);
-    // String contents should be all ASCII.
-    // Instead of checking for each character, we collect the bitwise-or of
-    // all the characters in `charOr` and later validate that all characters
-    // were ASCII.
-    int charOr = 0;
-    for (int i = start; i < end; i++) {
-      var char = input.codeUnitAt(i);
-      charOr |= char;
-      int code = _inverseAlphabet[char & asciiMask];
-      if (code >= 0) {
-        bits = ((bits << bitsPerCharacter) | code) & 0xFFFFFF;
-        count = (count + 1) & 3;
-        if (count == 0) {
-          assert(outIndex + 3 <= output.length);
-          output[outIndex++] = (bits >> 16) & eightBitMask;
-          output[outIndex++] = (bits >> 8) & eightBitMask;
-          output[outIndex++] = bits & eightBitMask;
-          bits = 0;
-        }
-        continue;
-      } else if (code == _padding && count > 1) {
-        if (charOr < 0 || charOr > asciiMax) break;
-        if (count == 3) {
-          if ((bits & 0x03) != 0) {
-            throw new FormatException(
-                "Invalid encoding before padding", input, i);
-          }
-          output[outIndex++] = bits >> 10;
-          output[outIndex++] = bits >> 2;
-        } else {
-          if ((bits & 0x0F) != 0) {
-            throw new FormatException(
-                "Invalid encoding before padding", input, i);
-          }
-          output[outIndex++] = bits >> 4;
-        }
-        // Expected padding is the number of expected padding characters,
-        // where `=` counts as three and `%3D` counts as one per character.
-        //
-        // Expect either zero or one padding depending on count (2 or 3),
-        // plus two more characters if the code was `%` (a partial padding).
-        int expectedPadding = (3 - count) * 3;
-        if (char == _char_percent) expectedPadding += 2;
-        state = _encodePaddingState(expectedPadding);
-        return _checkPadding(input, i + 1, end, state);
-      }
-      throw new FormatException("Invalid character", input, i);
-    }
-    if (charOr >= 0 && charOr <= asciiMax) {
-      return _encodeCharacterState(count, bits);
-    }
-    // There is an invalid (non-ASCII) character in the input.
-    int i;
-    for (i = start; i < end; i++) {
-      int char = input.codeUnitAt(i);
-      if (char < 0 || char > asciiMax) break;
-    }
-    throw new FormatException("Invalid character", input, i);
-  }
-
-  /**
-   * Allocates a buffer with room for the decoding of a substring of [input].
-   *
-   * Includes room for the characters in [state], and handles padding correctly.
-   */
-  static Uint8List _allocateBuffer(String input, int start, int end,
-                                   int state) {
-    assert(state >= 0);
-    int paddingStart = _trimPaddingChars(input, start, end);
-    int length = _stateCount(state) + (paddingStart - start);
-    // Three bytes per full four bytes in the input.
-    int bufferLength = (length >> 2) * 3;
-    // If padding was seen, then this is the last chunk, and the final partial
-    // chunk should be decoded too.
-    int remainderLength = length & 3;
-    if (remainderLength != 0 && paddingStart < end) {
-      bufferLength += remainderLength - 1;
-    }
-    if (bufferLength > 0) return new Uint8List(bufferLength);
-    // If the input plus state is less than four characters, and it's not
-    // at the end of input, no buffer is needed.
-    return null;
-  }
-
-  /**
-   * Returns the position of the start of padding at the end of the input.
-   *
-   * Returns the end of input if there is no padding.
-   *
-   * This is used to ensure that the decoding buffer has the exact size
-   * it needs when input is valid, and at least enough bytes to reach the error
-   * when input is invalid.
-   *
-   * Never count more than two padding sequences since any more than that
-   * will raise an error anyway, and we only care about being precise for
-   * successful conversions.
-   */
-  static int _trimPaddingChars(String input, int start, int end) {
-    // This may count '%=' as two paddings. That's ok, it will err later,
-    // but the buffer will be large enough to reach the error.
-    int padding = 0;
-    int index = end;
-    int newEnd = end;
-    while (index > start && padding < 2) {
-      index--;
-      int char = input.codeUnitAt(index);
-      if (char == _paddingChar) {
-        padding++;
-        newEnd = index;
-        continue;
-      }
-      if ((char | 0x20) == _char_d) {
-        if (index == start) break;
-        index--;
-        char = input.codeUnitAt(index);
-      }
-      if (char == _char_3) {
-        if (index == start) break;
-        index--;
-        char = input.codeUnitAt(index);
-      }
-      if (char == _char_percent) {
-        padding++;
-        newEnd = index;
-        continue;
-      }
-      break;
-    }
-    return newEnd;
-  }
-
-  /**
-   * Check that the remainder of the string is valid padding.
-   *
-   * Valid padding is a correct number (0, 1 or 2) of `=` characters
-   * or `%3D` sequences depending on the number of preceding base64 characters.
-   * The [state] parameter encodes which padding continuations are allowed
-   * as the number of expected characters. That number is the number of
-   * expected padding characters times 3 minus the number of padding characters
-   * seen so far, where `=` counts as 3 counts as three characters,
-   * and the padding sequence `%3D` counts as one character per character.
-   *
-   * The number of missing characters is always between 0 and 5 because we
-   * only call this function after having seen at least one `=` or `%`
-   * character.
-   * If the number of missing characters is not 3 or 0, we have seen (at least)
-   * a `%` character and expects the rest of the `%3D` sequence, and a `=` is
-   * not allowed. When missing 3 characters, either `=` or `%` is allowed.
-   *
-   * When the value is 0, no more padding (or any other character) is allowed.
-   */
-  static int _checkPadding(String input, int start, int end, int state) {
-    assert(_hasSeenPadding(state));
-    if (start == end) return state;
-    int expectedPadding = _statePadding(state);
-    assert(expectedPadding >= 0);
-    assert(expectedPadding < 6);
-    while (expectedPadding > 0) {
-      int char = input.codeUnitAt(start);
-      if (expectedPadding == 3) {
-        if (char == _paddingChar) {
-          expectedPadding -= 3;
-          start++;
-          break;
-        }
-        if (char == _char_percent) {
-          expectedPadding--;
-          start++;
-          if (start == end) break;
-          char = input.codeUnitAt(start);
-        } else {
-          break;
-        }
-      }
-      // Partial padding means we have seen part of a "%3D" escape.
-      int expectedPartialPadding = expectedPadding;
-      if (expectedPartialPadding > 3) expectedPartialPadding -= 3;
-      if (expectedPartialPadding == 2) {
-        // Expects '3'
-        if (char != _char_3) break;
-        start++;
-        expectedPadding--;
-        if (start == end) break;
-        char = input.codeUnitAt(start);
-      }
-      // Expects 'D' or 'd'.
-      if ((char | 0x20) != _char_d) break;
-      start++;
-      expectedPadding--;
-      if (start == end) break;
-    }
-    if (start != end) {
-      throw new FormatException("Invalid padding character",
-                                input, start);
-    }
-    return _encodePaddingState(expectedPadding);
-  }
-}
-
-class _Base64DecoderSink extends StringConversionSinkBase {
-  /** Output sink */
-  final Sink<List<int>> _sink;
-  final _Base64Decoder _decoder = new _Base64Decoder();
-
-  _Base64DecoderSink(this._sink);
-
-  void add(String string) {
-    if (string.isEmpty) return;
-    Uint8List buffer = _decoder.decode(string, 0, string.length);
-    if (buffer != null) _sink.add(buffer);
-  }
-
-  void close() {
-    _decoder.close(null, null);
-    _sink.close();
-  }
-
-  void addSlice(String string, int start, int end, bool isLast) {
-    end = RangeError.checkValidRange(start, end, string.length);
-    if (start == end) return;
-    Uint8List buffer = _decoder.decode(string, start, end);
-    if (buffer != null) _sink.add(buffer);
-    if (isLast) {
-      _decoder.close(string, end);
-      _sink.close();
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/byte_conversion.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/byte_conversion.dart
deleted file mode 100644
index 4c1ede4..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/byte_conversion.dart
+++ /dev/null
@@ -1,116 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * The [ByteConversionSink] provides an interface for converters to
- * efficiently transmit byte data.
- *
- * Instead of limiting the interface to one non-chunked list of bytes it
- * accepts its input in chunks (themselves being lists of bytes).
- *
- * This abstract class will likely get more methods over time. Implementers are
- * urged to extend or mix in [ByteConversionSinkBase] to ensure that their
- * class covers the newly added methods.
- */
-abstract class ByteConversionSink extends ChunkedConversionSink<List<int>> {
-  ByteConversionSink();
-  factory ByteConversionSink.withCallback(void callback(List<int> accumulated))
-      = _ByteCallbackSink;
-  factory ByteConversionSink.from(Sink<List<int>> sink)
-      = _ByteAdapterSink;
-
-  /**
-   * Adds the next [chunk] to `this`.
-   *
-   * Adds the bytes defined by [start] and [end]-exclusive to `this`.
-   *
-   * If [isLast] is `true` closes `this`.
-   *
-   * Contrary to `add` the given [chunk] must not be held onto. Once the method
-   * returns, it is safe to overwrite the data in it.
-   */
-  void addSlice(List<int> chunk, int start, int end, bool isLast);
-
-  // TODO(floitsch): add more methods:
-  // - iterateBytes.
-}
-
-/**
- * This class provides a base-class for converters that need to accept byte
- * inputs.
- */
-abstract class ByteConversionSinkBase extends ByteConversionSink {
-
-  void add(List<int> chunk);
-  void close();
-
-  void addSlice(List<int> chunk, int start, int end, bool isLast) {
-    add(chunk.sublist(start, end));
-    if (isLast) close();
-  }
-}
-
-/**
- * This class adapts a simple [Sink] to a [ByteConversionSink].
- *
- * All additional methods of the [ByteConversionSink] (compared to the
- * ChunkedConversionSink) are redirected to the `add` method.
- */
-class _ByteAdapterSink extends ByteConversionSinkBase {
-  final Sink<List<int>> _sink;
-
-  _ByteAdapterSink(this._sink);
-
-  void add(List<int> chunk) { _sink.add(chunk); }
-  void close() { _sink.close(); }
-}
-
-/**
- * This class accumulates all chunks into one list of bytes
- * and invokes a callback when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
-class _ByteCallbackSink extends ByteConversionSinkBase {
-  static const _INITIAL_BUFFER_SIZE = 1024;
-
-  final _ChunkedConversionCallback<List<int>> _callback;
-  List<int> _buffer = new Uint8List(_INITIAL_BUFFER_SIZE);
-  int _bufferIndex = 0;
-
-  _ByteCallbackSink(void callback(List<int> accumulated))
-      : this._callback = callback;
-
-  void add(Iterable<int> chunk) {
-    int freeCount = _buffer.length - _bufferIndex;
-    if (chunk.length > freeCount) {
-      // Grow the buffer.
-      int oldLength = _buffer.length;
-      int newLength = _roundToPowerOf2(chunk.length + oldLength) * 2;
-      List<int> grown = new Uint8List(newLength);
-      grown.setRange(0, _buffer.length, _buffer);
-      _buffer = grown;
-    }
-    _buffer.setRange(_bufferIndex, _bufferIndex + chunk.length, chunk);
-    _bufferIndex += chunk.length;
-  }
-
-  static int _roundToPowerOf2(int v) {
-    assert(v > 0);
-    v--;
-    v |= v >> 1;
-    v |= v >> 2;
-    v |= v >> 4;
-    v |= v >> 8;
-    v |= v >> 16;
-    v++;
-    return v;
-  }
-
-  void close() {
-    _callback(_buffer.sublist(0, _bufferIndex));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/chunked_conversion.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/chunked_conversion.dart
deleted file mode 100644
index ee71f4f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/chunked_conversion.dart
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-typedef void _ChunkedConversionCallback<T>(T accumulated);
-
-/// This class is deprecated. Extend [Converter] directly.
-@deprecated
-abstract class ChunkedConverter<S, T, S2, T2> extends Converter<S, T> {
-  const ChunkedConverter(): super();
-
-  dynamic bind(dynamic other) => super.bind(other);
-  dynamic startChunkedConversion(dynamic sink) =>
-      super.startChunkedConversion(sink);
-}
-
-/**
- * A [ChunkedConversionSink] is used to transmit data more efficiently between
- * two converters during chunked conversions.
- *
- * The basic `ChunkedConversionSink` is just a [Sink], and converters should
- * work with a plain `Sink`, but may work more efficiently with certain
- * specialized types of `ChunkedConversionSink`.
- *
- * It is recommended that implementations of `ChunkedConversionSink` extend
- * this class, to inherit any further methods that may be added to the class.
- */
-abstract class ChunkedConversionSink<T> implements Sink<T> {
-  ChunkedConversionSink();
-  factory ChunkedConversionSink.withCallback(
-      void callback(List<T> accumulated)) = _SimpleCallbackSink<T>;
-
-  /**
-   * Adds chunked data to this sink.
-   *
-   * This method is also used when converters are used as [StreamTransformer]s.
-   */
-  void add(T chunk);
-
-  /**
-   * Closes the sink.
-   *
-   * This signals the end of the chunked conversion. This method is called
-   * when converters are used as [StreamTransformer]'s.
-   */
-  void close();
-}
-
-/**
- * This class accumulates all chunks and invokes a callback with a list of
- * the chunks when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
-class _SimpleCallbackSink<T> extends ChunkedConversionSink<T> {
-  final _ChunkedConversionCallback<List<T>> _callback;
-  final List<T> _accumulated = <T>[];
-
-  _SimpleCallbackSink(this._callback);
-
-  void add(T chunk) { _accumulated.add(chunk); }
-  void close() { _callback(_accumulated); }
-}
-
-/**
- * This class implements the logic for a chunked conversion as a
- * stream transformer.
- *
- * It is used as strategy in the [EventTransformStream].
- *
- * It also implements the [ChunkedConversionSink] interface so that it
- * can be used as output sink in a chunked conversion.
- */
-class _ConverterStreamEventSink<S, T> implements EventSink<S> {
-  /** The output sink for the converter. */
-  final EventSink<T> _eventSink;
-
-  /**
-   * The input sink for new data. All data that is received with
-   * [handleData] is added into this sink.
-   */
-  final Sink<S> _chunkedSink;
-
-  _ConverterStreamEventSink(
-      Converter/*=Converter<S, T>*/ converter,
-      EventSink<T> sink)
-      : this._eventSink = sink,
-        _chunkedSink = converter.startChunkedConversion(sink);
-
-  void add(S o) { _chunkedSink.add(o); }
-  void addError(Object error, [StackTrace stackTrace]) {
-    _eventSink.addError(error, stackTrace);
-  }
-  void close() { _chunkedSink.close(); }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/codec.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/codec.dart
deleted file mode 100644
index 7f42c86..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/codec.dart
+++ /dev/null
@@ -1,102 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * A [Codec] encodes and (if supported) decodes data.
- *
- * Codecs can be fused. For example fusing [JSON] and [UTF8] produces
- * an encoder that can convert Json objects directly to bytes, or can decode
- * bytes directly to json objects.
- *
- * Fused codecs generally attempt to optimize the operations and can be faster
- * than executing each step of an encoding separately.
- *
- * *Codecs are still experimental and are subject to change without notice.*
- */
-abstract class Codec<S, T> {
-  const Codec();
-
-  T encode(S input) => encoder.convert(input);
-  S decode(T encoded) => decoder.convert(encoded);
-
-  /**
-   * Returns the encoder from [S] to [T].
-   *
-   * It may be stateful and should not be reused.
-   */
-  Converter<S, T> get encoder;
-  /**
-   * Returns the decoder of `this`, converting from [T] to [S].
-   *
-   * It may be stateful an should not be reused.
-   */
-  Converter<T, S> get decoder;
-
-  /**
-   * Fuses `this` with `other`.
-   *
-   * When encoding, the resulting codec encodes with `this` before
-   * encoding with [other].
-   *
-   * When decoding, the resulting codec decodes with [other] before decoding
-   * with `this`.
-   *
-   * In some cases one needs to use the [inverted] codecs to be able to fuse
-   * them correctly. That is, the output type of `this` ([T]) must match the
-   * input type of the second codec [other].
-   *
-   * Examples:
-   *
-   *     final JSON_TO_BYTES = JSON.fuse(UTF8);
-   *     List<int> bytes = JSON_TO_BYTES.encode(["json-object"]);
-   *     var decoded = JSON_TO_BYTES.decode(bytes);
-   *     assert(decoded is List && decoded[0] == "json-object");
-   *
-   *     var inverted = JSON.inverted;
-   *     var jsonIdentity = JSON.fuse(inverted);
-   *     var jsonObject = jsonIdentity.encode(["1", 2]);
-   *     assert(jsonObject is List && jsonObject[0] == "1" && jsonObject[1] == 2);
-   */
-  // TODO(floitsch): use better example with line-splitter once that one is
-  // in this library.
-  Codec<S, dynamic/*=R*/> fuse/*<R>*/(Codec<T, dynamic/*=R*/> other) {
-    return new _FusedCodec<S, T, dynamic/*=R*/>(this, other);
-  }
-
-  /**
-   * Inverts `this`.
-   *
-   * The [encoder] and [decoder] of the resulting codec are swapped.
-   */
-  Codec<T, S> get inverted => new _InvertedCodec<T, S>(this);
-}
-
-/**
- * Fuses the given codecs.
- *
- * In the non-chunked conversion simply invokes the non-chunked conversions in
- * sequence.
- */
-class _FusedCodec<S, M, T> extends Codec<S, T> {
-  final Codec<S, M> _first;
-  final Codec<M, T> _second;
-
-  Converter<S, T> get encoder => _first.encoder.fuse/*<T>*/(_second.encoder);
-  Converter<T, S> get decoder => _second.decoder.fuse/*<S>*/(_first.decoder);
-
-  _FusedCodec(this._first, this._second);
-}
-
-class _InvertedCodec<T, S> extends Codec<T, S> {
-  final Codec<S, T> _codec;
-
-  _InvertedCodec(Codec<S, T> codec) : _codec = codec;
-
-  Converter<T, S> get encoder => _codec.decoder;
-  Converter<S, T> get decoder => _codec.encoder;
-
-  Codec<S, T> get inverted => _codec;
-}
\ No newline at end of file
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/convert.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/convert.dart
deleted file mode 100644
index 83bbfd6..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/convert.dart
+++ /dev/null
@@ -1,71 +0,0 @@
-// 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.
-
-/**
- *
- * Encoders and decoders for converting between different data representations,
- * including JSON and UTF-8.
- *
- * In addition to converters for common data representations, this library
- * provides support for implementing converters in a way which makes them easy to
- * chain and to use with streams.
- *
- * To use this library in your code:
- *
- *     import 'dart:convert';
- *
- * Two commonly used converters are the top-level instances of
- * [JsonCodec] and [Utf8Codec], named JSON and UTF8, respectively.
- *
- * JSON is a simple text format for representing
- * structured objects and collections.
- * The JSON encoder/decoder transforms between strings and
- * object structures, such as lists and maps, using the JSON format.
- *
- * UTF-8 is a common variable-width encoding that can represent
- * every character in the Unicode character set.
- * The UTF-8 encoder/decoder transforms between Strings and bytes.
- *
- * Converters are often used with streams
- * to transform the data that comes through the stream
- * as it becomes available.
- * The following code uses two converters.
- * The first is a UTF-8 decoder, which converts the data from bytes to UTF-8
- * as it's read from a file,
- * The second is an instance of [LineSplitter],
- * which splits the data on newline boundaries.
- *
- *     int lineNumber = 1;
- *     Stream<List<int>> stream = new File('quotes.txt').openRead();
- *
- *     stream.transform(UTF8.decoder)
- *           .transform(const LineSplitter())
- *           .listen((line) {
- *             if (showLineNumbers) {
- *               stdout.write('${lineNumber++} ');
- *             }
- *             stdout.writeln(line);
- *           });
- *
- * See the documentation for the [Codec] and [Converter] classes
- * for information about creating your own converters.
- */
-library dart.convert;
-
-import 'dart:async';
-import 'dart:typed_data';
-
-part 'ascii.dart';
-part 'base64.dart';
-part 'byte_conversion.dart';
-part 'chunked_conversion.dart';
-part 'codec.dart';
-part 'converter.dart';
-part 'encoding.dart';
-part 'html_escape.dart';
-part 'json.dart';
-part 'latin1.dart';
-part 'line_splitter.dart';
-part 'string_conversion.dart';
-part 'utf.dart';
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/converter.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/converter.dart
deleted file mode 100644
index dfcfcdf..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/converter.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * A [Converter] converts data from one representation into another.
- *
- * It is recommended that implementations of `Converter` extend this class,
- * to inherit any further methods that may be added to the class.
- */
-abstract class Converter<S, T> implements StreamTransformer/*<S, T>*/ {
-  const Converter();
-
-  /**
-   * Converts [input] and returns the result of the conversion.
-   */
-  T convert(S input);
-
-  /**
-   * Fuses `this` with [other].
-   *
-   * Encoding with the resulting converter is equivalent to converting with
-   * `this` before converting with `other`.
-   */
-  Converter<S, dynamic/*=TT*/> fuse/*<TT>*/(
-      Converter<T, dynamic/*=TT*/> other) {
-    return new _FusedConverter<S, T, dynamic/*=TT*/>(this, other);
-  }
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The returned sink serves as input for the long-running conversion. The
-   * given [sink] serves as output.
-   */
-  Sink/*<S>*/ startChunkedConversion(Sink/*<T>*/ sink) {
-    throw new UnsupportedError(
-        "This converter does not support chunked conversions: $this");
-  }
-
-  Stream/*<T>*/ bind(Stream/*<S>*/ stream) {
-    return new Stream/*<T>*/.eventTransformed(
-        stream,
-        (EventSink sink) => new _ConverterStreamEventSink(this, sink));
-  }
-}
-
-/**
- * Fuses two converters.
- *
- * For a non-chunked conversion converts the input in sequence.
- */
-class _FusedConverter<S, M, T> extends Converter<S, T> {
-  final Converter<S, M> _first;
-  final Converter<M, T> _second;
-
-  _FusedConverter(this._first, this._second);
-
-  T convert(S input) => _second.convert(_first.convert(input));
-
-  Sink/*<S>*/ startChunkedConversion(Sink/*<T>*/ sink) {
-    return _first.startChunkedConversion(_second.startChunkedConversion(sink));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/encoding.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/encoding.dart
deleted file mode 100644
index 11ae300..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/encoding.dart
+++ /dev/null
@@ -1,79 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * Open-ended Encoding enum.
- */
-abstract class Encoding extends Codec<String, List<int>> {
-  const Encoding();
-
-  Converter<String, List<int>> get encoder;
-  Converter<List<int>, String> get decoder;
-
-  Future<String> decodeStream(Stream<List<int>> byteStream) {
-    return byteStream
-      .transform(decoder)
-      .fold(new StringBuffer(), (buffer, string) => buffer..write(string))
-      .then((buffer) => buffer.toString());
-  }
-
-  /**
-   * Name of the encoding.
-   *
-   * If the encoding is standardized, this is the lower-case version of one of
-   * the IANA official names for the character set (see
-   * http://www.iana.org/assignments/character-sets/character-sets.xml)
-   */
-  String get name;
-
-  // All aliases (in lowercase) of supported encoding from
-  // http://www.iana.org/assignments/character-sets/character-sets.xml.
-  static Map<String, Encoding> _nameToEncoding = <String, Encoding> {
-    // ISO_8859-1:1987.
-    "iso_8859-1:1987": LATIN1,
-    "iso-ir-100": LATIN1,
-    "iso_8859-1": LATIN1,
-    "iso-8859-1": LATIN1,
-    "latin1": LATIN1,
-    "l1": LATIN1,
-    "ibm819": LATIN1,
-    "cp819": LATIN1,
-    "csisolatin1": LATIN1,
-
-    // US-ASCII.
-    "iso-ir-6": ASCII,
-    "ansi_x3.4-1968": ASCII,
-    "ansi_x3.4-1986": ASCII,
-    "iso_646.irv:1991": ASCII,
-    "iso646-us": ASCII,
-    "us-ascii": ASCII,
-    "us": ASCII,
-    "ibm367": ASCII,
-    "cp367": ASCII,
-    "csascii": ASCII,
-    "ascii": ASCII,  // This is not in the IANA official names.
-
-    // UTF-8.
-    "csutf8": UTF8,
-    "utf-8": UTF8
-  };
-
-  /**
-  * Gets an [Encoding] object from the name of the character set
-  * name. The names used are the IANA official names for the
-  * character set (see
-  * http://www.iana.org/assignments/character-sets/character-sets.xml).
-  *
-  * The [name] passed is case insensitive.
-  *
-  * If character set is not supported [:null:] is returned.
-  */
-  static Encoding getByName(String name) {
-    if (name == null) return null;
-    name = name.toLowerCase();
-    return _nameToEncoding[name];
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/html_escape.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/html_escape.dart
deleted file mode 100644
index ff74442..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/html_escape.dart
+++ /dev/null
@@ -1,231 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * A `String` converter that converts characters to HTML entities.
- *
- * This is intended to sanitice text before inserting the text into an HTML
- * document. Characters that are meaningful in HTML are converted to
- * HTML entities (like `&amp;` for `&`).
- *
- * The general converter escapes all characters that are meaningful in HTML
- * attributes or normal element context. Elements with special content types
- * (like CSS or JavaScript) may need a more specialized escaping that
- * understands that content type.
- *
- * If the context where the text will be inserted is known in more detail,
- * it's possible to omit escaping some characters (like quotes when not
- * inside an attribute value).
- *
- * The escaped text should only be used inside quoted HTML attributes values
- * or as text content of a normal element. Using the escaped text inside a
- * tag, but not inside a quoted attribute value, is still dangerous.
- */
-const HtmlEscape HTML_ESCAPE = const HtmlEscape();
-
-/**
- * HTML escape modes.
- *
- * Allows specifying a mode for HTML escaping that depend on the context
- * where the escaped result is going to be used.
- * The relevant contexts are:
- *
- * * as text content of an HTML element.
- * * as value of a (single- or double-) quoted attribute value.
- *
- * All modes require escaping of `&` (ampersand) characters, and may
- * enable escaping of more characters.
- *
- * Custom escape modes can be created using the [HtmlEscapeMode.HtmlEscapeMode]
- * constructor.
- */
-class HtmlEscapeMode {
-  final String _name;
-  /** Whether to escape '<' and '>'. */
-  final bool escapeLtGt;
-  /** Whether to escape '"' (quote). */
-  final bool escapeQuot;
-  /** Whether to escape "'" (apostrophe). */
-  final bool escapeApos;
-  /**
-   * Whether to escape "/" (forward slash, solidus).
-   *
-   * Escaping a slash is recommended to avoid cross-site scripting attacks by
-   * [the Open Web Application Security Project](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet#RULE_.231_-_HTML_Escape_Before_Inserting_Untrusted_Data_into_HTML_Element_Content)
-   */
-  final bool escapeSlash;
-
-  /**
-   * Default escaping mode which escape all characters.
-   *
-   * The result of such an escaping is usable both in element content and
-   * in any attribute value.
-   *
-   * The escaping only works for elements with normal HTML content,
-   * and not for, for example, script or style element content,
-   * which require escapes matching their particular content syntax.
-   */
-  static const HtmlEscapeMode UNKNOWN =
-      const HtmlEscapeMode._('unknown', true, true, true, true);
-
-  /**
-   * Escaping mode for text going into double-quoted HTML attribute values.
-   *
-   * The result should not be used as the content of an unquoted
-   * or single-quoted attribute value.
-   *
-   * Escapes double quotes (`"`) but not single quotes (`'`),
-   * and escapes `<` and `>` characters because they are not allowed
-   * in strict XHTML attributes
-   */
-  static const HtmlEscapeMode ATTRIBUTE =
-      const HtmlEscapeMode._('attribute', true, true, false, false);
-
-  /**
-   * Escaping mode for text going into single-quoted HTML attribute values.
-   *
-   * The result should not be used as the content of an unquoted
-   * or double-quoted attribute value.
-   *
-   * Escapes single quotes (`'`) but not double quotes (`"`),
-   * and escapes `<` and `>` characters because they are not allowed
-   * in strict XHTML attributes
-   */
-  static const HtmlEscapeMode SQ_ATTRIBUTE =
-      const HtmlEscapeMode._('attribute', true, false, true, false);
-
-  /**
-   * Escaping mode for text going into HTML element content.
-   *
-   * The escaping only works for elements with normal HTML content,
-   * and not for, for example, script or style element content,
-   * which require escapes matching their particular content syntax.
-   *
-   * Escapes `<` and `>` characters.
-   */
-  static const HtmlEscapeMode ELEMENT =
-      const HtmlEscapeMode._('element', true, false, false, false);
-
-  const HtmlEscapeMode._(this._name,
-                         this.escapeLtGt,
-                         this.escapeQuot,
-                         this.escapeApos,
-                         this.escapeSlash);
-
-  /**
-   * Create a custom escaping mode.
-   *
-   * All modes escape `&`.
-   * The mode can further be set to escape `<` and `>` ([escapeLtGt]),
-   * `"` ([escapeQuot]), `'` ([escapeApos]), and/or `/` ([escapeSlash]).
-   */
-  const HtmlEscapeMode({String name: "custom",
-                        this.escapeLtGt: false,
-                        this.escapeQuot: false,
-                        this.escapeApos: false,
-                        this.escapeSlash: false}) : _name = name;
-
-  String toString() => _name;
-}
-
-/**
- * Converter which escapes characters with special meaning in HTML.
- *
- * The converter finds characters that are siginificant in HTML source and
- * replaces them with corresponding HTML entities.
- *
- * The characters that need escaping in HTML are:
- *
- * * `&` (ampersand) always need to be escaped.
- * * `<` (less than) and '>' (greater than) when inside an element.
- * * `"` (quote) when inside a double-quoted attribute value.
- * * `'` (apostrophe) when inside a single-quoted attribute value.
- *       Apostrophe is escaped as `&#39;` instead of `&apos;` since
- *       not all browsers understand `&apos;`.
- * * `/` (slash) is recommended to be escaped because it may be used
- *       to terminate an element in some HTML dialects.
- *
- * Escaping `>` (greater than) isn't necessary, but the result is often
- * found to be easier to read if greater-than is also escaped whenever
- * less-than is.
- */
-class HtmlEscape extends Converter<String, String> {
-
-  /** The [HtmlEscapeMode] used by the converter. */
-  final HtmlEscapeMode mode;
-
-  /**
-   * Create converter that escapes HTML characters.
-   *
-   * If [mode] is provided as either [HtmlEscapeMode.ATTRIBUTE] or
-   * [HtmlEscapeMode.ELEMENT], only the corresponding subset of HTML
-   * characters are escaped.
-   * The default is to escape all HTML characters.
-   */
-  const HtmlEscape([this.mode = HtmlEscapeMode.UNKNOWN]);
-
-  String convert(String text) {
-    var val = _convert(text, 0, text.length);
-    return val == null ? text : val;
-  }
-
-  /**
-   * Converts the substring of text from start to end.
-   *
-   * Returns `null` if no changes were necessary, otherwise returns
-   * the converted string.
-   */
-  String _convert(String text, int start, int end) {
-    StringBuffer result = null;
-    for (int i = start; i < end; i++) {
-      var ch = text[i];
-      String replacement = null;
-      switch (ch) {
-        case '&': replacement = '&amp;'; break;
-        case '"': if (mode.escapeQuot) replacement = '&quot;'; break;
-        case "'": if (mode.escapeApos) replacement = '&#39;'; break;
-        case '<': if (mode.escapeLtGt) replacement = '&lt;'; break;
-        case '>': if (mode.escapeLtGt) replacement = '&gt;'; break;
-        case '/': if (mode.escapeSlash) replacement = '&#47;'; break;
-      }
-      if (replacement != null) {
-        if (result == null) result = new StringBuffer();
-        if (i > start) result.write(text.substring(start, i));
-        result.write(replacement);
-        start = i + 1;
-      }
-    }
-    if (result == null) return null;
-    if (end > start) result.write(text.substring(start, end));
-    return result.toString();
-  }
-
-  StringConversionSink startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    }
-    return new _HtmlEscapeSink(this, sink);
-  }
-}
-
-class _HtmlEscapeSink extends StringConversionSinkBase {
-  final HtmlEscape _escape;
-  final StringConversionSink _sink;
-
-  _HtmlEscapeSink(this._escape, this._sink);
-
-  void addSlice(String chunk, int start, int end, bool isLast) {
-    var val = _escape._convert(chunk, start, end);
-    if(val == null) {
-      _sink.addSlice(chunk, start, end, isLast);
-    } else {
-      _sink.add(val);
-      if (isLast) _sink.close();
-    }
-  }
-
-  void close() { _sink.close(); }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/json.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/json.dart
deleted file mode 100644
index 24931df..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/json.dart
+++ /dev/null
@@ -1,1064 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * Error thrown by JSON serialization if an object cannot be serialized.
- *
- * The [unsupportedObject] field holds that object that failed to be serialized.
- *
- * If an object isn't directly serializable, the serializer calls the `toJson`
- * method on the object. If that call fails, the error will be stored in the
- * [cause] field. If the call returns an object that isn't directly
- * serializable, the [cause] is null.
- */
-class JsonUnsupportedObjectError extends Error {
-  /** The object that could not be serialized. */
-  final unsupportedObject;
-  /** The exception thrown when trying to convert the object. */
-  final cause;
-
-  JsonUnsupportedObjectError(this.unsupportedObject, { this.cause });
-
-  String toString() {
-    if (cause != null) {
-      return "Converting object to an encodable object failed.";
-    } else {
-      return "Converting object did not return an encodable object.";
-    }
-  }
-}
-
-
-/**
- * Reports that an object could not be stringified due to cyclic references.
- *
- * An object that references itself cannot be serialized by [stringify].
- * When the cycle is detected, a [JsonCyclicError] is thrown.
- */
-class JsonCyclicError extends JsonUnsupportedObjectError {
-  /** The first object that was detected as part of a cycle. */
-  JsonCyclicError(Object object): super(object);
-  String toString() => "Cyclic error in JSON stringify";
-}
-
-
-/**
- * An instance of the default implementation of the [JsonCodec].
- *
- * This instance provides a convenient access to the most common JSON
- * use cases.
- *
- * Examples:
- *
- *     var encoded = JSON.encode([1, 2, { "a": null }]);
- *     var decoded = JSON.decode('["foo", { "bar": 499 }]');
- */
-const JsonCodec JSON = const JsonCodec();
-
-typedef _Reviver(var key, var value);
-typedef _ToEncodable(var o);
-
-
-/**
- * A [JsonCodec] encodes JSON objects to strings and decodes strings to
- * JSON objects.
- *
- * Examples:
- *
- *     var encoded = JSON.encode([1, 2, { "a": null }]);
- *     var decoded = JSON.decode('["foo", { "bar": 499 }]');
- */
-class JsonCodec extends Codec<Object, String> {
-  final _Reviver _reviver;
-  final _ToEncodable _toEncodable;
-
-  /**
-   * Creates a `JsonCodec` with the given reviver and encoding function.
-   *
-   * The [reviver] function is called during decoding. It is invoked once for
-   * each object or list property that has been parsed.
-   * The `key` argument is either the integer list index for a list property,
-   * the string map key for object properties, or `null` for the final result.
-   *
-   * If [reviver] is omitted, it defaults to returning the value argument.
-   *
-   * The [toEncodable] function is used during encoding. It is invoked for
-   * values that are not directly encodable to a string (a value that is not a
-   * number, boolean, string, null, list or a map with string keys). The
-   * function must return an object that is directly encodable. The elements of
-   * a returned list and values of a returned map do not need to be directly
-   * encodable, and if they aren't, `toEncodable` will be used on them as well.
-   * Please notice that it is possible to cause an infinite recursive regress
-   * in this way, by effectively creating an infinite data structure through
-   * repeated call to `toEncodable`.
-   *
-   * If [toEncodable] is omitted, it defaults to a function that returns the
-   * result of calling `.toJson()` on the unencodable object.
-   */
-  const JsonCodec({reviver(var key, var value), toEncodable(var object)})
-      : _reviver = reviver,
-        _toEncodable = toEncodable;
-
-  /**
-   * Creates a `JsonCodec` with the given reviver.
-   *
-   * The [reviver] function is called once for each object or list property
-   * that has been parsed during decoding. The `key` argument is either the
-   * integer list index for a list property, the string map key for object
-   * properties, or `null` for the final result.
-   */
-  JsonCodec.withReviver(reviver(var key, var value)) : this(reviver: reviver);
-
-  /**
-   * Parses the string and returns the resulting Json object.
-   *
-   * The optional [reviver] function is called once for each object or list
-   * property that has been parsed during decoding. The `key` argument is either
-   * the integer list index for a list property, the string map key for object
-   * properties, or `null` for the final result.
-   *
-   * The default [reviver] (when not provided) is the identity function.
-   */
-  dynamic decode(String source, {reviver(var key, var value)}) {
-    if (reviver == null) reviver = _reviver;
-    if (reviver == null) return decoder.convert(source);
-    return new JsonDecoder(reviver).convert(source);
-  }
-
-  /**
-   * Converts [value] to a JSON string.
-   *
-   * If value contains objects that are not directly encodable to a JSON
-   * string (a value that is not a number, boolean, string, null, list or a map
-   * with string keys), the [toEncodable] function is used to convert it to an
-   * object that must be directly encodable.
-   *
-   * If [toEncodable] is omitted, it defaults to a function that returns the
-   * result of calling `.toJson()` on the unencodable object.
-   */
-  String encode(Object value, {toEncodable(object)}) {
-    if (toEncodable == null) toEncodable = _toEncodable;
-    if (toEncodable == null) return encoder.convert(value);
-    return new JsonEncoder(toEncodable).convert(value);
-  }
-
-  JsonEncoder get encoder {
-    if (_toEncodable == null) return const JsonEncoder();
-    return new JsonEncoder(_toEncodable);
-  }
-
-  JsonDecoder get decoder {
-    if (_reviver == null) return const JsonDecoder();
-    return new JsonDecoder(_reviver);
-  }
-}
-
-/**
- * This class converts JSON objects to strings.
- */
-class JsonEncoder extends Converter<Object, String> {
-  /**
-   * The string used for indention.
-   *
-   * When generating multi-line output, this string is inserted once at the
-   * beginning of each indented line for each level of indentation.
-   *
-   * If `null`, the output is encoded as a single line.
-   */
-  final String indent;
-
-  /**
-   * Function called on non-encodable objects to return a replacement
-   * encodable object that will be encoded in the orignal's place.
-   */
-  final _ToEncodable _toEncodable;
-
-  /**
-   * Creates a JSON encoder.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an
-   * object that is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
-   * the object.
-   */
-  const JsonEncoder([toEncodable(nonSerializable)])
-      : this.indent = null,
-        this._toEncodable = toEncodable;
-
-  /**
-   * Creates a JSON encoder that creates multi-line JSON.
-   *
-   * The encoding of elements of lists and maps are indented and put on separate
-   * lines. The [indent] string is prepended to these elements, once for each
-   * level of indentation.
-   *
-   * If [indent] is `null`, the output is encoded as a single line.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and
-   * maps directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an
-   * object that is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
-   * the object.
-   */
-  const JsonEncoder.withIndent(this.indent, [toEncodable(nonSerializable)])
-      : this._toEncodable = toEncodable;
-
-  /**
-   * Converts [object] to a JSON [String].
-   *
-   * Directly serializable values are [num], [String], [bool], and [Null], as
-   * well as some [List] and [Map] values. For [List], the elements must all be
-   * serializable. For [Map], the keys must be [String] and the values must be
-   * serializable.
-   *
-   * If a value of any other type is attempted to be serialized, the
-   * `toEncodable` function provided in the constructor is called with the value
-   * as argument. The result, which must be a directly serializable value, is
-   * serialized instead of the original value.
-   *
-   * If the conversion throws, or returns a value that is not directly
-   * serializable, a [JsonUnsupportedObjectError] exception is thrown.
-   * If the call throws, the error is caught and stored in the
-   * [JsonUnsupportedObjectError]'s [:cause:] field.
-   *
-   * If a [List] or [Map] contains a reference to itself, directly or through
-   * other lists or maps, it cannot be serialized and a [JsonCyclicError] is
-   * thrown.
-   *
-   * [object] should not change during serialization.
-   *
-   * If an object is serialized more than once, [convert] may cache the text
-   * for it. In other words, if the content of an object changes after it is
-   * first serialized, the new values may not be reflected in the result.
-   */
-  String convert(Object object) =>
-      _JsonStringStringifier.stringify(object, _toEncodable, indent);
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   *
-   * Returns a chunked-conversion sink that accepts at most one object. It is
-   * an error to invoke `add` more than once on the returned sink.
-   */
-  ChunkedConversionSink<Object> startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    } else if (sink is _Utf8EncoderSink) {
-      return new _JsonUtf8EncoderSink(sink._sink, _toEncodable,
-                                      JsonUtf8Encoder._utf8Encode(indent),
-                                      JsonUtf8Encoder.DEFAULT_BUFFER_SIZE);
-    }
-    return new _JsonEncoderSink(sink, _toEncodable, indent);
-  }
-
-  // Override the base class's bind, to provide a better type.
-  Stream<String> bind(Stream<Object> stream) => super.bind(stream);
-
-  Converter<Object, dynamic/*=T*/> fuse/*<T>*/(
-      Converter<String, dynamic/*=T*/> other) {
-    if (other is Utf8Encoder) {
-      return new JsonUtf8Encoder(indent, _toEncodable)
-          as dynamic/*=Converter<Object, T>*/;
-    }
-    return super.fuse/*<T>*/(other);
-  }
-}
-
-/**
- * Encoder that encodes a single object as a UTF-8 encoded JSON string.
- *
- * This encoder works equivalently to first converting the object to
- * a JSON string, and then UTF-8 encoding the string, but without
- * creating an intermediate string.
- */
-class JsonUtf8Encoder extends Converter<Object, List<int>> {
-  /** Default buffer size used by the JSON-to-UTF-8 encoder. */
-  static const int DEFAULT_BUFFER_SIZE = 256;
-  /** Indentation used in pretty-print mode, `null` if not pretty. */
-  final List<int> _indent;
-  /** Function called with each un-encodable object encountered. */
-  final _ToEncodable _toEncodable;
-  /** UTF-8 buffer size. */
-  final int _bufferSize;
-
-  /**
-   * Create converter.
-   *
-   * If [indent] is non-`null`, the converter attempts to "pretty-print" the
-   * JSON, and uses `indent` as the indentation. Otherwise the result has no
-   * whitespace outside of string literals.
-   * If `indent` contains characters that are not valid JSON whitespace
-   * characters, the result will not be valid JSON. JSON whitespace characters
-   * are space (U+0020), tab (U+0009), line feed (U+000a) and carriage return
-   * (U+000d) ([ECMA
-   * 404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)).
-   *
-   * The [bufferSize] is the size of the internal buffers used to collect
-   * UTF-8 code units.
-   * If using [startChunkedConversion], it will be the size of the chunks.
-   *
-   * The JSON encoder handles numbers, strings, booleans, null, lists and maps
-   * directly.
-   *
-   * Any other object is attempted converted by [toEncodable] to an object that
-   * is of one of the convertible types.
-   *
-   * If [toEncodable] is omitted, it defaults to calling `.toJson()` on the
-   * object.
-   */
-  JsonUtf8Encoder([String indent,
-                   toEncodable(object),
-                   int bufferSize = DEFAULT_BUFFER_SIZE])
-      : _indent = _utf8Encode(indent),
-        _toEncodable = toEncodable,
-        _bufferSize = bufferSize;
-
-  static List<int> _utf8Encode(String string) {
-    if (string == null) return null;
-    if (string.isEmpty) return new Uint8List(0);
-    checkAscii: {
-      for (int i = 0; i < string.length; i++) {
-        if (string.codeUnitAt(i) >= 0x80) break checkAscii;
-      }
-      return string.codeUnits;
-    }
-    return UTF8.encode(string);
-  }
-
-  /** Convert [object] into UTF-8 encoded JSON. */
-  List<int> convert(Object object) {
-    List<List<int>> bytes = [];
-    // The `stringify` function always converts into chunks.
-    // Collect the chunks into the `bytes` list, then combine them afterwards.
-    void addChunk(Uint8List chunk, int start, int end) {
-      if (start > 0 || end < chunk.length) {
-        int length = end - start;
-        chunk = new Uint8List.view(chunk.buffer,
-                                   chunk.offsetInBytes + start,
-                                   length);
-      }
-      bytes.add(chunk);
-    }
-    _JsonUtf8Stringifier.stringify(object,
-                                   _indent,
-                                   _toEncodable,
-                                   _bufferSize,
-                                   addChunk);
-    if (bytes.length == 1) return bytes[0];
-    int length = 0;
-    for (int i = 0; i < bytes.length; i++) {
-      length += bytes[i].length;
-    }
-    Uint8List result = new Uint8List(length);
-    for (int i = 0, offset = 0; i < bytes.length; i++) {
-      var byteList = bytes[i];
-      int end = offset + byteList.length;
-      result.setRange(offset, end, byteList);
-      offset = end;
-    }
-    return result;
-  }
-
-  /**
-   * Start a chunked conversion.
-   *
-   * Only one object can be passed into the returned sink.
-   *
-   * The argument [sink] will receive byte lists in sizes depending on the
-   * `bufferSize` passed to the constructor when creating this encoder.
-   */
-  ChunkedConversionSink<Object> startChunkedConversion(Sink<List<int>> sink) {
-    ByteConversionSink byteSink;
-    if (sink is ByteConversionSink) {
-      byteSink = sink;
-    } else {
-      byteSink = new ByteConversionSink.from(sink);
-    }
-    return new _JsonUtf8EncoderSink(byteSink, _toEncodable,
-                                    _indent, _bufferSize);
-  }
-
-  // Override the base class's bind, to provide a better type.
-  Stream<List<int>> bind(Stream<Object> stream) {
-    return super.bind(stream);
-  }
-}
-
-/**
- * Implements the chunked conversion from object to its JSON representation.
- *
- * The sink only accepts one value, but will produce output in a chunked way.
- */
-class _JsonEncoderSink extends ChunkedConversionSink<Object> {
-  final String _indent;
-  final _ToEncodable _toEncodable;
-  final StringConversionSink _sink;
-  bool _isDone = false;
-
-  _JsonEncoderSink(this._sink, this._toEncodable, this._indent);
-
-  /**
-   * Encodes the given object [o].
-   *
-   * It is an error to invoke this method more than once on any instance. While
-   * this makes the input effectly non-chunked the output will be generated in
-   * a chunked way.
-   */
-  void add(Object o) {
-    if (_isDone) {
-      throw new StateError("Only one call to add allowed");
-    }
-    _isDone = true;
-    ClosableStringSink stringSink = _sink.asStringSink();
-    _JsonStringStringifier.printOn(o, stringSink, _toEncodable, _indent);
-    stringSink.close();
-  }
-
-  void close() { /* do nothing */ }
-}
-
-/**
- * Sink returned when starting a chunked conversion from object to bytes.
- */
-class _JsonUtf8EncoderSink extends ChunkedConversionSink<Object> {
-  /** The byte sink receiveing the encoded chunks. */
-  final ByteConversionSink _sink;
-  final List<int> _indent;
-  final _ToEncodable _toEncodable;
-  final int _bufferSize;
-  bool _isDone = false;
-  _JsonUtf8EncoderSink(this._sink, this._toEncodable, this._indent,
-                       this._bufferSize);
-
-  /** Callback called for each slice of result bytes. */
-  void _addChunk(Uint8List chunk, int start, int end) {
-    _sink.addSlice(chunk, start, end, false);
-  }
-
-  void add(Object object) {
-    if (_isDone) {
-      throw new StateError("Only one call to add allowed");
-    }
-    _isDone = true;
-    _JsonUtf8Stringifier.stringify(object, _indent, _toEncodable,
-                                   _bufferSize,
-                                   _addChunk);
-    _sink.close();
-  }
-
-  void close() {
-    if (!_isDone) {
-      _isDone = true;
-      _sink.close();
-    }
-  }
-}
-
-/**
- * This class parses JSON strings and builds the corresponding objects.
- */
-class JsonDecoder extends Converter<String, Object> {
-  final _Reviver _reviver;
-  /**
-   * Constructs a new JsonDecoder.
-   *
-   * The [reviver] may be `null`.
-   */
-  const JsonDecoder([reviver(var key, var value)]) : this._reviver = reviver;
-
-  /**
-   * Converts the given JSON-string [input] to its corresponding object.
-   *
-   * Parsed JSON values are of the types [num], [String], [bool], [Null],
-   * [List]s of parsed JSON values or [Map]s from [String] to parsed JSON
-   * values.
-   *
-   * If `this` was initialized with a reviver, then the parsing operation
-   * invokes the reviver on every object or list property that has been parsed.
-   * The arguments are the property name ([String]) or list index ([int]), and
-   * the value is the parsed value. The return value of the reviver is used as
-   * the value of that property instead the parsed value.
-   *
-   * Throws [FormatException] if the input is not valid JSON text.
-   */
-  dynamic convert(String input) => _parseJson(input, _reviver);
-
-  /**
-   * Starts a conversion from a chunked JSON string to its corresponding object.
-   *
-   * The output [sink] receives exactly one decoded element through `add`.
-   */
-  external StringConversionSink startChunkedConversion(Sink<Object> sink);
-
-  // Override the base class's bind, to provide a better type.
-  Stream<Object> bind(Stream<String> stream) => super.bind(stream);
-}
-
-// Internal optimized JSON parsing implementation.
-external _parseJson(String source, reviver(key, value));
-
-
-// Implementation of encoder/stringifier.
-
-dynamic _defaultToEncodable(dynamic object) => object.toJson();
-
-/**
- * JSON encoder that traverses an object structure and writes JSON source.
- *
- * This is an abstract implementation that doesn't decide on the output
- * format, but writes the JSON through abstract methods like [writeString].
- */
-abstract class _JsonStringifier {
-  // Character code constants.
-  static const int BACKSPACE       = 0x08;
-  static const int TAB             = 0x09;
-  static const int NEWLINE         = 0x0a;
-  static const int CARRIAGE_RETURN = 0x0d;
-  static const int FORM_FEED       = 0x0c;
-  static const int QUOTE           = 0x22;
-  static const int CHAR_0          = 0x30;
-  static const int BACKSLASH       = 0x5c;
-  static const int CHAR_b          = 0x62;
-  static const int CHAR_f          = 0x66;
-  static const int CHAR_n          = 0x6e;
-  static const int CHAR_r          = 0x72;
-  static const int CHAR_t          = 0x74;
-  static const int CHAR_u          = 0x75;
-
-  /** List of objects currently being traversed. Used to detect cycles. */
-  final List _seen = new List();
-  /** Function called for each un-encodable object encountered. */
-  final _ToEncodable _toEncodable;
-
-  _JsonStringifier(toEncodable(o))
-      : _toEncodable = toEncodable ?? _defaultToEncodable;
-
-  /** Append a string to the JSON output. */
-  void writeString(String characters);
-  /** Append part of a string to the JSON output. */
-  void writeStringSlice(String characters, int start, int end);
-  /** Append a single character, given by its code point, to the JSON output. */
-  void writeCharCode(int charCode);
-  /** Write a number to the JSON output. */
-  void writeNumber(num number);
-
-  // ('0' + x) or ('a' + x - 10)
-  static int hexDigit(int x) => x < 10 ? 48 + x : 87 + x;
-
-  /**
-   * Write, and suitably escape, a string's content as a JSON string literal.
-   */
-  void writeStringContent(String s) {
-    int offset = 0;
-    final int length = s.length;
-    for (int i = 0; i < length; i++) {
-      int charCode = s.codeUnitAt(i);
-      if (charCode > BACKSLASH) continue;
-      if (charCode < 32) {
-        if (i > offset) writeStringSlice(s, offset, i);
-        offset = i + 1;
-        writeCharCode(BACKSLASH);
-        switch (charCode) {
-        case BACKSPACE:
-          writeCharCode(CHAR_b);
-          break;
-        case TAB:
-          writeCharCode(CHAR_t);
-          break;
-        case NEWLINE:
-          writeCharCode(CHAR_n);
-          break;
-        case FORM_FEED:
-          writeCharCode(CHAR_f);
-          break;
-        case CARRIAGE_RETURN:
-          writeCharCode(CHAR_r);
-          break;
-        default:
-          writeCharCode(CHAR_u);
-          writeCharCode(CHAR_0);
-          writeCharCode(CHAR_0);
-          writeCharCode(hexDigit((charCode >> 4) & 0xf));
-          writeCharCode(hexDigit(charCode & 0xf));
-          break;
-        }
-      } else if (charCode == QUOTE || charCode == BACKSLASH) {
-        if (i > offset) writeStringSlice(s, offset, i);
-        offset = i + 1;
-        writeCharCode(BACKSLASH);
-        writeCharCode(charCode);
-      }
-    }
-    if (offset == 0) {
-      writeString(s);
-    } else if (offset < length) {
-      writeStringSlice(s, offset, length);
-    }
-  }
-
-  /**
-   * Check if an encountered object is already being traversed.
-   *
-   * Records the object if it isn't already seen. Should have a matching call to
-   * [_removeSeen] when the object is no longer being traversed.
-   */
-  void _checkCycle(object) {
-    for (int i = 0; i < _seen.length; i++) {
-      if (identical(object, _seen[i])) {
-        throw new JsonCyclicError(object);
-      }
-    }
-    _seen.add(object);
-  }
-
-  /**
-   * Remove [object] from the list of currently traversed objects.
-   *
-   * Should be called in the opposite order of the matching [_checkCycle]
-   * calls.
-   */
-  void _removeSeen(object) {
-    assert(!_seen.isEmpty);
-    assert(identical(_seen.last, object));
-    _seen.removeLast();
-  }
-
-  /**
-   * Write an object.
-   *
-   * If [object] isn't directly encodable, the [_toEncodable] function gets one
-   * chance to return a replacement which is encodable.
-   */
-  void writeObject(object) {
-    // Tries stringifying object directly. If it's not a simple value, List or
-    // Map, call toJson() to get a custom representation and try serializing
-    // that.
-    if (writeJsonValue(object)) return;
-    _checkCycle(object);
-    try {
-      var customJson = _toEncodable(object);
-      if (!writeJsonValue(customJson)) {
-        throw new JsonUnsupportedObjectError(object);
-      }
-      _removeSeen(object);
-    } catch (e) {
-      throw new JsonUnsupportedObjectError(object, cause: e);
-    }
-  }
-
-  /**
-   * Serialize a [num], [String], [bool], [Null], [List] or [Map] value.
-   *
-   * Returns true if the value is one of these types, and false if not.
-   * If a value is both a [List] and a [Map], it's serialized as a [List].
-   */
-  bool writeJsonValue(object) {
-    if (object is num) {
-      if (!object.isFinite) return false;
-      writeNumber(object);
-      return true;
-    } else if (identical(object, true)) {
-      writeString('true');
-      return true;
-    } else if (identical(object, false)) {
-      writeString('false');
-       return true;
-    } else if (object == null) {
-      writeString('null');
-      return true;
-    } else if (object is String) {
-      writeString('"');
-      writeStringContent(object);
-      writeString('"');
-      return true;
-    } else if (object is List) {
-      _checkCycle(object);
-      writeList(object);
-      _removeSeen(object);
-      return true;
-    } else if (object is Map) {
-      _checkCycle(object);
-      // writeMap can fail if keys are not all strings.
-      var success = writeMap(object);
-      _removeSeen(object);
-      return success;
-    } else {
-      return false;
-    }
-  }
-
-  /** Serialize a [List]. */
-  void writeList(List list) {
-    writeString('[');
-    if (list.length > 0) {
-      writeObject(list[0]);
-      for (int i = 1; i < list.length; i++) {
-        writeString(',');
-        writeObject(list[i]);
-      }
-    }
-    writeString(']');
-  }
-
-  /** Serialize a [Map]. */
-  bool writeMap(Map map) {
-    if (map.isEmpty) {
-      writeString("{}");
-      return true;
-    }
-    List keyValueList = new List(map.length * 2);
-    int i = 0;
-    bool allStringKeys = true;
-    map.forEach((key, value) {
-      if (key is! String) {
-        allStringKeys = false;
-      }
-      keyValueList[i++] = key;
-      keyValueList[i++] = value;
-    });
-    if (!allStringKeys) return false;
-    writeString('{');
-    String separator = '"';
-    for (int i = 0; i < keyValueList.length; i += 2) {
-      writeString(separator);
-      separator = ',"';
-      writeStringContent(keyValueList[i]);
-      writeString('":');
-      writeObject(keyValueList[i + 1]);
-    }
-    writeString('}');
-    return true;
-  }
-}
-
-/**
- * A modification of [_JsonStringifier] which indents the contents of [List] and
- * [Map] objects using the specified indent value.
- *
- * Subclasses should implement [writeIndentation].
- */
-abstract class _JsonPrettyPrintMixin implements _JsonStringifier {
-  int _indentLevel = 0;
-
-  /**
-   * Add [indentLevel] indentations to the JSON output.
-   */
-  void writeIndentation(int indentLevel);
-
-  void writeList(List list) {
-    if (list.isEmpty) {
-      writeString('[]');
-    } else {
-      writeString('[\n');
-      _indentLevel++;
-      writeIndentation(_indentLevel);
-      writeObject(list[0]);
-      for (int i = 1; i < list.length; i++) {
-        writeString(',\n');
-        writeIndentation(_indentLevel);
-        writeObject(list[i]);
-      }
-      writeString('\n');
-      _indentLevel--;
-      writeIndentation(_indentLevel);
-      writeString(']');
-    }
-  }
-
-  bool writeMap(Map map) {
-    if (map.isEmpty) {
-      writeString("{}");
-      return true;
-    }
-    List keyValueList = new List(map.length * 2);
-    int i = 0;
-    bool allStringKeys = true;
-    map.forEach((key, value) {
-      if (key is! String) {
-        allStringKeys = false;
-      }
-      keyValueList[i++] = key;
-      keyValueList[i++] = value;
-    });
-    if (!allStringKeys) return false;
-    writeString('{\n');
-    _indentLevel++;
-    String separator = "";
-    for (int i = 0; i < keyValueList.length; i += 2) {
-      writeString(separator);
-      separator = ",\n";
-      writeIndentation(_indentLevel);
-      writeString('"');
-      writeStringContent(keyValueList[i]);
-      writeString('": ');
-      writeObject(keyValueList[i + 1]);
-    }
-    writeString('\n');
-    _indentLevel--;
-    writeIndentation(_indentLevel);
-    writeString('}');
-    return true;
-  }
-}
-
-/**
- * A specialziation of [_JsonStringifier] that writes its JSON to a string.
- */
-class _JsonStringStringifier extends _JsonStringifier {
-  final StringSink _sink;
-
-  _JsonStringStringifier(this._sink, _toEncodable) : super(_toEncodable);
-
-  /**
-   * Convert object to a string.
-   *
-   * The [toEncodable] function is used to convert non-encodable objects
-   * to encodable ones.
-   *
-   * If [indent] is not `null`, the resulting JSON will be "pretty-printed"
-   * with newlines and indentation. The `indent` string is added as indentation
-   * for each indentation level. It should only contain valid JSON whitespace
-   * characters (space, tab, carriage return or line feed).
-   */
-  static String stringify(object, toEncodable(o), String indent) {
-    StringBuffer output = new StringBuffer();
-    printOn(object, output, toEncodable, indent);
-    return output.toString();
-  }
-
-  /**
-   * Convert object to a string, and write the result to the [output] sink.
-   *
-   * The result is written piecemally to the sink.
-   */
-  static void printOn(
-      object, StringSink output, toEncodable(o), String indent) {
-    var stringifier;
-    if (indent == null) {
-      stringifier = new _JsonStringStringifier(output, toEncodable);
-    } else {
-      stringifier =
-          new _JsonStringStringifierPretty(output, toEncodable, indent);
-    }
-    stringifier.writeObject(object);
-  }
-
-  void writeNumber(num number) {
-    _sink.write(number.toString());
-  }
-  void writeString(String string) {
-    _sink.write(string);
-  }
-  void writeStringSlice(String string, int start, int end) {
-    _sink.write(string.substring(start, end));
-  }
-  void writeCharCode(int charCode) {
-    _sink.writeCharCode(charCode);
-  }
-}
-
-class _JsonStringStringifierPretty extends _JsonStringStringifier
-                                   with _JsonPrettyPrintMixin {
-  final String _indent;
-
-  _JsonStringStringifierPretty(StringSink sink, toEncodable(o), this._indent)
-      : super(sink, toEncodable);
-
-  void writeIndentation(int count) {
-    for (int i = 0; i < count; i++) writeString(_indent);
-  }
-}
-
-typedef void _AddChunk(Uint8List list, int start, int end);
-
-/**
- * Specialization of [_JsonStringifier] that writes the JSON as UTF-8.
- *
- * The JSON text is UTF-8 encoded and written to [Uint8List] buffers.
- * The buffers are then passed back to a user provided callback method.
- */
-class _JsonUtf8Stringifier extends _JsonStringifier {
-  final int bufferSize;
-  final _AddChunk addChunk;
-  Uint8List buffer;
-  int index = 0;
-
-  _JsonUtf8Stringifier(toEncodable(o), int bufferSize, this.addChunk)
-      : this.bufferSize = bufferSize,
-        buffer = new Uint8List(bufferSize),
-        super(toEncodable);
-
-  /**
-   * Convert [object] to UTF-8 encoded JSON.
-   *
-   * Calls [addChunk] with slices of UTF-8 code units.
-   * These will typically have size [bufferSize], but may be shorter.
-   * The buffers are not reused, so the [addChunk] call may keep and reuse the
-   * chunks.
-   *
-   * If [indent] is non-`null`, the result will be "pretty-printed" with extra
-   * newlines and indentation, using [indent] as the indentation.
-   */
-  static void stringify(Object object,
-                        List<int> indent,
-                        toEncodable(o),
-                        int bufferSize,
-                        void addChunk(Uint8List chunk, int start, int end)) {
-    _JsonUtf8Stringifier stringifier;
-    if (indent != null) {
-      stringifier = new _JsonUtf8StringifierPretty(toEncodable, indent,
-                                                   bufferSize, addChunk);
-    } else {
-      stringifier = new _JsonUtf8Stringifier(toEncodable, bufferSize, addChunk);
-    }
-    stringifier.writeObject(object);
-    stringifier.flush();
-  }
-
-  /**
-   * Must be called at the end to push the last chunk to the [addChunk]
-   * callback.
-   */
-  void flush() {
-    if (index > 0) {
-      addChunk(buffer, 0, index);
-    }
-    buffer = null;
-    index = 0;
-  }
-
-  void writeNumber(num number) {
-    writeAsciiString(number.toString());
-  }
-
-  /** Write a string that is known to not have non-ASCII characters. */
-  void writeAsciiString(String string) {
-    // TODO(lrn): Optimize by copying directly into buffer instead of going
-    // through writeCharCode;
-    for (int i = 0; i < string.length; i++) {
-      int char = string.codeUnitAt(i);
-      assert(char <= 0x7f);
-      writeByte(char);
-    }
-  }
-
-  void writeString(String string) {
-    writeStringSlice(string, 0, string.length);
-  }
-
-  void writeStringSlice(String string, int start, int end) {
-    // TODO(lrn): Optimize by copying directly into buffer instead of going
-    // through writeCharCode/writeByte. Assumption is the most characters
-    // in starings are plain ASCII.
-    for (int i = start; i < end; i++) {
-      int char = string.codeUnitAt(i);
-      if (char <= 0x7f) {
-        writeByte(char);
-      } else {
-        if ((char & 0xFC00) == 0xD800 && i + 1 < end) {
-          // Lead surrogate.
-          int nextChar = string.codeUnitAt(i + 1);
-          if ((nextChar & 0xFC00) == 0xDC00) {
-            // Tail surrogate.
-            char = 0x10000 + ((char & 0x3ff) << 10) + (nextChar & 0x3ff);
-            writeFourByteCharCode(char);
-            i++;
-            continue;
-          }
-        }
-        writeMultiByteCharCode(char);
-      }
-    }
-  }
-
-  void writeCharCode(int charCode) {
-    if (charCode <= 0x7f) {
-      writeByte(charCode);
-      return;
-    }
-    writeMultiByteCharCode(charCode);
-  }
-
-  void writeMultiByteCharCode(int charCode) {
-    if (charCode <= 0x7ff) {
-      writeByte(0xC0 | (charCode >> 6));
-      writeByte(0x80 | (charCode & 0x3f));
-      return;
-    }
-    if (charCode <= 0xffff) {
-      writeByte(0xE0 | (charCode >> 12));
-      writeByte(0x80 | ((charCode >> 6) & 0x3f));
-      writeByte(0x80 | (charCode & 0x3f));
-      return;
-    }
-    writeFourByteCharCode(charCode);
-  }
-
-  void writeFourByteCharCode(int charCode) {
-    assert(charCode <= 0x10ffff);
-    writeByte(0xF0 | (charCode >> 18));
-    writeByte(0x80 | ((charCode >> 12) & 0x3f));
-    writeByte(0x80 | ((charCode >> 6) & 0x3f));
-    writeByte(0x80 | (charCode & 0x3f));
-  }
-
-  void writeByte(int byte) {
-    assert(byte <= 0xff);
-    if (index == buffer.length) {
-      addChunk(buffer, 0, index);
-      buffer = new Uint8List(bufferSize);
-      index = 0;
-    }
-    buffer[index++] = byte;
-  }
-}
-
-/**
- * Pretty-printing version of [_JsonUtf8Stringifier].
- */
-class _JsonUtf8StringifierPretty extends _JsonUtf8Stringifier
-                                 with _JsonPrettyPrintMixin {
-  final List<int> indent;
-  _JsonUtf8StringifierPretty(
-      toEncodable(o), this.indent,
-      bufferSize, void addChunk(Uint8List buffer, int start, int end))
-      : super(toEncodable, bufferSize, addChunk);
-
-  void writeIndentation(int count) {
-    List<int> indent = this.indent;
-    int indentLength = indent.length;
-    if (indentLength == 1) {
-      int char = indent[0];
-      while (count > 0) {
-        writeByte(char);
-        count -= 1;
-      }
-      return;
-    }
-    while (count > 0) {
-      count--;
-      int end = index + indentLength;
-      if (end <= buffer.length) {
-        buffer.setRange(index, end, indent);
-        index = end;
-      } else {
-        for (int i = 0; i < indentLength; i++) {
-          writeByte(indent[i]);
-        }
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/latin1.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/latin1.dart
deleted file mode 100644
index 1d8546d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/latin1.dart
+++ /dev/null
@@ -1,194 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * An instance of the default implementation of the [Latin1Codec].
- *
- * This instance provides a convenient access to the most common ISO Latin 1
- * use cases.
- *
- * Examples:
- *
- *     var encoded = LATIN1.encode("blåbærgrød");
- *     var decoded = LATIN1.decode([0x62, 0x6c, 0xe5, 0x62, 0xe6,
- *                                  0x72, 0x67, 0x72, 0xf8, 0x64]);
- */
-const Latin1Codec LATIN1 = const Latin1Codec();
-
-const int _LATIN1_MASK = 0xFF;
-
-/**
- * A [LatinCodec] encodes strings to ISO Latin-1 (aka ISO-8859-1) bytes
- * and decodes Latin-1 bytes to strings.
- */
-class Latin1Codec extends Encoding {
-  final bool _allowInvalid;
-  /**
-   * Instantiates a new [Latin1Codec].
-   *
-   * If [allowInvalid] is true, the [decode] method and the converter
-   * returned by [decoder] will default to allowing invalid values. Invalid
-   * values are decoded into the Unicode Replacement character (U+FFFD).
-   * Calls to the [decode] method can override this default.
-   *
-   * Encoders will not accept invalid (non Latin-1) characters.
-   */
-  const Latin1Codec({bool allowInvalid: false}) : _allowInvalid = allowInvalid;
-
-  String get name => "iso-8859-1";
-
-  /**
-   * Decodes the Latin-1 [bytes] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * If [bytes] contains values that are not in the range 0 .. 255, the decoder
-   * will eventually throw a [FormatException].
-   *
-   * If [allowInvalid] is not provided, it defaults to the value used to create
-   * this [Latin1Codec].
-   */
-  String decode(List<int> bytes, { bool allowInvalid }) {
-    if (allowInvalid == null) allowInvalid = _allowInvalid;
-    if (allowInvalid) {
-      return const Latin1Decoder(allowInvalid: true).convert(bytes);
-    } else {
-      return const Latin1Decoder(allowInvalid: false).convert(bytes);
-    }
-  }
-
-  Latin1Encoder get encoder => const Latin1Encoder();
-
-  Latin1Decoder get decoder =>
-      _allowInvalid ? const Latin1Decoder(allowInvalid: true)
-                    : const Latin1Decoder(allowInvalid: false);
-}
-
-/**
- * This class converts strings of only ISO Latin-1 characters to bytes.
- */
-class Latin1Encoder extends _UnicodeSubsetEncoder {
-  const Latin1Encoder() : super(_LATIN1_MASK);
-}
-
-/**
- * This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
- * to a string.
- */
-class Latin1Decoder extends _UnicodeSubsetDecoder {
-  /**
-   * Instantiates a new [Latin1Decoder].
-   *
-   * The optional [allowInvalid] argument defines how [convert] deals
-   * with invalid bytes.
-   *
-   * If it is `true`, [convert] replaces invalid bytes with the Unicode
-   * Replacement character `U+FFFD` (�).
-   * Otherwise it throws a [FormatException].
-   */
-  const Latin1Decoder({ bool allowInvalid: false })
-      : super(allowInvalid, _LATIN1_MASK);
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<String> sink) {
-    StringConversionSink stringSink;
-    if (sink is StringConversionSink) {
-      stringSink = sink;
-    } else {
-      stringSink = new StringConversionSink.from(sink);
-    }
-    // TODO(lrn): Use stringSink.asUtf16Sink() if it becomes available.
-    if (!_allowInvalid) return new _Latin1DecoderSink(stringSink);
-    return new _Latin1AllowInvalidDecoderSink(stringSink);
-  }
-}
-
-class _Latin1DecoderSink extends ByteConversionSinkBase {
-  StringConversionSink _sink;
-  _Latin1DecoderSink(this._sink);
-
-  void close() {
-    _sink.close();
-    _sink = null;
-  }
-
-  void add(List<int> source) {
-    addSlice(source, 0, source.length, false);
-  }
-
-  void _addSliceToSink(List<int> source, int start, int end, bool isLast) {
-    // If _sink was a UTF-16 conversion sink, just add the slice directly with
-    // _sink.addSlice(source, start, end, isLast).
-    // The code below is an moderately stupid workaround until a real
-    // solution can be made.
-    _sink.add(new String.fromCharCodes(source, start, end));
-    if (isLast) close();
-  }
-
-  void addSlice(List<int> source, int start, int end, bool isLast) {
-    end = RangeError.checkValidRange(start, end, source.length);
-    if (start == end) return;
-    if (source is! Uint8List) {
-      // List may contain value outside of the 0..255 range. If so, throw.
-      // Technically, we could excuse Uint8ClampedList as well, but it unlikely
-      // to be relevant.
-      _checkValidLatin1(source, start, end);
-    }
-    _addSliceToSink(source, start, end, isLast);
-  }
-
-  static void _checkValidLatin1(List<int> source, int start, int end) {
-    int mask = 0;
-    for (int i = start; i < end; i++) {
-      mask |= source[i];
-    }
-    if (mask >= 0 && mask <= _LATIN1_MASK) {
-      return;
-    }
-    _reportInvalidLatin1(source, start, end);  // Always throws.
-  }
-
-
-  static void _reportInvalidLatin1(List<int> source, int start, int end) {
-    // Find the index of the first non-Latin-1 character code.
-    for (int i = start; i < end; i++) {
-      int char = source[i];
-      if (char < 0 || char > _LATIN1_MASK) {
-        throw new FormatException("Source contains non-Latin-1 characters.",
-                                  source, i);
-      }
-    }
-    // Unreachable - we only call the function if the loop above throws.
-    assert(false);
-  }
-}
-
-class _Latin1AllowInvalidDecoderSink extends _Latin1DecoderSink {
-  _Latin1AllowInvalidDecoderSink(StringConversionSink sink): super(sink);
-
-  void addSlice(List<int> source, int start, int end, bool isLast) {
-    RangeError.checkValidRange(start, end, source.length);
-    for (int i = start; i < end; i++) {
-      int char = source[i];
-      if (char > _LATIN1_MASK || char < 0) {
-        if (i > start) _addSliceToSink(source, start, i, false);
-        // Add UTF-8 encoding of U+FFFD.
-        _addSliceToSink(const[0xFFFD], 0, 1, false);
-        start = i + 1;
-      }
-    }
-    if (start < end) {
-      _addSliceToSink(source, start, end, isLast);
-    }
-    if (isLast) {
-      close();
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/line_splitter.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/line_splitter.dart
deleted file mode 100644
index b728d8f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/line_splitter.dart
+++ /dev/null
@@ -1,179 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-// Character constants.
-const int _LF = 10;
-const int _CR = 13;
-
-/**
- * A [Converter] that splits a [String] into individual lines.
- *
- * A line is terminated by either a CR (U+000D), a LF (U+000A), a
- * CR+LF sequence (DOS line ending),
- * and a final non-empty line can be ended by the end of the string.
- *
- * The returned lines do not contain the line terminators.
- */
-class LineSplitter
-    extends Converter<String, List<String>>/*=Object*/
-    implements Object/*=StreamTransformer<String, String>*/ {
-
-  const LineSplitter();
-
-  /// Split [lines] into individual lines.
-  ///
-  /// If [start] and [end] are provided, only split the contents of
-  /// `lines.substring(start, end)`. The [start] and [end] values must
-  /// specify a valid sub-range of [lines]
-  /// (`0 <= start <= end <= lines.length`).
-  static Iterable<String> split(String lines, [int start = 0, int end]) sync* {
-    end = RangeError.checkValidRange(start, end, lines.length);
-    int sliceStart = start;
-    int char = 0;
-    for (int i = start; i < end; i++) {
-      int previousChar = char;
-      char = lines.codeUnitAt(i);
-      if (char != _CR) {
-        if (char != _LF) continue;
-        if (previousChar == _CR) {
-          sliceStart = i + 1;
-          continue;
-        }
-      }
-      yield lines.substring(sliceStart, i);
-      sliceStart = i + 1;
-    }
-    if (sliceStart < end) {
-      yield lines.substring(sliceStart, end);
-    }
-  }
-
-  List<String> convert(String data) {
-    List<String> lines = <String>[];
-    int end = data.length;
-    int sliceStart = 0;
-    int char = 0;
-    for (int i = 0; i < end; i++) {
-      int previousChar = char;
-      char = data.codeUnitAt(i);
-      if (char != _CR) {
-        if (char != _LF) continue;
-        if (previousChar == _CR) {
-          sliceStart = i + 1;
-          continue;
-        }
-      }
-      lines.add(data.substring(sliceStart, i));
-      sliceStart = i + 1;
-    }
-    if (sliceStart < end) {
-      lines.add(data.substring(sliceStart, end));
-    }
-    return lines;
-  }
-
-  StringConversionSink startChunkedConversion(Sink<String> sink) {
-    if (sink is! StringConversionSink) {
-      sink = new StringConversionSink.from(sink);
-    }
-    return new _LineSplitterSink(sink);
-  }
-
-  Stream/*<String>*/ bind(Stream/*<String>*/ stream) {
-    return new Stream<String>.eventTransformed(
-          stream,
-          (EventSink<String> sink) => new _LineSplitterEventSink(sink));
-  }
-}
-
-// TODO(floitsch): deal with utf8.
-class _LineSplitterSink extends StringConversionSinkBase {
-  final StringConversionSink _sink;
-
-  /// The carry-over from the previous chunk.
-  ///
-  /// If the previous slice ended in a line without a line terminator,
-  /// then the next slice may continue the line.
-  String _carry;
-
-  /// Whether to skip a leading LF character from the next slice.
-  ///
-  /// If the previous slice ended on a CR character, a following LF
-  /// would be part of the same line termination, and should be ignored.
-  ///
-  /// Only `true` when [_carry] is `null`.
-  bool _skipLeadingLF = false;
-
-  _LineSplitterSink(this._sink);
-
-  void addSlice(String chunk, int start, int end, bool isLast) {
-    end = RangeError.checkValidRange(start, end, chunk.length);
-    // If the chunk is empty, it's probably because it's the last one.
-    // Handle that here, so we know the range is non-empty below.
-    if (start >= end) {
-      if (isLast) close();
-      return;
-    }
-    if (_carry != null) {
-      assert(!_skipLeadingLF);
-      chunk = _carry + chunk.substring(start, end);
-      start = 0;
-      end = chunk.length;
-      _carry = null;
-    } else if (_skipLeadingLF) {
-       if (chunk.codeUnitAt(start) == _LF) {
-        start += 1;
-      }
-      _skipLeadingLF = false;
-    }
-    _addLines(chunk, start, end);
-    if (isLast) close();
-  }
-
-  void close() {
-    if (_carry != null) {
-      _sink.add(_carry);
-      _carry = null;
-    }
-    _sink.close();
-  }
-
-  void _addLines(String lines, int start, int end) {
-    int sliceStart = start;
-    int char = 0;
-    for (int i = start; i < end; i++) {
-      int previousChar = char;
-      char = lines.codeUnitAt(i);
-      if (char != _CR) {
-        if (char != _LF) continue;
-        if (previousChar == _CR) {
-          sliceStart = i + 1;
-          continue;
-        }
-      }
-      _sink.add(lines.substring(sliceStart, i));
-      sliceStart = i + 1;
-    }
-    if (sliceStart < end) {
-      _carry = lines.substring(sliceStart, end);
-    } else {
-      _skipLeadingLF = (char == _CR);
-    }
-  }
-}
-
-class _LineSplitterEventSink extends _LineSplitterSink
-    implements EventSink<String> {
-  final EventSink<String> _eventSink;
-
-  _LineSplitterEventSink(EventSink<String> eventSink)
-      : _eventSink = eventSink,
-        super(new StringConversionSink.from(eventSink));
-
-  void addError(Object o, [StackTrace stackTrace]) {
-    _eventSink.addError(o, stackTrace);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/string_conversion.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/string_conversion.dart
deleted file mode 100644
index 6eb27d9..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/string_conversion.dart
+++ /dev/null
@@ -1,342 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/**
- * This class provides an interface for converters to
- * efficiently transmit String data.
- *
- * Instead of limiting the interface to one non-chunked String it accepts
- * partial strings or can be transformed into a byte sink that
- * accepts UTF-8 code units.
- *
- * This abstract class will likely get more methods over time. Implementers are
- * urged to extend [StringConversionSinkBase] or to mix in
- * [StringConversionSinkMixin], to ensure that their class covers the newly
- * added methods.
- */
-abstract class StringConversionSink extends ChunkedConversionSink<String> {
-  StringConversionSink();
-  factory StringConversionSink.withCallback(void callback(String accumulated))
-      = _StringCallbackSink;
-  factory StringConversionSink.from(Sink<String> sink)
-      = _StringAdapterSink;
-
-  /**
-   * Creates a new instance wrapping the given [sink].
-   *
-   * Every string that is added to the returned instance is forwarded to
-   * the [sink]. The instance is allowed to buffer and is not required to
-   * forward immediately.
-   */
-  factory StringConversionSink.fromStringSink(StringSink sink) =
-      _StringSinkConversionSink;
-
-  /**
-   * Adds the next [chunk] to `this`.
-   *
-   * Adds the substring defined by [start] and [end]-exclusive to `this`.
-   *
-   * If [isLast] is `true` closes `this`.
-   */
-  void addSlice(String chunk, int start, int end, bool isLast);
-
-  /**
-   * Returns `this` as a sink that accepts UTF-8 input.
-   *
-   * If used, this method must be the first and only call to `this`. It
-   * invalidates `this`. All further operations must be performed on the result.
-   */
-  ByteConversionSink asUtf8Sink(bool allowMalformed);
-  // - asRuneSink
-  // - asCodeUnitsSink
-
-  /**
-   * Returns `this` as a [ClosableStringSink].
-   *
-   * If used, this method must be the first and only call to `this`. It
-   * invalidates `this`. All further operations must be performed on the result.
-   */
-  ClosableStringSink asStringSink();
-}
-
-/**
- * A [ClosableStringSink] extends the [StringSink] interface by adding a
- * `close` method.
- */
-abstract class ClosableStringSink extends StringSink {
-  /**
-   * Creates a new instance combining a [StringSink] [sink] and a callback
-   * [onClose] which is invoked when the returned instance is closed.
-   */
-  factory ClosableStringSink.fromStringSink(StringSink sink, void onClose())
-      = _ClosableStringSink;
-
-  /**
-   * Closes `this` and flushes any outstanding data.
-   */
-  void close();
-}
-
-typedef void _StringSinkCloseCallback();
-
-/**
- * This class wraps an existing [StringSink] and invokes a
- * closure when [close] is invoked.
- */
-class _ClosableStringSink implements ClosableStringSink {
-  final _StringSinkCloseCallback _callback;
-  final StringSink _sink;
-
-  _ClosableStringSink(this._sink, this._callback);
-
-  void close() { _callback(); }
-
-  void writeCharCode(int charCode) { _sink.writeCharCode(charCode); }
-  void write(Object o) { _sink.write(o); }
-  void writeln([Object o = ""]) { _sink.writeln(o); }
-  void writeAll(Iterable objects, [String separator = ""]) {
-    _sink.writeAll(objects, separator);
-  }
-}
-
-/**
- * This class wraps an existing [StringConversionSink] and exposes a
- * [ClosableStringSink] interface. The wrapped sink only needs to implement
- * `add` and `close`.
- */
-// TODO(floitsch): make this class public?
-class _StringConversionSinkAsStringSinkAdapter implements ClosableStringSink {
-  static const _MIN_STRING_SIZE = 16;
-
-  StringBuffer _buffer;
-  StringConversionSink _chunkedSink;
-
-  _StringConversionSinkAsStringSinkAdapter(this._chunkedSink)
-      : _buffer = new StringBuffer();
-
-  void close() {
-    if (_buffer.isNotEmpty) _flush();
-    _chunkedSink.close();
-  }
-
-  void writeCharCode(int charCode) {
-    _buffer.writeCharCode(charCode);
-    if (_buffer.length > _MIN_STRING_SIZE) _flush();
-  }
-
-  void write(Object o) {
-    if (_buffer.isNotEmpty) _flush();
-    _chunkedSink.add(o.toString());
-  }
-
-  void writeln([Object o = ""]) {
-    _buffer.writeln(o);
-    if (_buffer.length > _MIN_STRING_SIZE) _flush();
-  }
-
-  void writeAll(Iterable objects, [String separator = ""]) {
-    if (_buffer.isNotEmpty) _flush();
-    Iterator iterator = objects.iterator;
-    if (!iterator.moveNext()) return;
-    if (separator.isEmpty) {
-      do {
-        _chunkedSink.add(iterator.current.toString());
-      } while (iterator.moveNext());
-    } else {
-      _chunkedSink.add(iterator.current.toString());
-      while (iterator.moveNext()) {
-        write(separator);
-        _chunkedSink.add(iterator.current.toString());
-      }
-    }
-  }
-
-  void _flush() {
-    String accumulated = _buffer.toString();
-    _buffer.clear();
-    _chunkedSink.add(accumulated);
-  }
-}
-
-/**
- * This class provides a base-class for converters that need to accept String
- * inputs.
- */
-abstract class StringConversionSinkBase extends StringConversionSinkMixin {
-}
-
-/**
- * This class provides a mixin for converters that need to accept String
- * inputs.
- */
-abstract class StringConversionSinkMixin implements StringConversionSink {
-
-  void addSlice(String str, int start, int end, bool isLast);
-  void close();
-
-  void add(String str) { addSlice(str, 0, str.length, false); }
-
-  ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8ConversionSink(this, allowMalformed);
-  }
-
-  ClosableStringSink asStringSink() {
-    return new _StringConversionSinkAsStringSinkAdapter(this);
-  }
-}
-
-/**
- * This class is a [StringConversionSink] that wraps a [StringSink].
- */
-class _StringSinkConversionSink extends StringConversionSinkBase {
-  StringSink _stringSink;
-  _StringSinkConversionSink(StringSink this._stringSink);
-
-  void close() {}
-  void addSlice(String str, int start, int end, bool isLast) {
-    if (start != 0 || end != str.length) {
-      for (int i = start; i < end; i++) {
-        _stringSink.writeCharCode(str.codeUnitAt(i));
-      }
-    } else {
-      _stringSink.write(str);
-    }
-    if (isLast) close();
-  }
-
-  void add(String str) { _stringSink.write(str); }
-
-  ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8StringSinkAdapter(this, _stringSink, allowMalformed);
-  }
-
-  ClosableStringSink asStringSink() {
-    return new ClosableStringSink.fromStringSink(_stringSink, this.close);
-  }
-}
-
-/**
- * This class accumulates all chunks into one string
- * and invokes a callback when the sink is closed.
- *
- * This class can be used to terminate a chunked conversion.
- */
-class _StringCallbackSink extends _StringSinkConversionSink {
-  final _ChunkedConversionCallback<String> _callback;
-  _StringCallbackSink(this._callback) : super(new StringBuffer());
-
-  void close() {
-    StringBuffer buffer = _stringSink;
-    String accumulated = buffer.toString();
-    buffer.clear();
-    _callback(accumulated);
-  }
-
-  ByteConversionSink asUtf8Sink(bool allowMalformed) {
-    return new _Utf8StringSinkAdapter(
-        this, _stringSink, allowMalformed);
-  }
-}
-
-/**
- * This class adapts a simple [ChunkedConversionSink] to a
- * [StringConversionSink].
- *
- * All additional methods of the [StringConversionSink] (compared to the
- * ChunkedConversionSink) are redirected to the `add` method.
- */
-class _StringAdapterSink extends StringConversionSinkBase {
-  final Sink<String> _sink;
-
-  _StringAdapterSink(this._sink);
-
-  void add(String str) { _sink.add(str); }
-
-  void addSlice(String str, int start, int end, bool isLast) {
-    if (start == 0 && end == str.length) {
-      add(str);
-    } else {
-      add(str.substring(start, end));
-    }
-    if (isLast) close();
-  }
-
-  void close() { _sink.close(); }
-}
-
-
-/**
- * Decodes UTF-8 code units and stores them in a [StringSink].
- */
-class _Utf8StringSinkAdapter extends ByteConversionSink {
-  final _Utf8Decoder _decoder;
-  final Sink _sink;
-
-  _Utf8StringSinkAdapter(this._sink,
-                         StringSink stringSink, bool allowMalformed)
-      : _decoder = new _Utf8Decoder(stringSink, allowMalformed);
-
-  void close() {
-    _decoder.close();
-    if(_sink != null) _sink.close();
-  }
-
-  void add(List<int> chunk) {
-    addSlice(chunk, 0, chunk.length, false);
-  }
-
-  void addSlice(List<int> codeUnits, int startIndex, int endIndex,
-                bool isLast) {
-    _decoder.convert(codeUnits, startIndex, endIndex);
-    if (isLast) close();
-  }
-}
-
-/**
- * Decodes UTF-8 code units.
- *
- * Forwards the decoded strings to the given [StringConversionSink].
- */
-// TODO(floitsch): make this class public?
-class _Utf8ConversionSink extends ByteConversionSink {
-
-  final _Utf8Decoder _decoder;
-  final StringConversionSink _chunkedSink;
-  final StringBuffer _buffer;
-  _Utf8ConversionSink(StringConversionSink sink, bool allowMalformed)
-      : this._(sink, new StringBuffer(), allowMalformed);
-
-  _Utf8ConversionSink._(this._chunkedSink, StringBuffer stringBuffer,
-                       bool allowMalformed)
-      : _decoder = new _Utf8Decoder(stringBuffer, allowMalformed),
-        _buffer = stringBuffer;
-
-  void close() {
-    _decoder.close();
-    if (_buffer.isNotEmpty) {
-      String accumulated = _buffer.toString();
-      _buffer.clear();
-      _chunkedSink.addSlice(accumulated, 0, accumulated.length, true);
-    } else  {
-      _chunkedSink.close();
-    }
-  }
-
-  void add(List<int> chunk) {
-    addSlice(chunk, 0, chunk.length, false);
-  }
-
-  void addSlice(List<int> chunk, int startIndex, int endIndex, bool isLast) {
-    _decoder.convert(chunk, startIndex, endIndex);
-    if (_buffer.isNotEmpty) {
-      String accumulated = _buffer.toString();
-      _chunkedSink.addSlice(accumulated, 0, accumulated.length, isLast);
-      _buffer.clear();
-      return;
-    }
-    if (isLast) close();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/convert/utf.dart b/pkg/dev_compiler/tool/input_sdk/lib/convert/utf.dart
deleted file mode 100644
index 486ab4d..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/convert/utf.dart
+++ /dev/null
@@ -1,572 +0,0 @@
-// 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.
-
-part of dart.convert;
-
-/** The Unicode Replacement character `U+FFFD` (�). */
-const int UNICODE_REPLACEMENT_CHARACTER_RUNE = 0xFFFD;
-
-/** The Unicode Byte Order Marker (BOM) character `U+FEFF`. */
-const int UNICODE_BOM_CHARACTER_RUNE = 0xFEFF;
-
-/**
- * An instance of the default implementation of the [Utf8Codec].
- *
- * This instance provides a convenient access to the most common UTF-8
- * use cases.
- *
- * Examples:
- *
- *     var encoded = UTF8.encode("Îñţérñåţîöñåļîžåţîờñ");
- *     var decoded = UTF8.decode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
- *                                0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
- */
-const Utf8Codec UTF8 = const Utf8Codec();
-
-/**
- * A [Utf8Codec] encodes strings to utf-8 code units (bytes) and decodes
- * UTF-8 code units to strings.
- */
-class Utf8Codec extends Encoding {
-  final bool _allowMalformed;
-
-  /**
-   * Instantiates a new [Utf8Codec].
-   *
-   * The optional [allowMalformed] argument defines how [decoder] (and [decode])
-   * deal with invalid or unterminated character sequences.
-   *
-   * If it is `true` (and not overridden at the method invocation) [decode] and
-   * the [decoder] replace invalid (or unterminated) octet
-   * sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
-   * they throw a [FormatException].
-   */
-  const Utf8Codec({ bool allowMalformed: false })
-      : _allowMalformed = allowMalformed;
-
-  String get name => "utf-8";
-
-  /**
-   * Decodes the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * If the [codeUnits] start with a leading [UNICODE_BOM_CHARACTER_RUNE] this
-   * character is discarded.
-   *
-   * If [allowMalformed] is `true` the decoder replaces invalid (or
-   * unterminated) character sequences with the Unicode Replacement character
-   * `U+FFFD` (�). Otherwise it throws a [FormatException].
-   *
-   * If [allowMalformed] is not given, it defaults to the `allowMalformed` that
-   * was used to instantiate `this`.
-   */
-  String decode(List<int> codeUnits, { bool allowMalformed }) {
-    if (allowMalformed == null) allowMalformed = _allowMalformed;
-    return new Utf8Decoder(allowMalformed: allowMalformed).convert(codeUnits);
-  }
-
-  Utf8Encoder get encoder => const Utf8Encoder();
-  Utf8Decoder get decoder {
-    return new Utf8Decoder(allowMalformed: _allowMalformed);
-  }
-}
-
-/**
- * This class converts strings to their UTF-8 code units (a list of
- * unsigned 8-bit integers).
- */
-class Utf8Encoder extends Converter<String, List<int>> {
-
-  const Utf8Encoder();
-
-  /**
-   * Converts [string] to its UTF-8 code units (a list of
-   * unsigned 8-bit integers).
-   *
-   * If [start] and [end] are provided, only the substring
-   * `string.substring(start, end)` is converted.
-   */
-  List<int> convert(String string, [int start = 0, int end]) {
-    int stringLength = string.length;
-    RangeError.checkValidRange(start, end, stringLength);
-    if (end == null) end = stringLength;
-    int length = end - start;
-    if (length == 0) return new Uint8List(0);
-    // Create a new encoder with a length that is guaranteed to be big enough.
-    // A single code unit uses at most 3 bytes, a surrogate pair at most 4.
-    _Utf8Encoder encoder = new _Utf8Encoder.withBufferSize(length * 3);
-    int endPosition = encoder._fillBuffer(string, start, end);
-    assert(endPosition >= end - 1);
-    if (endPosition != end) {
-      // Encoding skipped the last code unit.
-      // That can only happen if the last code unit is a leadsurrogate.
-      // Force encoding of the lead surrogate by itself.
-      int lastCodeUnit = string.codeUnitAt(end - 1);
-      assert(_isLeadSurrogate(lastCodeUnit));
-      // We use a non-surrogate as `nextUnit` so that _writeSurrogate just
-      // writes the lead-surrogate.
-      bool wasCombined = encoder._writeSurrogate(lastCodeUnit, 0);
-      assert(!wasCombined);
-    }
-    return encoder._buffer.sublist(0, encoder._bufferIndex);
-  }
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [ByteConversionSink].
-   */
-  StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _Utf8EncoderSink(sink);
-  }
-
-  // Override the base-classes bind, to provide a better type.
-  Stream<List<int>> bind(Stream<String> stream) => super.bind(stream);
-}
-
-/**
- * This class encodes Strings to UTF-8 code units (unsigned 8 bit integers).
- */
-// TODO(floitsch): make this class public.
-class _Utf8Encoder {
-  int _carry = 0;
-  int _bufferIndex = 0;
-  final List<int> _buffer;
-
-  static const _DEFAULT_BYTE_BUFFER_SIZE = 1024;
-
-  _Utf8Encoder() : this.withBufferSize(_DEFAULT_BYTE_BUFFER_SIZE);
-
-  _Utf8Encoder.withBufferSize(int bufferSize)
-      : _buffer = _createBuffer(bufferSize);
-
-  /**
-   * Allow an implementation to pick the most efficient way of storing bytes.
-   */
-  static List<int> _createBuffer(int size) => new Uint8List(size);
-
-  /**
-   * Tries to combine the given [leadingSurrogate] with the [nextCodeUnit] and
-   * writes it to [_buffer].
-   *
-   * Returns true if the [nextCodeUnit] was combined with the
-   * [leadingSurrogate]. If it wasn't then nextCodeUnit was not a trailing
-   * surrogate and has not been written yet.
-   *
-   * It is safe to pass 0 for [nextCodeUnit] in which case only the leading
-   * surrogate is written.
-   */
-  bool _writeSurrogate(int leadingSurrogate, int nextCodeUnit) {
-    if (_isTailSurrogate(nextCodeUnit)) {
-      int rune = _combineSurrogatePair(leadingSurrogate, nextCodeUnit);
-      // If the rune is encoded with 2 code-units then it must be encoded
-      // with 4 bytes in UTF-8.
-      assert(rune > _THREE_BYTE_LIMIT);
-      assert(rune <= _FOUR_BYTE_LIMIT);
-      _buffer[_bufferIndex++] = 0xF0 | (rune >> 18);
-      _buffer[_bufferIndex++] = 0x80 | ((rune >> 12) & 0x3f);
-      _buffer[_bufferIndex++] = 0x80 | ((rune >> 6) & 0x3f);
-      _buffer[_bufferIndex++] = 0x80 | (rune & 0x3f);
-      return true;
-    } else {
-      // TODO(floitsch): allow to throw on malformed strings.
-      // Encode the half-surrogate directly into UTF-8. This yields
-      // invalid UTF-8, but we started out with invalid UTF-16.
-
-      // Surrogates are always encoded in 3 bytes in UTF-8.
-      _buffer[_bufferIndex++] = 0xE0 | (leadingSurrogate >> 12);
-      _buffer[_bufferIndex++] = 0x80 | ((leadingSurrogate >> 6) & 0x3f);
-      _buffer[_bufferIndex++] = 0x80 | (leadingSurrogate & 0x3f);
-      return false;
-    }
-  }
-
-  /**
-   * Fills the [_buffer] with as many characters as possible.
-   *
-   * Does not encode any trailing lead-surrogate. This must be done by the
-   * caller.
-   *
-   * Returns the position in the string. The returned index points to the
-   * first code unit that hasn't been encoded.
-   */
-  int _fillBuffer(String str, int start, int end) {
-    if (start != end && _isLeadSurrogate(str.codeUnitAt(end - 1))) {
-      // Don't handle a trailing lead-surrogate in this loop. The caller has
-      // to deal with those.
-      end--;
-    }
-    int stringIndex;
-    for (stringIndex = start; stringIndex < end; stringIndex++) {
-      int codeUnit = str.codeUnitAt(stringIndex);
-      // ASCII has the same representation in UTF-8 and UTF-16.
-      if (codeUnit <= _ONE_BYTE_LIMIT) {
-        if (_bufferIndex >= _buffer.length) break;
-        _buffer[_bufferIndex++] = codeUnit;
-      } else if (_isLeadSurrogate(codeUnit)) {
-        if (_bufferIndex + 3 >= _buffer.length) break;
-        // Note that it is safe to read the next code unit. We decremented
-        // [end] above when the last valid code unit was a leading surrogate.
-        int nextCodeUnit = str.codeUnitAt(stringIndex + 1);
-        bool wasCombined = _writeSurrogate(codeUnit, nextCodeUnit);
-        if (wasCombined) stringIndex++;
-      } else {
-        int rune = codeUnit;
-        if (rune <= _TWO_BYTE_LIMIT) {
-          if (_bufferIndex + 1 >= _buffer.length) break;
-          _buffer[_bufferIndex++] = 0xC0 | (rune >> 6);
-          _buffer[_bufferIndex++] = 0x80 | (rune & 0x3f);
-        } else {
-          assert(rune <= _THREE_BYTE_LIMIT);
-          if (_bufferIndex + 2 >= _buffer.length) break;
-          _buffer[_bufferIndex++] = 0xE0 | (rune >> 12);
-          _buffer[_bufferIndex++] = 0x80 | ((rune >> 6) & 0x3f);
-          _buffer[_bufferIndex++] = 0x80 | (rune & 0x3f);
-        }
-      }
-    }
-    return stringIndex;
-  }
-}
-
-/**
- * This class encodes chunked strings to UTF-8 code units (unsigned 8-bit
- * integers).
- */
-class _Utf8EncoderSink extends _Utf8Encoder with StringConversionSinkMixin {
-
-  final ByteConversionSink _sink;
-
-  _Utf8EncoderSink(this._sink);
-
-  void close() {
-    if (_carry != 0) {
-      // addSlice will call close again, but then the carry must be equal to 0.
-      addSlice("", 0, 0, true);
-      return;
-    }
-    _sink.close();
-  }
-
-  void addSlice(String str, int start, int end, bool isLast) {
-    _bufferIndex = 0;
-
-    if (start == end && !isLast) {
-      return;
-    }
-
-    if (_carry != 0) {
-      int nextCodeUnit = 0;
-      if (start != end) {
-        nextCodeUnit = str.codeUnitAt(start);
-      } else {
-        assert(isLast);
-      }
-      bool wasCombined = _writeSurrogate(_carry, nextCodeUnit);
-      // Either we got a non-empty string, or we must not have been combined.
-      assert(!wasCombined || start != end );
-      if (wasCombined) start++;
-      _carry = 0;
-    }
-    do {
-      start = _fillBuffer(str, start, end);
-      bool isLastSlice = isLast && (start == end);
-      if (start == end - 1 && _isLeadSurrogate(str.codeUnitAt(start))) {
-        if (isLast && _bufferIndex < _buffer.length - 3) {
-          // There is still space for the last incomplete surrogate.
-          // We use a non-surrogate as second argument. This way the
-          // function will just add the surrogate-half to the buffer.
-          bool hasBeenCombined = _writeSurrogate(str.codeUnitAt(start), 0);
-          assert(!hasBeenCombined);
-        } else {
-          // Otherwise store it in the carry. If isLast is true, then
-          // close will flush the last carry.
-          _carry = str.codeUnitAt(start);
-        }
-        start++;
-      }
-      _sink.addSlice(_buffer, 0, _bufferIndex, isLastSlice);
-      _bufferIndex = 0;
-    } while (start < end);
-    if (isLast) close();
-  }
-
-  // TODO(floitsch): implement asUtf8Sink. Sligthly complicated because it
-  // needs to deal with malformed input.
-}
-
-/**
- * This class converts UTF-8 code units (lists of unsigned 8-bit integers)
- * to a string.
- */
-class Utf8Decoder extends Converter<List<int>, String> {
-  final bool _allowMalformed;
-
-  /**
-   * Instantiates a new [Utf8Decoder].
-   *
-   * The optional [allowMalformed] argument defines how [convert] deals
-   * with invalid or unterminated character sequences.
-   *
-   * If it is `true` [convert] replaces invalid (or unterminated) character
-   * sequences with the Unicode Replacement character `U+FFFD` (�). Otherwise
-   * it throws a [FormatException].
-   */
-  const Utf8Decoder({ bool allowMalformed: false })
-      : this._allowMalformed = allowMalformed;
-
-  /**
-   * Converts the UTF-8 [codeUnits] (a list of unsigned 8-bit integers) to the
-   * corresponding string.
-   *
-   * Uses the code units from [start] to, but no including, [end].
-   * If [end] is omitted, it defaults to `codeUnits.length`.
-   *
-   * If the [codeUnits] start with a leading [UNICODE_BOM_CHARACTER_RUNE] this
-   * character is discarded.
-   */
-  String convert(List<int> codeUnits, [int start = 0, int end]) {
-    // Allow the implementation to intercept and specialize based on the type
-    // of codeUnits.
-    String result = _convertIntercepted(_allowMalformed, codeUnits, start, end);
-    if (result != null) {
-      return result;
-    }
-
-    int length = codeUnits.length;
-    RangeError.checkValidRange(start, end, length);
-    if (end == null) end = length;
-    StringBuffer buffer = new StringBuffer();
-    _Utf8Decoder decoder = new _Utf8Decoder(buffer, _allowMalformed);
-    decoder.convert(codeUnits, start, end);
-    decoder.close();
-    return buffer.toString();
-  }
-
-  /**
-   * Starts a chunked conversion.
-   *
-   * The converter works more efficiently if the given [sink] is a
-   * [StringConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<String> sink) {
-    StringConversionSink stringSink;
-    if (sink is StringConversionSink) {
-      stringSink = sink;
-    } else {
-      stringSink = new StringConversionSink.from(sink);
-    }
-    return stringSink.asUtf8Sink(_allowMalformed);
-  }
-
-  // Override the base-classes bind, to provide a better type.
-  Stream<String> bind(Stream<List<int>> stream) => super.bind(stream);
-
-  external Converter<List<int>, dynamic/*=T*/> fuse/*<T>*/(
-      Converter<String, dynamic/*=T*/> next);
-
-  external static String _convertIntercepted(
-      bool allowMalformed, List<int> codeUnits, int start, int end);
-}
-
-// UTF-8 constants.
-const int _ONE_BYTE_LIMIT = 0x7f;   // 7 bits
-const int _TWO_BYTE_LIMIT = 0x7ff;  // 11 bits
-const int _THREE_BYTE_LIMIT = 0xffff;  // 16 bits
-const int _FOUR_BYTE_LIMIT = 0x10ffff;  // 21 bits, truncated to Unicode max.
-
-// UTF-16 constants.
-const int _SURROGATE_MASK = 0xF800;
-const int _SURROGATE_TAG_MASK = 0xFC00;
-const int _SURROGATE_VALUE_MASK = 0x3FF;
-const int _LEAD_SURROGATE_MIN = 0xD800;
-const int _TAIL_SURROGATE_MIN = 0xDC00;
-
-bool _isLeadSurrogate(int codeUnit) =>
-    (codeUnit & _SURROGATE_TAG_MASK) == _LEAD_SURROGATE_MIN;
-bool _isTailSurrogate(int codeUnit) =>
-    (codeUnit & _SURROGATE_TAG_MASK) == _TAIL_SURROGATE_MIN;
-int _combineSurrogatePair(int lead, int tail) =>
-    0x10000 + ((lead & _SURROGATE_VALUE_MASK) << 10)
-            | (tail & _SURROGATE_VALUE_MASK);
-
-/**
- * Decodes UTF-8.
- *
- * The decoder handles chunked input.
- */
-// TODO(floitsch): make this class public.
-class _Utf8Decoder {
-  final bool _allowMalformed;
-  final StringSink _stringSink;
-  bool _isFirstCharacter = true;
-  int _value = 0;
-  int _expectedUnits = 0;
-  int _extraUnits = 0;
-
-  _Utf8Decoder(this._stringSink, this._allowMalformed);
-
-  bool get hasPartialInput => _expectedUnits > 0;
-
-  // Limits of one through four byte encodings.
-  static const List<int> _LIMITS = const <int>[
-      _ONE_BYTE_LIMIT,
-      _TWO_BYTE_LIMIT,
-      _THREE_BYTE_LIMIT,
-      _FOUR_BYTE_LIMIT ];
-
-  void close() {
-    flush();
-  }
-
-  /**
-   * Flushes this decoder as if closed.
-   *
-   * This method throws if the input was partial and the decoder was
-   * constructed with `allowMalformed` set to `false`.
-   */
-  void flush() {
-    if (hasPartialInput) {
-      if (!_allowMalformed) {
-        throw new FormatException("Unfinished UTF-8 octet sequence");
-      }
-      _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
-      _value = 0;
-      _expectedUnits = 0;
-      _extraUnits = 0;
-    }
-  }
-
-  void convert(List<int> codeUnits, int startIndex, int endIndex) {
-    int value = _value;
-    int expectedUnits = _expectedUnits;
-    int extraUnits = _extraUnits;
-    _value = 0;
-    _expectedUnits = 0;
-    _extraUnits = 0;
-
-    int scanOneByteCharacters(units, int from) {
-      final to = endIndex;
-      final mask = _ONE_BYTE_LIMIT;
-      for (var i = from; i < to; i++) {
-        final unit = units[i];
-        if ((unit & mask) != unit) return i - from;
-      }
-      return to - from;
-    }
-
-    void addSingleBytes(int from, int to) {
-      assert(from >= startIndex && from <= endIndex);
-      assert(to >= startIndex && to <= endIndex);
-      _stringSink.write(new String.fromCharCodes(codeUnits, from, to));
-    }
-
-    int i = startIndex;
-    loop: while (true) {
-      multibyte: if (expectedUnits > 0) {
-        do {
-          if (i == endIndex) {
-            break loop;
-          }
-          int unit = codeUnits[i];
-          if ((unit & 0xC0) != 0x80) {
-            expectedUnits = 0;
-            if (!_allowMalformed) {
-              throw new FormatException(
-                  "Bad UTF-8 encoding 0x${unit.toRadixString(16)}");
-            }
-            _isFirstCharacter = false;
-            _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
-            break multibyte;
-          } else {
-            value = (value << 6) | (unit & 0x3f);
-            expectedUnits--;
-            i++;
-          }
-        } while (expectedUnits > 0);
-        if (value <= _LIMITS[extraUnits - 1]) {
-          // Overly long encoding. The value could be encoded with a shorter
-          // encoding.
-          if (!_allowMalformed) {
-            throw new FormatException(
-                "Overlong encoding of 0x${value.toRadixString(16)}");
-          }
-          expectedUnits = extraUnits = 0;
-          value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
-        }
-        if (value > _FOUR_BYTE_LIMIT) {
-          if (!_allowMalformed) {
-            throw new FormatException("Character outside valid Unicode range: "
-                                      "0x${value.toRadixString(16)}");
-          }
-          value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
-        }
-        if (!_isFirstCharacter || value != UNICODE_BOM_CHARACTER_RUNE) {
-          _stringSink.writeCharCode(value);
-        }
-        _isFirstCharacter = false;
-      }
-
-      while (i < endIndex) {
-        int oneBytes = scanOneByteCharacters(codeUnits, i);
-        if (oneBytes > 0) {
-          _isFirstCharacter = false;
-          addSingleBytes(i, i + oneBytes);
-          i += oneBytes;
-          if (i == endIndex) break;
-        }
-        int unit = codeUnits[i++];
-        // TODO(floitsch): the way we test we could potentially allow
-        // units that are too large, if they happen to have the
-        // right bit-pattern. (Same is true for the multibyte loop above).
-        // TODO(floitsch): optimize this loop. See:
-        // https://codereview.chromium.org/22929022/diff/1/sdk/lib/convert/utf.dart?column_width=80
-        if (unit < 0) {
-          // TODO(floitsch): should this be unit <= 0 ?
-          if (!_allowMalformed) {
-            throw new FormatException(
-                "Negative UTF-8 code unit: -0x${(-unit).toRadixString(16)}");
-          }
-          _stringSink.writeCharCode(UNICODE_REPLACEMENT_CHARACTER_RUNE);
-        } else {
-          assert(unit > _ONE_BYTE_LIMIT);
-          if ((unit & 0xE0) == 0xC0) {
-            value = unit & 0x1F;
-            expectedUnits = extraUnits = 1;
-            continue loop;
-          }
-          if ((unit & 0xF0) == 0xE0) {
-            value = unit & 0x0F;
-            expectedUnits = extraUnits = 2;
-            continue loop;
-          }
-          // 0xF5, 0xF6 ... 0xFF never appear in valid UTF-8 sequences.
-          if ((unit & 0xF8) == 0xF0 && unit < 0xF5) {
-            value = unit & 0x07;
-            expectedUnits = extraUnits = 3;
-            continue loop;
-          }
-          if (!_allowMalformed) {
-            throw new FormatException(
-                "Bad UTF-8 encoding 0x${unit.toRadixString(16)}");
-          }
-          value = UNICODE_REPLACEMENT_CHARACTER_RUNE;
-          expectedUnits = extraUnits = 0;
-          _isFirstCharacter = false;
-          _stringSink.writeCharCode(value);
-        }
-      }
-      break loop;
-    }
-    if (expectedUnits > 0) {
-      _value = value;
-      _expectedUnits = expectedUnits;
-      _extraUnits = extraUnits;
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/annotations.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/annotations.dart
deleted file mode 100644
index 77211ab..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/annotations.dart
+++ /dev/null
@@ -1,153 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/**
- * The annotation `@Deprecated('expires when')` marks a feature as deprecated.
- *
- * The annotation `@deprecated` is a shorthand for deprecating until
- * an unspecified "next release".
- *
- * The intent of the `@Deprecated` annotation is to inform users of a feature
- * that they should change their code, even if it is currently still working
- * correctly.
- *
- * A deprecated feature is scheduled to be removed at a later time, possibly
- * specified as the "expires" field of the annotation.
- * This means that a deprecated feature should not be used, or code using it
- * will break at some point in the future. If there is code using the feature,
- * that code should be rewritten to not use the deprecated feature.
- *
- * A deprecated feature should document how the same effect can be achieved,
- * so the programmer knows how to rewrite the code.
- *
- * The `@Deprecated` annotation applies to libraries, top-level declarations
- * (variables, getters, setters, functions, classes and typedefs),
- * class-level declarations (variables, getters, setters, methods, operators or
- * constructors, whether static or not), named optional arguments and
- * trailing optional positional parameters.
- *
- * Deprecation is transitive:
- *
- *  - If a library is deprecated, so is every member of it.
- *  - If a class is deprecated, so is every member of it.
- *  - If a variable is deprecated, so are its implicit getter and setter.
- *
- *
- * A tool that processes Dart source code may report when:
- *
- * - the code imports a deprecated library.
- * - the code exports a deprecated library, or any deprecated member of
- *   a non-deprecated library.
- * - the code refers statically to a deprecated declaration.
- * - the code dynamically uses a member of an object with a statically known
- *   type, where the member is deprecated on the static type of the object.
- * - the code dynamically calls a method with an argument where the
- *   corresponding optional parameter is deprecated on the object's static type.
- *
- *
- * If the deprecated use is inside a library, class or method which is itself
- * deprecated, the tool should not bother the user about it.
- * A deprecated feature is expected to use other deprecated features.
- */
-class Deprecated {
-  /**
-   * A description of when the deprecated feature is expected to be retired.
-   */
-  final String expires;
-
-  /**
-   * Create a deprecation annotation which specifies the expiration of the
-   * annotated feature.
-   *
-   * The [expires] argument should be readable by programmers, and should state
-   * when an annotated feature is expected to be removed.
-   * This can be specified, for example, as a date, as a release number, or
-   * as relative to some other change (like "when bug 4418 is fixed").
-   */
-  const Deprecated(String expires) : this.expires = expires;
-
-  String toString() => "Deprecated feature. Will be removed $expires";
-}
-
-class _Override {
-  const _Override();
-}
-
-/**
- * Marks a feature as [Deprecated] until the next release.
- */
-const Deprecated deprecated = const Deprecated("next release");
-
-/**
- * The annotation `@override` marks an instance member as overriding a
- * superclass member with the same name.
- *
- * The annotation applies to instance methods, getters and setters, and to
- * instance fields, where it means that the implicit getter and setter of the
- * field is marked as overriding, but the field itself is not.
- *
- * The intent of the `@override` notation is to catch situations where a
- * superclass renames a member, and an independent subclass which used to
- * override the member, could silently continue working using the
- * superclass implementation.
- *
- * The editor, or a similar tool aimed at the programmer, may report if no
- * declaration of an annotated member is inherited by the class from either a
- * superclass or an interface.
- *
- * Use the `@override` annotation judiciously and only for methods where
- * the superclass is not under the programmer's control, the superclass is in a
- * different library or package, and it is not considered stable.
- * In any case, the use of `@override` is optional.
- *
- * For example, the annotation is intentionally not used in the Dart platform
- * libraries, since they only depend on themselves.
- */
-const Object override = const _Override();
-
-class _Proxy {
-  const _Proxy();
-}
-
-/**
- * The annotation `@proxy` marks a class as implementing members dynamically
- * through `noSuchMethod`.
- *
- * The annotation applies to any class. It is inherited by subclasses from both
- * superclass and interfaces.
- *
- * If a class is annotated with `@proxy`, or it implements any class that is
- * annotated, then the class is considered to implement any member with regard
- * to static type analysis.
- * As such, it is not a static type warning to access any member of the object
- * which is not implemented by the class, or to call a method with a different
- * number of parameters than it is declared with.
- *
- * The annotation does not change which classes the annotated class implements,
- * and does not prevent static warnings for assigning an object to a variable
- * with a static type not implemented by the object.
- *
- * The suppression of warnings only affect static type warnings about
- * member access.
- * The runtime type of the object is unaffected.
- * It is not considered to implement any special interfaces,
- * so assigning it to a typed variable may fail in checked mode,
- * and testing it with the `is` operator
- * will only return true for types it actually implements or extends.
- * Accessing a member which isn't implemented by the class
- * will cause the `noSuchMethod` method to be called normally,
- * the `@proxy` annotation merely states the intent to handle (some of) those
- * `noSuchMethod` calls gracefully.
- *
- * A class that marked as `@proxy` should override the `noSuchMethod`
- * declared on [Object].
- *
- * The intent of the `@proxy` notation is to create objects that implement a
- * type (or multiple types) that are not known at compile time. If the types
- * are known at compile time, a class can be written that implements these
- * types.
- */
-const Object proxy = const _Proxy();
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/bool.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/bool.dart
deleted file mode 100644
index d1f31d7..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/bool.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * The reserved words [:true:] and [:false:] denote objects that are the only
- * instances of this class.
- *
- * It is a compile-time error for a class to attempt to extend or implement
- * bool.
- */
-class bool {
-  /**
-   * Returns the boolean value of the environment declaration [name].
-   *
-   * The boolean value of the declaration is `true` if the declared value is
-   * the string `"true"`, and `false` if the value is `"false"`.
-   *
-   * In all other cases, including when there is no declaration for `name`,
-   * the result is the [defaultValue].
-   *
-   * The result is the same as would be returned by:
-   *
-   *     (const String.fromEnvironment(name) == "true")
-   *         ? true
-   *         : (const String.fromEnvironment(name) == "false")
-   *             ? false
-   *             : defaultValue
-   *
-   * Example:
-   *
-   *     const loggingFlag = const bool.fromEnvironment("logging");
-   *
-   * If you want to use a different truth-string than `"true"`, you can use the
-   * [String.fromEnvironment] constructor directly:
-   *
-   *     const isLoggingOn = (const String.fromEnvironment("logging") == "on");
-   */
-  external const factory bool.fromEnvironment(String name,
-                                              {bool defaultValue: false});
-
-  /**
-   * Returns [:"true":] if the receiver is [:true:], or [:"false":] if the
-   * receiver is [:false:].
-   */
-  String toString() {
-    return this ? "true" : "false";
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/comparable.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/comparable.dart
deleted file mode 100644
index 7a22948..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/comparable.dart
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * The signature of a generic comparison function.
- *
- * A comparison function represents an ordering on a type of objects.
- * A total ordering on a type means that for two values, either they
- * are equal or one is greater than the other (and the latter must then be
- * smaller than the former).
- *
- * A [Comparator] function represents such a total ordering by returning
- *
- * * a negative integer if [a] is smaller than [b],
- * * zero if [a] is equal to [b], and
- * * a positive integer if [a] is greater than [b].
- */
-typedef int Comparator<T>(T a, T b);
-
-/**
- * Interface used by types that have an intrinsic ordering.
- *
- * The [compareTo] operation defines a total ordering of objects,
- * which can be used for ordering and sorting.
- *
- * The [Comparable] interface should be used for the natural ordering of a type.
- * If a type can be ordered in more than one way,
- * and none of them is the obvious natural ordering,
- * then it might be better not to use the [Comparable] interface,
- * and to provide separate [Comparator]s instead.
- *
- * It is recommended that the order of a [Comparable] agrees
- * with its operator [==] equality (`a.compareTo(b) == 0` iff `a == b`),
- * but this is not a requirement.
- * For example, [double] and [DateTime] have `compareTo` methods
- * that do not agree with operator [==].
- * For doubles the [compareTo] method is more precise than the equality,
- * and for [DateTime] it is less precise.
- *
- * Examples:
- *
- *      (0.0).compareTo(-0.0);  // => 1
- *      0.0 == -0.0;            // => true
- *      var dt = new DateTime.now();
- *      var dt2 = dt.toUtc();
- *      dt == dt2;              // => false
- *      dt.compareTo(dt2);      // => 0
- *
- * The [Comparable] interface does not imply the existence
- * of the comparison operators `<`, `<=`, `>` and `>=`.
- * These should only be defined
- * if the ordering is a less-than/greater-than ordering,
- * that is, an ordering where you would naturally
- * use the words "less than" about the order of two elements.
- *
- * If the equality operator and [compareTo] disagree,
- * the comparison operators should follow the equality operator,
- * and will likely also disagree with [compareTo].
- * Otherwise they should match the [compareTo] method,
- * so that `a < b` iff `a.compareTo(b) < 0`.
- *
- * The [double] class defines comparison operators
- * that are compatible with equality.
- * The operators differ from `double.compareTo` on -0.0 and NaN.
- *
- * The [DateTime] class has no comparison operators, instead it has the more
- * precisely named [DateTime.isBefore] and [DateTime.isAfter].
- */
-abstract class Comparable<T> {
-  /**
-   * Compares this object to another [Comparable]
-   *
-   * Returns a value like a [Comparator] when comparing `this` to [other].
-   * That is, it returns a negative integer if `this` is ordered before [other],
-   * a positive integer if `this` is ordered after [other],
-   * and zero if `this` and [other] are ordered together.
-   *
-   * The [other] argument must be a value that is comparable to this object.
-   */
-  int compareTo(T other);
-
-  /**
-   * A [Comparator] that compares one comparable to another.
-   *
-   * It returns the result of `a.compareTo(b)`.
-   *
-   * This utility function is used as the default comparator
-   * for ordering collections, for example in the [List] sort function.
-   */
-  static int compare(Comparable a, Comparable b) => a.compareTo(b);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/core.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/core.dart
deleted file mode 100644
index deeae3b..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/core.dart
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- *
- * Built-in types, collections,
- * and other core functionality for every Dart program.
- *
- * This library is automatically imported.
- *
- * Some classes in this library,
- * such as [String] and [num],
- * support Dart's built-in data types.
- * Other classes, such as [List] and [Map], provide data structures
- * for managing collections of objects.
- * And still other classes represent commonly used types of data
- * such as URIs, dates and times, and errors.
- *
- * ## Numbers and booleans
- *
- * [int] and [double] provide support for Dart's built-in numerical data types:
- * integers and double-precision floating point numbers, respectively.
- * An object of type [bool] is either true or false.
- * Variables of these types can be constructed from literals:
- *
- *     int meaningOfLife = 42;
- *     double valueOfPi  = 3.141592;
- *     bool visible      = true;
- *
- * ## Strings and regular expressions
- *
- * A [String] is immutable and represents a sequence of characters.
- *
- *     String shakespeareQuote = "All the world's a stage, ...";
- *
- * [StringBuffer] provides a way to construct strings efficiently.
- *
- *     StringBuffer moreShakespeare = new StringBuffer();
- *     moreShakespeare.write('And all the men and women ');
- *     moreShakespeare.write('merely players; ...');
- *
- * The String and StringBuffer classes implement string concatenation,
- * interpolation, and other string manipulation features.
- *
- *     String philosophy = 'Live on ';
- *     String get palindrome => philosophy + philosophy.split('').reversed.join();
- *
- * [RegExp] implements Dart regular expressions,
- * which provide a grammar for matching patterns within text.
- * For example, here's a regular expression that matches
- * a string of one or more digits:
- *
- *     var numbers = new RegExp(r'\d+');
- *
- * Dart regular expressions have the same syntax and semantics as
- * JavaScript regular expressions. See
- * <http://ecma-international.org/ecma-262/5.1/#sec-15.10>
- * for the specification of JavaScript regular expressions.
- *
- * ## Collections
- *
- * The dart:core library provides basic collections,
- * such as [List], [Map], and [Set].
- *
- * A List is an ordered collection of objects, with a length.
- * Lists are sometimes called arrays.
- * Use a List when you need to access objects by index.
- *
- *     List superheroes = [ 'Batman', 'Superman', 'Harry Potter' ];
- *
- * A Set is an unordered collection of unique objects.
- * You cannot get an item by index (position).
- * Adding a duplicate item has no effect.
- *
- *     Set villains = new Set();
- *     villains.add('Joker');
- *     villains.addAll( ['Lex Luther', 'Voldemort'] );
- *
- * A Map is an unordered collection of key-value pairs.
- * Maps are sometimes called associative arrays because
- * maps associate a key to some value for easy retrieval.
- * Keys are unique.
- * Use a Map when you need to access objects
- * by a unique identifier.
- *
- *     Map sidekicks = { 'Batman': 'Robin',
- *                       'Superman': 'Lois Lane',
- *                       'Harry Potter': 'Ron and Hermione' };
- *
- * In addition to these classes,
- * dart:core contains [Iterable],
- * an interface that defines functionality
- * common in collections of objects.
- * Examples include the ability
- * to run a function on each element in the collection,
- * to apply a test to each element,
- * to retrieve an object, and to determine length.
- *
- * Iterable is implemented by List and Set,
- * and used by Map for its keys and values.
- *
- * For other kinds of collections, check out the
- * [dart:collection](#dart-collection) library.
- *
- * ## Date and time
- *
- * Use [DateTime] to represent a point in time
- * and [Duration] to represent a span of time.
- *
- * You can create DateTime objects with constructors
- * or by parsing a correctly formatted string.
- *
- *     DateTime now = new DateTime.now();
- *     DateTime berlinWallFell = new DateTime(1989, 11, 9);
- *     DateTime moonLanding = DateTime.parse("1969-07-20");
- *
- * Create a Duration object specifying the individual time units.
- *
- *     Duration timeRemaining = new Duration(hours:56, minutes:14);
- *
- * In addition to DateTime and Duration,
- * dart:core contains the [Stopwatch] class for measuring elapsed time.
- *
- * ## Uri
- *
- * A [Uri] object represents a uniform resource identifier,
- * which identifies a resource on the web.
- *
- *     Uri dartlang = Uri.parse('http://dartlang.org/');
- *
- * ## Errors
- *
- * The [Error] class represents the occurrence of an error
- * during runtime.
- * Subclasses of this class represent specific kinds of errors.
- *
- * ## Other documentation
- *
- * For more information about how to use the built-in types, refer to [Built-in
- * Types](http://www.dartlang.org/docs/dart-up-and-running/contents/ch02.html#built-in-types)
- * in Chapter 2 of
- * [Dart: Up and Running](http://www.dartlang.org/docs/dart-up-and-running/).
- *
- * Also, see [dart:core - Numbers, Collections, Strings, and
- * More](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartcore---numbers-collections-strings-and-more)
- * for more coverage of classes in this package.
- *
- * The
- * [Dart Language Specification](http://www.dartlang.org/docs/spec/)
- * provides technical details.
- */
-library dart.core;
-
-import "dart:collection";
-import "dart:_internal" hide Symbol;
-import "dart:_internal" as internal show Symbol;
-import 'dart:_js_helper' show NoInline;
-import "dart:convert" show
-  Encoding, ASCII, LATIN1, UTF8,
-  BASE64, StringConversionSink, ChunkedConversionSink;
-import "dart:math" show Random;  // Used by List.shuffle.
-import "dart:typed_data" show Uint8List;
-
-part "annotations.dart";
-part "bool.dart";
-part "comparable.dart";
-part "date_time.dart";
-part "double.dart";
-part "duration.dart";
-part "errors.dart";
-part "exceptions.dart";
-part "expando.dart";
-part "function.dart";
-part "identical.dart";
-part "int.dart";
-part "invocation.dart";
-part "iterable.dart";
-part "iterator.dart";
-part "list.dart";
-part "map.dart";
-part "null.dart";
-part "num.dart";
-part "object.dart";
-part "pattern.dart";
-part "print.dart";
-part "regexp.dart";
-part "set.dart";
-part "sink.dart";
-part "stacktrace.dart";
-part "stopwatch.dart";
-part "string.dart";
-part "string_buffer.dart";
-part "string_sink.dart";
-part "symbol.dart";
-part "type.dart";
-part "uri.dart";
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/date_time.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/date_time.dart
deleted file mode 100644
index 35e93e0..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/date_time.dart
+++ /dev/null
@@ -1,761 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An instant in time, such as July 20, 1969, 8:18pm GMT.
- *
- * Create a DateTime object by using one of the constructors
- * or by parsing a correctly formatted string,
- * which complies with a subset of ISO 8601.
- * Note that hours are specified between 0 and 23,
- * as in a 24-hour clock.
- * For example:
- *
- *     DateTime now = new DateTime.now();
- *     DateTime berlinWallFell = new DateTime(1989, 11, 9);
- *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");  // 8:18pm
- *
- * A DateTime object is anchored either in the UTC time zone
- * or in the local time zone of the current computer
- * when the object is created.
- *
- * Once created, neither the value nor the time zone
- * of a DateTime object may be changed.
- *
- * You can use properties to get
- * the individual units of a DateTime object.
- *
- *     assert(berlinWallFell.month == 11);
- *     assert(moonLanding.hour == 20);
- *
- * For convenience and readability,
- * the DateTime class provides a constant for each day and month
- * name&mdash;for example, [AUGUST] and [FRIDAY].
- * You can use these constants to improve code readibility:
- *
- *     DateTime berlinWallFell = new DateTime(1989, DateTime.NOVEMBER, 9);
- *     assert(berlinWallFell.weekday == DateTime.THURSDAY);
- *
- * Day and month values begin at 1, and the week starts on Monday.
- * That is, the constants [JANUARY] and [MONDAY] are both 1.
- *
- * ## Working with UTC and local time
- *
- * A DateTime object is in the local time zone
- * unless explicitly created in the UTC time zone.
- *
- *     DateTime dDay = new DateTime.utc(1944, 6, 6);
- *
- * Use [isUtc] to determine whether a DateTime object is based in UTC.
- * Use the methods [toLocal] and [toUtc]
- * to get the equivalent date/time value specified in the other time zone.
- * Use [timeZoneName] to get an abbreviated name of the time zone
- * for the DateTime object.
- * To find the difference
- * between UTC and the time zone of a DateTime object
- * call [timeZoneOffset].
- *
- * ## Comparing DateTime objects
- *
- * The DateTime class contains several handy methods,
- * such as [isAfter], [isBefore], and [isAtSameMomentAs],
- * for comparing DateTime objects.
- *
- *     assert(berlinWallFell.isAfter(moonLanding) == true);
- *     assert(berlinWallFell.isBefore(moonLanding) == false);
- *
- * ## Using DateTime with Duration
- *
- * Use the [add] and [subtract] methods with a [Duration] object
- * to create a new DateTime object based on another.
- * For example, to find the date that is sixty days after today, write:
- *
- *     DateTime today = new DateTime.now();
- *     DateTime sixtyDaysFromNow = today.add(new Duration(days: 60));
- *
- * To find out how much time is between two DateTime objects use
- * [difference], which returns a [Duration] object:
- *
- *     Duration difference = berlinWallFell.difference(moonLanding)
- *     assert(difference.inDays == 7416);
- *
- * The difference between two dates in different time zones
- * is just the number of nanoseconds between the two points in time.
- * It doesn't take calendar days into account.
- * That means that the difference between two midnights in local time may be
- * less than 24 hours times the number of days between them,
- * if there is a daylight saving change in between.
- * If the difference above is calculated using Australian local time, the
- * difference is 7415 days and 23 hours, which is only 7415 whole days as
- * reported by `inDays`.
- *
- * ## Other resources
- *
- * See [Duration] to represent a span of time.
- * See [Stopwatch] to measure timespans.
- *
- * The DateTime class does not provide internationalization.
- * To internationalize your code, use
- * the [intl](http://pub.dartlang.org/packages/intl) package.
- *
- */
-class DateTime implements Comparable<DateTime> {
-  // Weekday constants that are returned by [weekday] method:
-  static const int MONDAY = 1;
-  static const int TUESDAY = 2;
-  static const int WEDNESDAY = 3;
-  static const int THURSDAY = 4;
-  static const int FRIDAY = 5;
-  static const int SATURDAY = 6;
-  static const int SUNDAY = 7;
-  static const int DAYS_PER_WEEK = 7;
-
-  // Month constants that are returned by the [month] getter.
-  static const int JANUARY = 1;
-  static const int FEBRUARY = 2;
-  static const int MARCH = 3;
-  static const int APRIL = 4;
-  static const int MAY = 5;
-  static const int JUNE = 6;
-  static const int JULY = 7;
-  static const int AUGUST = 8;
-  static const int SEPTEMBER = 9;
-  static const int OCTOBER = 10;
-  static const int NOVEMBER = 11;
-  static const int DECEMBER = 12;
-  static const int MONTHS_PER_YEAR = 12;
-
-  /**
-   * The value of this DateTime.
-   *
-   * The content of this field is implementation dependent. On JavaScript it is
-   * equal to [millisecondsSinceEpoch]. On the VM it is equal to
-   * [microsecondsSinceEpoch].
-   */
-  final int _value;
-
-  /**
-   * True if this [DateTime] is set to UTC time.
-   *
-   *     DateTime dDay = new DateTime.utc(1944, 6, 6);
-   *     assert(dDay.isUtc);
-   *
-   */
-  final bool isUtc;
-
-  /**
-   * Constructs a [DateTime] instance specified in the local time zone.
-   *
-   * For example,
-   * to create a new DateTime object representing April 29, 2014, 6:04am:
-   *
-   *     DateTime annularEclipse = new DateTime(2014, DateTime.APRIL, 29, 6, 4);
-   */
-  DateTime(int year,
-           [int month = 1,
-            int day = 1,
-            int hour = 0,
-            int minute = 0,
-            int second = 0,
-            int millisecond = 0,
-            int microsecond = 0])
-      : this._internal(
-            year, month, day, hour, minute, second, millisecond, microsecond,
-            false);
-
-  /**
-   * Constructs a [DateTime] instance specified in the UTC time zone.
-   *
-   *     DateTime dDay = new DateTime.utc(1944, DateTime.JUNE, 6);
-   */
-  DateTime.utc(int year,
-               [int month = 1,
-                int day = 1,
-                int hour = 0,
-                int minute = 0,
-                int second = 0,
-                int millisecond = 0,
-                int microsecond = 0])
-    : this._internal(
-          year, month, day, hour, minute, second, millisecond, microsecond,
-          true);
-
-  /**
-   * Constructs a [DateTime] instance with current date and time in the
-   * local time zone.
-   *
-   *     DateTime thisInstant = new DateTime.now();
-   *
-   */
-  DateTime.now() : this._now();
-
-  /**
-   * Constructs a new [DateTime] instance based on [formattedString].
-   *
-   * Throws a [FormatException] if the input cannot be parsed.
-   *
-   * The function parses a subset of ISO 8601
-   * which includes the subset accepted by RFC 3339.
-   *
-   * The accepted inputs are currently:
-   *
-   * * A date: A signed four-to-six digit year, two digit month and
-   *   two digit day, optionally separated by `-` characters.
-   *   Examples: "19700101", "-0004-12-24", "81030-04-01".
-   * * An optional time part, separated from the date by either `T` or a space.
-   *   The time part is a two digit hour,
-   *   then optionally a two digit minutes value,
-   *   then optionally a two digit seconds value, and
-   *   then optionally a '.' followed by a one-to-six digit second fraction.
-   *   The minuts and seconds may be separated from the previous parts by a ':'.
-   *   Examples: "12", "12:30:24.124", "123010.50".
-   * * An optional time-zone offset part,
-   *   possibly separated from the previous by a space.
-   *   The time zone is either 'z' or 'Z', or it is a signed two digit hour
-   *   part and an optional two digit minute part. The sign must be either
-   *   "+" or "-", and can not be omitted.
-   *   The minutes may be separted from the hours by a ':'.
-   *   Examples: "Z", "-10", "01:30", "1130".
-   *
-   * This includes the output of both [toString] and [toIso8601String], which
-   * will be parsed back into a `DateTime` object with the same time as the
-   * original.
-   *
-   * The result is always in either local time or UTC.
-   * If a time zone offset other than UTC is specified,
-   * the time is converted to the equivalent UTC time.
-   *
-   * Examples of accepted strings:
-   *
-   * * `"2012-02-27 13:27:00"`
-   * * `"2012-02-27 13:27:00.123456z"`
-   * * `"20120227 13:27:00"`
-   * * `"20120227T132700"`
-   * * `"20120227"`
-   * * `"+20120227"`
-   * * `"2012-02-27T14Z"`
-   * * `"2012-02-27T14+00:00"`
-   * * `"-123450101 00:00:00 Z"`: in the year -12345.
-   * * `"2002-02-27T14:00:00-0500"`: Same as `"2002-02-27T19:00:00Z"`
-   */
-  // TODO(lrn): restrict incorrect values like  2003-02-29T50:70:80.
-  // Or not, that may be a breaking change.
-  static DateTime parse(String formattedString) {
-    /*
-     * date ::= yeardate time_opt timezone_opt
-     * yeardate ::= year colon_opt month colon_opt day
-     * year ::= sign_opt digit{4,6}
-     * colon_opt :: <empty> | ':'
-     * sign ::= '+' | '-'
-     * sign_opt ::=  <empty> | sign
-     * month ::= digit{2}
-     * day ::= digit{2}
-     * time_opt ::= <empty> | (' ' | 'T') hour minutes_opt
-     * minutes_opt ::= <empty> | colon_opt digit{2} seconds_opt
-     * seconds_opt ::= <empty> | colon_opt digit{2} millis_opt
-     * micros_opt ::= <empty> | '.' digit{1,6}
-     * timezone_opt ::= <empty> | space_opt timezone
-     * space_opt :: ' ' | <empty>
-     * timezone ::= 'z' | 'Z' | sign digit{2} timezonemins_opt
-     * timezonemins_opt ::= <empty> | colon_opt digit{2}
-     */
-    final RegExp re = new RegExp(
-        r'^([+-]?\d{4,6})-?(\d\d)-?(\d\d)'  // Day part.
-        r'(?:[ T](\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d{1,6}))?)?)?' // Time part.
-        r'( ?[zZ]| ?([-+])(\d\d)(?::?(\d\d))?)?)?$'); // Timezone part.
-
-    Match match = re.firstMatch(formattedString);
-    if (match != null) {
-      int parseIntOrZero(String matched) {
-        if (matched == null) return 0;
-        return int.parse(matched);
-      }
-
-      // Parses fractional second digits of '.(\d{1,6})' into the combined
-      // microseconds.
-      int parseMilliAndMicroseconds(String matched) {
-        if (matched == null) return 0;
-        int length = matched.length;
-        assert(length >= 1);
-        assert(length <= 6);
-
-        int result = 0;
-        for (int i = 0; i < 6; i++) {
-          result *= 10;
-          if (i < matched.length) {
-            result += matched.codeUnitAt(i) ^ 0x30;
-          }
-        }
-        return result;
-      }
-
-      int years = int.parse(match[1]);
-      int month = int.parse(match[2]);
-      int day = int.parse(match[3]);
-      int hour = parseIntOrZero(match[4]);
-      int minute = parseIntOrZero(match[5]);
-      int second = parseIntOrZero(match[6]);
-      bool addOneMillisecond = false;
-      int milliAndMicroseconds = parseMilliAndMicroseconds(match[7]);
-      int millisecond =
-          milliAndMicroseconds ~/ Duration.MICROSECONDS_PER_MILLISECOND;
-      int microsecond =
-          milliAndMicroseconds.remainder(Duration.MICROSECONDS_PER_MILLISECOND);
-      bool isUtc = false;
-      if (match[8] != null) {  // timezone part
-        isUtc = true;
-        if (match[9] != null) {
-          // timezone other than 'Z' and 'z'.
-          int sign = (match[9] == '-') ? -1 : 1;
-          int hourDifference = int.parse(match[10]);
-          int minuteDifference = parseIntOrZero(match[11]);
-          minuteDifference += 60 * hourDifference;
-          minute -= sign * minuteDifference;
-        }
-      }
-      int value = _brokenDownDateToValue(
-          years, month, day, hour, minute, second, millisecond, microsecond,
-          isUtc);
-      if (value == null) {
-        throw new FormatException("Time out of range", formattedString);
-      }
-      return new DateTime._withValue(value, isUtc: isUtc);
-    } else {
-      throw new FormatException("Invalid date format", formattedString);
-    }
-  }
-
-  static const int _MAX_MILLISECONDS_SINCE_EPOCH = 8640000000000000;
-
-  /**
-   * Constructs a new [DateTime] instance
-   * with the given [millisecondsSinceEpoch].
-   *
-   * If [isUtc] is false then the date is in the local time zone.
-   *
-   * The constructed [DateTime] represents
-   * 1970-01-01T00:00:00Z + [millisecondsSinceEpoch] ms in the given
-   * time zone (local or UTC).
-   */
-  external DateTime.fromMillisecondsSinceEpoch(int millisecondsSinceEpoch,
-                                              {bool isUtc: false});
-
-  /**
-   * Constructs a new [DateTime] instance
-   * with the given [microsecondsSinceEpoch].
-   *
-   * If [isUtc] is false then the date is in the local time zone.
-   *
-   * The constructed [DateTime] represents
-   * 1970-01-01T00:00:00Z + [microsecondsSinceEpoch] us in the given
-   * time zone (local or UTC).
-   */
-  external DateTime.fromMicrosecondsSinceEpoch(int microsecondsSinceEpoch,
-                                               {bool isUtc: false});
-
-  /**
-   * Constructs a new [DateTime] instance with the given value.
-   *
-   * If [isUtc] is false then the date is in the local time zone.
-   */
-  DateTime._withValue(this._value, {this.isUtc}) {
-    if (millisecondsSinceEpoch.abs() > _MAX_MILLISECONDS_SINCE_EPOCH ||
-        (millisecondsSinceEpoch.abs() == _MAX_MILLISECONDS_SINCE_EPOCH &&
-         microsecond != 0)) {
-      throw new ArgumentError(millisecondsSinceEpoch);
-    }
-    if (isUtc == null) throw new ArgumentError(isUtc);
-  }
-
-  /**
-   * Returns true if [other] is a [DateTime] at the same moment and in the
-   * same time zone (UTC or local).
-   *
-   *     DateTime dDayUtc   = new DateTime.utc(1944, DateTime.JUNE, 6);
-   *     DateTime dDayLocal = new DateTime(1944, DateTime.JUNE, 6);
-   *
-   *     assert(dDayUtc.isAtSameMomentAs(dDayLocal) == false);
-   *
-   * See [isAtSameMomentAs] for a comparison that adjusts for time zone.
-   */
-  bool operator ==(other) {
-    if (!(other is DateTime)) return false;
-    return (_value == other._value && isUtc == other.isUtc);
-  }
-
-  /**
-   * Returns true if [this] occurs before [other].
-   *
-   * The comparison is independent
-   * of whether the time is in UTC or in the local time zone.
-   *
-   *     DateTime berlinWallFell = new DateTime(1989, 11, 9);
-   *     DateTime moonLanding    = DateTime.parse("1969-07-20 20:18:00");
-   *
-   *     assert(berlinWallFell.isBefore(moonLanding) == false);
-   *
-   */
-  bool isBefore(DateTime other) {
-    return _value < other._value;
-  }
-
-  /**
-   * Returns true if [this] occurs after [other].
-   *
-   * The comparison is independent
-   * of whether the time is in UTC or in the local time zone.
-   *
-   *     DateTime berlinWallFell = new DateTime(1989, 11, 9);
-   *     DateTime moonLanding    = DateTime.parse("1969-07-20 20:18:00");
-   *
-   *     assert(berlinWallFell.isAfter(moonLanding) == true);
-   *
-   */
-  bool isAfter(DateTime other) {
-    return _value > other._value;
-  }
-
-  /**
-   * Returns true if [this] occurs at the same moment as [other].
-   *
-   * The comparison is independent of whether the time is in UTC or in the local
-   * time zone.
-   *
-   *     DateTime berlinWallFell = new DateTime(1989, 11, 9);
-   *     DateTime moonLanding    = DateTime.parse("1969-07-20 20:18:00");
-   *
-   *     assert(berlinWallFell.isAtSameMomentAs(moonLanding) == false);
-   */
-  bool isAtSameMomentAs(DateTime other) {
-    return _value == other._value;
-  }
-
-  /**
-   * Compares this DateTime object to [other],
-   * returning zero if the values are equal.
-   *
-   * This function returns a negative integer
-   * if this DateTime is smaller (earlier) than [other],
-   * or a positive integer if it is greater (later).
-   */
-  int compareTo(DateTime other) => _value.compareTo(other._value);
-
-  int get hashCode => (_value ^ (_value >> 30)) & 0x3FFFFFFF;
-
-  /**
-   * Returns this DateTime value in the local time zone.
-   *
-   * Returns [this] if it is already in the local time zone.
-   * Otherwise this method is equivalent to:
-   *
-   *     new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch,
-   *                                             isUtc: false)
-   */
-  DateTime toLocal() {
-    if (isUtc) {
-      return new DateTime._withValue(_value, isUtc: false);
-    }
-    return this;
-  }
-
-  /**
-   * Returns this DateTime value in the UTC time zone.
-   *
-   * Returns [this] if it is already in UTC.
-   * Otherwise this method is equivalent to:
-   *
-   *     new DateTime.fromMicrosecondsSinceEpoch(microsecondsSinceEpoch,
-   *                                             isUtc: true)
-   */
-  DateTime toUtc() {
-    if (isUtc) return this;
-    return new DateTime._withValue(_value, isUtc: true);
-  }
-
-  static String _fourDigits(int n) {
-    int absN = n.abs();
-    String sign = n < 0 ? "-" : "";
-    if (absN >= 1000) return "$n";
-    if (absN >= 100) return "${sign}0$absN";
-    if (absN >= 10) return "${sign}00$absN";
-    return "${sign}000$absN";
-  }
-
-  static String _sixDigits(int n) {
-    assert(n < -9999 || n > 9999);
-    int absN = n.abs();
-    String sign = n < 0 ? "-" : "+";
-    if (absN >= 100000) return "$sign$absN";
-    return "${sign}0$absN";
-  }
-
-  static String _threeDigits(int n) {
-    if (n >= 100) return "${n}";
-    if (n >= 10) return "0${n}";
-    return "00${n}";
-  }
-
-  static String _twoDigits(int n) {
-    if (n >= 10) return "${n}";
-    return "0${n}";
-  }
-
-  /**
-   * Returns a human-readable string for this instance.
-   *
-   * The returned string is constructed for the time zone of this instance.
-   * The `toString()` method provides a simply formatted string.
-   * It does not support internationalized strings.
-   * Use the [intl](http://pub.dartlang.org/packages/intl) package
-   * at the pub shared packages repo.
-   *
-   * The resulting string can be parsed back using [parse].
-   */
-  String toString() {
-    String y = _fourDigits(year);
-    String m = _twoDigits(month);
-    String d = _twoDigits(day);
-    String h = _twoDigits(hour);
-    String min = _twoDigits(minute);
-    String sec = _twoDigits(second);
-    String ms = _threeDigits(millisecond);
-    String us = microsecond == 0 ? "" : _threeDigits(microsecond);
-    if (isUtc) {
-      return "$y-$m-$d $h:$min:$sec.$ms${us}Z";
-    } else {
-      return "$y-$m-$d $h:$min:$sec.$ms$us";
-    }
-  }
-
-  /**
-   * Returns an ISO-8601 full-precision extended format representation.
-   *
-   * The format is `yyyy-MM-ddTHH:mm:ss.mmmuuuZ` for UTC time, and
-   * `yyyy-MM-ddTHH:mm:ss.mmmuuu` (no trailing "Z") for local/non-UTC time,
-   * where:
-   *
-   * * `yyyy` is a, possibly negative, four digit representation of the year,
-   *   if the year is in the range -9999 to 9999,
-   *   otherwise it is a signed six digit representation of the year.
-   * * `MM` is the month in the range 01 to 12,
-   * * `dd` is the day of the month in the range 01 to 31,
-   * * `HH` are hours in the range 00 to 23,
-   * * `mm` are minutes in the range 00 to 59,
-   * * `ss` are seconds in the range 00 to 59 (no leap seconds),
-   * * `mmm` are milliseconds in the range 000 to 999, and
-   * * `uuu` are microseconds in the range 001 to 999. If [microsecond] equals
-   *   0, then this part is omitted.
-   *
-   * The resulting string can be parsed back using [parse].
-   */
-  String toIso8601String() {
-    String y = (year >= -9999 && year <= 9999) ? _fourDigits(year)
-                                               : _sixDigits(year);
-    String m = _twoDigits(month);
-    String d = _twoDigits(day);
-    String h = _twoDigits(hour);
-    String min = _twoDigits(minute);
-    String sec = _twoDigits(second);
-    String ms = _threeDigits(millisecond);
-    String us = microsecond == 0 ? "" : _threeDigits(microsecond);
-    if (isUtc) {
-      return "$y-$m-${d}T$h:$min:$sec.$ms${us}Z";
-    } else {
-      return "$y-$m-${d}T$h:$min:$sec.$ms$us";
-    }
-  }
-
-  /**
-   * Returns a new [DateTime] instance with [duration] added to [this].
-   *
-   *     DateTime today = new DateTime.now();
-   *     DateTime sixtyDaysFromNow = today.add(new Duration(days: 60));
-   */
-  external DateTime add(Duration duration);
-
-  /**
-   * Returns a new [DateTime] instance with [duration] subtracted from [this].
-   *
-   *     DateTime today = new DateTime.now();
-   *     DateTime sixtyDaysAgo = today.subtract(new Duration(days: 30));
-   *
-   * Notice that duration being subtracted is actually 30 * 24 * 60 * 60 seconds
-   * and if that crosses a daylight saving time change, the resulting `DateTime`
-   * won't have the same time of day as `today`, and may not actually hit the
-   * calendar date 30 days earlier. Be careful when working with dates in local
-   * time.
-   */
-  external DateTime subtract(Duration duration);
-
-  /**
-   * Returns a [Duration] with the difference between [this] and [other].
-   *
-   *     DateTime berlinWallFell = new DateTime.utc(1989, DateTime.NOVEMBER, 9);
-   *     DateTime dDay = new DateTime.utc(1944, DateTime.JUNE, 6);
-   *
-   *     Duration difference = berlinWallFell.difference(dDay);
-   *     assert(difference.inDays == 16592);
-   *
-   * The difference is measured in seconds and fractions of seconds.
-   * The difference above counts the number of fractional seconds between
-   * midnight at the beginning of those dates.
-   * If the dates above had been in local time, not UTC, then the difference
-   * between two midnights may not be a multiple of 24 hours due to daylight
-   * saving differences.
-   *
-   * For example, in Australia, similar code using local time instead of UTC:
-   *
-   *     DateTime berlinWallFell = new DateTime(1989, DateTime.NOVEMBER, 9);
-   *     DateTime dDay = new DateTime(1944, DateTime.JUNE, 6);
-   *     Duration difference = berlinWallFell.difference(dDay);
-   *     assert(difference.inDays == 16592);
-   *
-   * will fail because the difference is actually 16591 days and 23 hours, and
-   * [Duration.inDays] only returns the number of whole days.
-   */
-  external Duration difference(DateTime other);
-
-  external DateTime._internal(int year,
-                              int month,
-                              int day,
-                              int hour,
-                              int minute,
-                              int second,
-                              int millisecond,
-                              int microsecond,
-                              bool isUtc);
-
-  external DateTime._now();
-
-  /// Returns the time as value (millisecond or microsecond since epoch), or
-  /// null if the values are out of range.
-  external static int _brokenDownDateToValue(
-      int year, int month, int day, int hour, int minute, int second,
-      int millisecond, int microsecond, bool isUtc);
-
-  /**
-   * The number of milliseconds since
-   * the "Unix epoch" 1970-01-01T00:00:00Z (UTC).
-   *
-   * This value is independent of the time zone.
-   *
-   * This value is at most
-   * 8,640,000,000,000,000ms (100,000,000 days) from the Unix epoch.
-   * In other words: `millisecondsSinceEpoch.abs() <= 8640000000000000`.
-   */
-  external int get millisecondsSinceEpoch;
-
-  /**
-   * The number of microseconds since
-   * the "Unix epoch" 1970-01-01T00:00:00Z (UTC).
-   *
-   * This value is independent of the time zone.
-   *
-   * This value is at most
-   * 8,640,000,000,000,000,000us (100,000,000 days) from the Unix epoch.
-   * In other words: `microsecondsSinceEpoch.abs() <= 8640000000000000000`.
-   *
-   * Note that this value does not fit into 53 bits (the size of a IEEE double).
-   * A JavaScript number is not able to hold this value.
-   */
-  external int get microsecondsSinceEpoch;
-
-  /**
-   * The abbreviated time zone name&mdash;for example,
-   * [:"CET":] or [:"CEST":].
-   */
-  external String get timeZoneName;
-
-  /**
-   * The time zone offset, which
-   * is the difference between local time and UTC.
-   *
-   * The offset is positive for time zones east of UTC.
-   *
-   * Note, that JavaScript, Python and C return the difference between UTC and
-   * local time. Java, C# and Ruby return the difference between local time and
-   * UTC.
-   */
-  external Duration get timeZoneOffset;
-
-  /**
-   * The year.
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.year == 1969);
-   */
-  external int get year;
-
-  /**
-   * The month [1..12].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.month == 7);
-   *     assert(moonLanding.month == DateTime.JULY);
-   */
-  external int get month;
-
-  /**
-   * The day of the month [1..31].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.day == 20);
-   */
-  external int get day;
-
-  /**
-   * The hour of the day, expressed as in a 24-hour clock [0..23].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.hour == 20);
-   */
-  external int get hour;
-
-  /**
-   * The minute [0...59].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.minute == 18);
-   */
-  external int get minute;
-
-  /**
-   * The second [0...59].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.second == 0);
-   */
-  external int get second;
-
-  /**
-   * The millisecond [0...999].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.millisecond == 0);
-   */
-  external int get millisecond;
-
-  /**
-   * The microsecond [0...999].
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.microsecond == 0);
-   */
-  external int get microsecond;
-
-  /**
-   * The day of the week [MONDAY]..[SUNDAY].
-   *
-   * In accordance with ISO 8601
-   * a week starts with Monday, which has the value 1.
-   *
-   *     DateTime moonLanding = DateTime.parse("1969-07-20 20:18:00");
-   *     assert(moonLanding.weekday == 7);
-   *     assert(moonLanding.weekday == DateTime.SUNDAY);
-   *
-   */
-  external int get weekday;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/double.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/double.dart
deleted file mode 100644
index 87a8b51..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/double.dart
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-// TODO: Convert this abstract class into a concrete class double
-// that uses the patch class functionality to account for the
-// different platform implementations.
-
-/**
- * A double-precision floating point number.
- *
- * Representation of Dart doubles containing double specific constants
- * and operations and specializations of operations inherited from
- * [num]. Dart doubles are 64-bit floating-point numbers as specified in the
- * IEEE 754 standard.
- *
- * The [double] type is contagious. Operations on [double]s return
- * [double] results.
- *
- * It is a compile-time error for a class to attempt to extend or implement
- * double.
- */
-abstract class double extends num {
-  static const double NAN = 0.0 / 0.0;
-  static const double INFINITY = 1.0 / 0.0;
-  static const double NEGATIVE_INFINITY = -INFINITY;
-  static const double MIN_POSITIVE = 5e-324;
-  static const double MAX_FINITE = 1.7976931348623157e+308;
-
-  double remainder(num other);
-
-  /** Addition operator. */
-  double operator +(num other);
-
-  /** Subtraction operator. */
-  double operator -(num other);
-
-  /** Multiplication operator. */
-  double operator *(num other);
-
-  double operator %(num other);
-
-  /** Division operator. */
-  double operator /(num other);
-
-  /**
-   * Truncating division operator.
-   *
-   * The result of the truncating division `a ~/ b` is equivalent to
-   * `(a / b).truncate()`.
-   */
-  int operator ~/(num other);
-
-  /** Negate operator. */
-  double operator -();
-
-  /** Returns the absolute value of this [double]. */
-  double abs();
-
-  /**
-   * Returns the sign of the double's numerical value.
-   *
-   * Returns -1.0 if the value is less than zero,
-   * +1.0 if the value is greater than zero,
-   * and the value itself if it is -0.0, 0.0 or NaN.
-   */
-  double get sign;
-
-  /**
-   * Returns the integer closest to `this`.
-   *
-   * Rounds away from zero when there is no closest integer:
-   *  `(3.5).round() == 4` and `(-3.5).round() == -4`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int round();
-
-  /**
-   * Returns the greatest integer no greater than `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int floor();
-
-  /**
-   * Returns the least integer no smaller than `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int ceil();
-
-  /**
-   * Returns the integer obtained by discarding any fractional
-   * digits from `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int truncate();
-
-  /**
-   * Returns the integer double value closest to `this`.
-   *
-   * Rounds away from zero when there is no closest integer:
-   *  `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is not
-   * a finite value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`,
-   * and `-0.0` is therefore considered closer to negative numbers than `0.0`.
-   * This means that for a value, `d` in the range `-0.5 < d < 0.0`,
-   * the result is `-0.0`.
-   */
-  double roundToDouble();
-
-  /**
-   * Returns the greatest integer double value no greater than `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is not
-   * a finite value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `0.0 < d < 1.0` will return `0.0`.
-   */
-  double floorToDouble();
-
-  /**
-   * Returns the least integer double value no smaller than `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is not
-   * a finite value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`.
-   */
-  double ceilToDouble();
-
-  /**
-   * Returns the integer double value obtained by discarding any fractional
-   * digits from `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is not
-   * a finite value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and
-   * in the range `0.0 < d < 1.0` it will return 0.0.
-   */
-  double truncateToDouble();
-
-  /**
-   * Provide a representation of this [double] value.
-   *
-   * The representation is a number literal such that the closest double value
-   * to the representation's mathematical value is this [double].
-   *
-   * Returns "NaN" for the Not-a-Number value.
-   * Returns "Infinity" and "-Infinity" for positive and negative Infinity.
-   * Returns "-0.0" for negative zero.
-   *
-   * For all doubles, `d`, converting to a string and parsing the string back
-   * gives the same value again: `d == double.parse(d.toString())` (except when
-   * `d` is NaN).
-   */
-  String toString();
-
-  /**
-   * Parse [source] as an double literal and return its value.
-   *
-   * Accepts an optional sign (`+` or `-`) followed by either the characters
-   * "Infinity", the characters "NaN" or a floating-point representation.
-   * A floating-point representation is composed of a mantissa and an optional
-   * exponent part. The mantissa is either a decimal point (`.`) followed by a
-   * sequence of (decimal) digits, or a sequence of digits
-   * optionally followed by a decimal point and optionally more digits. The
-   * (optional) exponent part consists of the character "e" or "E", an optional
-   * sign, and one or more digits.
-   *
-   * Leading and trailing whitespace is ignored.
-   *
-   * If the [source] is not a valid double literal, the [onError]
-   * is called with the [source] as argument, and its return value is
-   * used instead. If no `onError` is provided, a [FormatException]
-   * is thrown instead.
-   *
-   * The [onError] function is only invoked if [source] is a [String] with an
-   * invalid format. It is not invoked if the [source] is invalid for some
-   * other reason, for example by being `null`.
-   *
-   * Examples of accepted strings:
-   *
-   *     "3.14"
-   *     "  3.14 \xA0"
-   *     "0."
-   *     ".0"
-   *     "-1.e3"
-   *     "1234E+7"
-   *     "+.12e-9"
-   *     "-NaN"
-   */
-  external static double parse(String source,
-                               [double onError(String source)]);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/duration.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/duration.dart
deleted file mode 100644
index c5b73a2..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/duration.dart
+++ /dev/null
@@ -1,289 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A span of time, such as 27 days, 4 hours, 12 minutes, and 3 seconds.
- *
- * A `Duration` represents a difference from one point in time to another. The
- * duration may be "negative" if the difference is from a later time to an
- * earlier.
- *
- * To create a new Duration object, use this class's single constructor
- * giving the appropriate arguments:
- *
- *     Duration fastestMarathon = new Duration(hours:2, minutes:3, seconds:2);
- *
- * The Duration is the sum of all individual parts.
- * This means that individual parts can be larger than the next-bigger unit.
- * For example, [minutes] can be greater than 59.
- *
- *     assert(fastestMarathon.inMinutes == 123);
- *
- * All individual parts are allowed to be negative.
- *
- * Use one of the properties, such as [inDays],
- * to retrieve the integer value of the Duration in the specified time unit.
- * Note that the returned value is rounded down.
- * For example,
- *
- *     Duration aLongWeekend = new Duration(hours:88);
- *     assert(aLongWeekend.inDays == 3);
- *
- * This class provides a collection of arithmetic
- * and comparison operators,
- * plus a set of constants useful for converting time units.
- *
- * See [DateTime] to represent a point in time.
- * See [Stopwatch] to measure time-spans.
- *
- */
-class Duration implements Comparable<Duration> {
-  static const int MICROSECONDS_PER_MILLISECOND = 1000;
-  static const int MILLISECONDS_PER_SECOND = 1000;
-  static const int SECONDS_PER_MINUTE = 60;
-  static const int MINUTES_PER_HOUR = 60;
-  static const int HOURS_PER_DAY = 24;
-
-  static const int MICROSECONDS_PER_SECOND =
-      MICROSECONDS_PER_MILLISECOND * MILLISECONDS_PER_SECOND;
-  static const int MICROSECONDS_PER_MINUTE =
-      MICROSECONDS_PER_SECOND * SECONDS_PER_MINUTE;
-  static const int MICROSECONDS_PER_HOUR =
-      MICROSECONDS_PER_MINUTE * MINUTES_PER_HOUR;
-  static const int MICROSECONDS_PER_DAY =
-      MICROSECONDS_PER_HOUR * HOURS_PER_DAY;
-
-
-  static const int MILLISECONDS_PER_MINUTE =
-      MILLISECONDS_PER_SECOND * SECONDS_PER_MINUTE;
-  static const int MILLISECONDS_PER_HOUR =
-      MILLISECONDS_PER_MINUTE * MINUTES_PER_HOUR;
-  static const int MILLISECONDS_PER_DAY =
-      MILLISECONDS_PER_HOUR * HOURS_PER_DAY;
-
-  static const int SECONDS_PER_HOUR = SECONDS_PER_MINUTE * MINUTES_PER_HOUR;
-  static const int SECONDS_PER_DAY = SECONDS_PER_HOUR * HOURS_PER_DAY;
-
-  static const int MINUTES_PER_DAY = MINUTES_PER_HOUR * HOURS_PER_DAY;
-
-  static const Duration ZERO = const Duration(seconds: 0);
-
-  /*
-   * The value of this Duration object in microseconds.
-   */
-  final int _duration;
-
-  /**
-   * Creates a new Duration object whose value
-   * is the sum of all individual parts.
-   *
-   * Individual parts can be larger than the next-bigger unit.
-   * For example, [hours] can be greater than 23.
-   *
-   * All individual parts are allowed to be negative.
-   * All arguments are 0 by default.
-   */
-  const Duration({int days: 0,
-                  int hours: 0,
-                  int minutes: 0,
-                  int seconds: 0,
-                  int milliseconds: 0,
-                  int microseconds: 0})
-      : this._microseconds(
-            MICROSECONDS_PER_DAY * days +
-            MICROSECONDS_PER_HOUR * hours +
-            MICROSECONDS_PER_MINUTE * minutes +
-            MICROSECONDS_PER_SECOND * seconds +
-            MICROSECONDS_PER_MILLISECOND * milliseconds +
-            microseconds);
-
-  // Fast path internal direct constructor to avoids the optional arguments and
-  // [_microseconds] recomputation.
-  const Duration._microseconds(this._duration);
-
-  /**
-   * Adds this Duration and [other] and
-   * returns the sum as a new Duration object.
-   */
-  Duration operator +(Duration other) {
-    return new Duration._microseconds(_duration + other._duration);
-  }
-
-  /**
-   * Subtracts [other] from this Duration and
-   * returns the difference as a new Duration object.
-   */
-  Duration operator -(Duration other) {
-    return new Duration._microseconds(_duration - other._duration);
-  }
-
-  /**
-   * Multiplies this Duration by the given [factor] and returns the result
-   * as a new Duration object.
-   *
-   * Note that when [factor] is a double, and the duration is greater than
-   * 53 bits, precision is lost because of double-precision arithmetic.
-   */
-  Duration operator *(num factor) {
-    return new Duration._microseconds((_duration * factor).round());
-  }
-
-  /**
-   * Divides this Duration by the given [quotient] and returns the truncated
-   * result as a new Duration object.
-   *
-   * Throws an [IntegerDivisionByZeroException] if [quotient] is `0`.
-   */
-  Duration operator ~/(int quotient) {
-    // By doing the check here instead of relying on "~/" below we get the
-    // exception even with dart2js.
-    if (quotient == 0) throw new IntegerDivisionByZeroException();
-    return new Duration._microseconds(_duration ~/ quotient);
-  }
-
-  /**
-   * Returns `true` if the value of this Duration
-   * is less than the value of [other].
-   */
-  bool operator <(Duration other) => this._duration < other._duration;
-
-  /**
-   * Returns `true` if the value of this Duration
-   * is greater than the value of [other].
-   */
-  bool operator >(Duration other) => this._duration > other._duration;
-
-  /**
-   * Returns `true` if the value of this Duration
-   * is less than or equal to the value of [other].
-   */
-  bool operator <=(Duration other) => this._duration <= other._duration;
-
-  /**
-   * Returns `true` if the value of this Duration
-   * is greater than or equal to the value of [other].
-   */
-  bool operator >=(Duration other) => this._duration >= other._duration;
-
-  /**
-   * Returns the number of whole days spanned by this Duration.
-   */
-  int get inDays => _duration ~/ Duration.MICROSECONDS_PER_DAY;
-
-  /**
-   * Returns the number of whole hours spanned by this Duration.
-   *
-   * The returned value can be greater than 23.
-   */
-  int get inHours => _duration ~/ Duration.MICROSECONDS_PER_HOUR;
-
-  /**
-   * Returns the number of whole minutes spanned by this Duration.
-   *
-   * The returned value can be greater than 59.
-   */
-  int get inMinutes => _duration ~/ Duration.MICROSECONDS_PER_MINUTE;
-
-  /**
-   * Returns the number of whole seconds spanned by this Duration.
-   *
-   * The returned value can be greater than 59.
-   */
-  int get inSeconds => _duration ~/ Duration.MICROSECONDS_PER_SECOND;
-
-  /**
-   * Returns number of whole milliseconds spanned by this Duration.
-   *
-   * The returned value can be greater than 999.
-   */
-  int get inMilliseconds => _duration ~/ Duration.MICROSECONDS_PER_MILLISECOND;
-
-  /**
-   * Returns number of whole microseconds spanned by this Duration.
-   */
-  int get inMicroseconds => _duration;
-
-  /**
-   * Returns `true` if this Duration is the same object as [other].
-   */
-  bool operator ==(other) {
-    if (other is !Duration) return false;
-    return _duration == other._duration;
-  }
-
-  int get hashCode => _duration.hashCode;
-
-  /**
-   * Compares this Duration to [other], returning zero if the values are equal.
-   *
-   * Returns a negative integer if this `Duration` is shorter than
-   * [other], or a positive integer if it is longer.
-   *
-   * A negative `Duration` is always considered shorter than a positive one.
-   *
-   * It is always the case that `duration1.compareTo(duration2) < 0` iff
-   * `(someDate + duration1).compareTo(someDate + duration2) < 0`.
-   */
-  int compareTo(Duration other) => _duration.compareTo(other._duration);
-
-  /**
-   * Returns a string representation of this `Duration`.
-   *
-   * Returns a string with hours, minutes, seconds, and microseconds, in the
-   * following format: `HH:MM:SS.mmmmmm`. For example,
-   *
-   *     var d = new Duration(days:1, hours:1, minutes:33, microseconds: 500);
-   *     d.toString();  // "25:33:00.000500"
-   */
-  String toString() {
-    String sixDigits(int n) {
-      if (n >= 100000) return "$n";
-      if (n >= 10000) return "0$n";
-      if (n >= 1000) return "00$n";
-      if (n >= 100) return "000$n";
-      if (n >= 10) return "0000$n";
-      return "00000$n";
-    }
-    String twoDigits(int n) {
-      if (n >= 10) return "$n";
-      return "0$n";
-    }
-
-    if (inMicroseconds < 0) {
-      return "-${-this}";
-    }
-    String twoDigitMinutes = twoDigits(inMinutes.remainder(MINUTES_PER_HOUR));
-    String twoDigitSeconds = twoDigits(inSeconds.remainder(SECONDS_PER_MINUTE));
-    String sixDigitUs =
-        sixDigits(inMicroseconds.remainder(MICROSECONDS_PER_SECOND));
-    return "$inHours:$twoDigitMinutes:$twoDigitSeconds.$sixDigitUs";
-  }
-
-  /**
-   * Returns whether this `Duration` is negative.
-   *
-   * A negative `Duration` represents the difference from a later time to an
-   * earlier time.
-   */
-  bool get isNegative => _duration < 0;
-
-  /**
-   * Returns a new `Duration` representing the absolute value of this
-   * `Duration`.
-   *
-   * The returned `Duration` has the same length as this one, but is always
-   * positive.
-   */
-  Duration abs() => new Duration._microseconds(_duration.abs());
-
-  /**
-   * Returns a new `Duration` representing this `Duration` negated.
-   *
-   * The returned `Duration` has the same length as this one, but will have the
-   * opposite sign of this one.
-   */
-  Duration operator -() => new Duration._microseconds(-_duration);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/errors.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/errors.dart
deleted file mode 100644
index c11ea2e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/errors.dart
+++ /dev/null
@@ -1,573 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * Error objects thrown in the case of a program failure.
- *
- * An `Error` object represents a program failure that the programmer
- * should have avoided.
- *
- * Examples include calling a function with invalid arguments,
- * or even with the wrong number of arguments,
- * or calling it at a time when it is not allowed.
- *
- * These are not errors that a caller should expect or catch -
- * if they occur, the program is erroneous,
- * and terminating the program may be the safest response.
- *
- * When deciding that a function throws an error,
- * the conditions where it happens should be clearly described,
- * and they should be detectable and predictable,
- * so the programmer using the function can avoid triggering the error.
- *
- * Such descriptions often uses words like
- * "must" or "must not" to describe the condition,
- * and if you see words like that in a function's documentation,
- * then not satisfying the requirement
- * is very likely to cause an error to be thrown.
- *
- * Example (from [String.contains]):
- *
- *        `startIndex` must not be negative or greater than `length`.
- *
- * In this case, an error will be thrown if `startIndex` is negative
- * or too large.
- *
- * If the conditions are not detectable before calling a function,
- * the called function should not throw an `Error`.
- * It may still throw a value,
- * but the caller will have to catch the thrown value,
- * effectively making it an alternative result rather than an error.
- * The thrown object can choose to implement [Exception]
- * to document that it represents an exceptional, but not erroneous, occurrence,
- * but it has no other effect than documentation.
- *
- * All non-`null` values can be thrown in Dart.
- * Objects extending `Error` are handled specially:
- * The first time they are thrown,
- * the stack trace at the throw point is recorded
- * and stored in the error object.
- * It can be retrieved using the [stackTrace] getter.
- * An error object that merely implements `Error`, and doesn't extend it,
- * will not store the stack trace automatically.
- *
- * Error objects are also used for system wide failures
- * like stack overflow or an out-of-memory situation.
- *
- * Since errors are not created to be caught,
- * there is no need for subclasses to distinguish the errors.
- * Instead subclasses have been created in order to make groups
- * of related errors easy to create with consistent error messages.
- * For example, the [String.contains] method will use a [RangeError]
- * if its `startIndex` isn't in the range `0..length`,
- * which is easily created by `new RangeError.range(startIndex, 0, length)`.
- */
-class Error {
-  Error();  // Prevent use as mixin.
-
-  /**
-   * Safely convert a value to a [String] description.
-   *
-   * The conversion is guaranteed to not throw, so it won't use the object's
-   * toString method.
-   */
-  static String safeToString(Object object) {
-    if (object is num || object is bool || null == object) {
-      return object.toString();
-    }
-    if (object is String) {
-      return _stringToSafeString(object);
-    }
-    return _objectToString(object);
-  }
-
-  /** Convert string to a valid string literal with no control characters. */
-  external static String _stringToSafeString(String string);
-
-  external static String _objectToString(Object object);
-
-  external StackTrace get stackTrace;
-}
-
-/**
- * Error thrown by the runtime system when an assert statement fails.
- */
-class AssertionError extends Error {
-  AssertionError();
-  String toString() => "Assertion failed";
-}
-
-/**
- * Error thrown by the runtime system when a type assertion fails.
- */
-class TypeError extends AssertionError {
-}
-
-/**
- * Error thrown by the runtime system when a cast operation fails.
- */
-class CastError extends Error {
-}
-
-/**
- * Error thrown when attempting to throw [:null:].
- */
-class NullThrownError extends Error {
-  String toString() => "Throw of null.";
-}
-
-/**
- * Error thrown when a function is passed an unacceptable argument.
- */
-class ArgumentError extends Error {
-  /** Whether value was provided. */
-  final bool _hasValue;
-  /** The invalid value. */
-  final invalidValue;
-  /** Name of the invalid argument, if available. */
-  final String name;
-  /** Message describing the problem. */
-  final message;
-
-  /**
-   * The [message] describes the erroneous argument.
-   *
-   * Existing code may be using `message` to hold the invalid value.
-   * If the `message` is not a [String], it is assumed to be a value instead
-   * of a message.
-   */
-  ArgumentError([this.message])
-     : invalidValue = null,
-       _hasValue = false,
-       name = null;
-
-  /**
-   * Creates error containing the invalid [value].
-   *
-   * A message is built by suffixing the [message] argument with
-   * the [name] argument (if provided) and the value. Example
-   *
-   *    "Invalid argument (foo): null"
-   *
-   * The `name` should match the argument name of the function, but if
-   * the function is a method implementing an interface, and its argument
-   * names differ from the interface, it might be more useful to use the
-   * interface method's argument name (or just rename arguments to match).
-   */
-  ArgumentError.value(value,
-                      [String this.name,
-                       String this.message])
-      : invalidValue = value,
-        _hasValue = true;
-
-  /**
-   * Create an argument error for a `null` argument that must not be `null`.
-   */
-  ArgumentError.notNull([this.name])
-      : _hasValue = false,
-        message = "Must not be null",
-        invalidValue = null;
-
-  // Helper functions for toString overridden in subclasses.
-  String get _errorName => "Invalid argument${!_hasValue ? "(s)" : ""}";
-  String get _errorExplanation => "";
-
-  String toString() {
-    String nameString = "";
-    if (name != null) {
-      nameString = " ($name)";
-    }
-    var message = (this.message == null) ? "" : ": ${this.message}";
-    String prefix = "$_errorName$nameString$message";
-    if (!_hasValue) return prefix;
-    // If we know the invalid value, we can try to describe the problem.
-    String explanation = _errorExplanation;
-    String errorValue = Error.safeToString(invalidValue);
-    return "$prefix$explanation: $errorValue";
-  }
-}
-
-/**
- * Error thrown due to an index being outside a valid range.
- */
-class RangeError extends ArgumentError {
-  /** The minimum value that [value] is allowed to assume. */
-  final num start;
-  /** The maximum value that [value] is allowed to assume. */
-  final num end;
-
-  // TODO(lrn): This constructor should be called only with string values.
-  // It currently isn't in all cases.
-  /**
-   * Create a new [RangeError] with the given [message].
-   */
-  RangeError(var message)
-      : start = null, end = null, super(message);
-
-  /**
-   * Create a new [RangeError] with a message for the given [value].
-   *
-   * An optional [name] can specify the argument name that has the
-   * invalid value, and the [message] can override the default error
-   * description.
-   */
-  RangeError.value(num value, [String name, String message])
-      : start = null, end = null,
-        super.value(value, name,
-                    (message != null) ? message : "Value not in range");
-
-  /**
-   * Create a new [RangeError] with for an invalid value being outside a range.
-   *
-   * The allowed range is from [minValue] to [maxValue], inclusive.
-   * If `minValue` or `maxValue` are `null`, the range is infinite in
-   * that direction.
-   *
-   * For a range from 0 to the length of something, end exclusive, use
-   * [RangeError.index].
-   *
-   * An optional [name] can specify the argument name that has the
-   * invalid value, and the [message] can override the default error
-   * description.
-   */
-  RangeError.range(num invalidValue, int minValue, int maxValue,
-                   [String name, String message])
-      : start = minValue,
-        end = maxValue,
-        super.value(invalidValue, name,
-                    (message != null) ? message : "Invalid value");
-
-  /**
-   * Creates a new [RangeError] stating that [index] is not a valid index
-   * into [indexable].
-   *
-   * An optional [name] can specify the argument name that has the
-   * invalid value, and the [message] can override the default error
-   * description.
-   *
-   * The [length] is the length of [indexable] at the time of the error.
-   * If `length` is omitted, it defaults to `indexable.length`.
-   */
-  factory RangeError.index(int index, indexable,
-                           [String name,
-                            String message,
-                            int length]) = IndexError;
-
-  /**
-   * Check that a [value] lies in a specific interval.
-   *
-   * Throws if [value] is not in the interval.
-   * The interval is from [minValue] to [maxValue], both inclusive.
-   */
-  static void checkValueInInterval(int value, int minValue, int maxValue,
-                                   [String name, String message]) {
-    if (value < minValue || value > maxValue) {
-      throw new RangeError.range(value, minValue, maxValue, name, message);
-    }
-  }
-
-  /**
-   * Check that a value is a valid index into an indexable object.
-   *
-   * Throws if [index] is not a valid index into [indexable].
-   *
-   * An indexable object is one that has a `length` and a and index-operator
-   * `[]` that accepts an index if `0 <= index < length`.
-   *
-   * If [length] is provided, it is used as the length of the indexable object,
-   * otherwise the length is found as `indexable.length`.
-   */
-  static void checkValidIndex(int index, var indexable,
-                              [String name, int length, String message]) {
-    if (length == null) length = indexable.length;
-    // Comparing with `0` as receiver produces better dart2js type inference.
-    if (0 > index || index >= length) {
-      if (name == null) name = "index";
-      throw new RangeError.index(index, indexable, name, message, length);
-    }
-  }
-
-  /**
-   * Check that a range represents a slice of an indexable object.
-   *
-   * Throws if the range is not valid for an indexable object with
-   * the given [length].
-   * A range is valid for an indexable object with a given [length]
-   *
-   * if `0 <= [start] <= [end] <= [length]`.
-   * An `end` of `null` is considered equivalent to `length`.
-   *
-   * The [startName] and [endName] defaults to `"start"` and `"end"`,
-   * respectively.
-   *
-   * Returns the actual `end` value, which is `length` if `end` is `null`,
-   * and `end` otherwise.
-   */
-  static int checkValidRange(int start, int end, int length,
-                              [String startName, String endName,
-                               String message]) {
-    // Comparing with `0` as receiver produces better dart2js type inference.
-    // Ditto `start > end` below.
-    if (0 > start || start > length) {
-      if (startName == null) startName = "start";
-      throw new RangeError.range(start, 0, length, startName, message);
-    }
-    if (end != null) {
-      if (start > end || end > length) {
-        if (endName == null) endName = "end";
-        throw new RangeError.range(end, start, length, endName, message);
-      }
-      return end;
-    }
-    return length;
-  }
-
-  /**
-   * Check that an integer value isn't negative.
-   *
-   * Throws if the value is negative.
-   */
-  static void checkNotNegative(int value, [String name, String message]) {
-    if (value < 0) throw new RangeError.range(value, 0, null, name, message);
-  }
-
-  String get _errorName => "RangeError";
-  String get _errorExplanation {
-    assert(_hasValue);
-    String explanation = "";
-    if (start == null) {
-      if (end != null) {
-        explanation = ": Not less than or equal to $end";
-      }
-      // If both are null, we don't add a description of the limits.
-    } else if (end == null) {
-      explanation = ": Not greater than or equal to $start";
-    } else if (end > start) {
-      explanation = ": Not in range $start..$end, inclusive";
-    } else if (end < start) {
-      explanation = ": Valid value range is empty";
-    } else {
-      // end == start.
-      explanation = ": Only valid value is $start";
-    }
-    return explanation;
-  }
-}
-
-/**
- * A specialized [RangeError] used when an index is not in the range
- * `0..indexable.length-1`.
- *
- * Also contains the indexable object, its length at the time of the error,
- * and the invalid index itself.
- */
-class IndexError extends ArgumentError implements RangeError {
-  /** The indexable object that [index] was not a valid index into. */
-  final indexable;
-  /** The length of [indexable] at the time of the error. */
-  final int length;
-
-  /**
-   * Creates a new [IndexError] stating that [invalidValue] is not a valid index
-   * into [indexable].
-   *
-   * The [length] is the length of [indexable] at the time of the error.
-   * If `length` is omitted, it defaults to `indexable.length`.
-   *
-   * The message is used as part of the string representation of the error.
-   */
-  IndexError(int invalidValue, indexable,
-             [String name, String message, int length])
-      : this.indexable = indexable,
-        this.length = (length != null) ? length : indexable.length,
-        super.value(invalidValue, name,
-                    (message != null) ? message : "Index out of range");
-
-  // Getters inherited from RangeError.
-  int get start => 0;
-  int get end => length - 1;
-
-  String get _errorName => "RangeError";
-  String get _errorExplanation {
-    assert(_hasValue);
-    if (invalidValue < 0) {
-      return ": index must not be negative";
-    }
-    if (length == 0) {
-      return ": no indices are valid";
-    }
-    return ": index should be less than $length";
-  }
-}
-
-
-/**
- * Error thrown when control reaches the end of a switch case.
- *
- * The Dart specification requires this error to be thrown when
- * control reaches the end of a switch case (except the last case
- * of a switch) without meeting a break or similar end of the control
- * flow.
- */
-class FallThroughError extends Error {
-  FallThroughError();
-}
-
-/**
- * Error thrown when trying to instantiate an abstract class.
- */
-class AbstractClassInstantiationError extends Error {
-  final String _className;
-  AbstractClassInstantiationError(String this._className);
-  String toString() => "Cannot instantiate abstract class: '$_className'";
-}
-
-
-/**
- * Error thrown by the default implementation of [:noSuchMethod:] on [Object].
- */
-class NoSuchMethodError extends Error {
-  final Object _receiver;
-  final Symbol _memberName;
-  final List _arguments;
-  final Map<Symbol, dynamic> _namedArguments;
-  final List _existingArgumentNames;
-
-  /**
-   * Create a [NoSuchMethodError] corresponding to a failed method call.
-   *
-   * The [receiver] is the receiver of the method call.
-   * That is, the object on which the method was attempted called.
-   * If the receiver is `null`, it is interpreted as a call to a top-level
-   * function of a library.
-   *
-   * The [memberName] is a [Symbol] representing the name of the called method
-   * or accessor. It should not be `null`.
-   *
-   * The [positionalArguments] is a list of the positional arguments that the
-   * method was called with. If `null`, it is considered equivalent to the
-   * empty list.
-   *
-   * The [namedArguments] is a map from [Symbol]s to the values of named
-   * arguments that the method was called with.
-   *
-   * The optional [existingArgumentNames] is the expected parameters of a
-   * method with the same name on the receiver, if available. This is
-   * the signature of the method that would have been called if the parameters
-   * had matched.
-   */
-  NoSuchMethodError(Object receiver,
-                    Symbol memberName,
-                    List positionalArguments,
-                    Map<Symbol ,dynamic> namedArguments,
-                    [List existingArgumentNames = null])
-      : _receiver = receiver,
-        _memberName = memberName,
-        _arguments = positionalArguments,
-        _namedArguments = namedArguments,
-        _existingArgumentNames = existingArgumentNames;
-
-  external String toString();
-}
-
-
-/**
- * The operation was not allowed by the object.
- *
- * This [Error] is thrown when an instance cannot implement one of the methods
- * in its signature.
- */
-class UnsupportedError extends Error {
-  final String message;
-  UnsupportedError(this.message);
-  String toString() => "Unsupported operation: $message";
-}
-
-
-/**
- * Thrown by operations that have not been implemented yet.
- *
- * This [Error] is thrown by unfinished code that hasn't yet implemented
- * all the features it needs.
- *
- * If a class is not intending to implement the feature, it should throw
- * an [UnsupportedError] instead. This error is only intended for
- * use during development.
- */
-class UnimplementedError extends Error implements UnsupportedError {
-  final String message;
-  UnimplementedError([String this.message]);
-  String toString() => (this.message != null
-                        ? "UnimplementedError: $message"
-                        : "UnimplementedError");
-}
-
-
-/**
- * The operation was not allowed by the current state of the object.
- *
- * This is a generic error used for a variety of different erroneous
- * actions. The message should be descriptive.
- */
-class StateError extends Error {
-  final String message;
-  StateError(this.message);
-  String toString() => "Bad state: $message";
-}
-
-
-/**
- * Error occurring when a collection is modified during iteration.
- *
- * Some modifications may be allowed for some collections, so each collection
- * ([Iterable] or similar collection of values) should declare which operations
- * are allowed during an iteration.
- */
-class ConcurrentModificationError extends Error {
-  /** The object that was modified in an incompatible way. */
-  final Object modifiedObject;
-
-  ConcurrentModificationError([this.modifiedObject]);
-
-  String toString() {
-    if (modifiedObject == null) {
-      return "Concurrent modification during iteration.";
-    }
-    return "Concurrent modification during iteration: "
-           "${Error.safeToString(modifiedObject)}.";
-  }
-}
-
-
-class OutOfMemoryError implements Error {
-  const OutOfMemoryError();
-  String toString() => "Out of Memory";
-
-  StackTrace get stackTrace => null;
-}
-
-
-class StackOverflowError implements Error {
-  const StackOverflowError();
-  String toString() => "Stack Overflow";
-
-  StackTrace get stackTrace => null;
-}
-
-/**
- * Error thrown when a lazily initialized variable cannot be initialized.
- *
- * A static/library variable with an initializer expression is initialized
- * the first time it is read. If evaluating the initializer expression causes
- * another read of the variable, this error is thrown.
- */
-class CyclicInitializationError extends Error {
-  final String variableName;
-  CyclicInitializationError([this.variableName]);
-  String toString() => variableName == null
-      ? "Reading static variable during its initialization"
-      : "Reading static variable '$variableName' during its initialization";
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/exceptions.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/exceptions.dart
deleted file mode 100644
index 7484ed5..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/exceptions.dart
+++ /dev/null
@@ -1,181 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-// Exceptions are thrown either by the VM or from Dart code.
-
-/**
- * A marker interface implemented by all core library exceptions.
- *
- * An [Exception] is intended to convey information to the user about a failure,
- * so that the error can be addressed programmatically. It is intended to be
- * caught, and it should contain useful data fields.
- *
- * Creating instances of [Exception] directly with [:new Exception("message"):]
- * is discouraged, and only included as a temporary measure during development,
- * until the actual exceptions used by a library are done.
- */
-abstract class Exception {
-  factory Exception([var message]) => new _Exception(message);
-}
-
-
-/** Default implementation of [Exception] which carries a message. */
-class _Exception implements Exception {
-  final message;
-
-  _Exception([this.message]);
-
-  String toString() {
-    if (message == null) return "Exception";
-    return "Exception: $message";
-  }
-}
-
-
-/**
- * Exception thrown when a string or some other data does not have an expected
- * format and cannot be parsed or processed.
- */
-class FormatException implements Exception {
-  /**
-   * A message describing the format error.
-   */
-  final String message;
-
-  /**
-   * The actual source input which caused the error.
-   *
-   * This is usually a [String], but can be other types too.
-   * If it is a string, parts of it may be included in the [toString] message.
-   *
-   * The source is `null` if omitted or unknown.
-   */
-  final source;
-
-  /**
-   * The offset in [source] where the error was detected.
-   *
-   * A zero-based offset into the source that marks the format error causing
-   * this exception to be created. If `source` is a string, this should be a
-   * string index in the range `0 <= offset <= source.length`.
-   *
-   * If input is a string, the [toString] method may represent this offset as
-   * a line and character position. The offset should be inside the string,
-   * or at the end of the string.
-   *
-   * May be omitted. If present, [source] should also be present if possible.
-   */
-  final int offset;
-
-  /**
-   * Creates a new FormatException with an optional error [message].
-   *
-   * Optionally also supply the actual [source] with the incorrect format,
-   * and the [offset] in the format where a problem was detected.
-   */
-  const FormatException([this.message = "", this.source, this.offset]);
-
-  /**
-   * Returns a description of the format exception.
-   *
-   * The description always contains the [message].
-   *
-   * If [source] is present and is a string, the description will contain
-   * (at least a part of) the source.
-   * If [offset] is also provided, the part of the source included will
-   * contain that offset, and the offset will be marked.
-   *
-   * If the source is a string and it contains a line break before offset,
-   * only the line containing offset will be included, and its line number
-   * will also be part of the description. Line and character offsets are
-   * 1-based.
-   */
-  String toString() {
-    String report = "FormatException";
-    if (message != null && "" != message) {
-      report = "$report: $message";
-    }
-    int offset = this.offset;
-    if (source is! String) {
-      if (offset != null) {
-        report += " (at offset $offset)";
-      }
-      return report;
-    }
-    if (offset != null && (offset < 0 || offset > source.length)) {
-      offset = null;
-    }
-    // Source is string and offset is null or valid.
-    if (offset == null) {
-      String source = this.source;
-      if (source.length > 78) {
-        source = source.substring(0, 75) + "...";
-      }
-      return "$report\n$source";
-    }
-    int lineNum = 1;
-    int lineStart = 0;
-    bool lastWasCR;
-    for (int i = 0; i < offset; i++) {
-      int char = source.codeUnitAt(i);
-      if (char == 0x0a) {
-        if (lineStart != i || !lastWasCR) {
-          lineNum++;
-        }
-        lineStart = i + 1;
-        lastWasCR = false;
-      } else if (char == 0x0d) {
-        lineNum++;
-        lineStart = i + 1;
-        lastWasCR = true;
-      }
-    }
-    if (lineNum > 1) {
-      report += " (at line $lineNum, character ${offset - lineStart + 1})\n";
-    } else {
-      report += " (at character ${offset + 1})\n";
-    }
-    int lineEnd = source.length;
-    for (int i = offset; i < source.length; i++) {
-      int char = source.codeUnitAt(i);
-      if (char == 0x0a || char == 0x0d) {
-        lineEnd = i;
-        break;
-      }
-    }
-    int length = lineEnd - lineStart;
-    int start = lineStart;
-    int end = lineEnd;
-    String prefix = "";
-    String postfix = "";
-    if (length > 78) {
-      // Can't show entire line. Try to anchor at the nearest end, if
-      // one is within reach.
-      int index = offset - lineStart;
-      if (index < 75) {
-        end = start + 75;
-        postfix = "...";
-      } else if (end - offset < 75) {
-        start = end - 75;
-        prefix = "...";
-      } else {
-        // Neither end is near, just pick an area around the offset.
-        start = offset - 36;
-        end = offset + 36;
-        prefix = postfix = "...";
-      }
-    }
-    String slice = source.substring(start, end);
-    int markOffset = offset - start + prefix.length;
-    return "$report$prefix$slice$postfix\n${" " * markOffset}^\n";
-  }
-}
-
-// Exception thrown when doing integer division with a zero divisor.
-class IntegerDivisionByZeroException implements Exception {
-  const IntegerDivisionByZeroException();
-  String toString() => "IntegerDivisionByZeroException";
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/expando.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/expando.dart
deleted file mode 100644
index 2ecd2dc..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/expando.dart
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An [Expando] allows adding new properties to objects.
- *
- * Does not work on numbers, strings, booleans or null.
- *
- * An `Expando` does not hold on to the added property value after an object
- * becomes inacessible.
- *
- * Since you can always create a new number that is identical to an existing
- * number, it means that an expando property on a number could never be
- * released. To avoid this, expando properties cannot be added to numbers.
- * The same argument applies to strings, booleans and null, which also have
- * literals that evaluate to identical values when they occur more than once.
- *
- * There is no restriction on other classes, even for compile time constant
- * objects. Be careful if adding expando properties to compile time constants,
- * since they will stay alive forever.
- */
-class Expando<T> {
-
-  /**
-   * The name of the this [Expando] as passed to the constructor. If
-   * no name was passed to the constructor, the name is [:null:].
-   */
-  final String name;
-
-  /**
-   * Creates a new [Expando]. The optional name is only used for
-   * debugging purposes and creating two different [Expando]s with the
-   * same name yields two [Expando]s that work on different properties
-   * of the objects they are used on.
-   */
-  external Expando([String name]);
-
-  /**
-   * Expando toString method override.
-   */
-  String toString() => "Expando:$name";
-
-  /**
-   * Gets the value of this [Expando]'s property on the given
-   * object. If the object hasn't been expanded, the method returns
-   * [:null:].
-   *
-   * The object must not be a number, a string, a boolean or null.
-   */
-  external T operator [](Object object);
-
-  /**
-   * Sets the value of this [Expando]'s property on the given
-   * object. Properties can effectively be removed again by setting
-   * their value to null.
-   *
-   * The object must not be a number, a string, a boolean or null.
-   */
-  external void operator []=(Object object, T value);
-
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/function.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/function.dart
deleted file mode 100644
index a349c36..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/function.dart
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * The base class for all function types.
- *
- * A function value, or an instance of a class with a "call" method, is a
- * subtype of a function type, and as such, a subtype of [Function].
- */
-abstract class Function {
-  /**
-   * Dynamically call [function] with the specified arguments.
-   *
-   * Acts the same as calling function with positional arguments
-   * corresponding to the elements of [positionalArguments] and
-   * named arguments corresponding to the elements of [namedArguments].
-   *
-   * This includes giving the same errors if [function] isn't callable or
-   * if it expects different parameters.
-   *
-   * Example:
-   *       Map<Symbol, dynamic> namedArguments = new Map<Symbol, dynamic>();
-   *       namedArguments[const Symbol("f")] = 4;
-   *       namedArguments[const Symbol("g")] = 5;
-   *       Function.apply(foo, [1,2,3], namedArguments);
-   *
-   * gives exactly the same result as
-   *       foo(1, 2, 3, f: 4, g: 5).
-   *
-   * If [positionalArguments] is null, it's considered an empty list.
-   * If [namedArguments] is omitted or null, it is considered an empty map.
-   */
-  external static apply(Function function,
-                        List positionalArguments,
-                        [Map<Symbol, dynamic> namedArguments]);
-
-  /**
-   * Returns a hash code value that is compatible with `operator==`.
-   */
-  int get hashCode;
-
-  /**
-   * Test whether another object is equal to this function.
-   *
-   * System-created function objects are only equal to other functions.
-   *
-   * Two function objects are known to represent the same function if
-   *
-   * - It is the same object. Static and top-level functions are compile time
-   *   constants when used as values, so referring to the same function twice
-   *   always give the same object,
-   * - or if they refer to the same member method extracted from the same object.
-   *   Extracting a member method as a function value twice gives equal, but
-   *   not necessarily identical, function values.
-   *
-   * Function expressions never give rise to equal function objects. Each time
-   * a function expression is evaluated, it creates a new closure value that
-   * is not known to be equal to other closures created by the same expression.
-   *
-   * Classes implementing `Function` by having a `call` method should have their
-   * own `operator==` and `hashCode` depending on the object.
-   */
-  bool operator==(Object other);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/identical.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/identical.dart
deleted file mode 100644
index cc00c30..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/identical.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * Check whether two references are to the same object.
- */
-external bool identical(Object a, Object b);
-
-/**
- * Returns the identity hash code of `object`.
- *
- * Returns the same value as `object.hashCode` if [object] has not overridden
- * [Object.hashCode]. Returns the value that [Object.hashCode] would return
- * on this object, even if `hashCode` has been overridden.
- *
- * This hash code is compatible with [identical].
- */
-external int identityHashCode(Object object);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/int.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/int.dart
deleted file mode 100644
index 0884d8f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/int.dart
+++ /dev/null
@@ -1,320 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An arbitrarily large integer.
- *
- * **Note:** When compiling to JavaScript, integers are
- * implemented as JavaScript numbers. When compiling to JavaScript,
- * integers are therefore restricted to 53 significant bits because
- * all JavaScript numbers are double-precision floating point
- * values. The behavior of the operators and methods in the [int]
- * class therefore sometimes differs between the Dart VM and Dart code
- * compiled to JavaScript.
- *
- * It is a compile-time error for a class to attempt to extend or implement int.
- */
-abstract class int extends num {
-  /**
-   * Returns the integer value of the given environment declaration [name].
-   *
-   * The result is the same as would be returned by:
-   *
-   *     int.parse(const String.fromEnvironment(name, defaultValue: ""),
-   *               (_) => defaultValue)
-   *
-   * Example:
-   *
-   *     const int.fromEnvironment("defaultPort", defaultValue: 80)
-   */
-  external const factory int.fromEnvironment(String name, {int defaultValue});
-
-  /**
-   * Bit-wise and operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with only the bits set that are set in
-   * both `this` and [other]
-   *
-   * Of both operands are negative, the result is negative, otherwise
-   * the result is non-negative.
-   */
-  int operator &(int other);
-
-  /**
-   * Bit-wise or operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with the bits set that are set in either
-   * of `this` and [other]
-   *
-   * If both operands are non-negative, the result is non-negative,
-   * otherwise the result us negative.
-   */
-  int operator |(int other);
-
-  /**
-   * Bit-wise exclusive-or operator.
-   *
-   * Treating both `this` and [other] as sufficiently large two's component
-   * integers, the result is a number with the bits set that are set in one,
-   * but not both, of `this` and [other]
-   *
-   * If the operands have the same sign, the result is non-negative,
-   * otherwise the result is negative.
-   */
-  int operator ^(int other);
-
-  /**
-   * The bit-wise negate operator.
-   *
-   * Treating `this` as a sufficiently large two's component integer,
-   * the result is a number with the opposite bits set.
-   *
-   * This maps any integer `x` to `-x - 1`.
-   */
-  int operator ~();
-
-  /**
-   * Shift the bits of this integer to the left by [shiftAmount].
-   *
-   * Shifting to the left makes the number larger, effectively multiplying
-   * the number by `pow(2, shiftIndex)`.
-   *
-   * There is no limit on the size of the result. It may be relevant to
-   * limit intermediate values by using the "and" operator with a suitable
-   * mask.
-   *
-   * It is an error if [shiftAmount] is negative.
-   */
-  int operator <<(int shiftAmount);
-
-  /**
-   * Shift the bits of this integer to the right by [shiftAmount].
-   *
-   * Shifting to the right makes the number smaller and drops the least
-   * significant bits, effectively doing an integer division by
-   *`pow(2, shiftIndex)`.
-   *
-   * It is an error if [shiftAmount] is negative.
-   */
-  int operator >>(int shiftAmount);
-
-  /**
-   * Returns this integer to the power of [exponent] modulo [modulus].
-   *
-   * The [exponent] must be non-negative and [modulus] must be
-   * positive.
-   */
-  int modPow(int exponent, int modulus);
-
-  /**
-   * Returns the modular multiplicative inverse of this integer
-   * modulo [modulus].
-   *
-   * The [modulus] must be positive.
-   *
-   * It is an error if no modular inverse exists.
-   */
-  int modInverse(int modulus);
-
-  /**
-   * Returns the greatest common divisor of this integer and [other].
-   *
-   * If either number is non-zero, the result is the numerically greatest
-   * integer dividing both `this` and `other`.
-   *
-   * The greatest common divisor is independent of the order,
-   * so `x.gcd(y)` is  always the same as `y.gcd(x)`.
-   *
-   * For any integer `x`, `x.gcd(x)` is `x.abs()`.
-   *
-   * If both `this` and `other` is zero, the result is also zero.
-   */
-  int gcd(int other);
-
-  /** Returns true if and only if this integer is even. */
-  bool get isEven;
-
-  /** Returns true if and only if this integer is odd. */
-  bool get isOdd;
-
-  /**
-   * Returns the minimum number of bits required to store this integer.
-   *
-   * The number of bits excludes the sign bit, which gives the natural length
-   * for non-negative (unsigned) values.  Negative values are complemented to
-   * return the bit position of the first bit that differs from the sign bit.
-   *
-   * To find the number of bits needed to store the value as a signed value,
-   * add one, i.e. use `x.bitLength + 1`.
-   *
-   *      x.bitLength == (-x-1).bitLength
-   *
-   *      3.bitLength == 2;     // 00000011
-   *      2.bitLength == 2;     // 00000010
-   *      1.bitLength == 1;     // 00000001
-   *      0.bitLength == 0;     // 00000000
-   *      (-1).bitLength == 0;  // 11111111
-   *      (-2).bitLength == 1;  // 11111110
-   *      (-3).bitLength == 2;  // 11111101
-   *      (-4).bitLength == 2;  // 11111100
-   */
-  int get bitLength;
-
-  /**
-   * Returns the least significant [width] bits of this integer as a
-   * non-negative number (i.e. unsigned representation).  The returned value has
-   * zeros in all bit positions higher than [width].
-   *
-   *     (-1).toUnsigned(5) == 31   // 11111111  ->  00011111
-   *
-   * This operation can be used to simulate arithmetic from low level languages.
-   * For example, to increment an 8 bit quantity:
-   *
-   *     q = (q + 1).toUnsigned(8);
-   *
-   * `q` will count from `0` up to `255` and then wrap around to `0`.
-   *
-   * If the input fits in [width] bits without truncation, the result is the
-   * same as the input.  The minimum width needed to avoid truncation of `x` is
-   * given by `x.bitLength`, i.e.
-   *
-   *     x == x.toUnsigned(x.bitLength);
-   */
-  int toUnsigned(int width);
-
-  /**
-   * Returns the least significant [width] bits of this integer, extending the
-   * highest retained bit to the sign.  This is the same as truncating the value
-   * to fit in [width] bits using an signed 2-s complement representation.  The
-   * returned value has the same bit value in all positions higher than [width].
-   *
-   *                                    V--sign bit-V
-   *     16.toSigned(5) == -16   //  00010000 -> 11110000
-   *     239.toSigned(5) == 15   //  11101111 -> 00001111
-   *                                    ^           ^
-   *
-   * This operation can be used to simulate arithmetic from low level languages.
-   * For example, to increment an 8 bit signed quantity:
-   *
-   *     q = (q + 1).toSigned(8);
-   *
-   * `q` will count from `0` up to `127`, wrap to `-128` and count back up to
-   * `127`.
-   *
-   * If the input value fits in [width] bits without truncation, the result is
-   * the same as the input.  The minimum width needed to avoid truncation of `x`
-   * is `x.bitLength + 1`, i.e.
-   *
-   *     x == x.toSigned(x.bitLength + 1);
-   */
-  int toSigned(int width);
-
-  /**
-   * Return the negative value of this integer.
-   *
-   * The result of negating an integer always has the opposite sign, except
-   * for zero, which is its own negation.
-   */
-  int operator -();
-
-  /**
-   * Returns the absolute value of this integer.
-   *
-   * For any integer `x`, the result is the same as `x < 0 ? -x : x`.
-   */
-  int abs();
-
-  /**
-   * Returns the sign of this integer.
-   *
-   * Returns 0 for zero, -1 for values less than zero and
-   * +1 for values greater than zero.
-   */
-  int get sign;
-
-  /** Returns `this`. */
-  int round();
-
-  /** Returns `this`. */
-  int floor();
-
-  /** Returns `this`. */
-  int ceil();
-
-  /** Returns `this`. */
-  int truncate();
-
-  /** Returns `this.toDouble()`. */
-  double roundToDouble();
-
-  /** Returns `this.toDouble()`. */
-  double floorToDouble();
-
-  /** Returns `this.toDouble()`. */
-  double ceilToDouble();
-
-  /** Returns `this.toDouble()`. */
-  double truncateToDouble();
-
-  /**
-   * Returns a String-representation of this integer.
-   *
-   * The returned string is parsable by [parse].
-   * For any `int` [:i:], it is guaranteed that
-   * [:i == int.parse(i.toString()):].
-   */
-  String toString();
-
-  /**
-   * Converts [this] to a string representation in the given [radix].
-   *
-   * In the string representation, lower-case letters are used for digits above
-   * '9', with 'a' being 10 an 'z' being 35.
-   *
-   * The [radix] argument must be an integer in the range 2 to 36.
-   */
-  String toRadixString(int radix);
-
-  /**
-   * Parse [source] as a, possibly signed, integer literal and return its value.
-   *
-   * The [source] must be a non-empty sequence of base-[radix] digits,
-   * optionally prefixed with a minus or plus sign ('-' or '+').
-   *
-   * The [radix] must be in the range 2..36. The digits used are
-   * first the decimal digits 0..9, and then the letters 'a'..'z' with
-   * values 10 through 35. Also accepts upper-case letters with the same
-   * values as the lower-case ones.
-   *
-   * If no [radix] is given then it defaults to 10. In this case, the [source]
-   * digits may also start with `0x`, in which case the number is interpreted
-   * as a hexadecimal literal, which effectively means that the `0x` is ignored
-   * and the radix is instead set to 16.
-   *
-   * For any int [:n:] and radix [:r:], it is guaranteed that
-   * [:n == int.parse(n.toRadixString(r), radix: r):].
-   *
-   * If the [source] is not a valid integer literal, optionally prefixed by a
-   * sign, the [onError] is called with the [source] as argument, and its return
-   * value is used instead. If no [onError] is provided, a [FormatException]
-   * is thrown.
-   *
-   * The [onError] handler can be chosen to return `null`.  This is preferable
-   * to to throwing and then immediately catching the [FormatException].
-   * Example:
-   *
-   *     var value = int.parse(text, onError: (source) => null);
-   *     if (value == null) ... handle the problem
-   *
-   * The [onError] function is only invoked if [source] is a [String]. It is
-   * not invoked if the [source] is, for example, `null`.
-   */
-  external static int parse(String source,
-                            { int radix,
-                              int onError(String source) });
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/invocation.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/invocation.dart
deleted file mode 100644
index 7deaeec..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/invocation.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * Representation of the invocation of a member on an object.
- *
- * This is the type of objects passed to [Object.noSuchMethod] when
- * an object doesn't support the member invocation that was attempted
- * on it.
- */
-abstract class Invocation {
-  /** The name of the invoked member. */
-  Symbol get memberName;
-
-  /**
-   * An unmodifiable view of the positional arguments of the call.
-   *
-   * If the member is a getter, the positional arguments is empty.
-   */
-  List get positionalArguments;
-
-  /**
-   * An unmodifiable view of the named arguments of the call.
-   *
-   * If the member is a getter, setter or operator, the named arguments
-   * is empty.
-   */
-  Map<Symbol, dynamic> get namedArguments;
-
-  /** Whether the invocation was a method call. */
-  bool get isMethod;
-
-  /**
-   * Whether the invocation was a getter call.
-   * If so, both types of arguments is empty.
-   */
-  bool get isGetter;
-
-  /**
-   * Whether the invocation was a setter call.
-   *
-   * If so, [arguments] has exactly one positonal argument,
-   * and [namedArguments] is empty.
-   */
-  bool get isSetter;
-
-  /** Whether the invocation was a getter or a setter call. */
-  bool get isAccessor => isGetter || isSetter;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/iterable.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/iterable.dart
deleted file mode 100644
index cf05cde..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/iterable.dart
+++ /dev/null
@@ -1,683 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A collection of values, or "elements", that can be accessed sequentially.
- *
- * The elements of the iterable are accessed by getting an [Iterator]
- * using the [iterator] getter, and using it to step through the values.
- * Stepping with the iterator is done by calling [Iterator.moveNext],
- * and if the call returns `true`,
- * the iterator has now moved to the next element,
- * which is then available as [Iterator.current].
- * If the call returns `false`, there are no more elements,
- * and `iterator.currrent` returns `null`.
- *
- * You can create more than one iterator from the same `Iterable`.
- * Each time `iterator` is read, it returns a new iterator,
- * and different iterators can be stepped through independently,
- * each giving access to all the elements of the iterable.
- * The iterators of the same iterable *should* provide the same values
- * in the same order (unless the underlying collection is modified between
- * the iterations, which some collections allow).
- *
- * You can also iterate over the elements of an `Iterable`
- * using the for-in loop construct, which uses the `iterator` getter behind the
- * scenes.
- * For example, you can iterate over all of the keys of a [Map],
- * because `Map` keys are iterable.
- *
- *     Map kidsBooks = {'Matilda': 'Roald Dahl',
- *                      'Green Eggs and Ham': 'Dr Seuss',
- *                      'Where the Wild Things Are': 'Maurice Sendak'};
- *     for (var book in kidsBooks.keys) {
- *       print('$book was written by ${kidsBooks[book]}');
- *     }
- *
- * The [List] and [Set] classes are both `Iterable`,
- * as are most classes in the [dart:collection](#dart-collection) library.
- *
- * Some [Iterable] collections can be modified.
- * Adding an element to a `List` or `Set` will change which elements it
- * contains, and adding a new key to a `Map` changes the elements of [Map.keys].
- * Iterators created after the change will provide the new elements, and may
- * or may not preserve the order of existing elements
- * (for example, a [HashSet] may completely change its order when a single
- * element is added).
- *
- * Changing a collection *while* it is being iterated
- * is generally *not* allowed.
- * Doing so will break the iteration, which is typically signalled
- * by throwing a [ConcurrentModificationError]
- * the next time [Iterator.moveNext] is called.
- * The current value of [Iterator.current] getter
- * should not be affected by the change in the collection,
- * the `current` value was set by the previous call to [Iterator.moveNext].
- *
- * Some iterables compute their elements dynamically every time they are
- * iterated, like the one returned by [Iterable.generate] or the iterable
- * returned by a `sync*` generator function. If the computation doesn't depend
- * on other objects that may change, then the generated sequence should be
- * the same one every time it's iterated.
- *
- * The members of `Iterable`, other than `iterator` itself,
- * work by looking at the elements of the iterable.
- * This can be implemented by running through the [iterator], but some classes
- * may have more efficient ways of finding the result
- * (like [last] or [length] on a [List], or [contains] on a [Set]).
- *
- * The methods that return another `Iterable` (like [map] and [where])
- * are all *lazy* - they will iterate the original (as necessary)
- * every time the returned iterable is iterated, and not before.
- *
- * Since an iterable may be iterated more than once, it's not recommended to
- * have detectable side-effects in the iterator.
- * For methods like [map] and [while], the returned iterable will execute the
- * argument function on every iteration, so those functions should also not
- * have side effects.
- */
-abstract class Iterable<E> {
-  const Iterable();
-
-  /**
-   * Creates an `Iterable` that generates its elements dynamically.
-   *
-   * An `Iterator` created by [iterator] will count from
-   * zero to [:count - 1:], and call [generator]
-   * with each index in turn to create the next value.
-   *
-   * If [generator] is omitted, it defaults to an identity function
-   * on integers `(int x) => x`, so it should only be omitted if the type
-   * parameter allows integer values.
-   *
-   * As an `Iterable`, `new Iterable.generate(n, generator))` is equivalent to
-   * `const [0, ..., n - 1].map(generator)`.
-   */
-  factory Iterable.generate(int count, [E generator(int index)]) {
-    if (count <= 0) return new EmptyIterable<E>();
-    return new _GeneratorIterable<E>(count, generator);
-  }
-
-  /**
-   * Creates an empty iterable.
-   *
-   * The empty iterable has no elements, and iterating it always stops
-   * immediately.
-   */
-  const factory Iterable.empty() = EmptyIterable<E>;
-
-  /**
-   * Returns a new `Iterator` that allows iterating the elements of this
-   * `Iterable`.
-   *
-   * Iterable classes may specify the iteration order of their elements
-   * (for example [List] always iterate in index order),
-   * or they may leave it unspecified (for example a hash-based [Set]
-   * may iterate in any order).
-   *
-   * Each time `iterator` is read, it returns a new iterator,
-   * which can be used to iterate through all the elements again.
-   * The iterators of the same iterable can be stepped through independently,
-   * but should return the same elements in the same order,
-   * as long as the underlying collection isn't changed.
-   *
-   * Modifying the collection may cause new iterators to produce
-   * different elements, and may change the order of existing elements.
-   * A [List] specifies its iteration order precisely,
-   * so modifying the list changes the iteration order predictably.
-   * A hash-based [Set] may change its iteration order completely
-   * when adding a new element to the set.
-   *
-   * Modifying the underlying collection after creating the new iterator
-   * may cause an error the next time [Iterator.moveNext] is called
-   * on that iterator.
-   * Any *modifiable* iterable class should specify which operations will
-   * break iteration.
-   */
-  Iterator<E> get iterator;
-
-  /**
-   * Returns a new lazy [Iterable] with elements that are created by
-   * calling `f` on each element of this `Iterable` in iteration order.
-   *
-   * This method returns a view of the mapped elements. As long as the
-   * returned [Iterable] is not iterated over, the supplied function [f] will
-   * not be invoked. The transformed elements will not be cached. Iterating
-   * multiple times over the returned [Iterable] will invoke the supplied
-   * function [f] multiple times on the same element.
-   *
-   * Methods on the returned iterable are allowed to omit calling `f`
-   * on any element where the result isn't needed.
-   * For example, [elementAt] may call `f` only once.
-   */
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E e)) =>
-      new MappedIterable<E, dynamic/*=T*/>(this, f);
-
-  /**
-   * Returns a new lazy [Iterable] with all elements that satisfy the
-   * predicate [test].
-   *
-   * The matching elements have the same order in the returned iterable
-   * as they have in [iterator].
-   *
-   * This method returns a view of the mapped elements. As long as the
-   * returned [Iterable] is not iterated over, the supplied function [test] will
-   * not be invoked. Iterating will not cache results, and thus iterating
-   * multiple times over the returned [Iterable] will invoke the supplied
-   * function [test] multiple times on the same element.
-   */
-  Iterable<E> where(bool test(E element)) =>
-      new WhereIterable<E>(this, test);
-
-  /**
-   * Expands each element of this [Iterable] into zero or more elements.
-   *
-   * The resulting Iterable runs through the elements returned
-   * by [f] for each element of this, in iteration order.
-   *
-   * The returned [Iterable] is lazy, and calls [f] for each element
-   * of this every time it's iterated.
-   */
-  Iterable/*<T>*/ expand/*<T>*/(Iterable/*<T>*/ f(E element)) =>
-      new ExpandIterable<E, dynamic/*=T*/>(this, f);
-
-  /**
-   * Returns true if the collection contains an element equal to [element].
-   *
-   * This operation will check each element in order for being equal to
-   * [element], unless it has a more efficient way to find an element
-   * equal to [element].
-   *
-   * The equality used to determine whether [element] is equal to an element of
-   * the iterable defaults to the [Object.operator==] of the element.
-   *
-   * Some types of iterable may have a different equality used for its elements.
-   * For example, a [Set] may have a custom equality
-   * (see [Set.identical]) that its `contains` uses.
-   * Likewise the `Iterable` returned by a [Map.keys] call
-   * should use the same equality that the `Map` uses for keys.
-   */
-  bool contains(Object element) {
-    for (E e in this) {
-      if (e == element) return true;
-    }
-    return false;
-  }
-
-
-  /**
-   * Applies the function [f] to each element of this collection in iteration
-   * order.
-   */
-  void forEach(void f(E element)) {
-    for (E element in this) f(element);
-  }
-
-  /**
-   * Reduces a collection to a single value by iteratively combining elements
-   * of the collection using the provided function.
-   *
-   * The iterable must have at least one element.
-   * If it has only one element, that element is returned.
-   *
-   * Otherwise this method starts with the first element from the iterator,
-   * and then combines it with the remaining elements in iteration order,
-   * as if by:
-   *
-   *     E value = iterable.first;
-   *     iterable.skip(1).forEach((element) {
-   *       value = combine(value, element);
-   *     });
-   *     return value;
-   *
-   * Example of calculating the sum of an iterable:
-   *
-   *     iterable.reduce((value, element) => value + element);
-   *
-   */
-  E reduce(E combine(E value, E element)) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E value = iterator.current;
-    while (iterator.moveNext()) {
-      value = combine(value, iterator.current);
-    }
-    return value;
-  }
-
-  /**
-   * Reduces a collection to a single value by iteratively combining each
-   * element of the collection with an existing value
-   *
-   * Uses [initialValue] as the initial value,
-   * then iterates through the elements and updates the value with
-   * each element using the [combine] function, as if by:
-   *
-   *     var value = initialValue;
-   *     for (E element in this) {
-   *       value = combine(value, element);
-   *     }
-   *     return value;
-   *
-   * Example of calculating the sum of an iterable:
-   *
-   *     iterable.fold(0, (prev, element) => prev + element);
-   *
-   */
-  dynamic/*=T*/ fold/*<T>*/(var/*=T*/ initialValue,
-               dynamic/*=T*/ combine(var/*=T*/ previousValue, E element)) {
-    var value = initialValue;
-    for (E element in this) value = combine(value, element);
-    return value;
-  }
-
-  /**
-   * Checks whether every element of this iterable satisfies [test].
-   *
-   * Checks every element in iteration order, and returns `false` if
-   * any of them make [test] return `false`, otherwise returns `true`.
-   */
-  bool every(bool f(E element)) {
-    for (E element in this) {
-      if (!f(element)) return false;
-    }
-    return true;
-  }
-
-  /**
-   * Converts each element to a [String] and concatenates the strings.
-   *
-   * Iterates through elements of this iterable,
-   * converts each one to a [String] by calling [Object.toString],
-   * and then concatenates the strings, with the
-   * [separator] string interleaved between the elements.
-   */
-  String join([String separator = ""]) {
-    Iterator<E> iterator = this.iterator;
-    if (!iterator.moveNext()) return "";
-    StringBuffer buffer = new StringBuffer();
-    if (separator == null || separator == "") {
-      do {
-        buffer.write("${iterator.current}");
-      } while (iterator.moveNext());
-    } else {
-      buffer.write("${iterator.current}");
-      while (iterator.moveNext()) {
-        buffer.write(separator);
-        buffer.write("${iterator.current}");
-      }
-    }
-    return buffer.toString();
-  }
-
-
-  /**
-   * Checks whether any element of this iterable satisfies [test].
-   *
-   * Checks every element in iteration order, and returns `true` if
-   * any of them make [test] return `true`, otherwise returns false.
-   */
-  bool any(bool f(E element)) {
-    for (E element in this) {
-      if (f(element)) return true;
-    }
-    return false;
-  }
-
-  /**
-   * Creates a [List] containing the elements of this [Iterable].
-   *
-   * The elements are in iteration order.
-   * The list is fixed-length if [growable] is false.
-   */
-  List<E> toList({ bool growable: true }) =>
-      new List<E>.from(this, growable: growable);
-
-  /**
-   * Creates a [Set] containing the same elements as this iterable.
-   *
-   * The set may contain fewer elements than the iterable,
-   * if the iterable contains an element more than once,
-   * or it contains one or more elements that are equal.
-   * The order of the elements in the set is not guaranteed to be the same
-   * as for the iterable.
-   */
-  Set<E> toSet() => new Set<E>.from(this);
-
-  /**
-   * Returns the number of elements in [this].
-   *
-   * Counting all elements may involve iterating through all elements and can
-   * therefore be slow.
-   * Some iterables have a more efficient way to find the number of elements.
-   */
-  int get length {
-    assert(this is! EfficientLength);
-    int count = 0;
-    Iterator it = iterator;
-    while (it.moveNext()) {
-      count++;
-    }
-    return count;
-  }
-
-  /**
-   * Returns `true` if there are no elements in this collection.
-   *
-   * May be computed by checking if `iterator.moveNext()` returns `false`.
-   */
-  bool get isEmpty => !iterator.moveNext();
-
-  /**
-   * Returns true if there is at least one element in this collection.
-   *
-   * May be computed by checking if `iterator.moveNext()` returns `true`.
-   */
-  bool get isNotEmpty => !isEmpty;
-
-   /**
-   * Returns a lazy iterable of the [count] first elements of this iterable.
-   *
-   * The returned `Iterable` may contain fewer than `count` elements, if `this`
-   * contains fewer than `count` elements.
-   *
-   * The elements can be computed by stepping through [iterator] until [count]
-   * elements have been seen.
-   *
-   * The `count` must not be negative.
-   */
-  Iterable<E> take(int count) {
-    return new TakeIterable<E>(this, count);
-  }
-
-  /**
-   * Returns a lazy iterable of the leading elements satisfying [test].
-   *
-   * The filtering happens lazily. Every new iterator of the returned
-   * iterable starts iterating over the elements of `this`.
-   *
-   * The elements can be computed by stepping through [iterator] until an
-   * element is found where `test(element)` is false. At that point,
-   * the returned iterable stops (its `moveNext()` returns false).
-   */
-  Iterable<E> takeWhile(bool test(E value)) {
-    return new TakeWhileIterable<E>(this, test);
-  }
-
-  /**
-   * Returns an Iterable that provides all but the first [count] elements.
-   *
-   * When the returned iterable is iterated, it starts iterating over `this`,
-   * first skipping past the initial [count] elements.
-   * If `this` has fewer than `count` elements, then the resulting Iterable is
-   * empty.
-   * After that, the remaining elements are iterated in the same order as
-   * in this iterable.
-   *
-   * The `count` must not be negative.
-   */
-  Iterable<E> skip(int count) {
-    return new SkipIterable<E>(this, count);
-  }
-
-  /**
-   * Returns an Iterable that skips leading elements while [test] is satisfied.
-   *
-   * The filtering happens lazily. Every new Iterator of the returned
-   * Iterable iterates over all elements of `this`.
-   *
-   * The returned iterable provides elements by iterating this iterable,
-   * but skipping over all initial elements where `test(element)` returns
-   * true. If all elements satisfy `test` the resulting iterable is empty,
-   * otherwise it iterates the remaining elements in their original order,
-   * starting with the first element for which `test(element)` returns false.
-   */
-  Iterable<E> skipWhile(bool test(E value)) {
-    return new SkipWhileIterable<E>(this, test);
-  }
-
-  /**
-   * Returns the first element.
-   *
-   * Throws a [StateError] if `this` is empty.
-   * Otherwise returns the first element in the iteration order,
-   * equivalent to `this.elementAt(0)`.
-   */
-  E get first {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    return it.current;
-  }
-
-  /**
-   * Returns the last element.
-   *
-   * Throws a [StateError] if `this` is empty.
-   * Otherwise may iterate through the elements and returns the last one
-   * seen.
-   * Some iterables may have more efficient ways to find the last element
-   * (for example a list can directly access the last element,
-   * without iterating through the previous ones).
-   */
-  E get last {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) {
-      throw IterableElementError.noElement();
-    }
-    E result;
-    do {
-      result = it.current;
-    } while(it.moveNext());
-    return result;
-  }
-
-  /**
-   * Checks that this iterable has only one element, and returns that element.
-   *
-   * Throws a [StateError] if `this` is empty or has more than one element.
-   */
-  E get single {
-    Iterator<E> it = iterator;
-    if (!it.moveNext()) throw IterableElementError.noElement();
-    E result = it.current;
-    if (it.moveNext()) throw IterableElementError.tooMany();
-    return result;
-  }
-
-  /**
-   * Returns the first element that satisfies the given predicate [test].
-   *
-   * Iterates through elements and returns the first to satsify [test].
-   *
-   * If no element satisfies [test], the result of invoking the [orElse]
-   * function is returned.
-   * If [orElse] is omitted, it defaults to throwing a [StateError].
-   */
-  E firstWhere(bool test(E element), { E orElse() }) {
-    for (E element in this) {
-      if (test(element)) return element;
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  /**
-   * Returns the last element that satisfies the given predicate [test].
-   *
-   * An iterable that can access its elements directly may check its
-   * elements in any order (for example a list starts by checking the
-   * last element and then moves towards the start of the list).
-   * The default implementation iterates elements in iteration order,
-   * checks `test(element)` for each,
-   * and finally returns that last one that matched.
-   *
-   * If no element satsfies [test], the result of invoking the [orElse]
-   * function is returned.
-   * If [orElse] is omitted, it defaults to throwing a [StateError].
-   */
-  E lastWhere(bool test(E element), {E orElse()}) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  /**
-   * Returns the single element that satisfies [test].
-   *
-   * Checks all elements to see if `test(element)` returns true.
-   * If exactly one element satisfies [test], that element is returned.
-   * Otherwise, if there are no matching elements, or if there is more than
-   * one matching element, a [StateError] is thrown.
-   */
-  E singleWhere(bool test(E element)) {
-    E result = null;
-    bool foundMatching = false;
-    for (E element in this) {
-      if (test(element)) {
-        if (foundMatching) {
-          throw IterableElementError.tooMany();
-        }
-        result = element;
-        foundMatching = true;
-      }
-    }
-    if (foundMatching) return result;
-    throw IterableElementError.noElement();
-  }
-
-  /**
-   * Returns the [index]th element.
-   *
-   * The [index] must be non-negative and less than [length].
-   * Index zero represents the first element (so `iterable.elementAt(0)` is
-   * equivalent to `iterable.first`).
-   *
-   * May iterate through the elements in iteration order, skipping the
-   * first `index` elements and returning the next.
-   * Some iterable may have more efficient ways to find the element.
-   */
-  E elementAt(int index) {
-    if (index is! int) throw new ArgumentError.notNull("index");
-    RangeError.checkNotNegative(index, "index");
-    int elementIndex = 0;
-    for (E element in this) {
-      if (index == elementIndex) return element;
-      elementIndex++;
-    }
-    throw new RangeError.index(index, this, "index", null, elementIndex);
-  }
-
-  /**
-   * Returns a string representation of (some of) the elements of `this`.
-   *
-   * Elements are represented by their own `toString` results.
-   *
-   * The default representation always contains the first three elements.
-   * If there are less than a hundred elements in the iterable, it also
-   * contains the last two elements.
-   *
-   * If the resulting string isn't above 80 characters, more elements are
-   * included from the start of the iterable.
-   *
-   * The conversion may omit calling `toString` on some elements if they
-   * are known to not occur in the output, and it may stop iterating after
-   * a hundred elements.
-   */
-  String toString() => IterableBase.iterableToShortString(this, '(', ')');
-}
-
-typedef E _Generator<E>(int index);
-
-class _GeneratorIterable<E> extends Iterable<E>
-                            implements EfficientLength {
-  final int _start;
-  final int _end;
-  final _Generator<E> _generator;
-
-  /// Creates an iterable that builds the elements from a generator function.
-  ///
-  /// The [generator] may be null, in which case the default generator
-  /// enumerating the integer positions is used. This means that [int] must
-  /// be assignable to [E] when no generator is provided. In practice this means
-  /// that the generator can only be emitted when [E] is equal to `dynamic`,
-  /// `int`, or `num`. The constructor will check that the types match.
-  _GeneratorIterable(this._end, E generator(int n))
-      : _start = 0,
-        // The `as` below is used as check to make sure that `int` is assignable
-        // to [E].
-        _generator = (generator != null) ? generator : _id as _Generator<E>;
-
-  _GeneratorIterable.slice(this._start, this._end, this._generator);
-
-  Iterator<E> get iterator =>
-      new _GeneratorIterator<E>(_start, _end, _generator);
-  int get length => _end - _start;
-
-  Iterable<E> skip(int count) {
-    RangeError.checkNotNegative(count, "count");
-    if (count == 0) return this;
-    int newStart = _start + count;
-    if (newStart >= _end) return new EmptyIterable<E>();
-    return new _GeneratorIterable<E>.slice(newStart, _end, _generator);
-  }
-
-  Iterable<E> take(int count) {
-    RangeError.checkNotNegative(count, "count");
-    if (count == 0) return new EmptyIterable<E>();
-    int newEnd = _start + count;
-    if (newEnd >= _end) return this;
-    return new _GeneratorIterable<E>.slice(_start, newEnd, _generator);
-  }
-
-  static int _id(int n) => n;
-}
-
-class _GeneratorIterator<E> implements Iterator<E> {
-  final int _end;
-  final _Generator<E> _generator;
-  int _index;
-  E _current;
-
-  _GeneratorIterator(this._index, this._end, this._generator);
-
-  bool moveNext() {
-    if (_index < _end) {
-      _current = _generator(_index);
-      _index++;
-      return true;
-    } else {
-      _current = null;
-      return false;
-    }
-  }
-
-  E get current => _current;
-}
-
-/**
- * An Iterator that allows moving backwards as well as forwards.
- */
-abstract class BidirectionalIterator<E> implements Iterator<E> {
-  /**
-   * Move back to the previous element.
-   *
-   * Returns true and updates [current] if successful. Returns false
-   * and sets [current] to null if there is no previous element.
-   */
-  bool movePrevious();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/iterator.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/iterator.dart
deleted file mode 100644
index cd0ad32..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/iterator.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An interface for getting items, one at a time, from an object.
- *
- * The for-in construct transparently uses `Iterator` to test for the end
- * of the iteration, and to get each item (or _element_).
- *
- * If the object iterated over is changed during the iteration, the
- * behavior is unspecified.
- *
- * The `Iterator` is initially positioned before the first element.
- * Before accessing the first element the iterator must thus be advanced using
- * [moveNext] to point to the first element.
- * If no element is left, then [moveNext] returns false, [current]
- * returns `null`, and all further calls to [moveNext] will also return false.
- *
- * A typical usage of an Iterator looks as follows:
- *
- *     var it = obj.iterator;
- *     while (it.moveNext()) {
- *       use(it.current);
- *     }
- *
- * **See also:**
- * [Iteration](http://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html#iteration)
- * in the [library tour](http://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html)
- */
-abstract class Iterator<E> {
-  /**
-   * Moves to the next element.
-   *
-   * Returns true if [current] contains the next element.
-   * Returns false if no elements are left.
-   *
-   * It is safe to invoke [moveNext] even when the iterator is already
-   * positioned after the last element.
-   * In this case [moveNext] returns false again and has no effect.
-   *
-   * A call to `moveNext` may throw if iteration has been broken by
-   * changing the underlying collection.
-   */
-  bool moveNext();
-
-  /**
-   * Returns the current element.
-   *
-   * Returns `null` if the iterator has not yet been moved to the first
-   * element, or if the iterator has been moved past the last element of the
-   * [Iterable].
-   *
-   * The `current` getter should keep its value until the next call to
-   * [moveNext], even if an underlying collection changes.
-   * After a successful call to `moveNext`, the user doesn't need to cache
-   * the current value, but can keep reading it from the iterator.
-   */
-  E get current;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/list.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/list.dart
deleted file mode 100644
index d4e69cf..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/list.dart
+++ /dev/null
@@ -1,489 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An indexable collection of objects with a length.
- *
- * Subclasses of this class implement different kinds of lists.
- * The most common kinds of lists are:
- *
- * * Fixed-length list.
- *   An error occurs when attempting to use operations
- *   that can change the length of the list.
- *
- * * Growable list. Full implementation of the API defined in this class.
- *
- * The default growable list, as returned by `new List()` or `[]`, keeps
- * an internal buffer, and grows that buffer when necessary. This guarantees
- * that a sequence of [add] operations will each execute in amortized constant
- * time. Setting the length directly may take time proportional to the new
- * length, and may change the internal capacity so that a following add
- * operation will need to immediately increase the buffer capacity.
- * Other list implementations may have different performance behavior.
- *
- * The following code illustrates that some List implementations support
- * only a subset of the API.
- *
- *     List<int> fixedLengthList = new List(5);
- *     fixedLengthList.length = 0;  // Error
- *     fixedLengthList.add(499);    // Error
- *     fixedLengthList[0] = 87;
- *     List<int> growableList = [1, 2];
- *     growableList.length = 0;
- *     growableList.add(499);
- *     growableList[0] = 87;
- *
- * Lists are [Iterable]. Iteration occurs over values in index order. Changing
- * the values does not affect iteration, but changing the valid
- * indices&mdash;that is, changing the list's length&mdash;between iteration
- * steps causes a [ConcurrentModificationError]. This means that only growable
- * lists can throw ConcurrentModificationError. If the length changes
- * temporarily and is restored before continuing the iteration, the iterator
- * does not detect it.
- *
- * It is generally not allowed to modify the list's length (adding or removing
- * elements) while an operation on the list is being performed,
- * for example during a call to [forEach] or [sort].
- * Changing the list's length while it is being iterated, either by iterating it
- * directly or through iterating an [Iterable] that is backed by the list, will
- * break the iteration.
- */
-abstract class List<E> implements Iterable<E>, EfficientLength {
-  /**
-   * Creates a list of the given length.
-   *
-   * The created list is fixed-length if [length] is provided.
-   *
-   *     List fixedLengthList = new List(3);
-   *     fixedLengthList.length;     // 3
-   *     fixedLengthList.length = 1; // Error
-   *
-   * The list has length 0 and is growable if [length] is omitted.
-   *
-   *     List growableList = new List();
-   *     growableList.length; // 0;
-   *     growableList.length = 3;
-   *
-   * To create a growable list with a given length, just assign the length
-   * right after creation:
-   *
-   *     List growableList = new List()..length = 500;
-   *
-   * The [length] must not be negative or null, if it is provided.
-   */
-  external factory List([int length]);
-
-  /**
-   * Creates a fixed-length list of the given length, and initializes the
-   * value at each position with [fill]:
-   *
-   *     new List<int>.filled(3, 0); // [0, 0, 0]
-   *
-   * The [length] must be a non-negative integer.
-   *
-   * If the list is growable, changing its length will not initialize new
-   * entries with [fill]. After being created and filled, the list is
-   * no different from any other growable or fixed-length list
-   * created using [List].
-   */
-  external factory List.filled(int length, E fill, {bool growable: false});
-
-  /**
-   * Creates a list containing all [elements].
-   *
-   * The [Iterator] of [elements] provides the order of the elements.
-   *
-   * This constructor returns a growable list when [growable] is true;
-   * otherwise, it returns a fixed-length list.
-   */
-  external factory List.from(Iterable elements, { bool growable: true });
-
-  /**
-   * Generates a list of values.
-   *
-   * Creates a list with [length] positions and fills it with values created by
-   * calling [generator] for each index in the range `0` .. `length - 1`
-   * in increasing order.
-   *
-   *     new List<int>.generate(3, (int index) => index * index); // [0, 1, 4]
-   *
-   * The created list is fixed-length unless [growable] is true.
-   */
-  factory List.generate(int length, E generator(int index),
-                        { bool growable: true }) {
-    List<E> result;
-    if (growable) {
-      result = <E>[]..length = length;
-    } else {
-      result = new List<E>(length);
-    }
-    for (int i = 0; i < length; i++) {
-      result[i] = generator(i);
-    }
-    return result;
-  }
-
-  /**
-   * Creates an unmodifiable list containing all [elements].
-   *
-   * The [Iterator] of [elements] provides the order of the elements.
-   *
-   * An unmodifiable list cannot have its length or elements changed.
-   * If the elements are themselves immutable, then the resulting list
-   * is also immutable.
-   */
-  external factory List.unmodifiable(Iterable elements);
-
-  /**
-   * Returns the object at the given [index] in the list
-   * or throws a [RangeError] if [index] is out of bounds.
-   */
-  E operator [](int index);
-
-  /**
-   * Sets the value at the given [index] in the list to [value]
-   * or throws a [RangeError] if [index] is out of bounds.
-   */
-  void operator []=(int index, E value);
-
-  /**
-   * Returns the number of objects in this list.
-   *
-   * The valid indices for a list are `0` through `length - 1`.
-   */
-  int get length;
-
-  /**
-   * Changes the length of this list.
-   *
-   * If [newLength] is greater than
-   * the current length, entries are initialized to [:null:].
-   *
-   * Throws an [UnsupportedError] if the list is fixed-length.
-   */
-  void set length(int newLength);
-
-  /**
-   * Adds [value] to the end of this list,
-   * extending the length by one.
-   *
-   * Throws an [UnsupportedError] if the list is fixed-length.
-   */
-  void add(E value);
-
-  /**
-   * Appends all objects of [iterable] to the end of this list.
-   *
-   * Extends the length of the list by the number of objects in [iterable].
-   * Throws an [UnsupportedError] if this list is fixed-length.
-   */
-  void addAll(Iterable<E> iterable);
-
-  /**
-   * Returns an [Iterable] of the objects in this list in reverse order.
-   */
-  Iterable<E> get reversed;
-
-  /**
-   * Sorts this list according to the order specified by the [compare] function.
-   *
-   * The [compare] function must act as a [Comparator].
-   *
-   *     List<String> numbers = ['two', 'three', 'four'];
-   *     // Sort from shortest to longest.
-   *     numbers.sort((a, b) => a.length.compareTo(b.length));
-   *     print(numbers);  // [two, four, three]
-   *
-   * The default List implementations use [Comparable.compare] if
-   * [compare] is omitted.
-   *
-   *     List<int> nums = [13, 2, -11];
-   *     nums.sort();
-   *     print(nums);  // [-11, 2, 13]
-   *
-   * A [Comparator] may compare objects as equal (return zero), even if they
-   * are distinct objects.
-   * The sort function is not guaranteed to be stable, so distinct objects
-   * that compare as equal may occur in any order in the result:
-   *
-   *     List<String> numbers = ['one', 'two', 'three', 'four'];
-   *     numbers.sort((a, b) => a.length.compareTo(b.length));
-   *     print(numbers);  // [one, two, four, three] OR [two, one, four, three]
-   */
-  void sort([int compare(E a, E b)]);
-
-  /**
-   * Shuffles the elements of this list randomly.
-   */
-  void shuffle([Random random]);
-
-  /**
-   * Returns the first index of [element] in this list.
-   *
-   * Searches the list from index [start] to the end of the list.
-   * The first time an object [:o:] is encountered so that [:o == element:],
-   * the index of [:o:] is returned.
-   *
-   *     List<String> notes = ['do', 're', 'mi', 're'];
-   *     notes.indexOf('re');    // 1
-   *     notes.indexOf('re', 2); // 3
-   *
-   * Returns -1 if [element] is not found.
-   *
-   *     notes.indexOf('fa');    // -1
-   */
-  int indexOf(E element, [int start = 0]);
-
-  /**
-   * Returns the last index of [element] in this list.
-   *
-   * Searches the list backwards from index [start] to 0.
-   *
-   * The first time an object [:o:] is encountered so that [:o == element:],
-   * the index of [:o:] is returned.
-   *
-   *     List<String> notes = ['do', 're', 'mi', 're'];
-   *     notes.lastIndexOf('re', 2); // 1
-   *
-   * If [start] is not provided, this method searches from the end of the
-   * list./Returns
-   *
-   *     notes.lastIndexOf('re');  // 3
-   *
-   * Returns -1 if [element] is not found.
-   *
-   *     notes.lastIndexOf('fa');  // -1
-   */
-  int lastIndexOf(E element, [int start]);
-
-  /**
-   * Removes all objects from this list;
-   * the length of the list becomes zero.
-   *
-   * Throws an [UnsupportedError], and retains all objects, if this
-   * is a fixed-length list.
-   */
-  void clear();
-
-  /**
-   * Inserts the object at position [index] in this list.
-   *
-   * This increases the length of the list by one and shifts all objects
-   * at or after the index towards the end of the list.
-   *
-   * An error occurs if the [index] is less than 0 or greater than length.
-   * An [UnsupportedError] occurs if the list is fixed-length.
-   */
-  void insert(int index, E element);
-
-  /**
-   * Inserts all objects of [iterable] at position [index] in this list.
-   *
-   * This increases the length of the list by the length of [iterable] and
-   * shifts all later objects towards the end of the list.
-   *
-   * An error occurs if the [index] is less than 0 or greater than length.
-   * An [UnsupportedError] occurs if the list is fixed-length.
-   */
-  void insertAll(int index, Iterable<E> iterable);
-
-  /**
-   * Overwrites objects of `this` with the objects of [iterable], starting
-   * at position [index] in this list.
-   *
-   *     List<String> list = ['a', 'b', 'c'];
-   *     list.setAll(1, ['bee', 'sea']);
-   *     list.join(', '); // 'a, bee, sea'
-   *
-   * This operation does not increase the length of `this`.
-   *
-   * The [index] must be non-negative and no greater than [length].
-   *
-   * The [iterable] must not have more elements than what can fit from [index]
-   * to [length].
-   *
-   * If `iterable` is based on this list, its values may change /during/ the
-   * `setAll` operation.
-   */
-  void setAll(int index, Iterable<E> iterable);
-
-  /**
-   * Removes the first occurence of [value] from this list.
-   *
-   * Returns true if [value] was in the list, false otherwise.
-   *
-   *     List<String> parts = ['head', 'shoulders', 'knees', 'toes'];
-   *     parts.remove('head'); // true
-   *     parts.join(', ');     // 'shoulders, knees, toes'
-   *
-   * The method has no effect if [value] was not in the list.
-   *
-   *     // Note: 'head' has already been removed.
-   *     parts.remove('head'); // false
-   *     parts.join(', ');     // 'shoulders, knees, toes'
-   *
-   * An [UnsupportedError] occurs if the list is fixed-length.
-   */
-  bool remove(Object value);
-
-  /**
-   * Removes the object at position [index] from this list.
-   *
-   * This method reduces the length of `this` by one and moves all later objects
-   * down by one position.
-   *
-   * Returns the removed object.
-   *
-   * The [index] must be in the range `0 ≤ index < length`.
-   *
-   * Throws an [UnsupportedError] if this is a fixed-length list. In that case
-   * the list is not modified.
-   */
-  E removeAt(int index);
-
-  /**
-   * Pops and returns the last object in this list.
-   *
-   * Throws an [UnsupportedError] if this is a fixed-length list.
-   */
-  E removeLast();
-
-  /**
-   * Removes all objects from this list that satisfy [test].
-   *
-   * An object [:o:] satisfies [test] if [:test(o):] is true.
-   *
-   *     List<String> numbers = ['one', 'two', 'three', 'four'];
-   *     numbers.removeWhere((item) => item.length == 3);
-   *     numbers.join(', '); // 'three, four'
-   *
-   * Throws an [UnsupportedError] if this is a fixed-length list.
-   */
-  void removeWhere(bool test(E element));
-
-  /**
-   * Removes all objects from this list that fail to satisfy [test].
-   *
-   * An object [:o:] satisfies [test] if [:test(o):] is true.
-   *
-   *     List<String> numbers = ['one', 'two', 'three', 'four'];
-   *     numbers.retainWhere((item) => item.length == 3);
-   *     numbers.join(', '); // 'one, two'
-   *
-   * Throws an [UnsupportedError] if this is a fixed-length list.
-   */
-  void retainWhere(bool test(E element));
-
-  /**
-   * Returns a new list containing the objects from [start] inclusive to [end]
-   * exclusive.
-   *
-   *     List<String> colors = ['red', 'green', 'blue', 'orange', 'pink'];
-   *     colors.sublist(1, 3); // ['green', 'blue']
-   *
-   * If [end] is omitted, the [length] of `this` is used.
-   *
-   *     colors.sublist(1);  // ['green', 'blue', 'orange', 'pink']
-   *
-   * An error occurs if [start] is outside the range `0` .. `length` or if
-   * [end] is outside the range `start` .. `length`.
-   */
-  List<E> sublist(int start, [int end]);
-
-  /**
-   * Returns an [Iterable] that iterates over the objects in the range
-   * [start] inclusive to [end] exclusive.
-   *
-   * An error occurs if [end] is before [start].
-   *
-   * An error occurs if the [start] and [end] are not valid ranges at the time
-   * of the call to this method. The returned [Iterable] behaves like
-   * `skip(start).take(end - start)`. That is, it does not throw exceptions
-   * if `this` changes size.
-   *
-   *     List<String> colors = ['red', 'green', 'blue', 'orange', 'pink'];
-   *     Iterable<String> range = colors.getRange(1, 4);
-   *     range.join(', ');  // 'green, blue, orange'
-   *     colors.length = 3;
-   *     range.join(', ');  // 'green, blue'
-   */
-  Iterable<E> getRange(int start, int end);
-
-  /**
-   * Copies the objects of [iterable], skipping [skipCount] objects first,
-   * into the range [start], inclusive, to [end], exclusive, of the list.
-   *
-   *     List<int> list1 = [1, 2, 3, 4];
-   *     List<int> list2 = [5, 6, 7, 8, 9];
-   *     // Copies the 4th and 5th items in list2 as the 2nd and 3rd items
-   *     // of list1.
-   *     list1.setRange(1, 3, list2, 3);
-   *     list1.join(', '); // '1, 8, 9, 4'
-   *
-   * The [start] and [end] indices must satisfy `0 ≤ start ≤ end ≤ length`.
-   * If [start] equals [end], this method has no effect.
-   *
-   * The [iterable] must have enough objects to fill the range from `start`
-   * to `end` after skipping [skipCount] objects.
-   *
-   * If `iterable` is this list, the operation will copy the elements originally
-   * in the range from `skipCount` to `skipCount + (end - start)` to the
-   * range `start` to `end`, even if the two ranges overlap.
-   *
-   * If `iterable` depends on this list in some other way, no guarantees are
-   * made.
-   */
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]);
-
-  /**
-   * Removes the objects in the range [start] inclusive to [end] exclusive.
-   *
-   * The [start] and [end] indices must be in the range
-   * `0 ≤ index ≤ length`, and `start ≤ end`.
-   *
-   * Throws an [UnsupportedError] if this is a fixed-length list. In that case
-   * the list is not modified.
-   */
-  void removeRange(int start, int end);
-
-  /**
-   * Sets the objects in the range [start] inclusive to [end] exclusive
-   * to the given [fillValue].
-   *
-   * An error occurs if [start]..[end] is not a valid range for `this`.
-   */
-  void fillRange(int start, int end, [E fillValue]);
-
-  /**
-   * Removes the objects in the range [start] inclusive to [end] exclusive
-   * and inserts the contents of [replacement] in its place.
-   *
-   *     List<int> list = [1, 2, 3, 4, 5];
-   *     list.replaceRange(1, 4, [6, 7]);
-   *     list.join(', '); // '1, 6, 7, 5'
-   *
-   * An error occurs if [start]..[end] is not a valid range for `this`.
-   *
-   * This method does not work on fixed-length lists, even when [replacement]
-   * has the same number of elements as the replaced range. In that case use
-   * [setRange] instead.
-   */
-  void replaceRange(int start, int end, Iterable<E> replacement);
-
-  /**
-   * Returns an unmodifiable [Map] view of `this`.
-   *
-   * The map uses the indices of this list as keys and the corresponding objects
-   * as values. The `Map.keys` [Iterable] iterates the indices of this list
-   * in numerical order.
-   *
-   *     List<String> words = ['fee', 'fi', 'fo', 'fum'];
-   *     Map<int, String> map = words.asMap();
-   *     map[0] + map[1];   // 'feefi';
-   *     map.keys.toList(); // [0, 1, 2, 3]
-   */
-  Map<int, E> asMap();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/map.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/map.dart
deleted file mode 100644
index ac4581f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/map.dart
+++ /dev/null
@@ -1,270 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An collection of key-value pairs, from which you retrieve a value
- * using its associated key.
- *
- * There is a finite number of keys in the map,
- * and each key has exactly one value associated with it.
- *
- * Maps, and their keys and values, can be iterated.
- * The order of iteration is defined by the individual type of map.
- * Examples:
- *
- * * The plain [HashMap] is unordered (no order is guaranteed),
- * * the [LinkedHashMap] iterates in key insertion order,
- * * and a sorted map like [SplayTreeMap] iterates the keys in sorted order.
- *
- * It is generally not allowed to modify the map (add or remove keys) while
- * an operation is being performed on the map, for example in functions called
- * during a [forEach] or [putIfAbsent] call.
- * Modifying the map while iterating the keys or values
- * may also break the iteration.
- */
-abstract class Map<K, V> {
-  /**
-   * Creates a Map instance with the default implementation, [LinkedHashMap].
-   *
-   * This constructor is equivalent to the non-const map literal `<K,V>{}`.
-   *
-   * A `LinkedHashMap` requires the keys to implement compatible
-   * `operator==` and `hashCode`, and it allows null as a key.
-   * It iterates in key insertion order.
-   */
-  external factory Map();
-
-  /**
-   * Creates a [LinkedHashMap] instance that contains all key-value pairs of
-   * [other].
-   *
-   * The keys must all be assignable to [K] and the values to [V].
-   * The [other] map itself can have any type.
-   *
-   * A `LinkedHashMap` requires the keys to implement compatible
-   * `operator==` and `hashCode`, and it allows `null` as a key.
-   * It iterates in key insertion order.
-   */
-  factory Map.from(Map other) = LinkedHashMap<K, V>.from;
-
-  /**
-   * Creates an unmodifiable hash based map containing the entries of [other].
-   *
-   * The keys must all be assignable to [K] and the values to [V].
-   * The [other] map itself can have any type.
-   *
-   * The map requires the keys to implement compatible
-   * `operator==` and `hashCode`, and it allows `null` as a key.
-   * The created map iterates keys in a fixed order,
-   * preserving the order provided by [other].
-   *
-   * The resulting map behaves like the result of [Map.from],
-   * except that the map returned by this constructor is not modifiable.
-   */
-  external factory Map.unmodifiable(Map other);
-
-  /**
-   * Creates an identity map with the default implementation, [LinkedHashMap].
-   *
-   * The returned map allows `null` as a key.
-   * It iterates in key insertion order.
-   */
-  factory Map.identity() = LinkedHashMap<K, V>.identity;
-
-  /**
-   * Creates a Map instance in which the keys and values are computed from the
-   * [iterable].
-   *
-   * The created map is a [LinkedHashMap].
-   * A `LinkedHashMap` requires the keys to implement compatible
-   * `operator==` and `hashCode`, and it allows null as a key.
-   * It iterates in key insertion order.
-   *
-   * For each element of the [iterable] this constructor computes a key-value
-   * pair, by applying [key] and [value] respectively.
-   *
-   * The example below creates a new Map from a List. The keys of `map` are
-   * `list` values converted to strings, and the values of the `map` are the
-   * squares of the `list` values:
-   *
-   *     List<int> list = [1, 2, 3];
-   *     Map<String, int> map = new Map.fromIterable(list,
-   *         key: (item) => item.toString(),
-   *         value: (item) => item * item));
-   *
-   *     map['1'] + map['2']; // 1 + 4
-   *     map['3'] - map['2']; // 9 - 4
-   *
-   * If no values are specified for [key] and [value] the default is the
-   * identity function.
-   *
-   * In the following example, the keys and corresponding values of `map`
-   * are `list` values:
-   *
-   *     map = new Map.fromIterable(list);
-   *     map[1] + map[2]; // 1 + 2
-   *     map[3] - map[2]; // 3 - 2
-   *
-   * The keys computed by the source [iterable] do not need to be unique. The
-   * last occurrence of a key will simply overwrite any previous value.
-   */
-  factory Map.fromIterable(Iterable iterable,
-      {K key(element), V value(element)}) = LinkedHashMap<K, V>.fromIterable;
-
-  /**
-   * Creates a Map instance associating the given [keys] to [values].
-   *
-   * The created map is a [LinkedHashMap].
-   * A `LinkedHashMap` requires the keys to implement compatible
-   * `operator==` and `hashCode`, and it allows null as a key.
-   * It iterates in key insertion order.
-   *
-   * This constructor iterates over [keys] and [values] and maps each element of
-   * [keys] to the corresponding element of [values].
-   *
-   *     List<String> letters = ['b', 'c'];
-   *     List<String> words = ['bad', 'cat'];
-   *     Map<String, String> map = new Map.fromIterables(letters, words);
-   *     map['b'] + map['c'];  // badcat
-   *
-   * If [keys] contains the same object multiple times, the last occurrence
-   * overwrites the previous value.
-   *
-   * The two [Iterable]s must have the same length.
-   */
-  factory Map.fromIterables(Iterable<K> keys, Iterable<V> values)
-      = LinkedHashMap<K, V>.fromIterables;
-
-  /**
-   * Returns true if this map contains the given [value].
-   *
-   * Returns true if any of the values in the map are equal to `value`
-   * according to the `==` operator.
-   */
-  bool containsValue(Object value);
-
-  /**
-   * Returns true if this map contains the given [key].
-   *
-   * Returns true if any of the keys in the map are equal to `key`
-   * according to the equality used by the map.
-   */
-  bool containsKey(Object key);
-
-  /**
-   * Returns the value for the given [key] or null if [key] is not in the map.
-   *
-   * Some maps allows keys to have `null` as a value,
-   * For those maps, a lookup using this operator does cannot be used to
-   * distinguish between a key not being in the map, and the key having a null
-   * value.
-   * Methods like [containsKey] or [putIfAbsent] can be use if the distinction
-   * is important.
-   */
-  V operator [](Object key);
-
-  /**
-   * Associates the [key] with the given [value].
-   *
-   * If the key was already in the map, its associated value is changed.
-   * Otherwise the key-value pair is added to the map.
-   */
-  void operator []=(K key, V value);
-
-  /**
-   * Look up the value of [key], or add a new value if it isn't there.
-   *
-   * Returns the value associated to [key], if there is one.
-   * Otherwise calls [ifAbsent] to get a new value, associates [key] to
-   * that value, and then returns the new value.
-   *
-   *     Map<String, int> scores = {'Bob': 36};
-   *     for (var key in ['Bob', 'Rohan', 'Sophena']) {
-   *       scores.putIfAbsent(key, () => key.length);
-   *     }
-   *     scores['Bob'];      // 36
-   *     scores['Rohan'];    //  5
-   *     scores['Sophena'];  //  7
-   *
-   * Calling [ifAbsent] must not add or remove keys from the map.
-   */
-  V putIfAbsent(K key, V ifAbsent());
-
-  /**
-   * Adds all key-value pairs of [other] to this map.
-   *
-   * If a key of [other] is already in this map, its value is overwritten.
-   *
-   * The operation is equivalent to doing `this[key] = value` for each key
-   * and associated value in other. It iterates over [other], which must
-   * therefore not change during the iteration.
-   */
-  void addAll(Map<K, V> other);
-
-  /**
-   * Removes [key] and its associated value, if present, from the map.
-   *
-   * Returns the value associated with `key` before it was removed.
-   * Returns `null` if `key` was not in the map.
-   *
-   * Note that values can be `null` and a returned `null` value doesn't
-   * always mean that the key was absent.
-   */
-  V remove(Object key);
-
-  /**
-   * Removes all pairs from the map.
-   *
-   * After this, the map is empty.
-   */
-  void clear();
-
-  /**
-   * Applies [f] to each key-value pair of the map.
-   *
-   * Calling `f` must not add or remove keys from the map.
-   */
-  void forEach(void f(K key, V value));
-
-  /**
-   * The keys of [this].
-   *
-   * The returned iterable has efficient `length` and `contains` operations,
-   * based on [length] and [containsKey] of the map.
-   *
-   * The order of iteration is defined by the individual `Map` implementation,
-   * but must be consistent between changes to the map.
-   */
-  Iterable<K> get keys;
-
-  /**
-   * The values of [this].
-   *
-   * The values are iterated in the order of their corresponding keys.
-   * This means that iterating [keys] and [values] in parallel will
-   * provided matching pairs of keys and values.
-   *
-   * The returned iterable has an efficient `length` method based on the
-   * [length] of the map. Its [Iterable.contains] method is based on
-   * `==` comparison.
-   */
-  Iterable<V> get values;
-
-  /**
-   * The number of key-value pairs in the map.
-   */
-  int get length;
-
-  /**
-   * Returns true if there is no key-value pair in the map.
-   */
-  bool get isEmpty;
-
-  /**
-   * Returns true if there is at least one key-value pair in the map.
-   */
-  bool get isNotEmpty;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/null.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/null.dart
deleted file mode 100644
index dd914a3..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/null.dart
+++ /dev/null
@@ -1,21 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/**
- * The reserved word [:null:] denotes an object that is the sole instance of 
- * this class.
- * 
- * It is a compile-time error for a class to attempt to extend or implement
- * Null.
- */
-class Null {
-  factory Null._uninstantiable() {
-    throw new UnsupportedError('class Null cannot be instantiated');
-  }
-
-  /** Returns the string `"null"`. */
-  String toString() => "null";
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/num.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/num.dart
deleted file mode 100644
index 21f23ee..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/num.dart
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An integer or floating-point number.
- *
- * It is a compile-time error for any type other than [int] or [double]
- * to attempt to extend or implement num.
- */
-abstract class num implements Comparable<num> {
-  /**
-   * Test whether this value is numerically equal to `other`.
-   *
-   * If both operands are doubles, they are equal if they have the same
-   * representation, except that:
-   *
-   *   * zero and minus zero (0.0 and -0.0) are considered equal. They
-   *     both have the numerical value zero.
-   *   * NaN is not equal to anything, including NaN. If either operand is
-   *     NaN, the result is always false.
-   *
-   * If one operand is a double and the other is an int, they are equal if
-   * the double has an integer value (finite with no fractional part) and
-   * `identical(doubleValue.toInt(), intValue)` is true.
-   *
-   * If both operands are integers, they are equal if they have the same value.
-   *
-   * Returns false if `other` is not a [num].
-   *
-   * Notice that the behavior for NaN is non-reflexive. This means that
-   * equality of double values is not a proper equality relation, as is
-   * otherwise required of `operator==`. Using NaN in, e.g., a [HashSet]
-   * will fail to work. The behavior is the standard IEEE-754 equality of
-   * doubles.
-   *
-   * If you can avoid NaN values, the remaining doubles do have a proper eqality
-   * relation, and can be used safely.
-   *
-   * Use [compareTo] for a comparison that distinguishes zero and minus zero,
-   * and that considers NaN values as equal.
-   */
-  bool operator==(Object other);
-
-  /**
-   * Returns a hash code for a numerical value.
-   *
-   * The hash code is compatible with equality. It returns the same value
-   * for an [int] and a [double] with the same numerical value, and therefore
-   * the same value for the doubles zero and minus zero.
-   *
-   * No guarantees are made about the hash code of NaN.
-   */
-  int get hashCode;
-
-  /**
-   * Compares this to `other`.
-   *
-   * Returns a negative number if `this` is less than `other`, zero if they are
-   * equal, and a positive number if `this` is greater than `other`.
-   *
-   * The orderding represented by this method is a total ordering of [num]
-   * values. All distinct doubles are non-equal, as are all distinct integers,
-   * but integers are equal to doubles if they have the same numerical
-   * value.
-   *
-   * For ordering, the double NaN value is considered equal to itself, and
-   * greater than any numeric value (unlike its behavior in `operator==`).
-   *
-   * The double value -0.0 is considered less than 0.0 (and the integer 0), but
-   * greater than any non-zero negative value.
-   *
-   * Positive infinity is greater than any finite value (any value apart from
-   * itself and NaN), and negative infinity is less than any other value.
-   *
-   * All other values are compared using their numeric value.
-   */
-  int compareTo(num other);
-
-  /** Addition operator. */
-  num operator +(num other);
-
-  /** Subtraction operator. */
-  num operator -(num other);
-
-  /** Multiplication operator. */
-  num operator *(num other);
-
-  /**
-   * Euclidean modulo operator.
-   *
-   * Returns the remainder of the euclidean division. The euclidean division of
-   * two integers `a` and `b` yields two integers `q` and `r` such that
-   * `a == b * q + r` and `0 <= r < b.abs()`.
-   *
-   * The euclidean division is only defined for integers, but can be easily
-   * extended to work with doubles. In that case `r` may have a non-integer
-   * value, but it still verifies `0 <= r < |b|`.
-   *
-   * The sign of the returned value `r` is always positive.
-   *
-   * See [remainder] for the remainder of the truncating division.
-   */
-  num operator %(num other);
-
-  /** Division operator. */
-  double operator /(num other);
-
-  /**
-   * Truncating division operator.
-   *
-   * If either operand is a [double] then the result of the truncating division
-   * `a ~/ b` is equivalent to `(a / b).truncate().toInt()`.
-   *
-   * If both operands are [int]s then `a ~/ b` performs the truncating
-   * integer division.
-   */
-  int operator ~/(num other);
-
-  /** Negate operator. */
-  num operator -();
-
- /**
-   * Returns the remainder of the truncating division of `this` by [other].
-   *
-   * The result `r` of this operation satisfies:
-   * `this == (this ~/ other) * other + r`.
-   * As a consequence the remainder `r` has the same sign as the divider `this`.
-   */
-  num remainder(num other);
-
-  /** Relational less than operator. */
-  bool operator <(num other);
-
-  /** Relational less than or equal operator. */
-  bool operator <=(num other);
-
-  /** Relational greater than operator. */
-  bool operator >(num other);
-
-  /** Relational greater than or equal operator. */
-  bool operator >=(num other);
-
-  /** True if the number is the double Not-a-Number value; otherwise, false. */
-  bool get isNaN;
-
-  /**
-   * True if the number is negative; otherwise, false.
-   *
-   * Negative numbers are those less than zero, and the double `-0.0`.
-   */
-  bool get isNegative;
-
-  /**
-   * True if the number is positive infinity or negative infinity; otherwise,
-   * false.
-   */
-  bool get isInfinite;
-
-  /**
-   * True if the number is finite; otherwise, false.
-   *
-   * The only non-finite numbers are NaN, positive infinitity and
-   * negative infinity.
-   */
-  bool get isFinite;
-
-  /** Returns the absolute value of this [num]. */
-  num abs();
-
-  /**
-   * Returns minus one, zero or plus one depending on the sign and
-   * numerical value of the number.
-   *
-   * Returns minus one if the number is less than zero,
-   * plus one if the number is greater than zero,
-   * and zero if the number is equal to zero.
-   *
-   * Returns NaN if the number is the double NaN value.
-   *
-   * Returns a number of the same type as this number.
-   * For doubles, `-0.0.sign == -0.0`.
-
-   * The result satisfies:
-   *
-   *     n == n.sign * n.abs()
-   *
-   * for all numbers `n` (except NaN, because NaN isn't `==` to itself).
-   */
-  num get sign;
-
-  /**
-   * Returns the integer closest to `this`.
-   *
-   * Rounds away from zero when there is no closest integer:
-   *  `(3.5).round() == 4` and `(-3.5).round() == -4`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int round();
-
-  /**
-   * Returns the greatest integer no greater than `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int floor();
-
-  /**
-   * Returns the least integer no smaller than `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int ceil();
-
-  /**
-   * Returns the integer obtained by discarding any fractional
-   * digits from `this`.
-   *
-   * If `this` is not finite (`NaN` or infinity), throws an [UnsupportedError].
-   */
-  int truncate();
-
-  /**
-   * Returns the double integer value closest to `this`.
-   *
-   * Rounds away from zero when there is no closest integer:
-   *  `(3.5).roundToDouble() == 4` and `(-3.5).roundToDouble() == -4`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is a
-   * non-finite double value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`,
-   * and `-0.0` is therefore considered closer to negative numbers than `0.0`.
-   * This means that for a value, `d` in the range `-0.5 < d < 0.0`,
-   * the result is `-0.0`.
-   *
-   * The result is always a double.
-   * If this is a numerically large integer, the result may be an infinite
-   * double.
-   */
-  double roundToDouble();
-
-  /**
-   * Returns the greatest double integer value no greater than `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is a
-   * non-finite double value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `0.0 < d < 1.0` will return `0.0`.
-   *
-   * The result is always a double.
-   * If this is a numerically large integer, the result may be an infinite
-   * double.
-   */
-  double floorToDouble();
-
-  /**
-   * Returns the least double integer value no smaller than `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is a
-   * non-finite double value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`.
-   *
-   * The result is always a double.
-   * If this is a numerically large integer, the result may be an infinite
-   * double.
-   */
-  double ceilToDouble();
-
-  /**
-   * Returns the double integer value obtained by discarding any fractional
-   * digits from the double value of `this`.
-   *
-   * If this is already an integer valued double, including `-0.0`, or it is a
-   * non-finite double value, the value is returned unmodified.
-   *
-   * For the purpose of rounding, `-0.0` is considered to be below `0.0`.
-   * A number `d` in the range `-1.0 < d < 0.0` will return `-0.0`, and
-   * in the range `0.0 < d < 1.0` it will return 0.0.
-   *
-   * The result is always a double.
-   * If this is a numerically large integer, the result may be an infinite
-   * double.
-   */
-  double truncateToDouble();
-
-  /**
-   * Returns this [num] clamped to be in the range [lowerLimit]-[upperLimit].
-   *
-   * The comparison is done using [compareTo] and therefore takes `-0.0` into
-   * account. This also implies that [double.NAN] is treated as the maximal
-   * double value.
-   */
-  num clamp(num lowerLimit, num upperLimit);
-
-  /** Truncates this [num] to an integer and returns the result as an [int]. */
-  int toInt();
-
-  /**
-   * Return this [num] as a [double].
-   *
-   * If the number is not representable as a [double], an
-   * approximation is returned. For numerically large integers, the
-   * approximation may be infinite.
-   */
-  double toDouble();
-
-  /**
-   * Returns a decimal-point string-representation of `this`.
-   *
-   * Converts `this` to a [double] before computing the string representation.
-   *
-   * If the absolute value of `this` is greater or equal to `10^21` then this
-   * methods returns an exponential representation computed by
-   * `this.toStringAsExponential()`. Otherwise the result
-   * is the closest string representation with exactly [fractionDigits] digits
-   * after the decimal point. If [fractionDigits] equals 0 then the decimal
-   * point is omitted.
-   *
-   * The parameter [fractionDigits] must be an integer satisfying:
-   * `0 <= fractionDigits <= 20`.
-   *
-   * Examples:
-   *
-   *     1.toStringAsFixed(3);  // 1.000
-   *     (4321.12345678).toStringAsFixed(3);  // 4321.123
-   *     (4321.12345678).toStringAsFixed(5);  // 4321.12346
-   *     123456789012345678901.toStringAsFixed(3);  // 123456789012345683968.000
-   *     1000000000000000000000.toStringAsFixed(3); // 1e+21
-   *     5.25.toStringAsFixed(0); // 5
-   */
-  String toStringAsFixed(int fractionDigits);
-
-  /**
-   * Returns an exponential string-representation of `this`.
-   *
-   * Converts `this` to a [double] before computing the string representation.
-   *
-   * If [fractionDigits] is given then it must be an integer satisfying:
-   * `0 <= fractionDigits <= 20`. In this case the string contains exactly
-   * [fractionDigits] after the decimal point. Otherwise, without the parameter,
-   * the returned string uses the shortest number of digits that accurately
-   * represent [this].
-   *
-   * If [fractionDigits] equals 0 then the decimal point is omitted.
-   * Examples:
-   *
-   *     1.toStringAsExponential();       // 1e+0
-   *     1.toStringAsExponential(3);      // 1.000e+0
-   *     123456.toStringAsExponential();  // 1.23456e+5
-   *     123456.toStringAsExponential(3); // 1.235e+5
-   *     123.toStringAsExponential(0);    // 1e+2
-   */
-  String toStringAsExponential([int fractionDigits]);
-
-  /**
-   * Converts `this` to a double and returns a string representation with
-   * exactly [precision] significant digits.
-   *
-   * The parameter [precision] must be an integer satisfying:
-   * `1 <= precision <= 21`.
-   *
-   * Examples:
-   *
-   *     1.toStringAsPrecision(2);       // 1.0
-   *     1e15.toStringAsPrecision(3);    // 1.00+15
-   *     1234567.toStringAsPrecision(3); // 1.23e+6
-   *     1234567.toStringAsPrecision(9); // 1234567.00
-   *     12345678901234567890.toStringAsPrecision(20); // 12345678901234567168
-   *     12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19
-   *     0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7
-   *     0.0000012345.toStringAsPrecision(15);  // 0.00000123450000000000
-   */
-  String toStringAsPrecision(int precision);
-
-  /**
-   * Returns the shortest string that correctly represent the input number.
-   *
-   * All [double]s in the range `10^-6` (inclusive) to `10^21` (exclusive)
-   * are converted to their decimal representation with at least one digit
-   * after the decimal point. For all other doubles,
-   * except for special values like `NaN` or `Infinity`, this method returns an
-   * exponential representation (see [toStringAsExponential]).
-   *
-   * Returns `"NaN"` for [double.NAN], `"Infinity"` for [double.INFINITY], and
-   * `"-Infinity"` for [double.MINUS_INFINITY].
-   *
-   * An [int] is converted to a decimal representation with no decimal point.
-   *
-   * Examples:
-   *
-   *     (0.000001).toString();  // "0.000001"
-   *     (0.0000001).toString(); // "1e-7"
-   *     (111111111111111111111.0).toString();  // "111111111111111110000.0"
-   *     (100000000000000000000.0).toString();  // "100000000000000000000.0"
-   *     (1000000000000000000000.0).toString(); // "1e+21"
-   *     (1111111111111111111111.0).toString(); // "1.1111111111111111e+21"
-   *     1.toString(); // "1"
-   *     111111111111111111111.toString();  // "111111111111111110000"
-   *     100000000000000000000.toString();  // "100000000000000000000"
-   *     1000000000000000000000.toString(); // "1000000000000000000000"
-   *     1111111111111111111111.toString(); // "1111111111111111111111"
-   *     1.234e5.toString();   // 123400
-   *     1234.5e6.toString();  // 1234500000
-   *     12.345e67.toString(); // 1.2345e+68
-   *
-   * Note: the conversion may round the output if the returned string
-   * is accurate enough to uniquely identify the input-number.
-   * For example the most precise representation of the [double] `9e59` equals
-   * `"899999999999999918767229449717619953810131273674690656206848"`, but
-   * this method returns the shorter (but still uniquely identifying) `"9e59"`.
-   *
-   */
-  String toString();
-
-  /**
-   * Parses a string containing a number literal into a number.
-   *
-   * The method first tries to read the [input] as integer (similar to
-   * [int.parse] without a radix).
-   * If that fails, it tries to parse the [input] as a double (similar to
-   * [double.parse]).
-   * If that fails, too, it invokes [onError] with [input], and the result
-   * of that invocation becomes the result of calling `parse`.
-   *
-   * If no [onError] is supplied, it defaults to a function that throws a
-   * [FormatException].
-   *
-   * For any number `n`, this function satisfies
-   * `identical(n, num.parse(n.toString()))` (except when `n` is a NaN `double`
-   * with a payload).
-   */
-  static num parse(String input, [num onError(String input)]) {
-    String source = input.trim();
-    // TODO(lrn): Optimize to detect format and result type in one check.
-    num result = int.parse(source, onError: _returnIntNull);
-    if (result != null) return result;
-    result = double.parse(source, _returnDoubleNull);
-    if (result != null) return result;
-    if (onError == null) throw new FormatException(input);
-    return onError(input);
-  }
-
-  /** Helper functions for [parse]. */
-  static int _returnIntNull(String _) => null;
-  static double _returnDoubleNull(String _) => null;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/object.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/object.dart
deleted file mode 100644
index ae0431e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/object.dart
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * The base class for all Dart objects.
- *
- * Because Object is the root of the Dart class hierarchy,
- * every other Dart class is a subclass of Object.
- *
- * When you define a class, you should override [toString]
- * to return a string describing an instance of that class.
- * You might also need to define [hashCode] and [==], as described in the
- * [Implementing map
- * keys](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#implementing-map-keys)
- * section of the [library
- * tour](http://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html).
- */
-class Object {
-  /**
-   * Creates a new [Object] instance.
-   *
-   * [Object] instances have no meaningful state, and are only useful
-   * through their identity. An [Object] instance is equal to itself
-   * only.
-   */
-  const Object();
-
-  /**
-   * The equality operator.
-   *
-   * The default behavior for all [Object]s is to return true if and
-   * only if [:this:] and [other] are the same object.
-   *
-   * Override this method to specify a different equality relation on
-   * a class. The overriding method must still be an equivalence relation.
-   * That is, it must be:
-   *
-   *  * Total: It must return a boolean for all arguments. It should never throw
-   *    or return `null`.
-   *
-   *  * Reflexive: For all objects `o`, `o == o` must be true.
-   *
-   *  * Symmetric: For all objects `o1` and `o2`, `o1 == o2` and `o2 == o1` must
-   *    either both be true, or both be false.
-   *
-   *  * Transitive: For all objects `o1`, `o2`, and `o3`, if `o1 == o2` and
-   *    `o2 == o3` are true, then `o1 == o3` must be true.
-   *
-   * The method should also be consistent over time, so equality of two objects
-   * should not change over time, or at least only change if one of the objects
-   * was modified.
-   *
-   * If a subclass overrides the equality operator it should override
-   * the [hashCode] method as well to maintain consistency.
-   */
-  bool operator ==(other) => identical(this, other);
-
-  /**
-   * Get a hash code for this object.
-   *
-   * All objects have hash codes. Hash codes are guaranteed to be the
-   * same for objects that are equal when compared using the equality
-   * operator [:==:]. Other than that there are no guarantees about
-   * the hash codes. They will not be consistent between runs and
-   * there are no distribution guarantees.
-   *
-   * If a subclass overrides [hashCode] it should override the
-   * equality operator as well to maintain consistency.
-   */
-  external int get hashCode;
-
-  /**
-   * Returns a string representation of this object.
-   */
-  external String toString();
-
-  /**
-   * Invoked when a non-existent method or property is accessed.
-   *
-   * Classes can override [noSuchMethod] to provide custom behavior.
-   *
-   * If a value is returned, it becomes the result of the original invocation.
-   *
-   * The default behavior is to throw a [NoSuchMethodError].
-   */
-  external dynamic noSuchMethod(Invocation invocation);
-
-  /**
-   * A representation of the runtime type of the object.
-   */
-  external Type get runtimeType;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/pattern.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/pattern.dart
deleted file mode 100644
index 7f32c72..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/pattern.dart
+++ /dev/null
@@ -1,131 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * An interface for basic searches within strings.
- */
-abstract class Pattern {
-  // NOTE: When using "start" index from the language library, call
-  // without an argument if start is zero. This allows backwards compatiblity
-  // with implementations of the older interface that didn't have the start
-  // index argument.
-  /**
-   * Match this pattern against the string repeatedly.
-   *
-   * If [start] is provided, matching will start at that index.
-   *
-   * The returned iterable lazily computes all the non-overlapping matches
-   * of the pattern on the string, ordered by start index.
-   * If a user only requests the first
-   * match, this function should not compute all possible matches.
-   *
-   * The matches are found by repeatedly finding the first match
-   * of the pattern on the string, starting from the end of the previous
-   * match, and initially starting from index zero.
-   *
-   * If the pattern matches the empty string at some point, the next
-   * match is found by starting at the previous match's end plus one.
-   */
-  Iterable<Match> allMatches(String string, [int start = 0]);
-
-  /**
-   * Match this pattern against the start of `string`.
-   *
-   * If [start] is provided, it must be an integer in the range `0` ..
-   * `string.length`. In that case, this patten is tested against the
-   * string at the [start] position. That is, a [Match] is returned if the
-   * pattern can match a part of the string starting from position [start].
-   * Returns `null` if the pattern doesn't match.
-   */
-  Match matchAsPrefix(String string, [int start = 0]);
-}
-
-/**
- * A result from searching within a string.
- *
- * A Match or an [Iterable] of Match objects is returned from [Pattern]
- * matching methods.
- *
- * The following example finds all matches of a [RegExp] in a [String]
- * and iterates through the returned iterable of Match objects.
- *
- *     RegExp exp = new RegExp(r"(\w+)");
- *     String str = "Parse my string";
- *     Iterable<Match> matches = exp.allMatches(str);
- *     for (Match m in matches) {
- *       String match = m.group(0);
- *       print(match);
- *     }
- *
- * The output of the example is:
- *
- *     Parse
- *     my
- *     string
- *
- * Some patterns, regular expressions in particular, may record subtrings
- * that were part of the matching. These are called _groups_ in the Match
- * object. Some patterns may never have any groups, and their matches always
- * have zero [groupCount].
- */
-abstract class Match {
-  /**
-   * Returns the index in the string where the match starts.
-   */
-  int get start;
-
-  /**
-   * Returns the index in the string after the last character of the
-   * match.
-   */
-  int get end;
-
-  /**
-   * Returns the string matched by the given [group].
-   *
-   * If [group] is 0, returns the match of the pattern.
-   *
-   * The result may be `null` if the pattern didn't assign a value to it
-   * as part of this match.
-   */
-  String group(int group);
-
-  /**
-   * Returns the string matched by the given [group].
-   *
-   * If [group] is 0, returns the match of the pattern.
-   *
-   * Short alias for [Match.group].
-   */
-  String operator [](int group);
-
-  /**
-   * Returns a list of the groups with the given indices.
-   *
-   * The list contains the strings returned by [group] for each index in
-   * [groupIndices].
-   */
-  List<String> groups(List<int> groupIndices);
-
-  /**
-   * Returns the number of captured groups in the match.
-   *
-   * Some patterns may capture parts of the input that was used to
-   * compute the full match. This is the number of captured groups,
-   * which is also the maximal allowed argument to the [group] method.
-   */
-  int get groupCount;
-
-  /**
-   * The string on which this match was computed.
-   */
-  String get input;
-
-  /**
-   * The pattern used to search in [input].
-   */
-  Pattern get pattern;
-}
\ No newline at end of file
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/print.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/print.dart
deleted file mode 100644
index 42c7d1c..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/print.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/// Prints a string representation of the object to the console.
-void print(Object object) {
-  String line = "$object";
-  if (printToZone == null) {
-    printToConsole(line);
-  } else {
-    printToZone(line);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/regexp.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/regexp.dart
deleted file mode 100644
index 09874c4..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/regexp.dart
+++ /dev/null
@@ -1,91 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A regular expression pattern.
- *
- * Regular expressions are [Pattern]s, and can as such be used to match strings
- * or parts of strings.
- *
- * Dart regular expressions have the same syntax and semantics as
- * JavaScript regular expressions. See
- * <http://ecma-international.org/ecma-262/5.1/#sec-15.10>
- * for the specification of JavaScript regular expressions.
- *
- * [firstMatch] is the main implementation method that applies a regular
- * expression to a string and returns the first [Match]. All
- * other methods in [RegExp] can build on it.
- *
- * Use [allMatches] to look for all matches of a regular expression in
- * a string.
- *
- * The following example finds all matches of a regular expression in
- * a string.
- *
- *     RegExp exp = new RegExp(r"(\w+)");
- *     String str = "Parse my string";
- *     Iterable<Match> matches = exp.allMatches(str);
- * 
- * Note the use of a _raw string_ (a string prefixed with `r`)
- * in the example above. Use a raw string to treat each character in a string
- * as a literal character.
- */
-abstract class RegExp implements Pattern {
-  /**
-   * Constructs a regular expression.
-   *
-   * Throws a [FormatException] if [source] is not valid regular
-   * expression syntax.
-   */
-  external factory RegExp(String source, {bool multiLine: false,
-                                          bool caseSensitive: true});
-
-  /**
-   * Searches for the first match of the regular expression
-   * in the string [input]. Returns `null` if there is no match.
-   */
-  Match firstMatch(String input);
-
-  /**
-   * Returns an iterable of the matches of the regular expression on [input].
-   *
-   * If [start] is provided, only start looking for matches at `start`.
-   */
-  Iterable<Match> allMatches(String input, [int start = 0]);
-
-  /**
-   * Returns whether the regular expression has a match in the string [input].
-   */
-  bool hasMatch(String input);
-
-  /**
-   * Returns the first substring match of this regular expression in [input].
-   */
-  String stringMatch(String input);
-
-  /**
-   * The source regular expression string used to create this `RegExp`.
-   */
-  String get pattern;
-
-  /**
-   * Whether this regular expression matches multiple lines.
-   *
-   * If the regexp does match multiple lines, the "^" and "$" characters
-   * match the beginning and end of lines. If not, the character match the
-   * beginning and end of the input.
-   */
-  bool get isMultiLine;
-
-  /**
-   * Whether this regular expression is case sensitive.
-   *
-   * If the regular expression is not case sensitive, it will match an input
-   * letter with a pattern letter even if the two letters are different case
-   * versions of the same letter.
-   */
-  bool get isCaseSensitive;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/set.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/set.dart
deleted file mode 100644
index 55ad971..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/set.dart
+++ /dev/null
@@ -1,204 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A collection of objects in which each object can occur only once.
- *
- * That is, for each object of the element type, the object is either considered
- * to be in the set, or to _not_ be in the set.
- *
- * Set implementations may consider some elements indistinguishable. These
- * elements are treated as being the same for any operation on the set.
- *
- * The default [Set] implementation, [LinkedHashSet], considers objects
- * indistinguishable if they are equal with regard to
- * operator [Object.==].
- *
- * Iterating over elements of a set may be either unordered
- * or ordered in some way. Examples:
- *
- * * A [HashSet] is unordered, which means that its iteration order is
- *   uspecified,
- * * [LinkedHashSet] iterates in the insertion order of its elements, and
- * * a sorted set like [SplayTreeSet] iterates the elements in sorted order.
- *
- * It is generally not allowed to modify the set (add or remove elements) while
- * an operation on the set is being performed, for example during a call to
- * [forEach] or [containsAll]. Nor is it allowed to modify the set while
- * iterating either the set itself or any [Iterable] that is backed by the set,
- * such as the ones returned by methods like [where] and [map].
- */
-abstract class Set<E> extends Iterable<E> implements EfficientLength {
-  /**
-   * Creates an empty [Set].
-   *
-   * The created [Set] is a plain [LinkedHashSet].
-   * As such, it considers elements that are equal (using [==]) to be
-   * indistinguishable, and requires them to have a compatible
-   * [Object.hashCode] implementation.
-   *
-   * The set is equivalent to one created by `new LinkedHashSet<E>()`.
-   */
-  factory Set() = LinkedHashSet<E>;
-
-  /**
-   * Creates an empty identity [Set].
-   *
-   * The created [Set] is a [LinkedHashSet] that uses identity as equality
-   * relation.
-   *
-   * The set is equivalent to one created by `new LinkedHashSet<E>.identity()`.
-   */
-  factory Set.identity() = LinkedHashSet<E>.identity;
-
-  /**
-   * Creates a [Set] that contains all [elements].
-   *
-   * All the [elements] should be assignable to [E].
-   * The `elements` iterable itself can have any type,
-   * so this constructor can be used to down-cast a `Set`, for example as:
-   *
-   *     Set<SuperType> superSet = ...;
-   *     Set<SubType> subSet =
-   *         new Set<SubType>.from(superSet.where((e) => e is SubType));
-   *
-   * The created [Set] is a [LinkedHashSet]. As such, it considers elements that
-   * are equal (using [==]) to be indistinguishable, and requires them to
-   * have a compatible [Object.hashCode] implementation.
-   *
-   * The set is equivalent to one created by
-   * `new LinkedHashSet<E>.from(elements)`.
-   */
-  factory Set.from(Iterable<E> elements) = LinkedHashSet<E>.from;
-
-  /**
-   * Provides an iterator that iterates over the elements of this set.
-   *
-   * The order of iteration is defined by the individual `Set` implementation,
-   * but must be consistent between changes to the set.
-   */
-  Iterator<E> get iterator;
-
-  /**
-   * Returns true if [value] is in the set.
-   */
-  bool contains(Object value);
-
-  /**
-   * Adds [value] to the set.
-   *
-   * Returns `true` if [value] (or an equal value) was not yet in the set.
-   * Otherwise returns `false` and the set is not changed.
-   *
-   * Example:
-   *
-   *     var set = new Set();
-   *     var time1 = new DateTime.fromMillisecondsSinceEpoch(0);
-   *     var time2 = new DateTime.fromMillisecondsSinceEpoch(0);
-   *     // time1 and time2 are equal, but not identical.
-   *     Expect.isTrue(time1 == time2);
-   *     Expect.isFalse(identical(time1, time2));
-   *     set.add(time1);  // => true.
-   *     // A value equal to time2 exists already in the set, and the call to
-   *     // add doesn't change the set.
-   *     set.add(time2);  // => false.
-   *     Expect.isTrue(set.length == 1);
-   *     Expect.isTrue(identical(time1, set.first));
-   */
-  bool add(E value);
-
-  /**
-   * Adds all [elements] to this Set.
-   *
-   * Equivalent to adding each element in [elements] using [add],
-   * but some collections may be able to optimize it.
-   */
-  void addAll(Iterable<E> elements);
-
-  /**
-   * Removes [value] from the set. Returns true if [value] was
-   * in the set. Returns false otherwise. The method has no effect
-   * if [value] value was not in the set.
-   */
-  bool remove(Object value);
-
-  /**
-   * If an object equal to [object] is in the set, return it.
-   *
-   * Checks if there is an object in the set that is equal to [object].
-   * If so, that object is returned, otherwise returns null.
-   */
-  E lookup(Object object);
-
-  /**
-   * Removes each element of [elements] from this set.
-   */
-  void removeAll(Iterable<Object> elements);
-
-  /**
-   * Removes all elements of this set that are not elements in [elements].
-   *
-   * Checks for each element of [elements] whether there is an element in this
-   * set that is equal to it (according to `this.contains`), and if so, the
-   * equal element in this set is retained, and elements that are not equal
-   * to any element in `elements` are removed.
-   */
-  void retainAll(Iterable<Object> elements);
-
-  /**
-   * Removes all elements of this set that satisfy [test].
-   */
-  void removeWhere(bool test(E element));
-
-  /**
-   * Removes all elements of this set that fail to satisfy [test].
-   */
-  void retainWhere(bool test(E element));
-
-  /**
-   * Returns whether this Set contains all the elements of [other].
-   */
-  bool containsAll(Iterable<Object> other);
-
-  /**
-   * Returns a new set which is the intersection between this set and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that
-   * are also elements of [other] according to `other.contains`.
-   */
-  Set<E> intersection(Set<Object> other);
-
-  /**
-   * Returns a new set which contains all the elements of this set and [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] and
-   * all the elements of [other].
-   */
-  Set<E> union(Set<E> other);
-
-  /**
-   * Returns a new set with the elements of this that are not in [other].
-   *
-   * That is, the returned set contains all the elements of this [Set] that
-   * are not elements of [other] according to `other.contains`.
-   */
-  Set<E> difference(Set<Object> other);
-
-  /**
-   * Removes all elements in the set.
-   */
-  void clear();
-
-  /* Creates a [Set] with the same elements and behavior as this `Set`.
-   *
-   * The returned set behaves the same as this set
-   * with regard to adding and removing elements.
-   * It initially contains the same elements.
-   * If this set specifies an ordering of the elements,
-   * the returned set will have the same order.
-   */
-  Set<E> toSet();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/sink.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/sink.dart
deleted file mode 100644
index 0d8f2ef..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/sink.dart
+++ /dev/null
@@ -1,31 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/**
- * A generic destination for data.
- *
- * Multiple data values can be put into a sink, and when no more data is
- * available, the sink should be closed.
- *
- * This is a generic interface that other data receivers can implement.
- */
-abstract class Sink<T> {
-  /**
-   * Put the data into the sink.
-   *
-   * Must not be called after a call to [close].
-   */
-  void add(T data);
-
-  /**
-   * Tell the sink that no further data will be added.
-   *
-   * Calling this method more than once is allowed, but does nothing.
-   *
-   * The [add] method must not be called after this method.
-   */
-  void close();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/stacktrace.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/stacktrace.dart
deleted file mode 100644
index 17abd38..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/stacktrace.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/**
- * An interface implemented by all stack trace objects.
- *
- * A [StackTrace] is intended to convey information to the user about the call
- * sequence that triggered an exception.
- *
- * These objects are created by the runtime, it is not possible to create
- * them programmatically.
- */
-abstract class StackTrace {
-  StackTrace();  // In case existing classes extend StackTrace.
-
-  /**
-   * Create a `StackTrace` object from [stackTraceString].
-   *
-   * The created stack trace will have a `toString` method returning
-   * `stackTraceString`.
-   *
-   * The `stackTraceString` can be a string returned by some other
-   * stack trace, or it can be any string at all.
-   * If the string doesn't look like a stack trace, code that interprets
-   * stack traces is likely to fail, so fake stack traces should be used
-   * with care.
-   */
-  factory StackTrace.fromString(String stackTraceString) = _StringStackTrace;
-
-  /**
-   * Returns a representation of the current stack trace.
-   *
-   * This is similar to what can be achieved by doing:
-   *
-   *     try { throw 0; } catch (_, stack) { return stack; }
-   *
-   * The getter achieves this without throwing, except on platforms that
-   * have no other way to get a stack trace.
-   */
-  external static StackTrace get current;
-
-  /**
-   * Returns a [String] representation of the stack trace.
-   *
-   * The string represents the full stack trace starting from
-   * the point where a throw ocurred to the top of the current call sequence.
-   *
-   * The exact format of the string representation is not final.
-   */
-  String toString();
-}
-
-class _StringStackTrace implements StackTrace {
-  final String _stackTrace;
-  _StringStackTrace(this._stackTrace);
-  String toString() => _stackTrace;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/stopwatch.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/stopwatch.dart
deleted file mode 100644
index e923083..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/stopwatch.dart
+++ /dev/null
@@ -1,143 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A simple stopwatch interface to measure elapsed time.
- */
-class Stopwatch {
-  /**
-   * Frequency of the elapsed counter in Hz.
-   */
-  int get frequency => _frequency;
-
-  // The _start and _stop fields capture the time when [start] and [stop]
-  // are called respectively.
-  // If _start is null, then the [Stopwatch] has not been started yet.
-  // If _stop is null, then the [Stopwatch] has not been stopped yet,
-  // or is running.
-  int _start;
-  int _stop;
-
-  /**
-   * Creates a [Stopwatch] in stopped state with a zero elapsed count.
-   *
-   * The following example shows how to start a [Stopwatch]
-   * immediately after allocation.
-   *
-   *     Stopwatch stopwatch = new Stopwatch()..start();
-   */
-  Stopwatch() {
-    _initTicker();
-  }
-
-  /**
-   * Starts the [Stopwatch].
-   *
-   * The [elapsed] count is increasing monotonically. If the [Stopwatch] has
-   * been stopped, then calling start again restarts it without resetting the
-   * [elapsed] count.
-   *
-   * If the [Stopwatch] is currently running, then calling start does nothing.
-   */
-  void start() {
-    if (isRunning) return;
-    if (_start == null) {
-      // This stopwatch has never been started.
-      _start = _now();
-    } else {
-      // Restart this stopwatch. Prepend the elapsed time to the current
-      // start time.
-      _start = _now() - (_stop - _start);
-      _stop = null;
-    }
-  }
-
-  /**
-   * Stops the [Stopwatch].
-   *
-   * The [elapsedTicks] count stops increasing after this call. If the
-   * [Stopwatch] is currently not running, then calling this method has no
-   * effect.
-   */
-  void stop() {
-    if (!isRunning) return;
-    _stop = _now();
-  }
-
-  /**
-   * Resets the [elapsed] count to zero.
-   *
-   * This method does not stop or start the [Stopwatch].
-   */
-  void reset() {
-    if (_start == null) return;
-    // If [_start] is not null, then the stopwatch had already been started. It
-    // may running right now.
-    _start = _now();
-    if (_stop != null) {
-      // The watch is not running. So simply set the [_stop] to [_start] thus
-      // having an elapsed time of 0.
-      _stop = _start;
-    }
-  }
-
-  /**
-   * Returns the elapsed number of clock ticks since calling [start] while the
-   * [Stopwatch] is running.
-   *
-   * Returns the elapsed number of clock ticks between calling [start] and
-   * calling [stop].
-   *
-   * Returns 0 if the [Stopwatch] has never been started.
-   *
-   * The elapsed number of clock ticks increases by [frequency] every second.
-   */
-  int get elapsedTicks {
-    if (_start == null) {
-      return 0;
-    }
-    return (_stop == null) ? (_now() - _start) : (_stop - _start);
-  }
-
-  /**
-   * Returns the [elapsedTicks] counter converted to a [Duration].
-   */
-  Duration get elapsed {
-    return new Duration(microseconds: elapsedMicroseconds);
-  }
-
-  /**
-   * Returns the [elapsedTicks] counter converted to microseconds.
-   */
-  int get elapsedMicroseconds {
-    return (elapsedTicks * 1000000) ~/ frequency;
-  }
-
-  /**
-   * Returns the [elapsedTicks] counter converted to milliseconds.
-   */
-  int get elapsedMilliseconds {
-    return (elapsedTicks * 1000) ~/ frequency;
-  }
-
-
-  /**
-   * Returns wether the [StopWatch] is currently running.
-   */
-  bool get isRunning => _start != null && _stop == null;
-
-  /**
-   * Cached frequency of the system. Must be initialized in [_initTicker];
-   */
-  static int _frequency;
-
-  /**
-   * Initializes the time-measuring system. *Must* initialize the [_frequency]
-   * variable.
-   */
-  external static void _initTicker();
-  external static int _now();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/string.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/string.dart
deleted file mode 100644
index 39641df..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/string.dart
+++ /dev/null
@@ -1,792 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A sequence of characters.
- *
- * A string can be either single or multiline. Single line strings are
- * written using matching single or double quotes, and multiline strings are
- * written using triple quotes. The following are all valid Dart strings:
- *
- *     'Single quotes';
- *     "Double quotes";
- *     'Double quotes in "single" quotes';
- *     "Single quotes in 'double' quotes";
- *
- *     '''A
- *     multiline
- *     string''';
- *
- *     """
- *     Another
- *     multiline
- *     string""";
- *
- * Strings are immutable. Although you cannot change a string, you can perform
- * an operation on a string and assign the result to a new string:
- *
- *     var string = 'Dart is fun';
- *     var newString = string.substring(0, 5);
- *
- * You can use the plus (`+`) operator to concatenate strings:
- *
- *     'Dart ' + 'is ' + 'fun!'; // 'Dart is fun!'
- *
- * You can also use adjacent string literals for concatenation:
- *
- *     'Dart ' 'is ' 'fun!';    // 'Dart is fun!'
- *
- * You can use `${}` to interpolate the value of Dart expressions
- * within strings. The curly braces can be omitted when evaluating identifiers:
- *
- *     string = 'dartlang';
- *     '$string has ${string.length} letters'; // 'dartlang has 8 letters'
- *
- * A string is represented by a sequence of Unicode UTF-16 code units
- * accessible through the [codeUnitAt] or the [codeUnits] members:
- *
- *     string = 'Dart';
- *     string.codeUnitAt(0); // 68
- *     string.codeUnits;     // [68, 97, 114, 116]
- *
- * The string representation of code units is accessible through the index
- * operator:
- *
- *     string[0];            // 'D'
- *
- * The characters of a string are encoded in UTF-16. Decoding UTF-16, which
- * combines surrogate pairs, yields Unicode code points. Following a similar
- * terminology to Go, we use the name 'rune' for an integer representing a
- * Unicode code point. Use the [runes] property to get the runes of a string:
- *
- *     string.runes.toList(); // [68, 97, 114, 116]
- *
- * For a character outside the Basic Multilingual Plane (plane 0) that is
- * composed of a surrogate pair, [runes] combines the pair and returns a
- * single integer.  For example, the Unicode character for a
- * musical G-clef ('𝄞') with rune value 0x1D11E consists of a UTF-16 surrogate
- * pair: `0xD834` and `0xDD1E`. Using [codeUnits] returns the surrogate pair,
- * and using `runes` returns their combined value:
- *
- *     var clef = '\u{1D11E}';
- *     clef.codeUnits;         // [0xD834, 0xDD1E]
- *     clef.runes.toList();    // [0x1D11E]
- *
- * The String class can not be extended or implemented. Attempting to do so
- * yields a compile-time error.
- *
- * ## Other resources
- *
- * See [StringBuffer] to efficiently build a string incrementally. See
- * [RegExp] to work with regular expressions.
- *
- * Also see:
-
- * * [Dart Cookbook](https://www.dartlang.org/docs/cookbook/#strings)
- *   for String examples and recipes.
- * * [Dart Up and Running](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#strings-and-regular-expressions)
- */
-abstract class String implements Comparable<String>, Pattern {
-  /**
-   * Allocates a new String for the specified [charCodes].
-   *
-   * The [charCodes] can be UTF-16 code units or runes. If a char-code value is
-   * 16-bit, it is copied verbatim:
-   *
-   *     new String.fromCharCodes([68]); // 'D'
-   *
-   * If a char-code value is greater than 16-bits, it is decomposed into a
-   * surrogate pair:
-   *
-   *     var clef = new String.fromCharCodes([0x1D11E]);
-   *     clef.codeUnitAt(0); // 0xD834
-   *     clef.codeUnitAt(1); // 0xDD1E
-   *
-   * If [start] and [end] is provided, only the values of [charCodes]
-   * at positions from `start` to, but not including, `end`, are used.
-   * The `start` and `end` values must satisfy
-   * `0 <= start <= end <= charCodes.length`.
-   */
-  external factory String.fromCharCodes(Iterable<int> charCodes,
-                                        [int start = 0, int end]);
-
-  /**
-   * Allocates a new String for the specified [charCode].
-   *
-   * If the [charCode] can be represented by a single UTF-16 code unit, the new
-   * string contains a single code unit. Otherwise, the [length] is 2 and
-   * the code units form a surrogate pair. See documentation for
-   * [fromCharCodes].
-   *
-   * Creating a String with half of a surrogate pair is allowed.
-   */
-  external factory String.fromCharCode(int charCode);
-
-  /**
-   * Returns the string value of the environment declaration [name].
-   *
-   * Environment declarations are provided by the surrounding system compiling
-   * or running the Dart program. Declarations map a string key to a string
-   * value.
-   *
-   * If [name] is not declared in the environment, the result is instead
-   * [defaultValue].
-   *
-   * Example of getting a value:
-   *
-   *     const String.fromEnvironment("defaultFloo", defaultValue: "no floo")
-   *
-   * Example of checking whether a declaration is there at all:
-   *
-   *     var isDeclared = const String.fromEnvironment("maybeDeclared") != null;
-   */
-  external const factory String.fromEnvironment(String name,
-                                                {String defaultValue});
-
-  /**
-   * Gets the character (as a single-code-unit [String]) at the given [index].
-   *
-   * The returned string represents exactly one UTF-16 code unit, which may be
-   * half of a surrogate pair. A single member of a surrogate pair is an
-   * invalid UTF-16 string:
-   *
-   *     var clef = '\u{1D11E}';
-   *     // These represent invalid UTF-16 strings.
-   *     clef[0].codeUnits;      // [0xD834]
-   *     clef[1].codeUnits;      // [0xDD1E]
-   *
-   * This method is equivalent to
-   * `new String.fromCharCode(this.codeUnitAt(index))`.
-   */
-  String operator [](int index);
-
-  /**
-   * Returns the 16-bit UTF-16 code unit at the given [index].
-   */
-  int codeUnitAt(int index);
-
-  /**
-   * The length of the string.
-   *
-   * Returns the number of UTF-16 code units in this string. The number
-   * of [runes] might be fewer, if the string contains characters outside
-   * the Basic Multilingual Plane (plane 0):
-   *
-   *     'Dart'.length;          // 4
-   *     'Dart'.runes.length;    // 4
-   *
-   *     var clef = '\u{1D11E}';
-   *     clef.length;            // 2
-   *     clef.runes.length;      // 1
-   */
-  int get length;
-
-  /**
-   * Returns a hash code derived from the code units of the string.
-   *
-   * This is compatible with [operator==]. Strings with the same sequence
-   * of code units have the same hash code.
-   */
-  int get hashCode;
-
-  /**
-   * Returns true if other is a `String` with the same sequence of code units.
-   *
-   * This method compares each individual code unit of the strings.
-   * It does not check for Unicode equivalence.
-   * For example, both the following strings represent the string 'Amélie',
-   * but due to their different encoding, are not equal:
-   *
-   *     'Am\xe9lie' == 'Ame\u{301}lie'; // false
-   *
-   * The first string encodes 'é' as a single unicode code unit (also
-   * a single rune), whereas the second string encodes it as 'e' with the
-   * combining accent character '◌́'.
-   */
-  bool operator ==(Object other);
-
-  /**
-   * Returns true if this string ends with [other]. For example:
-   *
-   *     'Dart'.endsWith('t'); // true
-   */
-  bool endsWith(String other);
-
-  /**
-   * Returns true if this string starts with a match of [pattern].
-   *
-   *     var string = 'Dart';
-   *     string.startsWith('D');                       // true
-   *     string.startsWith(new RegExp(r'[A-Z][a-z]')); // true
-   *
-   * If [index] is provided, this method checks if the substring starting
-   * at that index starts with a match of [pattern]:
-   *
-   *     string.startsWith('art', 1);                  // true
-   *     string.startsWith(new RegExp(r'\w{3}'));      // true
-   *
-   * [index] must not be negative or greater than [length].
-   *
-   * A [RegExp] containing '^' does not match if the [index] is greater than
-   * zero. The pattern works on the string as a whole, and does not extract
-   * a substring starting at [index] first:
-   *
-   *     string.startsWith(new RegExp(r'^art'), 1);    // false
-   *     string.startsWith(new RegExp(r'art'), 1);     // true
-   */
-  bool startsWith(Pattern pattern, [int index = 0]);
-
-  /**
-   * Returns the position of the first match of [pattern] in this string,
-   * starting at [start], inclusive:
-   *
-   *     var string = 'Dartisans';
-   *     string.indexOf('art');                     // 1
-   *     string.indexOf(new RegExp(r'[A-Z][a-z]')); // 0
-   *
-   * Returns -1 if no match is found:
-   *
-   *     string.indexOf(new RegExp(r'dart'));       // -1
-   *
-   * [start] must not be negative or greater than [length].
-   */
-  int indexOf(Pattern pattern, [int start]);
-
-  /**
-   * Returns the position of the last match [pattern] in this string, searching
-   * backward starting at [start], inclusive:
-   *
-   *     var string = 'Dartisans';
-   *     string.lastIndexOf('a');                    // 6
-   *     string.lastIndexOf(new RegExp(r'a(r|n)'));  // 6
-   *
-   * Returns -1 if [other] could not be found.
-   *
-   *     string.lastIndexOf(new RegExp(r'DART'));    // -1
-   *
-   * [start] must not be negative or greater than [length].
-   */
-  int lastIndexOf(Pattern pattern, [int start]);
-
-  /**
-   * Returns true if this string is empty.
-   */
-  bool get isEmpty;
-
-  /**
-   * Returns true if this string is not empty.
-   */
-  bool get isNotEmpty;
-
-  /**
-   * Creates a new string by concatenating this string with [other].
-   *
-   *     'dart' + 'lang'; // 'dartlang'
-   */
-  String operator +(String other);
-
-  /**
-   * Returns the substring of this string that extends from [startIndex],
-   * inclusive, to [endIndex], exclusive.
-   *
-   *     var string = 'dartlang';
-   *     string.substring(1);    // 'artlang'
-   *     string.substring(1, 4); // 'art'
-   */
-  String substring(int startIndex, [int endIndex]);
-
-  /**
-   * Returns the string without any leading and trailing whitespace.
-   *
-   * If the string contains leading or trailing whitespace, a new string with no
-   * leading and no trailing whitespace is returned:
-   *
-   *     '\tDart is fun\n'.trim(); // 'Dart is fun'
-   *
-   * Otherwise, the original string itself is returned:
-   *
-   *     var str1 = 'Dart';
-   *     var str2 = str1.trim();
-   *     identical(str1, str2);    // true
-   *
-   * Whitespace is defined by the Unicode White_Space property (as defined in
-   * version 6.2 or later) and the BOM character, 0xFEFF.
-   *
-   * Here is the list of trimmed characters (following version 6.2):
-   *
-   *     0009..000D    ; White_Space # Cc   <control-0009>..<control-000D>
-   *     0020          ; White_Space # Zs   SPACE
-   *     0085          ; White_Space # Cc   <control-0085>
-   *     00A0          ; White_Space # Zs   NO-BREAK SPACE
-   *     1680          ; White_Space # Zs   OGHAM SPACE MARK
-   *     180E          ; White_Space # Zs   MONGOLIAN VOWEL SEPARATOR
-   *     2000..200A    ; White_Space # Zs   EN QUAD..HAIR SPACE
-   *     2028          ; White_Space # Zl   LINE SEPARATOR
-   *     2029          ; White_Space # Zp   PARAGRAPH SEPARATOR
-   *     202F          ; White_Space # Zs   NARROW NO-BREAK SPACE
-   *     205F          ; White_Space # Zs   MEDIUM MATHEMATICAL SPACE
-   *     3000          ; White_Space # Zs   IDEOGRAPHIC SPACE
-   *
-   *     FEFF          ; BOM                ZERO WIDTH NO_BREAK SPACE
-   */
-  String trim();
-
-  /**
-   * Returns the string without any leading whitespace.
-   *
-   * As [trim], but only removes leading whitespace.
-   */
-  String trimLeft();
-
-  /**
-   * Returns the string without any trailing whitespace.
-   *
-   * As [trim], but only removes trailing whitespace.
-   */
-  String trimRight();
-
-  /**
-   * Creates a new string by concatenating this string with itself a number
-   * of times.
-   *
-   * The result of `str * n` is equivalent to
-   * `str + str + ...`(n times)`... + str`.
-   *
-   * Returns an empty string if [times] is zero or negative.
-   */
-  String operator *(int times);
-
-  /**
-   * Pads this string on the left if it is shorther than [width].
-   *
-   * Return a new string that prepends [padding] onto this string
-   * one time for each position the length is less than [width].
-   *
-   * If [width] is already smaller than or equal to `this.length`,
-   * no padding is added. A negative `width` is treated as zero.
-   *
-   * If [padding] has length different from 1, the result will not
-   * have length `width`. This may be useful for cases where the
-   * padding is a longer string representing a single character, like
-   * `"&nbsp;"` or `"\u{10002}`".
-   * In that case, the user should make sure that `this.length` is
-   * the correct measure of the strings length.
-   */
-  String padLeft(int width, [String padding = ' ']);
-
-  /**
-   * Pads this string on the right if it is shorther than [width].
-   *
-   * Return a new string that appends [padding] after this string
-   * one time for each position the length is less than [width].
-   *
-   * If [width] is already smaller than or equal to `this.length`,
-   * no padding is added. A negative `width` is treated as zero.
-   *
-   * If [padding] has length different from 1, the result will not
-   * have length `width`. This may be useful for cases where the
-   * padding is a longer string representing a single character, like
-   * `"&nbsp;"` or `"\u{10002}`".
-   * In that case, the user should make sure that `this.length` is
-   * the correct measure of the strings length.
-   */
-  String padRight(int width, [String padding = ' ']);
-
-  /**
-   * Returns true if this string contains a match of [other]:
-   *
-   *     var string = 'Dart strings';
-   *     string.contains('D');                     // true
-   *     string.contains(new RegExp(r'[A-Z]'));    // true
-   *
-   * If [startIndex] is provided, this method matches only at or after that
-   * index:
-   *
-   *     string.contains('X', 1);                  // false
-   *     string.contains(new RegExp(r'[A-Z]'), 1); // false
-   *
-   * [startIndex] must not be negative or greater than [length].
-   */
-  bool contains(Pattern other, [int startIndex = 0]);
-
-  /**
-   * Returns a new string in which the first occurence of [from] in this string
-   * is replaced with [to], starting from [startIndex]:
-   *
-   *     '0.0001'.replaceFirst(new RegExp(r'0'), ''); // '.0001'
-   *     '0.0001'.replaceFirst(new RegExp(r'0'), '7', 1); // '0.7001'
-   */
-  String replaceFirst(Pattern from, String to, [int startIndex = 0]);
-
-  /**
-   * Replace the first occurence of [from] in this string.
-   *
-   * Returns a new string, which is this string
-   * except that the first match of [pattern], starting from [startIndex],
-   * is replaced by the result of calling [replace] with the match object.
-   *
-   * If the value returned by calling `replace` is not a [String], it
-   * is converted to a `String` using its `toString` method, which must
-   * then return a string.
-   */
-  String replaceFirstMapped(Pattern from, String replace(Match match),
-                            [int startIndex = 0]);
-
-  /**
-   * Replaces all substrings that match [from] with [replace].
-   *
-   * Returns a new string in which the non-overlapping substrings matching
-   * [from] (the ones iterated by `from.allMatches(thisString)`) are replaced
-   * by the literal string [replace].
-   *
-   *     'resume'.replaceAll(new RegExp(r'e'), 'é'); // 'résumé'
-   *
-   * Notice that the [replace] string is not interpreted. If the replacement
-   * depends on the match (for example on a [RegExp]'s capture groups), use
-   * the [replaceAllMapped] method instead.
-   */
-  String replaceAll(Pattern from, String replace);
-
-  /**
-   * Replace all substrings that match [from] by a string computed from the
-   * match.
-   *
-   * Returns a new string in which the non-overlapping substrings that match
-   * [from] (the ones iterated by `from.allMatches(thisString)`) are replaced
-   * by the result of calling [replace] on the corresponding [Match] object.
-   *
-   * This can be used to replace matches with new content that depends on the
-   * match, unlike [replaceAll] where the replacement string is always the same.
-   *
-   * The [replace] function is called with the [Match] generated
-   * by the pattern, and its result is used as replacement.
-   *
-   * The function defined below converts each word in a string to simplified
-   * 'pig latin' using [replaceAllMapped]:
-   *
-   *     pigLatin(String words) => words.replaceAllMapped(
-   *         new RegExp(r'\b(\w*?)([aeiou]\w*)', caseSensitive: false),
-   *         (Match m) => "${m[2]}${m[1]}${m[1].isEmpty ? 'way' : 'ay'}");
-   *
-   *     pigLatin('I have a secret now!'); // 'Iway avehay away ecretsay ownay!'
-   */
-  String replaceAllMapped(Pattern from, String replace(Match match));
-
-  /**
-   * Replaces the substring from [start] to [end] with [replacement].
-   *
-   * Returns a new string equivalent to:
-   *
-   *     this.substring(0, start) + replacement + this.substring(end)
-   *
-   * The [start] and [end] indices must specify a valid range of this string.
-   * That is `0 <= start <= end <= this.length`.
-   * If [end] is `null`, it defaults to [length].
-   */
-  String replaceRange(int start, int end, String replacement);
-
-  /**
-   * Splits the string at matches of [pattern] and returns a list of substrings.
-   *
-   * Finds all the matches of `pattern` in this string,
-   * and returns the list of the substrings between the matches.
-   *
-   *     var string = "Hello world!";
-   *     string.split(" ");                      // ['Hello', 'world!'];
-   *
-   * Empty matches at the beginning and end of the strings are ignored,
-   * and so are empty matches right after another match.
-   *
-   *     var string = "abba";
-   *     string.split(new RegExp(r"b*"));        // ['a', 'a']
-   *                                             // not ['', 'a', 'a', '']
-   *
-   * If this string is empty, the result is an empty list if `pattern` matches
-   * the empty string, and it is `[""]` if the pattern doesn't match.
-   *
-   *     var string = '';
-   *     string.split('');                       // []
-   *     string.split("a");                      // ['']
-   *
-   * Splitting with an empty pattern splits the string into single-code unit
-   * strings.
-   *
-   *     var string = 'Pub';
-   *     string.split('');                       // ['P', 'u', 'b']
-   *
-   *     string.codeUnits.map((unit) {
-   *       return new String.fromCharCode(unit);
-   *     }).toList();                            // ['P', 'u', 'b']
-   *
-   * Splitting happens at UTF-16 code unit boundaries,
-   * and not at rune boundaries:
-   *
-   *     // String made up of two code units, but one rune.
-   *     string = '\u{1D11E}';
-   *     string.split('').length;                 // 2 surrogate values
-   *
-   * To get a list of strings containing the individual runes of a string,
-   * you should not use split. You can instead map each rune to a string
-   * as follows:
-   *
-   *     string.runes.map((rune) => new String.fromCharCode(rune)).toList();
-   */
-  List<String> split(Pattern pattern);
-
-  /**
-   * Splits the string, converts its parts, and combines them into a new
-   * string.
-   *
-   * [pattern] is used to split the string into parts and separating matches.
-   *
-   * Each match is converted to a string by calling [onMatch]. If [onMatch]
-   * is omitted, the matched string is used.
-   *
-   * Each non-matched part is converted by a call to [onNonMatch]. If
-   * [onNonMatch] is omitted, the non-matching part is used.
-   *
-   * Then all the converted parts are combined into the resulting string.
-   *
-   *     'Eats shoots leaves'.splitMapJoin((new RegExp(r'shoots')),
-   *         onMatch:    (m) => '${m.group(0)}',
-   *         onNonMatch: (n) => '*'); // *shoots*
-   */
-  String splitMapJoin(Pattern pattern,
-                      {String onMatch(Match match),
-                       String onNonMatch(String nonMatch)});
-
-  /**
-   * Returns an unmodifiable list of the UTF-16 code units of this string.
-   */
-  List<int> get codeUnits;
-
-  /**
-   * Returns an [Iterable] of Unicode code-points of this string.
-   *
-   * If the string contains surrogate pairs, they are combined and returned
-   * as one integer by this iterator. Unmatched surrogate halves are treated
-   * like valid 16-bit code-units.
-   */
-  Runes get runes;
-
-  /**
-   * Converts all characters in this string to lower case.
-   * If the string is already in all lower case, this method returns [:this:].
-   *
-   *     'ALPHABET'.toLowerCase(); // 'alphabet'
-   *     'abc'.toLowerCase();      // 'abc'
-   *
-   * This function uses the language independent Unicode mapping and thus only
-   * works in some languages.
-   */
-  // TODO(floitsch): document better. (See EcmaScript for description).
-  String toLowerCase();
-
-  /**
-   * Converts all characters in this string to upper case.
-   * If the string is already in all upper case, this method returns [:this:].
-   *
-   *     'alphabet'.toUpperCase(); // 'ALPHABET'
-   *     'ABC'.toUpperCase();      // 'ABC'
-   *
-   * This function uses the language independent Unicode mapping and thus only
-   * works in some languages.
-   */
-  // TODO(floitsch): document better. (See EcmaScript for description).
-  String toUpperCase();
-}
-
-/**
- * The runes (integer Unicode code points) of a [String].
- */
-class Runes extends Iterable<int> {
-  final String string;
-  Runes(this.string);
-
-  RuneIterator get iterator => new RuneIterator(string);
-
-  int get last {
-    if (string.length == 0) {
-      throw new StateError('No elements.');
-    }
-    int length = string.length;
-    int code = string.codeUnitAt(length - 1);
-    if (_isTrailSurrogate(code) && string.length > 1) {
-      int previousCode = string.codeUnitAt(length - 2);
-      if (_isLeadSurrogate(previousCode)) {
-        return _combineSurrogatePair(previousCode, code);
-      }
-    }
-    return code;
-  }
-
-}
-
-// Is then code (a 16-bit unsigned integer) a UTF-16 lead surrogate.
-bool _isLeadSurrogate(int code) => (code & 0xFC00) == 0xD800;
-
-// Is then code (a 16-bit unsigned integer) a UTF-16 trail surrogate.
-bool _isTrailSurrogate(int code) => (code & 0xFC00) == 0xDC00;
-
-// Combine a lead and a trail surrogate value into a single code point.
-int _combineSurrogatePair(int start, int end) {
-  return 0x10000 + ((start & 0x3FF) << 10) + (end & 0x3FF);
-}
-
-/** [Iterator] for reading runes (integer Unicode code points) out of a Dart
-  * string.
-  */
-class RuneIterator implements BidirectionalIterator<int> {
-  /** String being iterated. */
-  final String string;
-  /** Position before the current code point. */
-  int _position;
-  /** Position after the current code point. */
-  int _nextPosition;
-  /**
-   * Current code point.
-   *
-   * If the iterator has hit either end, the [_currentCodePoint] is null
-   * and [: _position == _nextPosition :].
-   */
-  int _currentCodePoint;
-
-  /** Create an iterator positioned at the beginning of the string. */
-  RuneIterator(String string)
-      : this.string = string, _position = 0, _nextPosition = 0;
-
-  /**
-   * Create an iterator positioned before the [index]th code unit of the string.
-   *
-   * When created, there is no [current] value.
-   * A [moveNext] will use the rune starting at [index] the current value,
-   * and a [movePrevious] will use the rune ending just before [index] as the
-   * the current value.
-   *
-   * The [index] position must not be in the middle of a surrogate pair.
-   */
-  RuneIterator.at(String string, int index)
-      : string = string, _position = index, _nextPosition = index {
-    RangeError.checkValueInInterval(index, 0, string.length);
-    _checkSplitSurrogate(index);
-  }
-
-  /** Throw an error if the index is in the middle of a surrogate pair. */
-  void _checkSplitSurrogate(int index) {
-    if (index > 0 && index < string.length &&
-        _isLeadSurrogate(string.codeUnitAt(index - 1)) &&
-        _isTrailSurrogate(string.codeUnitAt(index))) {
-      throw new ArgumentError('Index inside surrogate pair: $index');
-    }
-  }
-
-  /**
-   * Returns the starting position of the current rune in the string.
-   *
-   * Returns null if the [current] rune is null.
-   */
-  int get rawIndex => (_position != _nextPosition) ? _position : null;
-
-  /**
-   * Resets the iterator to the rune at the specified index of the string.
-   *
-   * Setting a negative [rawIndex], or one greater than or equal to
-   * [:string.length:],
-   * is an error. So is setting it in the middle of a surrogate pair.
-   *
-   * Setting the position to the end of then string will set [current] to null.
-   */
-  void set rawIndex(int rawIndex) {
-    RangeError.checkValidIndex(rawIndex, string, "rawIndex");
-    reset(rawIndex);
-    moveNext();
-  }
-
-  /**
-   * Resets the iterator to the given index into the string.
-   *
-   * After this the [current] value is unset.
-   * You must call [moveNext] make the rune at the position current,
-   * or [movePrevious] for the last rune before the position.
-   *
-   * Setting a negative [rawIndex], or one greater than [:string.length:],
-   * is an error. So is setting it in the middle of a surrogate pair.
-   */
-  void reset([int rawIndex = 0]) {
-    RangeError.checkValueInInterval(rawIndex, 0, string.length, "rawIndex");
-    _checkSplitSurrogate(rawIndex);
-    _position = _nextPosition = rawIndex;
-    _currentCodePoint = null;
-  }
-
-  /** The rune (integer Unicode code point) starting at the current position in
-   *  the string.
-   */
-  int get current => _currentCodePoint;
-
-  /**
-   * The number of code units comprising the current rune.
-   *
-   * Returns zero if there is no current rune ([current] is null).
-   */
-  int get currentSize => _nextPosition - _position;
-
-  /**
-   * A string containing the current rune.
-   *
-   * For runes outside the basic multilingual plane, this will be
-   * a String of length 2, containing two code units.
-   *
-   * Returns null if [current] is null.
-   */
-  String get currentAsString {
-    if (_position == _nextPosition) return null;
-    if (_position + 1 == _nextPosition) return string[_position];
-    return string.substring(_position, _nextPosition);
-  }
-
-  bool moveNext() {
-    _position = _nextPosition;
-    if (_position == string.length) {
-      _currentCodePoint = null;
-      return false;
-    }
-    int codeUnit = string.codeUnitAt(_position);
-    int nextPosition = _position + 1;
-    if (_isLeadSurrogate(codeUnit) && nextPosition < string.length) {
-      int nextCodeUnit = string.codeUnitAt(nextPosition);
-      if (_isTrailSurrogate(nextCodeUnit)) {
-        _nextPosition = nextPosition + 1;
-        _currentCodePoint = _combineSurrogatePair(codeUnit, nextCodeUnit);
-        return true;
-      }
-    }
-    _nextPosition = nextPosition;
-    _currentCodePoint = codeUnit;
-    return true;
-  }
-
-  bool movePrevious() {
-    _nextPosition = _position;
-    if (_position == 0) {
-      _currentCodePoint = null;
-      return false;
-    }
-    int position = _position - 1;
-    int codeUnit = string.codeUnitAt(position);
-    if (_isTrailSurrogate(codeUnit) && position > 0) {
-      int prevCodeUnit = string.codeUnitAt(position - 1);
-      if (_isLeadSurrogate(prevCodeUnit)) {
-        _position = position - 1;
-        _currentCodePoint = _combineSurrogatePair(prevCodeUnit, codeUnit);
-        return true;
-      }
-    }
-    _position = position;
-    _currentCodePoint = codeUnit;
-    return true;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/string_buffer.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/string_buffer.dart
deleted file mode 100644
index 31b8780..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/string_buffer.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A class for concatenating strings efficiently.
- *
- * Allows for the incremental building of a string using write*() methods.
- * The strings are concatenated to a single string only when [toString] is
- * called.
- */
-class StringBuffer implements StringSink {
-
-  /** Creates the string buffer with an initial content. */
-  external StringBuffer([Object content = ""]);
-
-  /**
-   * Returns the length of the content that has been accumulated so far.
-   * This is a constant-time operation.
-   */
-  external int get length;
-
-  /** Returns whether the buffer is empty. This is a constant-time operation. */
-  bool get isEmpty => length == 0;
-
-  /**
-   * Returns whether the buffer is not empty. This is a constant-time
-   * operation.
-   */
-  bool get isNotEmpty => !isEmpty;
-
-  /// Adds the contents of [obj], converted to a string, to the buffer.
-  external void write(Object obj);
-
-  /// Adds the string representation of [charCode] to the buffer.
-  external void writeCharCode(int charCode);
-
-  external void writeAll(Iterable objects, [String separator = ""]);
-
-  external void writeln([Object obj = ""]);
-
-  /**
-   * Clears the string buffer.
-   */
-  external void clear();
-
-  /// Returns the contents of buffer as a concatenated string.
-  external String toString();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/string_sink.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/string_sink.dart
deleted file mode 100644
index 5fdd0f2..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/string_sink.dart
+++ /dev/null
@@ -1,32 +0,0 @@
-// 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.
-
-part of dart.core;
-
-abstract class StringSink {
-
-  /**
-   * Converts [obj] to a String by invoking [Object.toString] and 
-   * adds the result to `this`.
-   */
-  void write(Object obj);
-
-  /**
-   * Iterates over the given [objects] and [write]s them in sequence.
-   */
-  void writeAll(Iterable objects, [String separator = ""]);
-
-  /**
-   * Converts [obj] to a String by invoking [Object.toString] and 
-   * adds the result to `this`, followed by a newline.
-   */
-  void writeln([Object obj = ""]);
-
-  /**
-   * Writes the [charCode] to `this`.
-   *
-   * This method is equivalent to `write(new String.fromCharCode(charCode))`.
-   */
-  void writeCharCode(int charCode);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/symbol.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/symbol.dart
deleted file mode 100644
index f60cdd1..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/symbol.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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.
-
-part of dart.core;
-
-/// Opaque name used by mirrors, invocations and [Function.apply].
-abstract class Symbol {
-  /**
-   * Constructs a new Symbol.
-   *
-   * The name must be a valid public Dart member name,
-   * public constructor name, or library name, optionally qualified.
-   *
-   * A qualified name is a valid name preceded by a public identifier name
-   * and a '`.`', e.g., `foo.bar.baz=` is a qualified version of `baz=`.
-   * That means that the content of the [name] String must be either
-   *
-   * * a valid public Dart identifier
-   *   (that is, an identifier not starting with "`_`"),
-   * * such an identifier followed by "=" (a setter name),
-   * * the name of a declarable operator
-   *   (one of "`+`", "`-`", "`*`", "`/`", "`%`", "`~/`", "`&`", "`|`",
-   *   "`^`", "`~`", "`<<`", "`>>`", "`<`", "`<=`", "`>`", "`>=`", "`==`",
-   *   "`[]`", "`[]=`", or "`unary-`"),
-   * * any of the above preceeded by any number of qualifiers,
-   *   where a qualifier is a non-private identifier followed by '`.`',
-   * * or the empty string (the default name of a library with no library
-   *   name declaration).
-   *
-   * The following text is non-normative:
-   *
-   * Creating non-const Symbol instances may result in larger output.  If
-   * possible, use [MirrorsUsed] in "dart:mirrors" to specify which names might
-   * be passed to this constructor.
-   */
-  const factory Symbol(String name) = internal.Symbol;
-
-  /**
-   * Returns a hash code compatible with [operator==].
-   *
-   * Equal symbols have the same hash code.
-   */
-  int get hashCode;
-
-  /**
-   * Symbols are equal to other symbols that correspond to the same member name.
-   *
-   * Qualified member names, like `#foo.bar` are equal only if they have the
-   * same identifiers before the same final member name.
-   */
-  bool operator ==(Object other);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/type.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/type.dart
deleted file mode 100644
index d2e107b..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/type.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * Runtime representation of a type.
- */
-abstract class Type {}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/core/uri.dart b/pkg/dev_compiler/tool/input_sdk/lib/core/uri.dart
deleted file mode 100644
index 1d35106..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/core/uri.dart
+++ /dev/null
@@ -1,3354 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.core;
-
-/**
- * A parsed URI, such as a URL.
- *
- * **See also:**
- *
- * * [URIs][uris] in the [library tour][libtour]
- * * [RFC-3986](http://tools.ietf.org/html/rfc3986)
- *
- * [uris]: https://www.dartlang.org/docs/dart-up-and-running/ch03.html#uris
- * [libtour]: https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html
- */
-class Uri {
-  /**
-   * The scheme component of the URI.
-   *
-   * Returns the empty string if there is no scheme component.
-   *
-   * A URI scheme is case insensitive.
-   * The returned scheme is canonicalized to lowercase letters.
-   */
-  // We represent the missing scheme as an empty string.
-  // A valid scheme cannot be empty.
-  final String scheme;
-
-  /**
-   * The user-info part of the authority.
-   *
-   * Does not distinguish between an empty user-info and an absent one.
-   * The value is always non-null.
-   * Is considered absent if [_host] is `null`.
-   */
-  final String _userInfo;
-
-  /**
-   * The host name of the URI.
-   *
-   * Set to `null` if there is no authority in the URI.
-   * The host name is the only mandatory part of an authority, so we use
-   * it to mark whether an authority part was present or not.
-   */
-  final String _host;
-
-  /**
-   * The port number part of the authority.
-   *
-   * The port. Set to null if there is no port. Normalized to null if
-   * the port is the default port for the scheme.
-   */
-  int _port;
-
-  /**
-   * The path of the URI.
-   *
-   * Always non-null.
-   */
-  String _path;
-
-  // The query content, or null if there is no query.
-  final String _query;
-
-  // The fragment content, or null if there is no fragment.
-  final String _fragment;
-
-  /**
-   * Cache the computed return value of [pathSegements].
-   */
-  List<String> _pathSegments;
-
-  /**
-   * Cache the computed return value of [queryParameters].
-   */
-  Map<String, String> _queryParameters;
-  Map<String, List<String>> _queryParameterLists;
-
-  /// Internal non-verifying constructor. Only call with validated arguments.
-  Uri._internal(this.scheme,
-                this._userInfo,
-                this._host,
-                this._port,
-                this._path,
-                this._query,
-                this._fragment);
-
-  /**
-   * Creates a new URI from its components.
-   *
-   * Each component is set through a named argument. Any number of
-   * components can be provided. The [path] and [query] components can be set
-   * using either of two different named arguments.
-   *
-   * The scheme component is set through [scheme]. The scheme is
-   * normalized to all lowercase letters. If the scheme is omitted or empty,
-   * the URI will not have a scheme part.
-   *
-   * The user info part of the authority component is set through
-   * [userInfo]. It defaults to the empty string, which will be omitted
-   * from the string representation of the URI.
-   *
-   * The host part of the authority component is set through
-   * [host]. The host can either be a hostname, an IPv4 address or an
-   * IPv6 address, contained in '[' and ']'. If the host contains a
-   * ':' character, the '[' and ']' are added if not already provided.
-   * The host is normalized to all lowercase letters.
-   *
-   * The port part of the authority component is set through
-   * [port].
-   * If [port] is omitted or `null`, it implies the default port for
-   * the URI's scheme, and is equivalent to passing that port explicitly.
-   * The recognized schemes, and their default ports, are "http" (80) and
-   * "https" (443). All other schemes are considered as having zero as the
-   * default port.
-   *
-   * If any of `userInfo`, `host` or `port` are provided,
-   * the URI has an autority according to [hasAuthority].
-   *
-   * The path component is set through either [path] or
-   * [pathSegments].
-   * When [path] is used, it should be a valid URI path,
-   * but invalid characters, except the general delimiters ':/@[]?#',
-   * will be escaped if necessary.
-   * When [pathSegments] is used, each of the provided segments
-   * is first percent-encoded and then joined using the forward slash
-   * separator.
-   *
-   * The percent-encoding of the path segments encodes all
-   * characters except for the unreserved characters and the following
-   * list of characters: `!$&'()*+,;=:@`. If the other components
-   * necessitate an absolute path, a leading slash `/` is prepended if
-   * not already there.
-   *
-   * The query component is set through either [query] or [queryParameters].
-   * When [query] is used, the provided string should be a valid URI query,
-   * but invalid characters, other than general delimiters,
-   * will be escaped if necessary.
-   * When [queryParameters] is used the query is built from the
-   * provided map. Each key and value in the map is percent-encoded
-   * and joined using equal and ampersand characters.
-   * A value in the map must be either a string, or an [Iterable] of strings,
-   * where the latter corresponds to multiple values for the same key.
-   *
-   * The percent-encoding of the keys and values encodes all characters
-   * except for the unreserved characters, and replaces spaces with `+`.
-   * If `query` is the empty string, it is equivalent to omitting it.
-   * To have an actual empty query part,
-   * use an empty map for `queryParameters`.
-   *
-   * If both `query` and `queryParameters` are omitted or `null`,
-   * the URI has no query part.
-   *
-   * The fragment component is set through [fragment].
-   * It should be a valid URI fragment, but invalid characters other than
-   * general delimiters, are escaped if necessary.
-   * If `fragment` is omitted or `null`, the URI has no fragment part.
-   */
-  factory Uri({String scheme : "",
-               String userInfo : "",
-               String host,
-               int port,
-               String path,
-               Iterable<String> pathSegments,
-               String query,
-               Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
-               String fragment}) {
-    scheme = _makeScheme(scheme, 0, _stringOrNullLength(scheme));
-    userInfo = _makeUserInfo(userInfo, 0, _stringOrNullLength(userInfo));
-    host = _makeHost(host, 0, _stringOrNullLength(host), false);
-    // Special case this constructor for backwards compatibility.
-    if (query == "") query = null;
-    query = _makeQuery(query, 0, _stringOrNullLength(query), queryParameters);
-    fragment = _makeFragment(fragment, 0, _stringOrNullLength(fragment));
-    port = _makePort(port, scheme);
-    bool isFile = (scheme == "file");
-    if (host == null &&
-        (userInfo.isNotEmpty || port != null || isFile)) {
-      host = "";
-    }
-    bool hasAuthority = (host != null);
-    path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
-                     scheme, hasAuthority);
-    if (scheme.isEmpty && host == null && !path.startsWith('/')) {
-      path = _normalizeRelativePath(path);
-    } else {
-      path = _removeDotSegments(path);
-    }
-    return new Uri._internal(scheme, userInfo, host, port,
-                             path, query, fragment);
-  }
-
-  /**
-   * Creates a new `http` URI from authority, path and query.
-   *
-   * Examples:
-   *
-   * ```
-   * // http://example.org/path?q=dart.
-   * new Uri.http("google.com", "/search", { "q" : "dart" });
-   *
-   * // http://user:pass@localhost:8080
-   * new Uri.http("user:pass@localhost:8080", "");
-   *
-   * // http://example.org/a%20b
-   * new Uri.http("example.org", "a b");
-   *
-   * // http://example.org/a%252F
-   * new Uri.http("example.org", "/a%2F");
-   * ```
-   *
-   * The `scheme` is always set to `http`.
-   *
-   * The `userInfo`, `host` and `port` components are set from the
-   * [authority] argument. If `authority` is `null` or empty,
-   * the created `Uri` has no authority, and isn't directly usable
-   * as an HTTP URL, which must have a non-empty host.
-   *
-   * The `path` component is set from the [unencodedPath]
-   * argument. The path passed must not be encoded as this constructor
-   * encodes the path.
-   *
-   * The `query` component is set from the optional [queryParameters]
-   * argument.
-   */
-  factory Uri.http(String authority,
-                   String unencodedPath,
-                   [Map<String, String> queryParameters]) {
-    return _makeHttpUri("http", authority, unencodedPath, queryParameters);
-  }
-
-  /**
-   * Creates a new `https` URI from authority, path and query.
-   *
-   * This constructor is the same as [Uri.http] except for the scheme
-   * which is set to `https`.
-   */
-  factory Uri.https(String authority,
-                    String unencodedPath,
-                    [Map<String, String> queryParameters]) {
-    return _makeHttpUri("https", authority, unencodedPath, queryParameters);
-  }
-
-  /**
-   * Returns the authority component.
-   *
-   * The authority is formatted from the [userInfo], [host] and [port]
-   * parts.
-   *
-   * Returns the empty string if there is no authority component.
-   */
-  String get authority {
-    if (!hasAuthority) return "";
-    var sb = new StringBuffer();
-    _writeAuthority(sb);
-    return sb.toString();
-  }
-
-  /**
-   * Returns the user info part of the authority component.
-   *
-   * Returns the empty string if there is no user info in the
-   * authority component.
-   */
-  String get userInfo => _userInfo;
-
-  /**
-   * Returns the host part of the authority component.
-   *
-   * Returns the empty string if there is no authority component and
-   * hence no host.
-   *
-   * If the host is an IP version 6 address, the surrounding `[` and `]` is
-   * removed.
-   *
-   * The host string is case-insensitive.
-   * The returned host name is canonicalized to lower-case
-   * with upper-case percent-escapes.
-   */
-  String get host {
-    if (_host == null) return "";
-    if (_host.startsWith('[')) {
-      return _host.substring(1, _host.length - 1);
-    }
-    return _host;
-  }
-
-  /**
-   * Returns the port part of the authority component.
-   *
-   * Returns the defualt port if there is no port number in the authority
-   * component. That's 80 for http, 443 for https, and 0 for everything else.
-   */
-  int get port {
-    if (_port == null) return _defaultPort(scheme);
-    return _port;
-  }
-
-  // The default port for the scheme of this Uri..
-  static int _defaultPort(String scheme) {
-    if (scheme == "http") return 80;
-    if (scheme == "https") return 443;
-    return 0;
-  }
-
-  /**
-   * Returns the path component.
-   *
-   * The returned path is encoded. To get direct access to the decoded
-   * path use [pathSegments].
-   *
-   * Returns the empty string if there is no path component.
-   */
-  String get path => _path;
-
-  /**
-   * Returns the query component. The returned query is encoded. To get
-   * direct access to the decoded query use [queryParameters].
-   *
-   * Returns the empty string if there is no query component.
-   */
-  String get query => (_query == null) ? "" : _query;
-
-  /**
-   * Returns the fragment identifier component.
-   *
-   * Returns the empty string if there is no fragment identifier
-   * component.
-   */
-  String get fragment => (_fragment == null) ? "" : _fragment;
-
-  /**
-   * Creates a new `Uri` object by parsing a URI string.
-   *
-   * If [start] and [end] are provided, only the substring from `start`
-   * to `end` is parsed as a URI.
-   *
-   * If the string is not valid as a URI or URI reference,
-   * a [FormatException] is thrown.
-   */
-  static Uri parse(String uri, [int start = 0, int end]) {
-    // This parsing will not validate percent-encoding, IPv6, etc.
-    // When done splitting into parts, it will call, e.g., [_makeFragment]
-    // to do the final parsing.
-    //
-    // Important parts of the RFC 3986 used here:
-    // URI           = scheme ":" hier-part [ "?" query ] [ "#" fragment ]
-    //
-    // hier-part     = "//" authority path-abempty
-    //               / path-absolute
-    //               / path-rootless
-    //               / path-empty
-    //
-    // URI-reference = URI / relative-ref
-    //
-    // absolute-URI  = scheme ":" hier-part [ "?" query ]
-    //
-    // relative-ref  = relative-part [ "?" query ] [ "#" fragment ]
-    //
-    // relative-part = "//" authority path-abempty
-    //               / path-absolute
-    //               / path-noscheme
-    //               / path-empty
-    //
-    // scheme        = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
-    //
-    // authority     = [ userinfo "@" ] host [ ":" port ]
-    // userinfo      = *( unreserved / pct-encoded / sub-delims / ":" )
-    // host          = IP-literal / IPv4address / reg-name
-    // port          = *DIGIT
-    // reg-name      = *( unreserved / pct-encoded / sub-delims )
-    //
-    // path          = path-abempty    ; begins with "/" or is empty
-    //               / path-absolute   ; begins with "/" but not "//"
-    //               / path-noscheme   ; begins with a non-colon segment
-    //               / path-rootless   ; begins with a segment
-    //               / path-empty      ; zero characters
-    //
-    // path-abempty  = *( "/" segment )
-    // path-absolute = "/" [ segment-nz *( "/" segment ) ]
-    // path-noscheme = segment-nz-nc *( "/" segment )
-    // path-rootless = segment-nz *( "/" segment )
-    // path-empty    = 0<pchar>
-    //
-    // segment       = *pchar
-    // segment-nz    = 1*pchar
-    // segment-nz-nc = 1*( unreserved / pct-encoded / sub-delims / "@" )
-    //               ; non-zero-length segment without any colon ":"
-    //
-    // pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
-    //
-    // query         = *( pchar / "/" / "?" )
-    //
-    // fragment      = *( pchar / "/" / "?" )
-    const int EOI = -1;
-
-    String scheme = "";
-    String userinfo = "";
-    String host = null;
-    int port = null;
-    String path = null;
-    String query = null;
-    String fragment = null;
-    if (end == null) end = uri.length;
-
-    int index = start;
-    int pathStart = start;
-    // End of input-marker.
-    int char = EOI;
-
-    void parseAuth() {
-      if (index == end) {
-        char = EOI;
-        return;
-      }
-      int authStart = index;
-      int lastColon = -1;
-      int lastAt = -1;
-      char = uri.codeUnitAt(index);
-      while (index < end) {
-        char = uri.codeUnitAt(index);
-        if (char == _SLASH || char == _QUESTION || char == _NUMBER_SIGN) {
-          break;
-        }
-        if (char == _AT_SIGN) {
-          lastAt = index;
-          lastColon = -1;
-        } else if (char == _COLON) {
-          lastColon = index;
-        } else if (char == _LEFT_BRACKET) {
-          lastColon = -1;
-          int endBracket = uri.indexOf(']', index + 1);
-          if (endBracket == -1) {
-            index = end;
-            char = EOI;
-            break;
-          } else {
-            index = endBracket;
-          }
-        }
-        index++;
-        char = EOI;
-      }
-      int hostStart = authStart;
-      int hostEnd = index;
-      if (lastAt >= 0) {
-        userinfo = _makeUserInfo(uri, authStart, lastAt);
-        hostStart = lastAt + 1;
-      }
-      if (lastColon >= 0) {
-        int portNumber;
-        if (lastColon + 1 < index) {
-          portNumber = 0;
-          for (int i = lastColon + 1; i < index; i++) {
-            int digit = uri.codeUnitAt(i);
-            if (_ZERO > digit || _NINE < digit) {
-              _fail(uri, i, "Invalid port number");
-            }
-            portNumber = portNumber * 10 + (digit - _ZERO);
-          }
-        }
-        port = _makePort(portNumber, scheme);
-        hostEnd = lastColon;
-      }
-      host = _makeHost(uri, hostStart, hostEnd, true);
-      if (index < end) {
-        char = uri.codeUnitAt(index);
-      }
-    }
-
-    // When reaching path parsing, the current character is known to not
-    // be part of the path.
-    const int NOT_IN_PATH = 0;
-    // When reaching path parsing, the current character is part
-    // of the a non-empty path.
-    const int IN_PATH = 1;
-    // When reaching authority parsing, authority is possible.
-    // This is only true at start or right after scheme.
-    const int ALLOW_AUTH = 2;
-
-    // Current state.
-    // Initialized to the default value that is used when exiting the
-    // scheme loop by reaching the end of input.
-    // All other breaks set their own state.
-    int state = NOT_IN_PATH;
-    int i = index;  // Temporary alias for index to avoid bug 19550 in dart2js.
-    while (i < end) {
-      char = uri.codeUnitAt(i);
-      if (char == _QUESTION || char == _NUMBER_SIGN) {
-        state = NOT_IN_PATH;
-        break;
-      }
-      if (char == _SLASH) {
-        state = (i == start) ? ALLOW_AUTH : IN_PATH;
-        break;
-      }
-      if (char == _COLON) {
-        if (i == start) _fail(uri, start, "Invalid empty scheme");
-        scheme = _makeScheme(uri, start, i);
-        i++;
-        pathStart = i;
-        if (i == end) {
-          char = EOI;
-          state = NOT_IN_PATH;
-        } else {
-          char = uri.codeUnitAt(i);
-          if (char == _QUESTION || char == _NUMBER_SIGN) {
-            state = NOT_IN_PATH;
-          } else if (char == _SLASH) {
-            state = ALLOW_AUTH;
-          } else {
-            state = IN_PATH;
-          }
-        }
-        break;
-      }
-      i++;
-      char = EOI;
-    }
-    index = i;  // Remove alias when bug is fixed.
-
-    if (state == ALLOW_AUTH) {
-      assert(char == _SLASH);
-      // Have seen one slash either at start or right after scheme.
-      // If two slashes, it's an authority, otherwise it's just the path.
-      index++;
-      if (index == end) {
-        char = EOI;
-        state = NOT_IN_PATH;
-      } else {
-        char = uri.codeUnitAt(index);
-        if (char == _SLASH) {
-          index++;
-          parseAuth();
-          pathStart = index;
-        }
-        if (char == _QUESTION || char == _NUMBER_SIGN || char == EOI) {
-          state = NOT_IN_PATH;
-        } else {
-          state = IN_PATH;
-        }
-      }
-    }
-
-    assert(state == IN_PATH || state == NOT_IN_PATH);
-    if (state == IN_PATH) {
-      // Characters from pathStart to index (inclusive) are known
-      // to be part of the path.
-      while (++index < end) {
-        char = uri.codeUnitAt(index);
-        if (char == _QUESTION || char == _NUMBER_SIGN) {
-          break;
-        }
-        char = EOI;
-      }
-      state = NOT_IN_PATH;
-    }
-
-    assert(state == NOT_IN_PATH);
-    bool hasAuthority = (host != null);
-    path = _makePath(uri, pathStart, index, null, scheme, hasAuthority);
-
-    if (char == _QUESTION) {
-      int numberSignIndex = -1;
-      for (int i = index + 1; i < end; i++) {
-        if (uri.codeUnitAt(i) == _NUMBER_SIGN) {
-          numberSignIndex = i;
-          break;
-        }
-      }
-      if (numberSignIndex < 0) {
-        query = _makeQuery(uri, index + 1, end, null);
-      } else {
-        query = _makeQuery(uri, index + 1, numberSignIndex, null);
-        fragment = _makeFragment(uri, numberSignIndex + 1, end);
-      }
-    } else if (char == _NUMBER_SIGN) {
-      fragment = _makeFragment(uri, index + 1, end);
-    }
-    return new Uri._internal(scheme,
-                             userinfo,
-                             host,
-                             port,
-                             path,
-                             query,
-                             fragment);
-  }
-
-  // Report a parse failure.
-  static void _fail(String uri, int index, String message) {
-    throw new FormatException(message, uri, index);
-  }
-
-  static Uri _makeHttpUri(String scheme,
-                          String authority,
-                          String unencodedPath,
-                          Map<String, String> queryParameters) {
-    var userInfo = "";
-    var host = null;
-    var port = null;
-
-    if (authority != null && authority.isNotEmpty) {
-      var hostStart = 0;
-      // Split off the user info.
-      bool hasUserInfo = false;
-      for (int i = 0; i < authority.length; i++) {
-        if (authority.codeUnitAt(i) == _AT_SIGN) {
-          hasUserInfo = true;
-          userInfo = authority.substring(0, i);
-          hostStart = i + 1;
-          break;
-        }
-      }
-      var hostEnd = hostStart;
-      if (hostStart < authority.length &&
-          authority.codeUnitAt(hostStart) == _LEFT_BRACKET) {
-        // IPv6 host.
-        for (; hostEnd < authority.length; hostEnd++) {
-          if (authority.codeUnitAt(hostEnd) == _RIGHT_BRACKET) break;
-        }
-        if (hostEnd == authority.length) {
-          throw new FormatException("Invalid IPv6 host entry.",
-                                    authority, hostStart);
-        }
-        parseIPv6Address(authority, hostStart + 1, hostEnd);
-        hostEnd++;  // Skip the closing bracket.
-        if (hostEnd != authority.length &&
-            authority.codeUnitAt(hostEnd) != _COLON) {
-          throw new FormatException("Invalid end of authority",
-                                    authority, hostEnd);
-        }
-      }
-      // Split host and port.
-      bool hasPort = false;
-      for (; hostEnd < authority.length; hostEnd++) {
-        if (authority.codeUnitAt(hostEnd) == _COLON) {
-          var portString = authority.substring(hostEnd + 1);
-          // We allow the empty port - falling back to initial value.
-          if (portString.isNotEmpty) port = int.parse(portString);
-          break;
-        }
-      }
-      host = authority.substring(hostStart, hostEnd);
-    }
-    return new Uri(scheme: scheme,
-                   userInfo: userInfo,
-                   host: host,
-                   port: port,
-                   pathSegments: unencodedPath.split("/"),
-                   queryParameters: queryParameters);
-  }
-
-  /**
-   * Creates a new file URI from an absolute or relative file path.
-   *
-   * The file path is passed in [path].
-   *
-   * This path is interpreted using either Windows or non-Windows
-   * semantics.
-   *
-   * With non-Windows semantics the slash ("/") is used to separate
-   * path segments.
-   *
-   * With Windows semantics, backslash ("\") and forward-slash ("/")
-   * are used to separate path segments, except if the path starts
-   * with "\\?\" in which case, only backslash ("\") separates path
-   * segments.
-   *
-   * If the path starts with a path separator an absolute URI is
-   * created. Otherwise a relative URI is created. One exception from
-   * this rule is that when Windows semantics is used and the path
-   * starts with a drive letter followed by a colon (":") and a
-   * path separator then an absolute URI is created.
-   *
-   * The default for whether to use Windows or non-Windows semantics
-   * determined from the platform Dart is running on. When running in
-   * the standalone VM this is detected by the VM based on the
-   * operating system. When running in a browser non-Windows semantics
-   * is always used.
-   *
-   * To override the automatic detection of which semantics to use pass
-   * a value for [windows]. Passing `true` will use Windows
-   * semantics and passing `false` will use non-Windows semantics.
-   *
-   * Examples using non-Windows semantics:
-   *
-   * ```
-   * // xxx/yyy
-   * new Uri.file("xxx/yyy", windows: false);
-   *
-   * // xxx/yyy/
-   * new Uri.file("xxx/yyy/", windows: false);
-   *
-   * // file:///xxx/yyy
-   * new Uri.file("/xxx/yyy", windows: false);
-   *
-   * // file:///xxx/yyy/
-   * new Uri.file("/xxx/yyy/", windows: false);
-   *
-   * // C:
-   * new Uri.file("C:", windows: false);
-   * ```
-   *
-   * Examples using Windows semantics:
-   *
-   * ```
-   * // xxx/yyy
-   * new Uri.file(r"xxx\yyy", windows: true);
-   *
-   * // xxx/yyy/
-   * new Uri.file(r"xxx\yyy\", windows: true);
-   *
-   * file:///xxx/yyy
-   * new Uri.file(r"\xxx\yyy", windows: true);
-   *
-   * file:///xxx/yyy/
-   * new Uri.file(r"\xxx\yyy/", windows: true);
-   *
-   * // file:///C:/xxx/yyy
-   * new Uri.file(r"C:\xxx\yyy", windows: true);
-   *
-   * // This throws an error. A path with a drive letter is not absolute.
-   * new Uri.file(r"C:", windows: true);
-   *
-   * // This throws an error. A path with a drive letter is not absolute.
-   * new Uri.file(r"C:xxx\yyy", windows: true);
-   *
-   * // file://server/share/file
-   * new Uri.file(r"\\server\share\file", windows: true);
-   * ```
-   *
-   * If the path passed is not a legal file path [ArgumentError] is thrown.
-   */
-  factory Uri.file(String path, {bool windows}) {
-    windows = (windows == null) ? Uri._isWindows : windows;
-    return windows ? _makeWindowsFileUrl(path, false)
-                   : _makeFileUri(path, false);
-  }
-
-  /**
-   * Like [Uri.file] except that a non-empty URI path ends in a slash.
-   *
-   * If [path] is not empty, and it doesn't end in a directory separator,
-   * then a slash is added to the returned URI's path.
-   * In all other cases, the result is the same as returned by `Uri.file`.
-   */
-  factory Uri.directory(String path, {bool windows}) {
-    windows = (windows == null) ? Uri._isWindows : windows;
-    return windows ? _makeWindowsFileUrl(path, true)
-                   : _makeFileUri(path, true);
-  }
-
-  /**
-   * Creates a `data:` URI containing the [content] string.
-   *
-   * Converts the content to a bytes using [encoding] or the charset specified
-   * in [parameters] (defaulting to US-ASCII if not specified or unrecognized),
-   * then encodes the bytes into the resulting data URI.
-   *
-   * Defaults to encoding using percent-encoding (any non-ASCII or non-URI-valid
-   * bytes is replaced by a percent encoding). If [base64] is true, the bytes
-   * are instead encoded using [BASE64].
-   *
-   * If [encoding] is not provided and [parameters] has a `charset` entry,
-   * that name is looked up using [Encoding.getByName],
-   * and if the lookup returns an encoding, that encoding is used to convert
-   * [content] to bytes.
-   * If providing both an [encoding] and a charset [parameter], they should
-   * agree, otherwise decoding won't be able to use the charset parameter
-   * to determine the encoding.
-   *
-   * If [mimeType] and/or [parameters] are supplied, they are added to the
-   * created URI. If any of these contain characters that are not allowed
-   * in the data URI, the character is percent-escaped. If the character is
-   * non-ASCII, it is first UTF-8 encoded and then the bytes are percent
-   * encoded. An omitted [mimeType] in a data URI means `text/plain`, just
-   * as an omitted `charset` parameter defaults to meaning `US-ASCII`.
-   *
-   * To read the content back, use [UriData.contentAsString].
-   */
-  factory Uri.dataFromString(String content,
-                             {String mimeType,
-                              Encoding encoding,
-                              Map<String, String> parameters,
-                              bool base64: false}) {
-    UriData data =  new UriData.fromString(content,
-                                           mimeType: mimeType,
-                                           encoding: encoding,
-                                           parameters: parameters,
-                                           base64: base64);
-    return data.uri;
-  }
-
-  /**
-   * Creates a `data:` URI containing an encoding of [bytes].
-   *
-   * Defaults to Base64 encoding the bytes, but if [percentEncoded]
-   * is `true`, the bytes will instead be percent encoded (any non-ASCII
-   * or non-valid-ASCII-character byte is replaced by a percent encoding).
-   *
-   * To read the bytes back, use [UriData.contentAsBytes].
-   *
-   * It defaults to having the mime-type `application/octet-stream`.
-   * The [mimeType] and [parameters] are added to the created URI.
-   * If any of these contain characters that are not allowed
-   * in the data URI, the character is percent-escaped. If the character is
-   * non-ASCII, it is first UTF-8 encoded and then the bytes are percent
-   * encoded.
-   */
-  factory Uri.dataFromBytes(List<int> bytes,
-                            {mimeType: "application/octet-stream",
-                             Map<String, String> parameters,
-                             percentEncoded: false}) {
-    UriData data = new UriData.fromBytes(bytes,
-                                         mimeType: mimeType,
-                                         parameters: parameters,
-                                         percentEncoded: percentEncoded);
-    return data.uri;
-  }
-
-  /**
-   * Returns the natural base URI for the current platform.
-   *
-   * When running in a browser this is the current URL (from
-   * `window.location.href`).
-   *
-   * When not running in a browser this is the file URI referencing
-   * the current working directory.
-   */
-  external static Uri get base;
-
-  external static bool get _isWindows;
-
-  static _checkNonWindowsPathReservedCharacters(List<String> segments,
-                                                bool argumentError) {
-    segments.forEach((segment) {
-      if (segment.contains("/")) {
-        if (argumentError) {
-          throw new ArgumentError("Illegal path character $segment");
-        } else {
-          throw new UnsupportedError("Illegal path character $segment");
-        }
-      }
-    });
-  }
-
-  static _checkWindowsPathReservedCharacters(List<String> segments,
-                                             bool argumentError,
-                                             [int firstSegment = 0]) {
-    for (var segment in segments.skip(firstSegment)) {
-      if (segment.contains(new RegExp(r'["*/:<>?\\|]'))) {
-        if (argumentError) {
-          throw new ArgumentError("Illegal character in path");
-        } else {
-          throw new UnsupportedError("Illegal character in path");
-        }
-      }
-    }
-  }
-
-  static _checkWindowsDriveLetter(int charCode, bool argumentError) {
-    if ((_UPPER_CASE_A <= charCode && charCode <= _UPPER_CASE_Z) ||
-        (_LOWER_CASE_A <= charCode && charCode <= _LOWER_CASE_Z)) {
-      return;
-    }
-    if (argumentError) {
-      throw new ArgumentError("Illegal drive letter " +
-                              new String.fromCharCode(charCode));
-    } else {
-      throw new UnsupportedError("Illegal drive letter " +
-                              new String.fromCharCode(charCode));
-    }
-  }
-
-  static _makeFileUri(String path, bool slashTerminated) {
-    const String sep = "/";
-    var segments = path.split(sep);
-    if (slashTerminated &&
-        segments.isNotEmpty &&
-        segments.last.isNotEmpty) {
-      segments.add("");  // Extra separator at end.
-    }
-    if (path.startsWith(sep)) {
-      // Absolute file:// URI.
-      return new Uri(scheme: "file", pathSegments: segments);
-    } else {
-      // Relative URI.
-      return new Uri(pathSegments: segments);
-    }
-  }
-
-  static _makeWindowsFileUrl(String path, bool slashTerminated) {
-    if (path.startsWith(r"\\?\")) {
-      if (path.startsWith(r"UNC\", 4)) {
-        path = path.replaceRange(0, 7, r'\');
-      } else {
-        path = path.substring(4);
-        if (path.length < 3 ||
-            path.codeUnitAt(1) != _COLON ||
-            path.codeUnitAt(2) != _BACKSLASH) {
-          throw new ArgumentError(
-              r"Windows paths with \\?\ prefix must be absolute");
-        }
-      }
-    } else {
-      path = path.replaceAll("/", r'\');
-    }
-    const String sep = r'\';
-    if (path.length > 1 && path.codeUnitAt(1) == _COLON) {
-      _checkWindowsDriveLetter(path.codeUnitAt(0), true);
-      if (path.length == 2 || path.codeUnitAt(2) != _BACKSLASH) {
-        throw new ArgumentError(
-            "Windows paths with drive letter must be absolute");
-      }
-      // Absolute file://C:/ URI.
-      var pathSegments = path.split(sep);
-      if (slashTerminated &&
-          pathSegments.last.isNotEmpty) {
-        pathSegments.add("");  // Extra separator at end.
-      }
-      _checkWindowsPathReservedCharacters(pathSegments, true, 1);
-      return new Uri(scheme: "file", pathSegments: pathSegments);
-    }
-
-    if (path.startsWith(sep)) {
-      if (path.startsWith(sep, 1)) {
-        // Absolute file:// URI with host.
-        int pathStart = path.indexOf(r'\', 2);
-        String hostPart =
-            (pathStart < 0) ? path.substring(2) : path.substring(2, pathStart);
-        String pathPart =
-            (pathStart < 0) ? "" : path.substring(pathStart + 1);
-        var pathSegments = pathPart.split(sep);
-        _checkWindowsPathReservedCharacters(pathSegments, true);
-        if (slashTerminated &&
-            pathSegments.last.isNotEmpty) {
-          pathSegments.add("");  // Extra separator at end.
-        }
-        return new Uri(
-            scheme: "file", host: hostPart, pathSegments: pathSegments);
-      } else {
-        // Absolute file:// URI.
-        var pathSegments = path.split(sep);
-        if (slashTerminated &&
-            pathSegments.last.isNotEmpty) {
-          pathSegments.add("");  // Extra separator at end.
-        }
-        _checkWindowsPathReservedCharacters(pathSegments, true);
-        return new Uri(scheme: "file", pathSegments: pathSegments);
-      }
-    } else {
-      // Relative URI.
-      var pathSegments = path.split(sep);
-      _checkWindowsPathReservedCharacters(pathSegments, true);
-      if (slashTerminated &&
-          pathSegments.isNotEmpty &&
-          pathSegments.last.isNotEmpty) {
-        pathSegments.add("");  // Extra separator at end.
-      }
-      return new Uri(pathSegments: pathSegments);
-    }
-  }
-
-  /**
-   * Returns a new `Uri` based on this one, but with some parts replaced.
-   *
-   * This method takes the same parameters as the [new Uri] constructor,
-   * and they have the same meaning.
-   *
-   * At most one of [path] and [pathSegments] must be provided.
-   * Likewise, at most one of [query] and [queryParameters] must be provided.
-   *
-   * Each part that is not provided will default to the corresponding
-   * value from this `Uri` instead.
-   *
-   * This method is different from [Uri.resolve] which overrides in a
-   * hierarchial manner,
-   * and can instead replace each part of a `Uri` individually.
-   *
-   * Example:
-   *
-   *     Uri uri1 = Uri.parse("a://b@c:4/d/e?f#g");
-   *     Uri uri2 = uri1.replace(scheme: "A", path: "D/E/E", fragment: "G");
-   *     print(uri2);  // prints "A://b@c:4/D/E/E/?f#G"
-   *
-   * This method acts similarly to using the `new Uri` constructor with
-   * some of the arguments taken from this `Uri` . Example:
-   *
-   *     Uri uri3 = new Uri(
-   *         scheme: "A",
-   *         userInfo: uri1.userInfo,
-   *         host: uri1.host,
-   *         port: uri1.port,
-   *         path: "D/E/E",
-   *         query: uri1.query,
-   *         fragment: "G");
-   *     print(uri3);  // prints "A://b@c:4/D/E/E/?f#G"
-   *     print(uri2 == uri3);  // prints true.
-   *
-   * Using this method can be seen as a shorthand for the `Uri` constructor
-   * call above, but may also be slightly faster because the parts taken
-   * from this `Uri` need not be checked for validity again.
-   */
-  Uri replace({String scheme,
-               String userInfo,
-               String host,
-               int port,
-               String path,
-               Iterable<String> pathSegments,
-               String query,
-               Map<String, dynamic/*String|Iterable<String>*/> queryParameters,
-               String fragment}) {
-    // Set to true if the scheme has (potentially) changed.
-    // In that case, the default port may also have changed and we need
-    // to check even the existing port.
-    bool schemeChanged = false;
-    if (scheme != null) {
-      scheme = _makeScheme(scheme, 0, scheme.length);
-      schemeChanged = true;
-    } else {
-      scheme = this.scheme;
-    }
-    bool isFile = (scheme == "file");
-    if (userInfo != null) {
-      userInfo = _makeUserInfo(userInfo, 0, userInfo.length);
-    } else {
-      userInfo = this._userInfo;
-    }
-    if (port != null) {
-      port = _makePort(port, scheme);
-    } else {
-      port = this._port;
-      if (schemeChanged) {
-        // The default port might have changed.
-        port = _makePort(port, scheme);
-      }
-    }
-    if (host != null) {
-      host = _makeHost(host, 0, host.length, false);
-    } else if (this.hasAuthority) {
-      host = this._host;
-    } else if (userInfo.isNotEmpty || port != null || isFile) {
-      host = "";
-    }
-
-    bool hasAuthority = host != null;
-    if (path != null || pathSegments != null) {
-      path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
-                       scheme, hasAuthority);
-    } else {
-      path = this._path;
-      if ((isFile || (hasAuthority && !path.isEmpty)) &&
-          !path.startsWith('/')) {
-        path = "/" + path;
-      }
-    }
-
-    if (query != null || queryParameters != null) {
-      query = _makeQuery(query, 0, _stringOrNullLength(query), queryParameters);
-    } else {
-      query = this._query;
-    }
-
-    if (fragment != null) {
-      fragment = _makeFragment(fragment, 0, fragment.length);
-    } else {
-      fragment = this._fragment;
-    }
-
-    return new Uri._internal(
-        scheme, userInfo, host, port, path, query, fragment);
-  }
-
-  /**
-   * Returns a `Uri` that differs from this only in not having a fragment.
-   *
-   * If this `Uri` does not have a fragment, it is itself returned.
-   */
-  Uri removeFragment() {
-    if (!this.hasFragment) return this;
-    return new Uri._internal(scheme, _userInfo, _host, _port,
-                             _path, _query, null);
-  }
-
-  /**
-   * Returns the URI path split into its segments. Each of the segments in the
-   * returned list have been decoded. If the path is empty the empty list will
-   * be returned. A leading slash `/` does not affect the segments returned.
-   *
-   * The returned list is unmodifiable and will throw [UnsupportedError] on any
-   * calls that would mutate it.
-   */
-  List<String> get pathSegments {
-    var result = _pathSegments;
-    if (result != null) return result;
-
-    var pathToSplit = path;
-    if (pathToSplit.isNotEmpty && pathToSplit.codeUnitAt(0) == _SLASH) {
-      pathToSplit = pathToSplit.substring(1);
-    }
-    result = (pathToSplit == "")
-        ? const<String>[]
-        : new List<String>.unmodifiable(
-              pathToSplit.split("/").map(Uri.decodeComponent));
-    _pathSegments = result;
-    return result;
-  }
-
-  /**
-   * Returns the URI query split into a map according to the rules
-   * specified for FORM post in the [HTML 4.01 specification section
-   * 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
-   * Each key and value in the returned map has been decoded.
-   * If there is no query the empty map is returned.
-   *
-   * Keys in the query string that have no value are mapped to the
-   * empty string.
-   * If a key occurs more than once in the query string, it is mapped to
-   * an arbitrary choice of possible value.
-   * The [queryParametersAll] getter can provide a map
-   * that maps keys to all of their values.
-   *
-   * The returned map is unmodifiable.
-   */
-  Map<String, String> get queryParameters {
-    if (_queryParameters == null) {
-      _queryParameters =
-          new UnmodifiableMapView<String, String>(splitQueryString(query));
-    }
-    return _queryParameters;
-  }
-
-  /**
-   * Returns the URI query split into a map according to the rules
-   * specified for FORM post in the [HTML 4.01 specification section
-   * 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
-   * Each key and value in the returned map has been decoded. If there is no
-   * query the empty map is returned.
-   *
-   * Keys are mapped to lists of their values. If a key occurs only once,
-   * its value is a singleton list. If a key occurs with no value, the
-   * empty string is used as the value for that occurrence.
-   *
-   * The returned map and the lists it contains are unmodifiable.
-   */
-  Map<String, List<String>> get queryParametersAll {
-    if (_queryParameterLists == null) {
-      Map queryParameterLists = _splitQueryStringAll(query);
-      for (var key in queryParameterLists.keys) {
-        queryParameterLists[key] =
-            new List<String>.unmodifiable(queryParameterLists[key]);
-      }
-      _queryParameterLists =
-          new Map<String, List<String>>.unmodifiable(queryParameterLists);
-    }
-    return _queryParameterLists;
-  }
-
-  /**
-   * Returns a URI where the path has been normalized.
-   *
-   * A normalized path does not contain `.` segments or non-leading `..`
-   * segments.
-   * Only a relative path with no scheme or authority may contain
-   * leading `..` segments,
-   * a path that starts with `/` will also drop any leading `..` segments.
-   *
-   * This uses the same normalization strategy as `new Uri().resolve(this)`.
-   *
-   * Does not change any part of the URI except the path.
-   *
-   * The default implementation of `Uri` always normalizes paths, so calling
-   * this function has no effect.
-   */
-  Uri normalizePath() {
-    String path = _normalizePath(_path, scheme, hasAuthority);
-    if (identical(path, _path)) return this;
-    return this.replace(path: path);
-  }
-
-  static int _makePort(int port, String scheme) {
-    // Perform scheme specific normalization.
-    if (port != null && port == _defaultPort(scheme)) return null;
-    return port;
-  }
-
-  /**
-   * Check and normalize a host name.
-   *
-   * If the host name starts and ends with '[' and ']', it is considered an
-   * IPv6 address. If [strictIPv6] is false, the address is also considered
-   * an IPv6 address if it contains any ':' character.
-   *
-   * If it is not an IPv6 address, it is case- and escape-normalized.
-   * This escapes all characters not valid in a reg-name,
-   * and converts all non-escape upper-case letters to lower-case.
-   */
-  static String _makeHost(String host, int start, int end, bool strictIPv6) {
-    // TODO(lrn): Should we normalize IPv6 addresses according to RFC 5952?
-    if (host == null) return null;
-    if (start == end) return "";
-    // Host is an IPv6 address if it starts with '[' or contains a colon.
-    if (host.codeUnitAt(start) == _LEFT_BRACKET) {
-      if (host.codeUnitAt(end - 1) != _RIGHT_BRACKET) {
-        _fail(host, start, 'Missing end `]` to match `[` in host');
-      }
-      parseIPv6Address(host, start + 1, end - 1);
-      // RFC 5952 requires hex digits to be lower case.
-      return host.substring(start, end).toLowerCase();
-    }
-    if (!strictIPv6) {
-      // TODO(lrn): skip if too short to be a valid IPv6 address?
-      for (int i = start; i < end; i++) {
-        if (host.codeUnitAt(i) == _COLON) {
-          parseIPv6Address(host, start, end);
-          return '[$host]';
-        }
-      }
-    }
-    return _normalizeRegName(host, start, end);
-  }
-
-  static bool _isRegNameChar(int char) {
-    return char < 127 && (_regNameTable[char >> 4] & (1 << (char & 0xf))) != 0;
-  }
-
-  /**
-   * Validates and does case- and percent-encoding normalization.
-   *
-   * The [host] must be an RFC3986 "reg-name". It is converted
-   * to lower case, and percent escapes are converted to either
-   * lower case unreserved characters or upper case escapes.
-   */
-  static String _normalizeRegName(String host, int start, int end) {
-    StringBuffer buffer;
-    int sectionStart = start;
-    int index = start;
-    // Whether all characters between sectionStart and index are normalized,
-    bool isNormalized = true;
-
-    while (index < end) {
-      int char = host.codeUnitAt(index);
-      if (char == _PERCENT) {
-        // The _regNameTable contains "%", so we check that first.
-        String replacement = _normalizeEscape(host, index, true);
-        if (replacement == null && isNormalized) {
-          index += 3;
-          continue;
-        }
-        if (buffer == null) buffer = new StringBuffer();
-        String slice = host.substring(sectionStart, index);
-        if (!isNormalized) slice = slice.toLowerCase();
-        buffer.write(slice);
-        int sourceLength = 3;
-        if (replacement == null) {
-          replacement = host.substring(index, index + 3);
-        } else if (replacement == "%") {
-          replacement = "%25";
-          sourceLength = 1;
-        }
-        buffer.write(replacement);
-        index += sourceLength;
-        sectionStart = index;
-        isNormalized = true;
-      } else if (_isRegNameChar(char)) {
-        if (isNormalized && _UPPER_CASE_A <= char && _UPPER_CASE_Z >= char) {
-          // Put initial slice in buffer and continue in non-normalized mode
-          if (buffer == null) buffer = new StringBuffer();
-          if (sectionStart < index) {
-            buffer.write(host.substring(sectionStart, index));
-            sectionStart = index;
-          }
-          isNormalized = false;
-        }
-        index++;
-      } else if (_isGeneralDelimiter(char)) {
-        _fail(host, index, "Invalid character");
-      } else {
-        int sourceLength = 1;
-        if ((char & 0xFC00) == 0xD800 && (index + 1) < end) {
-          int tail = host.codeUnitAt(index + 1);
-          if ((tail & 0xFC00) == 0xDC00) {
-            char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
-            sourceLength = 2;
-          }
-        }
-        if (buffer == null) buffer = new StringBuffer();
-        String slice = host.substring(sectionStart, index);
-        if (!isNormalized) slice = slice.toLowerCase();
-        buffer.write(slice);
-        buffer.write(_escapeChar(char));
-        index += sourceLength;
-        sectionStart = index;
-      }
-    }
-    if (buffer == null) return host.substring(start, end);
-    if (sectionStart < end) {
-      String slice = host.substring(sectionStart, end);
-      if (!isNormalized) slice = slice.toLowerCase();
-      buffer.write(slice);
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * Validates scheme characters and does case-normalization.
-   *
-   * Schemes are converted to lower case. They cannot contain escapes.
-   */
-  static String _makeScheme(String scheme, int start, int end) {
-    if (start == end) return "";
-    final int firstCodeUnit = scheme.codeUnitAt(start);
-    if (!_isAlphabeticCharacter(firstCodeUnit)) {
-      _fail(scheme, start, "Scheme not starting with alphabetic character");
-    }
-    bool containsUpperCase = false;
-    for (int i = start; i < end; i++) {
-      final int codeUnit = scheme.codeUnitAt(i);
-      if (!_isSchemeCharacter(codeUnit)) {
-        _fail(scheme, i, "Illegal scheme character");
-      }
-      if (_UPPER_CASE_A <= codeUnit && codeUnit <= _UPPER_CASE_Z) {
-        containsUpperCase = true;
-      }
-    }
-    scheme = scheme.substring(start, end);
-    if (containsUpperCase) scheme = scheme.toLowerCase();
-    return scheme;
-  }
-
-  static String _makeUserInfo(String userInfo, int start, int end) {
-    if (userInfo == null) return "";
-    return _normalize(userInfo, start, end, _userinfoTable);
-  }
-
-  static String _makePath(String path, int start, int end,
-                          Iterable<String> pathSegments,
-                          String scheme,
-                          bool hasAuthority) {
-    bool isFile = (scheme == "file");
-    bool ensureLeadingSlash = isFile || hasAuthority;
-    if (path == null && pathSegments == null) return isFile ? "/" : "";
-    if (path != null && pathSegments != null) {
-      throw new ArgumentError('Both path and pathSegments specified');
-    }
-    var result;
-    if (path != null) {
-      result = _normalize(path, start, end, _pathCharOrSlashTable);
-    } else {
-      result = pathSegments.map((s) =>
-          _uriEncode(_pathCharTable, s, UTF8, false)).join("/");
-    }
-    if (result.isEmpty) {
-      if (isFile) return "/";
-    } else if (ensureLeadingSlash && !result.startsWith('/')) {
-      result = "/" + result;
-    }
-    result = _normalizePath(result, scheme, hasAuthority);
-    return result;
-  }
-
-  /// Performs path normalization (remove dot segments) on a path.
-  ///
-  /// If the URI has neither scheme nor authority, it's considered a
-  /// "pure path" and normalization won't remove leading ".." segments.
-  /// Otherwise it follows the RFC 3986 "remove dot segments" algorithm.
-  static String _normalizePath(String path, String scheme, bool hasAuthority) {
-    if (scheme.isEmpty && !hasAuthority && !path.startsWith('/')) {
-      return _normalizeRelativePath(path);
-    }
-    return _removeDotSegments(path);
-  }
-
-  static String _makeQuery(
-      String query, int start, int end,
-      Map<String, dynamic/*String|Iterable<String>*/> queryParameters) {
-    if (query == null && queryParameters == null) return null;
-    if (query != null && queryParameters != null) {
-      throw new ArgumentError('Both query and queryParameters specified');
-    }
-    if (query != null) return _normalize(query, start, end, _queryCharTable);
-
-    var result = new StringBuffer();
-    var separator = "";
-
-    void writeParameter(String key, String value) {
-      result.write(separator);
-      separator = "&";
-      result.write(Uri.encodeQueryComponent(key));
-      if (value != null && value.isNotEmpty) {
-        result.write("=");
-        result.write(Uri.encodeQueryComponent(value));
-      }
-    }
-
-    queryParameters.forEach((key, value) {
-      if (value == null || value is String) {
-        writeParameter(key, value);
-      } else {
-        Iterable values = value;
-        for (String value in values) {
-          writeParameter(key, value);
-        }
-      }
-    });
-    return result.toString();
-  }
-
-  static String _makeFragment(String fragment, int start, int end) {
-    if (fragment == null) return null;
-    return _normalize(fragment, start, end, _queryCharTable);
-  }
-
-  static int _stringOrNullLength(String s) => (s == null) ? 0 : s.length;
-
-  /**
-   * Performs RFC 3986 Percent-Encoding Normalization.
-   *
-   * Returns a replacement string that should be replace the original escape.
-   * Returns null if no replacement is necessary because the escape is
-   * not for an unreserved character and is already non-lower-case.
-   *
-   * Returns "%" if the escape is invalid (not two valid hex digits following
-   * the percent sign). The calling code should replace the percent
-   * sign with "%25", but leave the following two characters unmodified.
-   *
-   * If [lowerCase] is true, a single character returned is always lower case,
-   */
-  static String _normalizeEscape(String source, int index, bool lowerCase) {
-    assert(source.codeUnitAt(index) == _PERCENT);
-    if (index + 2 >= source.length) {
-      return "%";  // Marks the escape as invalid.
-    }
-    int firstDigit = source.codeUnitAt(index + 1);
-    int secondDigit = source.codeUnitAt(index + 2);
-    int firstDigitValue = _parseHexDigit(firstDigit);
-    int secondDigitValue = _parseHexDigit(secondDigit);
-    if (firstDigitValue < 0 || secondDigitValue < 0) {
-      return "%";  // Marks the escape as invalid.
-    }
-    int value = firstDigitValue * 16 + secondDigitValue;
-    if (_isUnreservedChar(value)) {
-      if (lowerCase && _UPPER_CASE_A <= value && _UPPER_CASE_Z >= value) {
-        value |= 0x20;
-      }
-      return new String.fromCharCode(value);
-    }
-    if (firstDigit >= _LOWER_CASE_A || secondDigit >= _LOWER_CASE_A) {
-      // Either digit is lower case.
-      return source.substring(index, index + 3).toUpperCase();
-    }
-    // Escape is retained, and is already non-lower case, so return null to
-    // represent "no replacement necessary".
-    return null;
-  }
-
-  // Converts a UTF-16 code-unit to its value as a hex digit.
-  // Returns -1 for non-hex digits.
-  static int _parseHexDigit(int char) {
-    int digit = char ^ Uri._ZERO;
-    if (digit <= 9) return digit;
-    int lowerCase = char | 0x20;
-    if (Uri._LOWER_CASE_A <= lowerCase && lowerCase <= _LOWER_CASE_F) {
-      return lowerCase - (_LOWER_CASE_A - 10);
-    }
-    return -1;
-  }
-
-  static String _escapeChar(int char) {
-    assert(char <= 0x10ffff);  // It's a valid unicode code point.
-    List<int> codeUnits;
-    if (char < 0x80) {
-      // ASCII, a single percent encoded sequence.
-      codeUnits = new List(3);
-      codeUnits[0] = _PERCENT;
-      codeUnits[1] = _hexDigits.codeUnitAt(char >> 4);
-      codeUnits[2] = _hexDigits.codeUnitAt(char & 0xf);
-    } else {
-      // Do UTF-8 encoding of character, then percent encode bytes.
-      int flag = 0xc0;  // The high-bit markers on the first byte of UTF-8.
-      int encodedBytes = 2;
-      if (char > 0x7ff) {
-        flag = 0xe0;
-        encodedBytes = 3;
-        if (char > 0xffff) {
-          encodedBytes = 4;
-          flag = 0xf0;
-        }
-      }
-      codeUnits = new List(3 * encodedBytes);
-      int index = 0;
-      while (--encodedBytes >= 0) {
-        int byte = ((char >> (6 * encodedBytes)) & 0x3f) | flag;
-        codeUnits[index] = _PERCENT;
-        codeUnits[index + 1] = _hexDigits.codeUnitAt(byte >> 4);
-        codeUnits[index + 2] = _hexDigits.codeUnitAt(byte & 0xf);
-        index += 3;
-        flag = 0x80;  // Following bytes have only high bit set.
-      }
-    }
-    return new String.fromCharCodes(codeUnits);
-  }
-
-  /**
-   * Runs through component checking that each character is valid and
-   * normalize percent escapes.
-   *
-   * Uses [charTable] to check if a non-`%` character is allowed.
-   * Each `%` character must be followed by two hex digits.
-   * If the hex-digits are lower case letters, they are converted to
-   * upper case.
-   */
-  static String _normalize(String component, int start, int end,
-                           List<int> charTable) {
-    StringBuffer buffer;
-    int sectionStart = start;
-    int index = start;
-    // Loop while characters are valid and escapes correct and upper-case.
-    while (index < end) {
-      int char = component.codeUnitAt(index);
-      if (char < 127 && (charTable[char >> 4] & (1 << (char & 0x0f))) != 0) {
-        index++;
-      } else {
-        String replacement;
-        int sourceLength;
-        if (char == _PERCENT) {
-          replacement = _normalizeEscape(component, index, false);
-          // Returns null if we should keep the existing escape.
-          if (replacement == null) {
-            index += 3;
-            continue;
-          }
-          // Returns "%" if we should escape the existing percent.
-          if ("%" == replacement) {
-            replacement = "%25";
-            sourceLength = 1;
-          } else {
-            sourceLength = 3;
-          }
-        } else if (_isGeneralDelimiter(char)) {
-          _fail(component, index, "Invalid character");
-        } else {
-          sourceLength = 1;
-          if ((char & 0xFC00) == 0xD800) {
-            // Possible lead surrogate.
-            if (index + 1 < end) {
-              int tail = component.codeUnitAt(index + 1);
-              if ((tail & 0xFC00) == 0xDC00) {
-                // Tail surrogat.
-                sourceLength = 2;
-                char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
-              }
-            }
-          }
-          replacement = _escapeChar(char);
-        }
-        if (buffer == null) buffer = new StringBuffer();
-        buffer.write(component.substring(sectionStart, index));
-        buffer.write(replacement);
-        index += sourceLength;
-        sectionStart = index;
-      }
-    }
-    if (buffer == null) {
-      // Makes no copy if start == 0 and end == component.length.
-      return component.substring(start, end);
-    }
-    if (sectionStart < end) {
-      buffer.write(component.substring(sectionStart, end));
-    }
-    return buffer.toString();
-  }
-
-  static bool _isSchemeCharacter(int ch) {
-    return ch < 128 && ((_schemeTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
-  }
-
-  static bool _isGeneralDelimiter(int ch) {
-    return ch <= _RIGHT_BRACKET &&
-        ((_genDelimitersTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
-  }
-
-  /**
-   * Returns whether the URI is absolute.
-   */
-  bool get isAbsolute => scheme != "" && fragment == "";
-
-  String _mergePaths(String base, String reference) {
-    // Optimize for the case: absolute base, reference beginning with "../".
-    int backCount = 0;
-    int refStart = 0;
-    // Count number of "../" at beginning of reference.
-    while (reference.startsWith("../", refStart)) {
-      refStart += 3;
-      backCount++;
-    }
-
-    // Drop last segment - everything after last '/' of base.
-    int baseEnd = base.lastIndexOf('/');
-    // Drop extra segments for each leading "../" of reference.
-    while (baseEnd > 0 && backCount > 0) {
-      int newEnd = base.lastIndexOf('/', baseEnd - 1);
-      if (newEnd < 0) {
-        break;
-      }
-      int delta = baseEnd - newEnd;
-      // If we see a "." or ".." segment in base, stop here and let
-      // _removeDotSegments handle it.
-      if ((delta == 2 || delta == 3) &&
-          base.codeUnitAt(newEnd + 1) == _DOT &&
-          (delta == 2 || base.codeUnitAt(newEnd + 2) == _DOT)) {
-        break;
-      }
-      baseEnd = newEnd;
-      backCount--;
-    }
-    return base.replaceRange(baseEnd + 1, null,
-                             reference.substring(refStart - 3 * backCount));
-  }
-
-  /// Make a guess at whether a path contains a `..` or `.` segment.
-  ///
-  /// This is a primitive test that can cause false positives.
-  /// It's only used to avoid a more expensive operation in the case where
-  /// it's not necessary.
-  static bool _mayContainDotSegments(String path) {
-    if (path.startsWith('.')) return true;
-    int index = path.indexOf("/.");
-    return index != -1;
-  }
-
-  /// Removes '.' and '..' segments from a path.
-  ///
-  /// Follows the RFC 2986 "remove dot segments" algorithm.
-  /// This algorithm is only used on paths of URIs with a scheme,
-  /// and it treats the path as if it is absolute (leading '..' are removed).
-  static String _removeDotSegments(String path) {
-    if (!_mayContainDotSegments(path)) return path;
-    assert(path.isNotEmpty);  // An empty path would not have dot segments.
-    List<String> output = [];
-    bool appendSlash = false;
-    for (String segment in path.split("/")) {
-      appendSlash = false;
-      if (segment == "..") {
-        if (output.isNotEmpty) {
-          output.removeLast();
-          if (output.isEmpty) {
-            output.add("");
-          }
-        }
-        appendSlash = true;
-      } else if ("." == segment) {
-        appendSlash = true;
-      } else {
-        output.add(segment);
-      }
-    }
-    if (appendSlash) output.add("");
-    return output.join("/");
-  }
-
-  /// Removes all `.` segments and any non-leading `..` segments.
-  ///
-  /// Removing the ".." from a "bar/foo/.." sequence results in "bar/"
-  /// (trailing "/"). If the entire path is removed (because it contains as
-  /// many ".." segments as real segments), the result is "./".
-  /// This is different from an empty string, which represents "no path",
-  /// when you resolve it against a base URI with a path with a non-empty
-  /// final segment.
-  static String _normalizeRelativePath(String path) {
-    assert(!path.startsWith('/'));  // Only get called for relative paths.
-    if (!_mayContainDotSegments(path)) return path;
-    assert(path.isNotEmpty);  // An empty path would not have dot segments.
-    List<String> output = [];
-    bool appendSlash = false;
-    for (String segment in path.split("/")) {
-      appendSlash = false;
-      if (".." == segment) {
-        if (!output.isEmpty && output.last != "..") {
-          output.removeLast();
-          appendSlash = true;
-        } else {
-          output.add("..");
-        }
-      } else if ("." == segment) {
-        appendSlash = true;
-      } else {
-        output.add(segment);
-      }
-    }
-    if (output.isEmpty || (output.length == 1 && output[0].isEmpty)) {
-      return "./";
-    }
-    if (appendSlash || output.last == '..') output.add("");
-    return output.join("/");
-  }
-
-  /**
-   * Resolve [reference] as an URI relative to `this`.
-   *
-   * First turn [reference] into a URI using [Uri.parse]. Then resolve the
-   * resulting URI relative to `this`.
-   *
-   * Returns the resolved URI.
-   *
-   * See [resolveUri] for details.
-   */
-  Uri resolve(String reference) {
-    return resolveUri(Uri.parse(reference));
-  }
-
-  /**
-   * Resolve [reference] as an URI relative to `this`.
-   *
-   * Returns the resolved URI.
-   *
-   * The algorithm "Transform Reference" for resolving a reference is described
-   * in [RFC-3986 Section 5](http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
-   *
-   * Updated to handle the case where the base URI is just a relative path -
-   * that is: when it has no scheme or authority and the path does not start
-   * with a slash.
-   * In that case, the paths are combined without removing leading "..", and
-   * an empty path is not converted to "/".
-   */
-  Uri resolveUri(Uri reference) {
-    // From RFC 3986.
-    String targetScheme;
-    String targetUserInfo = "";
-    String targetHost;
-    int targetPort;
-    String targetPath;
-    String targetQuery;
-    if (reference.scheme.isNotEmpty) {
-      targetScheme = reference.scheme;
-      if (reference.hasAuthority) {
-        targetUserInfo = reference.userInfo;
-        targetHost = reference.host;
-        targetPort = reference.hasPort ? reference.port : null;
-      }
-      targetPath = _removeDotSegments(reference.path);
-      if (reference.hasQuery) {
-        targetQuery = reference.query;
-      }
-    } else {
-      targetScheme = this.scheme;
-      if (reference.hasAuthority) {
-        targetUserInfo = reference.userInfo;
-        targetHost = reference.host;
-        targetPort = _makePort(reference.hasPort ? reference.port : null,
-                               targetScheme);
-        targetPath = _removeDotSegments(reference.path);
-        if (reference.hasQuery) targetQuery = reference.query;
-      } else {
-        targetUserInfo = this._userInfo;
-        targetHost = this._host;
-        targetPort = this._port;
-        if (reference.path == "") {
-          targetPath = this._path;
-          if (reference.hasQuery) {
-            targetQuery = reference.query;
-          } else {
-            targetQuery = this._query;
-          }
-        } else {
-          if (reference.hasAbsolutePath) {
-            targetPath = _removeDotSegments(reference.path);
-          } else {
-            // This is the RFC 3986 behavior for merging.
-            if (this.hasEmptyPath) {
-              if (!this.hasScheme && !this.hasAuthority) {
-                // Keep the path relative if no scheme or authority.
-                targetPath = reference.path;
-              } else {
-                // Add path normalization on top of RFC algorithm.
-                targetPath = _removeDotSegments("/" + reference.path);
-              }
-            } else {
-              var mergedPath = _mergePaths(this._path, reference.path);
-              if (this.hasScheme || this.hasAuthority || this.hasAbsolutePath) {
-                targetPath = _removeDotSegments(mergedPath);
-              } else {
-                // Non-RFC 3986 beavior. If both base and reference are relative
-                // path, allow the merged path to start with "..".
-                // The RFC only specifies the case where the base has a scheme.
-                targetPath = _normalizeRelativePath(mergedPath);
-              }
-            }
-          }
-          if (reference.hasQuery) targetQuery = reference.query;
-        }
-      }
-    }
-    String fragment = reference.hasFragment ? reference.fragment : null;
-    return new Uri._internal(targetScheme,
-                             targetUserInfo,
-                             targetHost,
-                             targetPort,
-                             targetPath,
-                             targetQuery,
-                             fragment);
-  }
-
-  /**
-   * Returns whether the URI has a [scheme] component.
-   */
-  bool get hasScheme => scheme.isNotEmpty;
-
-  /**
-   * Returns whether the URI has an [authority] component.
-   */
-  bool get hasAuthority => _host != null;
-
-  /**
-   * Returns whether the URI has an explicit port.
-   *
-   * If the port number is the default port number
-   * (zero for unrecognized schemes, with http (80) and https (443) being
-   * recognized),
-   * then the port is made implicit and omitted from the URI.
-   */
-  bool get hasPort => _port != null;
-
-  /**
-   * Returns whether the URI has a query part.
-   */
-  bool get hasQuery => _query != null;
-
-  /**
-   * Returns whether the URI has a fragment part.
-   */
-  bool get hasFragment => _fragment != null;
-
-  /**
-   * Returns whether the URI has an empty path.
-   */
-  bool get hasEmptyPath => _path.isEmpty;
-
-  /**
-   * Returns whether the URI has an absolute path (starting with '/').
-   */
-  bool get hasAbsolutePath => _path.startsWith('/');
-
-  /**
-   * Returns the origin of the URI in the form scheme://host:port for the
-   * schemes http and https.
-   *
-   * It is an error if the scheme is not "http" or "https".
-   *
-   * See: http://www.w3.org/TR/2011/WD-html5-20110405/origin-0.html#origin
-   */
-  String get origin {
-    if (scheme == "" || _host == null || _host == "") {
-      throw new StateError("Cannot use origin without a scheme: $this");
-    }
-    if (scheme != "http" && scheme != "https") {
-      throw new StateError(
-        "Origin is only applicable schemes http and https: $this");
-    }
-    if (_port == null) return "$scheme://$_host";
-    return "$scheme://$_host:$_port";
-  }
-
-  /**
-   * Returns the file path from a file URI.
-   *
-   * The returned path has either Windows or non-Windows
-   * semantics.
-   *
-   * For non-Windows semantics the slash ("/") is used to separate
-   * path segments.
-   *
-   * For Windows semantics the backslash ("\") separator is used to
-   * separate path segments.
-   *
-   * If the URI is absolute the path starts with a path separator
-   * unless Windows semantics is used and the first path segment is a
-   * drive letter. When Windows semantics is used a host component in
-   * the uri in interpreted as a file server and a UNC path is
-   * returned.
-   *
-   * The default for whether to use Windows or non-Windows semantics
-   * determined from the platform Dart is running on. When running in
-   * the standalone VM this is detected by the VM based on the
-   * operating system. When running in a browser non-Windows semantics
-   * is always used.
-   *
-   * To override the automatic detection of which semantics to use pass
-   * a value for [windows]. Passing `true` will use Windows
-   * semantics and passing `false` will use non-Windows semantics.
-   *
-   * If the URI ends with a slash (i.e. the last path component is
-   * empty) the returned file path will also end with a slash.
-   *
-   * With Windows semantics URIs starting with a drive letter cannot
-   * be relative to the current drive on the designated drive. That is
-   * for the URI `file:///c:abc` calling `toFilePath` will throw as a
-   * path segment cannot contain colon on Windows.
-   *
-   * Examples using non-Windows semantics (resulting of calling
-   * toFilePath in comment):
-   *
-   *     Uri.parse("xxx/yyy");  // xxx/yyy
-   *     Uri.parse("xxx/yyy/");  // xxx/yyy/
-   *     Uri.parse("file:///xxx/yyy");  // /xxx/yyy
-   *     Uri.parse("file:///xxx/yyy/");  // /xxx/yyy/
-   *     Uri.parse("file:///C:");  // /C:
-   *     Uri.parse("file:///C:a");  // /C:a
-   *
-   * Examples using Windows semantics (resulting URI in comment):
-   *
-   *     Uri.parse("xxx/yyy");  // xxx\yyy
-   *     Uri.parse("xxx/yyy/");  // xxx\yyy\
-   *     Uri.parse("file:///xxx/yyy");  // \xxx\yyy
-   *     Uri.parse("file:///xxx/yyy/");  // \xxx\yyy/
-   *     Uri.parse("file:///C:/xxx/yyy");  // C:\xxx\yyy
-   *     Uri.parse("file:C:xxx/yyy");  // Throws as a path segment
-   *                                   // cannot contain colon on Windows.
-   *     Uri.parse("file://server/share/file");  // \\server\share\file
-   *
-   * If the URI is not a file URI calling this throws
-   * [UnsupportedError].
-   *
-   * If the URI cannot be converted to a file path calling this throws
-   * [UnsupportedError].
-   */
-  String toFilePath({bool windows}) {
-    if (scheme != "" && scheme != "file") {
-      throw new UnsupportedError(
-          "Cannot extract a file path from a $scheme URI");
-    }
-    if (query != "") {
-      throw new UnsupportedError(
-          "Cannot extract a file path from a URI with a query component");
-    }
-    if (fragment != "") {
-      throw new UnsupportedError(
-          "Cannot extract a file path from a URI with a fragment component");
-    }
-    if (windows == null) windows = _isWindows;
-    return windows ? _toWindowsFilePath() : _toFilePath();
-  }
-
-  String _toFilePath() {
-    if (host != "") {
-      throw new UnsupportedError(
-          "Cannot extract a non-Windows file path from a file URI "
-          "with an authority");
-    }
-    _checkNonWindowsPathReservedCharacters(pathSegments, false);
-    var result = new StringBuffer();
-    if (_isPathAbsolute) result.write("/");
-    result.writeAll(pathSegments, "/");
-    return result.toString();
-  }
-
-  String _toWindowsFilePath() {
-    bool hasDriveLetter = false;
-    var segments = pathSegments;
-    if (segments.length > 0 &&
-        segments[0].length == 2 &&
-        segments[0].codeUnitAt(1) == _COLON) {
-      _checkWindowsDriveLetter(segments[0].codeUnitAt(0), false);
-      _checkWindowsPathReservedCharacters(segments, false, 1);
-      hasDriveLetter = true;
-    } else {
-      _checkWindowsPathReservedCharacters(segments, false);
-    }
-    var result = new StringBuffer();
-    if (_isPathAbsolute && !hasDriveLetter) result.write("\\");
-    if (host != "") {
-      result.write("\\");
-      result.write(host);
-      result.write("\\");
-    }
-    result.writeAll(segments, "\\");
-    if (hasDriveLetter && segments.length == 1) result.write("\\");
-    return result.toString();
-  }
-
-  bool get _isPathAbsolute {
-    if (path == null || path.isEmpty) return false;
-    return path.startsWith('/');
-  }
-
-  void _writeAuthority(StringSink ss) {
-    if (_userInfo.isNotEmpty) {
-      ss.write(_userInfo);
-      ss.write("@");
-    }
-    if (_host != null) ss.write(_host);
-    if (_port != null) {
-      ss.write(":");
-      ss.write(_port);
-    }
-  }
-
-  /**
-   * Access the structure of a `data:` URI.
-   *
-   * Returns a [UriData] object for `data:` URIs and `null` for all other
-   * URIs.
-   * The [UriData] object can be used to access the media type and data
-   * of a `data:` URI.
-   */
-  UriData get data => (scheme == "data") ? new UriData.fromUri(this) : null;
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    _addIfNonEmpty(sb, scheme, scheme, ':');
-    if (hasAuthority || path.startsWith("//") || (scheme == "file")) {
-      // File URIS always have the authority, even if it is empty.
-      // The empty URI means "localhost".
-      sb.write("//");
-      _writeAuthority(sb);
-    }
-    sb.write(path);
-    if (_query != null) { sb..write("?")..write(_query); }
-    if (_fragment != null) { sb..write("#")..write(_fragment); }
-    return sb.toString();
-  }
-
-  bool operator==(other) {
-    if (other is! Uri) return false;
-    Uri uri = other;
-    return scheme       == uri.scheme       &&
-           hasAuthority == uri.hasAuthority &&
-           userInfo     == uri.userInfo     &&
-           host         == uri.host         &&
-           port         == uri.port         &&
-           path         == uri.path         &&
-           hasQuery     == uri.hasQuery     &&
-           query        == uri.query        &&
-           hasFragment  == uri.hasFragment  &&
-           fragment     == uri.fragment;
-  }
-
-  int get hashCode {
-    int combine(part, current) {
-      // The sum is truncated to 30 bits to make sure it fits into a Smi.
-      return (current * 31 + part.hashCode) & 0x3FFFFFFF;
-    }
-    return combine(scheme, combine(userInfo, combine(host, combine(port,
-        combine(path, combine(query, combine(fragment, 1)))))));
-  }
-
-  static void _addIfNonEmpty(StringBuffer sb, String test,
-                             String first, String second) {
-    if ("" != test) {
-      sb.write(first);
-      sb.write(second);
-    }
-  }
-
-  /**
-   * Encode the string [component] using percent-encoding to make it
-   * safe for literal use as a URI component.
-   *
-   * All characters except uppercase and lowercase letters, digits and
-   * the characters `-_.!~*'()` are percent-encoded. This is the
-   * set of characters specified in RFC 2396 and the which is
-   * specified for the encodeUriComponent in ECMA-262 version 5.1.
-   *
-   * When manually encoding path segments or query components remember
-   * to encode each part separately before building the path or query
-   * string.
-   *
-   * For encoding the query part consider using
-   * [encodeQueryComponent].
-   *
-   * To avoid the need for explicitly encoding use the [pathSegments]
-   * and [queryParameters] optional named arguments when constructing
-   * a [Uri].
-   */
-  static String encodeComponent(String component) {
-    return _uriEncode(_unreserved2396Table, component, UTF8, false);
-  }
-
-  /**
-   * Encode the string [component] according to the HTML 4.01 rules
-   * for encoding the posting of a HTML form as a query string
-   * component.
-   *
-   * Encode the string [component] according to the HTML 4.01 rules
-   * for encoding the posting of a HTML form as a query string
-   * component.
-
-   * The component is first encoded to bytes using [encoding].
-   * The default is to use [UTF8] encoding, which preserves all
-   * the characters that don't need encoding.
-
-   * Then the resulting bytes are "percent-encoded". This transforms
-   * spaces (U+0020) to a plus sign ('+') and all bytes that are not
-   * the ASCII decimal digits, letters or one of '-._~' are written as
-   * a percent sign '%' followed by the two-digit hexadecimal
-   * representation of the byte.
-
-   * Note that the set of characters which are percent-encoded is a
-   * superset of what HTML 4.01 requires, since it refers to RFC 1738
-   * for reserved characters.
-   *
-   * When manually encoding query components remember to encode each
-   * part separately before building the query string.
-   *
-   * To avoid the need for explicitly encoding the query use the
-   * [queryParameters] optional named arguments when constructing a
-   * [Uri].
-   *
-   * See http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.2 for more
-   * details.
-   */
-  static String encodeQueryComponent(String component,
-                                     {Encoding encoding: UTF8}) {
-    return _uriEncode(_unreservedTable, component, encoding, true);
-  }
-
-  /**
-   * Decodes the percent-encoding in [encodedComponent].
-   *
-   * Note that decoding a URI component might change its meaning as
-   * some of the decoded characters could be characters with are
-   * delimiters for a given URI componene type. Always split a URI
-   * component using the delimiters for the component before decoding
-   * the individual parts.
-   *
-   * For handling the [path] and [query] components consider using
-   * [pathSegments] and [queryParameters] to get the separated and
-   * decoded component.
-   */
-  static String decodeComponent(String encodedComponent) {
-    return _uriDecode(encodedComponent, 0, encodedComponent.length,
-                      UTF8, false);
-  }
-
-  /**
-   * Decodes the percent-encoding in [encodedComponent], converting
-   * pluses to spaces.
-   *
-   * It will create a byte-list of the decoded characters, and then use
-   * [encoding] to decode the byte-list to a String. The default encoding is
-   * UTF-8.
-   */
-  static String decodeQueryComponent(
-      String encodedComponent,
-      {Encoding encoding: UTF8}) {
-    return _uriDecode(encodedComponent, 0, encodedComponent.length,
-                      encoding, true);
-  }
-
-  /**
-   * Encode the string [uri] using percent-encoding to make it
-   * safe for literal use as a full URI.
-   *
-   * All characters except uppercase and lowercase letters, digits and
-   * the characters `!#$&'()*+,-./:;=?@_~` are percent-encoded. This
-   * is the set of characters specified in in ECMA-262 version 5.1 for
-   * the encodeURI function .
-   */
-  static String encodeFull(String uri) {
-    return _uriEncode(_encodeFullTable, uri, UTF8, false);
-  }
-
-  /**
-   * Decodes the percent-encoding in [uri].
-   *
-   * Note that decoding a full URI might change its meaning as some of
-   * the decoded characters could be reserved characters. In most
-   * cases an encoded URI should be parsed into components using
-   * [Uri.parse] before decoding the separate components.
-   */
-  static String decodeFull(String uri) {
-    return _uriDecode(uri, 0, uri.length, UTF8, false);
-  }
-
-  /**
-   * Returns the [query] split into a map according to the rules
-   * specified for FORM post in the [HTML 4.01 specification section
-   * 17.13.4](http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4 "HTML 4.01 section 17.13.4").
-   * Each key and value in the returned map has been decoded. If the [query]
-   * is the empty string an empty map is returned.
-   *
-   * Keys in the query string that have no value are mapped to the
-   * empty string.
-   *
-   * Each query component will be decoded using [encoding]. The default encoding
-   * is UTF-8.
-   */
-  static Map<String, String> splitQueryString(String query,
-                                              {Encoding encoding: UTF8}) {
-    return query.split("&").fold({}, (map, element) {
-      int index = element.indexOf("=");
-      if (index == -1) {
-        if (element != "") {
-          map[decodeQueryComponent(element, encoding: encoding)] = "";
-        }
-      } else if (index != 0) {
-        var key = element.substring(0, index);
-        var value = element.substring(index + 1);
-        map[Uri.decodeQueryComponent(key, encoding: encoding)] =
-            decodeQueryComponent(value, encoding: encoding);
-      }
-      return map;
-    });
-  }
-
-  static List _createList() => [];
-
-  static Map _splitQueryStringAll(
-      String query, {Encoding encoding: UTF8}) {
-    Map result = {};
-    int i = 0;
-    int start = 0;
-    int equalsIndex = -1;
-
-    void parsePair(int start, int equalsIndex, int end) {
-      String key;
-      String value;
-      if (start == end) return;
-      if (equalsIndex < 0) {
-        key =  _uriDecode(query, start, end, encoding, true);
-        value = "";
-      } else {
-        key = _uriDecode(query, start, equalsIndex, encoding, true);
-        value = _uriDecode(query, equalsIndex + 1, end, encoding, true);
-      }
-      result.putIfAbsent(key, _createList).add(value);
-    }
-
-    const int _equals = 0x3d;
-    const int _ampersand = 0x26;
-    while (i < query.length) {
-      int char = query.codeUnitAt(i);
-      if (char == _equals) {
-        if (equalsIndex < 0) equalsIndex = i;
-      } else if (char == _ampersand) {
-        parsePair(start, equalsIndex, i);
-        start = i + 1;
-        equalsIndex = -1;
-      }
-      i++;
-    }
-    parsePair(start, equalsIndex, i);
-    return result;
-  }
-
-  /**
-   * Parse the [host] as an IP version 4 (IPv4) address, returning the address
-   * as a list of 4 bytes in network byte order (big endian).
-   *
-   * Throws a [FormatException] if [host] is not a valid IPv4 address
-   * representation.
-   */
-  static List<int> parseIPv4Address(String host) {
-    void error(String msg) {
-      throw new FormatException('Illegal IPv4 address, $msg');
-    }
-    var bytes = host.split('.');
-    if (bytes.length != 4) {
-      error('IPv4 address should contain exactly 4 parts');
-    }
-    // TODO(ajohnsen): Consider using Uint8List.
-    return bytes
-        .map((byteString) {
-          int byte = int.parse(byteString);
-          if (byte < 0 || byte > 255) {
-            error('each part must be in the range of `0..255`');
-          }
-          return byte;
-        })
-        .toList();
-  }
-
-  /**
-   * Parse the [host] as an IP version 6 (IPv6) address, returning the address
-   * as a list of 16 bytes in network byte order (big endian).
-   *
-   * Throws a [FormatException] if [host] is not a valid IPv6 address
-   * representation.
-   *
-   * Acts on the substring from [start] to [end]. If [end] is omitted, it
-   * defaults ot the end of the string.
-   *
-   * Some examples of IPv6 addresses:
-   *  * ::1
-   *  * FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
-   *  * 3ffe:2a00:100:7031::1
-   *  * ::FFFF:129.144.52.38
-   *  * 2010:836B:4179::836B:4179
-   */
-  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
-    if (end == null) end = host.length;
-    // An IPv6 address consists of exactly 8 parts of 1-4 hex digits, seperated
-    // by `:`'s, with the following exceptions:
-    //
-    //  - One (and only one) wildcard (`::`) may be present, representing a fill
-    //    of 0's. The IPv6 `::` is thus 16 bytes of `0`.
-    //  - The last two parts may be replaced by an IPv4 address.
-    void error(String msg, [position]) {
-      throw new FormatException('Illegal IPv6 address, $msg', host, position);
-    }
-    int parseHex(int start, int end) {
-      if (end - start > 4) {
-        error('an IPv6 part can only contain a maximum of 4 hex digits', start);
-      }
-      int value = int.parse(host.substring(start, end), radix: 16);
-      if (value < 0 || value > (1 << 16) - 1) {
-        error('each part must be in the range of `0x0..0xFFFF`', start);
-      }
-      return value;
-    }
-    if (host.length < 2) error('address is too short');
-    List<int> parts = [];
-    bool wildcardSeen = false;
-    int partStart = start;
-    // Parse all parts, except a potential last one.
-    for (int i = start; i < end; i++) {
-      if (host.codeUnitAt(i) == _COLON) {
-        if (i == start) {
-          // If we see a `:` in the beginning, expect wildcard.
-          i++;
-          if (host.codeUnitAt(i) != _COLON) {
-            error('invalid start colon.', i);
-          }
-          partStart = i;
-        }
-        if (i == partStart) {
-          // Wildcard. We only allow one.
-          if (wildcardSeen) {
-            error('only one wildcard `::` is allowed', i);
-          }
-          wildcardSeen = true;
-          parts.add(-1);
-        } else {
-          // Found a single colon. Parse [partStart..i] as a hex entry.
-          parts.add(parseHex(partStart, i));
-        }
-        partStart = i + 1;
-      }
-    }
-    if (parts.length == 0) error('too few parts');
-    bool atEnd = (partStart == end);
-    bool isLastWildcard = (parts.last == -1);
-    if (atEnd && !isLastWildcard) {
-      error('expected a part after last `:`', end);
-    }
-    if (!atEnd) {
-      try {
-        parts.add(parseHex(partStart, end));
-      } catch (e) {
-        // Failed to parse the last chunk as hex. Try IPv4.
-        try {
-          List<int> last = parseIPv4Address(host.substring(partStart, end));
-          parts.add(last[0] << 8 | last[1]);
-          parts.add(last[2] << 8 | last[3]);
-        } catch (e) {
-          error('invalid end of IPv6 address.', partStart);
-        }
-      }
-    }
-    if (wildcardSeen) {
-      if (parts.length > 7) {
-        error('an address with a wildcard must have less than 7 parts');
-      }
-    } else if (parts.length != 8) {
-      error('an address without a wildcard must contain exactly 8 parts');
-    }
-    List<int> bytes = new Uint8List(16);
-    for (int i = 0, index = 0; i < parts.length; i++) {
-      int value = parts[i];
-      if (value == -1) {
-        int wildCardLength = 9 - parts.length;
-        for (int j = 0; j < wildCardLength; j++) {
-          bytes[index] = 0;
-          bytes[index + 1] = 0;
-          index += 2;
-        }
-      } else {
-        bytes[index] = value >> 8;
-        bytes[index + 1] = value & 0xff;
-        index += 2;
-      }
-    }
-    return bytes;
-  }
-
-  // Frequently used character codes.
-  static const int _SPACE = 0x20;
-  static const int _DOUBLE_QUOTE = 0x22;
-  static const int _NUMBER_SIGN = 0x23;
-  static const int _PERCENT = 0x25;
-  static const int _ASTERISK = 0x2A;
-  static const int _PLUS = 0x2B;
-  static const int _DOT = 0x2E;
-  static const int _SLASH = 0x2F;
-  static const int _ZERO = 0x30;
-  static const int _NINE = 0x39;
-  static const int _COLON = 0x3A;
-  static const int _LESS = 0x3C;
-  static const int _GREATER = 0x3E;
-  static const int _QUESTION = 0x3F;
-  static const int _AT_SIGN = 0x40;
-  static const int _UPPER_CASE_A = 0x41;
-  static const int _UPPER_CASE_F = 0x46;
-  static const int _UPPER_CASE_Z = 0x5A;
-  static const int _LEFT_BRACKET = 0x5B;
-  static const int _BACKSLASH = 0x5C;
-  static const int _RIGHT_BRACKET = 0x5D;
-  static const int _LOWER_CASE_A = 0x61;
-  static const int _LOWER_CASE_F = 0x66;
-  static const int _LOWER_CASE_Z = 0x7A;
-  static const int _BAR = 0x7C;
-
-  static const String _hexDigits = "0123456789ABCDEF";
-
-  external static String _uriEncode(List<int> canonicalTable,
-                                    String text,
-                                    Encoding encoding,
-                                    bool spaceToPlus);
-
-  /**
-   * Convert a byte (2 character hex sequence) in string [s] starting
-   * at position [pos] to its ordinal value
-   */
-  static int _hexCharPairToByte(String s, int pos) {
-    int byte = 0;
-    for (int i = 0; i < 2; i++) {
-      var charCode = s.codeUnitAt(pos + i);
-      if (0x30 <= charCode && charCode <= 0x39) {
-        byte = byte * 16 + charCode - 0x30;
-      } else {
-        // Check ranges A-F (0x41-0x46) and a-f (0x61-0x66).
-        charCode |= 0x20;
-        if (0x61 <= charCode && charCode <= 0x66) {
-          byte = byte * 16 + charCode - 0x57;
-        } else {
-          throw new ArgumentError("Invalid URL encoding");
-        }
-      }
-    }
-    return byte;
-  }
-
-  /**
-   * Uri-decode a percent-encoded string.
-   *
-   * It unescapes the string [text] and returns the unescaped string.
-   *
-   * This function is similar to the JavaScript-function `decodeURI`.
-   *
-   * If [plusToSpace] is `true`, plus characters will be converted to spaces.
-   *
-   * The decoder will create a byte-list of the percent-encoded parts, and then
-   * decode the byte-list using [encoding]. The default encodingis UTF-8.
-   */
-  static String _uriDecode(String text,
-                           int start,
-                           int end,
-                           Encoding encoding,
-                           bool plusToSpace) {
-    assert(0 <= start);
-    assert(start <= end);
-    assert(end <= text.length);
-    assert(encoding != null);
-    // First check whether there is any characters which need special handling.
-    bool simple = true;
-    for (int i = start; i < end; i++) {
-      var codeUnit = text.codeUnitAt(i);
-      if (codeUnit > 127 ||
-          codeUnit == _PERCENT ||
-          (plusToSpace && codeUnit == _PLUS)) {
-        simple = false;
-        break;
-      }
-    }
-    List<int> bytes;
-    if (simple) {
-      if (UTF8 == encoding || LATIN1 == encoding || ASCII == encoding) {
-        return text.substring(start, end);
-      } else {
-        bytes = text.substring(start, end).codeUnits;
-      }
-    } else {
-      bytes = new List();
-      for (int i = start; i < end; i++) {
-        var codeUnit = text.codeUnitAt(i);
-        if (codeUnit > 127) {
-          throw new ArgumentError("Illegal percent encoding in URI");
-        }
-        if (codeUnit == _PERCENT) {
-          if (i + 3 > text.length) {
-            throw new ArgumentError('Truncated URI');
-          }
-          bytes.add(_hexCharPairToByte(text, i + 1));
-          i += 2;
-        } else if (plusToSpace && codeUnit == _PLUS) {
-          bytes.add(_SPACE);
-        } else {
-          bytes.add(codeUnit);
-        }
-      }
-    }
-    return encoding.decode(bytes);
-  }
-
-  static bool _isAlphabeticCharacter(int codeUnit) {
-    var lowerCase = codeUnit | 0x20;
-    return (_LOWER_CASE_A <= lowerCase && lowerCase <= _LOWER_CASE_Z);
-  }
-
-  static bool _isUnreservedChar(int char) {
-    return char < 127 &&
-           ((_unreservedTable[char >> 4] & (1 << (char & 0x0f))) != 0);
-  }
-
-  // Tables of char-codes organized as a bit vector of 128 bits where
-  // each bit indicate whether a character code on the 0-127 needs to
-  // be escaped or not.
-
-  // The unreserved characters of RFC 3986.
-  static const _unreservedTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //                           -.
-      0x6000,   // 0x20 - 0x2f  0000000000000110
-                //              0123456789
-      0x03ff,   // 0x30 - 0x3f  1111111111000000
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // The unreserved characters of RFC 2396.
-  static const _unreserved2396Table = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !     '()*  -.
-      0x6782,   // 0x20 - 0x2f  0100000111100110
-                //              0123456789
-      0x03ff,   // 0x30 - 0x3f  1111111111000000
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Table of reserved characters specified by ECMAScript 5.
-  static const _encodeFullTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               ! #$ &'()*+,-./
-      0xffda,   // 0x20 - 0x2f  0101101111111111
-                //              0123456789:; = ?
-      0xafff,   // 0x30 - 0x3f  1111111111110101
-                //              @ABCDEFGHIJKLMNO
-      0xffff,   // 0x40 - 0x4f  1111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in the scheme.
-  static const _schemeTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //                         + -.
-      0x6800,   // 0x20 - 0x2f  0000000000010110
-                //              0123456789
-      0x03ff,   // 0x30 - 0x3f  1111111111000000
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ
-      0x07ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz
-      0x07ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in scheme except for upper case letters.
-  static const _schemeLowerTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //                         + -.
-      0x6800,   // 0x20 - 0x2f  0000000000010110
-                //              0123456789
-      0x03ff,   // 0x30 - 0x3f  1111111111000000
-                //
-      0x0000,   // 0x40 - 0x4f  0111111111111111
-                //
-      0x0000,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz
-      0x07ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Sub delimiter characters combined with unreserved as of 3986.
-  // sub-delims  = "!" / "$" / "&" / "'" / "(" / ")"
-  //             / "*" / "+" / "," / ";" / "="
-  // RFC 3986 section 2.3.
-  // unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"
-  static const _subDelimitersTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $ &'()*+,-.
-      0x7fd2,   // 0x20 - 0x2f  0100101111111110
-                //              0123456789 ; =
-      0x2bff,   // 0x30 - 0x3f  1111111111010100
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // General delimiter characters, RFC 3986 section 2.2.
-  // gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
-  //
-  static const _genDelimitersTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //                 #           /
-      0x8008,   // 0x20 - 0x2f  0001000000000001
-                //                        :    ?
-      0x8400,   // 0x30 - 0x3f  0000000000100001
-                //              @
-      0x0001,   // 0x40 - 0x4f  1000000000000000
-                //                         [ ]
-      0x2800,   // 0x50 - 0x5f  0000000000010100
-                //
-      0x0000,   // 0x60 - 0x6f  0000000000000000
-                //
-      0x0000];  // 0x70 - 0x7f  0000000000000000
-
-  // Characters allowed in the userinfo as of RFC 3986.
-  // RFC 3986 Apendix A
-  // userinfo = *( unreserved / pct-encoded / sub-delims / ':')
-  static const _userinfoTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $ &'()*+,-.
-      0x7fd2,   // 0x20 - 0x2f  0100101111111110
-                //              0123456789:; =
-      0x2fff,   // 0x30 - 0x3f  1111111111110100
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in the reg-name as of RFC 3986.
-  // RFC 3986 Apendix A
-  // reg-name = *( unreserved / pct-encoded / sub-delims )
-  static const _regNameTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $%&'()*+,-.
-      0x7ff2,   // 0x20 - 0x2f  0100111111111110
-                //              0123456789 ; =
-      0x2bff,   // 0x30 - 0x3f  1111111111010100
-                //               ABCDEFGHIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  0111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in the path as of RFC 3986.
-  // RFC 3986 section 3.3.
-  // pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
-  static const _pathCharTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $ &'()*+,-.
-      0x7fd2,   // 0x20 - 0x2f  0100101111111110
-                //              0123456789:; =
-      0x2fff,   // 0x30 - 0x3f  1111111111110100
-                //              @ABCDEFGHIJKLMNO
-      0xffff,   // 0x40 - 0x4f  1111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in the path as of RFC 3986.
-  // RFC 3986 section 3.3 *and* slash.
-  static const _pathCharOrSlashTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $ &'()*+,-./
-      0xffd2,   // 0x20 - 0x2f  0100101111111111
-                //              0123456789:; =
-      0x2fff,   // 0x30 - 0x3f  1111111111110100
-                //              @ABCDEFGHIJKLMNO
-      0xffff,   // 0x40 - 0x4f  1111111111111111
-
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-  // Characters allowed in the query as of RFC 3986.
-  // RFC 3986 section 3.4.
-  // query = *( pchar / "/" / "?" )
-  static const _queryCharTable = const [
-                //             LSB            MSB
-                //              |              |
-      0x0000,   // 0x00 - 0x0f  0000000000000000
-      0x0000,   // 0x10 - 0x1f  0000000000000000
-                //               !  $ &'()*+,-./
-      0xffd2,   // 0x20 - 0x2f  0100101111111111
-                //              0123456789:; = ?
-      0xafff,   // 0x30 - 0x3f  1111111111110101
-                //              @ABCDEFGHIJKLMNO
-      0xffff,   // 0x40 - 0x4f  1111111111111111
-                //              PQRSTUVWXYZ    _
-      0x87ff,   // 0x50 - 0x5f  1111111111100001
-                //               abcdefghijklmno
-      0xfffe,   // 0x60 - 0x6f  0111111111111111
-                //              pqrstuvwxyz   ~
-      0x47ff];  // 0x70 - 0x7f  1111111111100010
-
-}
-
-// --------------------------------------------------------------------
-// Data URI
-// --------------------------------------------------------------------
-
-/**
- * A way to access the structure of a `data:` URI.
- *
- * Data URIs are non-hierarchical URIs that can contain any binary data.
- * They are defined by [RFC 2397](https://tools.ietf.org/html/rfc2397).
- *
- * This class allows parsing the URI text and extracting individual parts of the
- * URI, as well as building the URI text from structured parts.
- */
-class UriData {
-  static const int _noScheme = -1;
-  /**
-   * Contains the text content of a `data:` URI, with or without a
-   * leading `data:`.
-   *
-   * If [_separatorIndices] starts with `4` (the index of the `:`), then
-   * there is a leading `data:`, otherwise [_separatorIndices] starts with
-   * `-1`.
-   */
-  final String _text;
-
-  /**
-   * List of the separators (';', '=' and ',') in the text.
-   *
-   * Starts with the index of the `:` in `data:` of the mimeType.
-   * That is always either -1 or 4, depending on whether `_text` includes the
-   * `data:` scheme or not.
-   *
-   * The first speparator ends the mime type. We don't bother with finding
-   * the '/' inside the mime type.
-   *
-   * Each two separators after that marks a parameter key and value.
-   *
-   * If there is a single separator left, it ends the "base64" marker.
-   *
-   * So the following separators are found for a text:
-   *
-   *     data:text/plain;foo=bar;base64,ARGLEBARGLE=
-   *         ^          ^   ^   ^      ^
-   *
-   */
-  final List<int> _separatorIndices;
-
-  /**
-   * Cache of the result returned by [uri].
-   */
-  Uri _uriCache;
-
-  UriData._(this._text, this._separatorIndices, this._uriCache);
-
-  /**
-   * Creates a `data:` URI containing the [content] string.
-   *
-   * Equivalent to `new Uri.dataFromString(...).data`, but may
-   * be more efficient if the [uri] itself isn't used.
-   */
-  factory UriData.fromString(String content,
-                             {String mimeType,
-                              Encoding encoding,
-                              Map<String, String> parameters,
-                              bool base64: false}) {
-    StringBuffer buffer = new StringBuffer();
-    List<int> indices = [_noScheme];
-    String charsetName;
-    String encodingName;
-    if (parameters != null) charsetName = parameters["charset"];
-    if (encoding == null) {
-      if (charsetName != null) {
-        encoding = Encoding.getByName(charsetName);
-      }
-    } else if (charsetName == null) {
-      // Non-null only if parameters does not contain "charset".
-      encodingName = encoding.name;
-    }
-    encoding ??= ASCII;
-    _writeUri(mimeType, encodingName, parameters, buffer, indices);
-    indices.add(buffer.length);
-    if (base64) {
-      buffer.write(';base64,');
-      indices.add(buffer.length - 1);
-      buffer.write(encoding.fuse(BASE64).encode(content));
-    } else {
-      buffer.write(',');
-      _uriEncodeBytes(_uricTable, encoding.encode(content), buffer);
-    }
-    return new UriData._(buffer.toString(), indices, null);
-  }
-
-  /**
-   * Creates a `data:` URI containing an encoding of [bytes].
-   *
-   * Equivalent to `new Uri.dataFromBytes(...).data`, but may
-   * be more efficient if the [uri] itself isn't used.
-   */
-  factory UriData.fromBytes(List<int> bytes,
-                            {mimeType: "application/octet-stream",
-                             Map<String, String> parameters,
-                             percentEncoded: false}) {
-    StringBuffer buffer = new StringBuffer();
-    List<int> indices = [_noScheme];
-    _writeUri(mimeType, null, parameters, buffer, indices);
-    indices.add(buffer.length);
-    if (percentEncoded) {
-      buffer.write(',');
-      _uriEncodeBytes(_uricTable, bytes, buffer);
-    } else {
-      buffer.write(';base64,');
-      indices.add(buffer.length - 1);
-      BASE64.encoder
-            .startChunkedConversion(
-                new StringConversionSink.fromStringSink(buffer))
-            .addSlice(bytes, 0, bytes.length, true);
-    }
-
-    return new UriData._(buffer.toString(), indices, null);
-  }
-
-  /**
-   * Creates a `DataUri` from a [Uri] which must have `data` as [Uri.scheme].
-   *
-   * The [uri] must have scheme `data` and no authority or fragment,
-   * and the path (concatenated with the query, if there is one) must be valid
-   * as data URI content with the same rules as [parse].
-   */
-  factory UriData.fromUri(Uri uri) {
-    if (uri.scheme != "data") {
-      throw new ArgumentError.value(uri, "uri",
-                                    "Scheme must be 'data'");
-    }
-    if (uri.hasAuthority) {
-      throw new ArgumentError.value(uri, "uri",
-                                    "Data uri must not have authority");
-    }
-    if (uri.hasFragment) {
-      throw new ArgumentError.value(uri, "uri",
-                                    "Data uri must not have a fragment part");
-    }
-    if (!uri.hasQuery) {
-      return _parse(uri.path, 0, uri);
-    }
-    // Includes path and query (and leading "data:").
-    return _parse("$uri", 5, uri);
-  }
-
-  /**
-   * Writes the initial part of a `data:` uri, from after the "data:"
-   * until just before the ',' before the data, or before a `;base64,`
-   * marker.
-   *
-   * Of an [indices] list is passed, separator indices are stored in that
-   * list.
-   */
-  static void _writeUri(String mimeType,
-                        String charsetName,
-                        Map<String, String> parameters,
-                        StringBuffer buffer, List indices) {
-    if (mimeType == null || mimeType == "text/plain") {
-      mimeType = "";
-    }
-    if (mimeType.isEmpty || identical(mimeType, "application/octet-stream")) {
-      buffer.write(mimeType);  // Common cases need no escaping.
-    } else {
-      int slashIndex = _validateMimeType(mimeType);
-      if (slashIndex < 0) {
-        throw new ArgumentError.value(mimeType, "mimeType",
-                                      "Invalid MIME type");
-      }
-      buffer.write(Uri._uriEncode(_tokenCharTable,
-                                  mimeType.substring(0, slashIndex),
-                                  UTF8, false));
-      buffer.write("/");
-      buffer.write(Uri._uriEncode(_tokenCharTable,
-                                  mimeType.substring(slashIndex + 1),
-                                  UTF8, false));
-    }
-    if (charsetName != null) {
-      if (indices != null) {
-        indices..add(buffer.length)
-               ..add(buffer.length + 8);
-      }
-      buffer.write(";charset=");
-      buffer.write(Uri._uriEncode(_tokenCharTable, charsetName, UTF8, false));
-    }
-    parameters?.forEach((var key, var value) {
-      if (key.isEmpty) {
-        throw new ArgumentError.value("", "Parameter names must not be empty");
-      }
-      if (value.isEmpty) {
-        throw new ArgumentError.value("", "Parameter values must not be empty",
-                                      'parameters["$key"]');
-      }
-      if (indices != null) indices.add(buffer.length);
-      buffer.write(';');
-      // Encode any non-RFC2045-token character and both '%' and '#'.
-      buffer.write(Uri._uriEncode(_tokenCharTable, key, UTF8, false));
-      if (indices != null) indices.add(buffer.length);
-      buffer.write('=');
-      buffer.write(Uri._uriEncode(_tokenCharTable, value, UTF8, false));
-    });
-  }
-
-  /**
-   * Checks mimeType is valid-ish (`token '/' token`).
-   *
-   * Returns the index of the slash, or -1 if the mime type is not
-   * considered valid.
-   *
-   * Currently only looks for slashes, all other characters will be
-   * percent-encoded as UTF-8 if necessary.
-   */
-  static int _validateMimeType(String mimeType) {
-    int slashIndex = -1;
-    for (int i = 0; i < mimeType.length; i++) {
-      var char = mimeType.codeUnitAt(i);
-      if (char != Uri._SLASH) continue;
-      if (slashIndex < 0) {
-        slashIndex = i;
-        continue;
-      }
-      return -1;
-    }
-    return slashIndex;
-  }
-
-  /**
-   * Parses a string as a `data` URI.
-   *
-   * The string must have the format:
-   *
-   * ```
-   * 'data:' (type '/' subtype)? (';' attribute '=' value)* (';base64')? ',' data
-   * ````
-   *
-   * where `type`, `subtype`, `attribute` and `value` are specified in RFC-2045,
-   * and `data` is a sequnce of URI-characters (RFC-2396 `uric`).
-   *
-   * This means that all the characters must be ASCII, but the URI may contain
-   * percent-escapes for non-ASCII byte values that need an interpretation
-   * to be converted to the corresponding string.
-   *
-   * Parsing doesn't check the validity of any part, it just checks that the
-   * input has the correct structure with the correct sequence of `/`, `;`, `=`
-   * and `,` delimiters.
-   *
-   * Accessing the individual parts may fail later if they turn out to have
-   * content that can't be decoded sucessfully as a string.
-   */
-  static UriData parse(String uri) {
-    if (!uri.startsWith("data:")) {
-      throw new FormatException("Does not start with 'data:'", uri, 0);
-    }
-    return _parse(uri, 5, null);
-  }
-
-  /**
-   * The [Uri] that this `UriData` is giving access to.
-   *
-   * Returns a `Uri` with scheme `data` and the remainder of the data URI
-   * as path.
-   */
-  Uri get uri {
-    if (_uriCache != null) return _uriCache;
-    String path = _text;
-    String query = null;
-    int colonIndex = _separatorIndices[0];
-    int queryIndex = _text.indexOf('?', colonIndex + 1);
-    int end = null;
-    if (queryIndex >= 0) {
-      query = _text.substring(queryIndex + 1);
-      end = queryIndex;
-    }
-    path = _text.substring(colonIndex + 1, end);
-    // TODO(lrn): This is probably too simple. We should ensure URI
-    // normalization before passing in the raw strings, maybe using
-    // Uri._makePath, Uri._makeQuery.
-    _uriCache = new Uri._internal("data", "", null, null, path, query, null);
-    return _uriCache;
-  }
-
-  /**
-   * The MIME type of the data URI.
-   *
-   * A data URI consists of a "media type" followed by data.
-   * The media type starts with a MIME type and can be followed by
-   * extra parameters.
-   *
-   * Example:
-   *
-   *     data:text/plain;charset=utf-8,Hello%20World!
-   *
-   * This data URI has the media type `text/plain;charset=utf-8`, which is the
-   * MIME type `text/plain` with the parameter `charset` with value `utf-8`.
-   * See [RFC 2045](https://tools.ietf.org/html/rfc2045) for more detail.
-   *
-   * If the first part of the data URI is empty, it defaults to `text/plain`.
-   */
-  String get mimeType {
-    int start = _separatorIndices[0] + 1;
-    int end = _separatorIndices[1];
-    if (start == end) return "text/plain";
-    return Uri._uriDecode(_text, start, end, UTF8, false);
-  }
-
-  /**
-   * The charset parameter of the media type.
-   *
-   * If the parameters of the media type contains a `charset` parameter
-   * then this returns its value, otherwise it returns `US-ASCII`,
-   * which is the default charset for data URIs.
-   */
-  String get charset {
-    int parameterStart = 1;
-    int parameterEnd = _separatorIndices.length - 1;  // The ',' before data.
-    if (isBase64) {
-      // There is a ";base64" separator, so subtract one for that as well.
-      parameterEnd -= 1;
-    }
-    for (int i = parameterStart; i < parameterEnd; i += 2) {
-      var keyStart = _separatorIndices[i] + 1;
-      var keyEnd = _separatorIndices[i + 1];
-      if (keyEnd == keyStart + 7 && _text.startsWith("charset", keyStart)) {
-        return Uri._uriDecode(_text, keyEnd + 1, _separatorIndices[i + 2],
-                              UTF8, false);
-      }
-    }
-    return "US-ASCII";
-  }
-
-  /**
-   * Whether the data is Base64 encoded or not.
-   */
-  bool get isBase64 => _separatorIndices.length.isOdd;
-
-  /**
-   * The content part of the data URI, as its actual representation.
-   *
-   * This string may contain percent escapes.
-   */
-  String get contentText => _text.substring(_separatorIndices.last + 1);
-
-  /**
-   * The content part of the data URI as bytes.
-   *
-   * If the data is Base64 encoded, it will be decoded to bytes.
-   *
-   * If the data is not Base64 encoded, it will be decoded by unescaping
-   * percent-escaped characters and returning byte values of each unescaped
-   * character. The bytes will not be, e.g., UTF-8 decoded.
-   */
-  List<int> contentAsBytes() {
-    String text = _text;
-    int start = _separatorIndices.last + 1;
-    if (isBase64) {
-      return BASE64.decoder.convert(text, start);
-    }
-
-    // Not base64, do percent-decoding and return the remaining bytes.
-    // Compute result size.
-    const int percent = 0x25;
-    int length = text.length - start;
-    for (int i = start; i < text.length; i++) {
-      var codeUnit = text.codeUnitAt(i);
-      if (codeUnit == percent) {
-        i += 2;
-        length -= 2;
-      }
-    }
-    // Fill result array.
-    Uint8List result = new Uint8List(length);
-    if (length == text.length) {
-      result.setRange(0, length, text.codeUnits, start);
-      return result;
-    }
-    int index = 0;
-    for (int i = start; i < text.length; i++) {
-      var codeUnit = text.codeUnitAt(i);
-      if (codeUnit != percent) {
-        result[index++] = codeUnit;
-      } else {
-        if (i + 2 < text.length) {
-          var digit1 = Uri._parseHexDigit(text.codeUnitAt(i + 1));
-          var digit2 = Uri._parseHexDigit(text.codeUnitAt(i + 2));
-          if (digit1 >= 0 && digit2 >= 0) {
-            int byte = digit1 * 16 + digit2;
-            result[index++] = byte;
-            i += 2;
-            continue;
-          }
-        }
-        throw new FormatException("Invalid percent escape", text, i);
-      }
-    }
-    assert(index == result.length);
-    return result;
-  }
-
-  /**
-   * Returns a string created from the content of the data URI.
-   *
-   * If the content is Base64 encoded, it will be decoded to bytes and then
-   * decoded to a string using [encoding].
-   * If encoding is omitted, the value of a `charset` parameter is used
-   * if it is recongized by [Encoding.getByName], otherwise it defaults to
-   * the [ASCII] encoding, which is the default encoding for data URIs
-   * that do not specify an encoding.
-   *
-   * If the content is not Base64 encoded, it will first have percent-escapes
-   * converted to bytes and then the character codes and byte values are
-   * decoded using [encoding].
-   */
-  String contentAsString({Encoding encoding}) {
-    if (encoding == null) {
-      var charset = this.charset;  // Returns "US-ASCII" if not present.
-      encoding = Encoding.getByName(charset);
-      if (encoding == null) {
-        throw new UnsupportedError("Unknown charset: $charset");
-      }
-    }
-    String text = _text;
-    int start = _separatorIndices.last + 1;
-    if (isBase64) {
-      var converter = BASE64.decoder.fuse(encoding.decoder);
-      return converter.convert(text.substring(start));
-    }
-    return Uri._uriDecode(text, start, text.length, encoding, false);
-  }
-
-  /**
-   * A map representing the parameters of the media type.
-   *
-   * A data URI may contain parameters between the MIME type and the
-   * data. This converts these parameters to a map from parameter name
-   * to parameter value.
-   * The map only contains parameters that actually occur in the URI.
-   * The `charset` parameter has a default value even if it doesn't occur
-   * in the URI, which is reflected by the [charset] getter. This means that
-   * [charset] may return a value even if `parameters["charset"]` is `null`.
-   *
-   * If the values contain non-ASCII values or percent escapes, they default
-   * to being decoded as UTF-8.
-   */
-  Map<String, String> get parameters {
-    var result = <String, String>{};
-    for (int i = 3; i < _separatorIndices.length; i += 2) {
-      var start = _separatorIndices[i - 2] + 1;
-      var equals = _separatorIndices[i - 1];
-      var end = _separatorIndices[i];
-      String key = Uri._uriDecode(_text, start, equals, UTF8, false);
-      String value = Uri._uriDecode(_text,equals + 1, end, UTF8, false);
-      result[key] = value;
-    }
-    return result;
-  }
-
-  static UriData _parse(String text, int start, Uri sourceUri) {
-    assert(start == 0 || start == 5);
-    assert((start == 5) == text.startsWith("data:"));
-
-    /// Character codes.
-    const int comma     = 0x2c;
-    const int slash     = 0x2f;
-    const int semicolon = 0x3b;
-    const int equals    = 0x3d;
-    List<int> indices = [start - 1];
-    int slashIndex = -1;
-    var char;
-    int i = start;
-    for (; i < text.length; i++) {
-      char = text.codeUnitAt(i);
-      if (char == comma || char == semicolon) break;
-      if (char == slash) {
-        if (slashIndex < 0) {
-          slashIndex = i;
-          continue;
-        }
-        throw new FormatException("Invalid MIME type", text, i);
-      }
-    }
-    if (slashIndex < 0 && i > start) {
-      // An empty MIME type is allowed, but if non-empty it must contain
-      // exactly one slash.
-      throw new FormatException("Invalid MIME type", text, i);
-    }
-    while (char != comma) {
-      // Parse parameters and/or "base64".
-      indices.add(i);
-      i++;
-      int equalsIndex = -1;
-      for (; i < text.length; i++) {
-        char = text.codeUnitAt(i);
-        if (char == equals) {
-          if (equalsIndex < 0) equalsIndex = i;
-        } else if (char == semicolon || char == comma) {
-          break;
-        }
-      }
-      if (equalsIndex >= 0) {
-        indices.add(equalsIndex);
-      } else {
-        // Have to be final "base64".
-        var lastSeparator = indices.last;
-        if (char != comma ||
-            i != lastSeparator + 7 /* "base64,".length */ ||
-            !text.startsWith("base64", lastSeparator + 1)) {
-          throw new FormatException("Expecting '='", text, i);
-        }
-        break;
-      }
-    }
-    indices.add(i);
-    return new UriData._(text, indices, sourceUri);
-  }
-
-  /**
-   * Like [Uri._uriEncode] but takes the input as bytes, not a string.
-   *
-   * Encodes into [buffer] instead of creating its own buffer.
-   */
-  static void _uriEncodeBytes(List<int> canonicalTable,
-                              List<int> bytes,
-                              StringSink buffer) {
-    // Encode the string into bytes then generate an ASCII only string
-    // by percent encoding selected bytes.
-    int byteOr = 0;
-    for (int i = 0; i < bytes.length; i++) {
-      int byte = bytes[i];
-      byteOr |= byte;
-      if (byte < 128 &&
-          ((canonicalTable[byte >> 4] & (1 << (byte & 0x0f))) != 0)) {
-        buffer.writeCharCode(byte);
-      } else {
-        buffer.writeCharCode(Uri._PERCENT);
-        buffer.writeCharCode(Uri._hexDigits.codeUnitAt(byte >> 4));
-        buffer.writeCharCode(Uri._hexDigits.codeUnitAt(byte & 0x0f));
-      }
-    }
-    if ((byteOr & ~0xFF) != 0) {
-      for (int i = 0; i < bytes.length; i++) {
-        var byte = bytes[i];
-        if (byte < 0 || byte > 255) {
-          throw new ArgumentError.value(byte, "non-byte value");
-        }
-      }
-    }
-  }
-
-  String toString() =>
-      (_separatorIndices[0] == _noScheme) ? "data:$_text" : _text;
-
-  // Table of the `token` characters of RFC 2045 in a URI.
-  //
-  // A token is any US-ASCII character except SPACE, control characters and
-  // `tspecial` characters. The `tspecial` category is:
-  // '(', ')', '<', '>', '@', ',', ';', ':', '\', '"', '/', '[, ']', '?', '='.
-  //
-  // In a data URI, we also need to escape '%' and '#' characters.
-  static const _tokenCharTable = const [
-                //             LSB             MSB
-                //              |               |
-      0x0000,   // 0x00 - 0x0f  00000000 00000000
-      0x0000,   // 0x10 - 0x1f  00000000 00000000
-                //               !  $ &'   *+ -.
-      0x6cd2,   // 0x20 - 0x2f  01001011 00110110
-                //              01234567 89
-      0x03ff,   // 0x30 - 0x3f  11111111 11000000
-                //               ABCDEFG HIJKLMNO
-      0xfffe,   // 0x40 - 0x4f  01111111 11111111
-                //              PQRSTUVW XYZ   ^_
-      0xc7ff,   // 0x50 - 0x5f  11111111 11100011
-                //              `abcdefg hijklmno
-      0xffff,   // 0x60 - 0x6f  11111111 11111111
-                //              pqrstuvw xyz{|}~
-      0x7fff];  // 0x70 - 0x7f  11111111 11111110
-
-  // All non-escape RFC-2396 uric characters.
-  //
-  //  uric        =  reserved | unreserved | escaped
-  //  reserved    =  ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
-  //  unreserved  =  alphanum | mark
-  //  mark        =  "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
-  //
-  // This is the same characters as in a URI query (which is URI pchar plus '?')
-  static const _uricTable = Uri._queryCharTable;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart
deleted file mode 100644
index 47ea5ba..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/developer/developer.dart
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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.
-
-/// Interact with developer tools such as the debugger and inspector.
-///
-/// The dart:developer library is _unstable_ and its API might change slightly
-/// as a result of developer feedback. This library is platform dependent and
-/// therefore it has implementations for both dart2js and the Dart VM. Both are
-/// under development and may not support all operations yet.
-///
-/// To use this library in your code:
-///
-///     import 'dart:developer';
-///
-library dart.developer;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:isolate' show RawReceivePort, SendPort;
-
-part 'extension.dart';
-part 'profiler.dart';
-part 'timeline.dart';
-part 'service.dart';
-
-/// If [when] is true, stop the program as if a breakpoint were hit at the
-/// following statement.
-///
-/// Returns the value of [when]. Some debuggers may display [message].
-///
-/// NOTE: When invoked, the isolate will not return until a debugger
-/// continues execution. When running in the Dart VM the behaviour is the same
-/// regardless of whether or not a debugger is connected. When compiled to
-/// JavaScript, this uses the "debugger" statement, and behaves exactly as
-/// that does.
-external bool debugger({bool when: true, String message});
-
-/// Send a reference to [object] to any attached debuggers.
-///
-/// Debuggers may open an inspector on the object. Returns the argument.
-external Object inspect(Object object);
-
-/// Emit a log event.
-/// [message] is the log message.
-/// [time]  (optional) is the timestamp.
-/// [sequenceNumber]  (optional) is a monotonically increasing sequence number.
-/// [level]  (optional) is the severity level (value between 0 and 2000).
-/// [name]  (optional) is the name of the source of the log message.
-/// [zone]  (optional) the zone where the log was emitted
-/// [error]  (optional) an error object associated with this log event.
-/// [stackTrace]  (optional) a stack trace associated with this log event.
-external void log(String message,
-                  {DateTime time,
-                   int sequenceNumber,
-                   int level: 0,
-                   String name: '',
-                   Zone zone,
-                   Object error,
-                   StackTrace stackTrace});
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart
deleted file mode 100644
index 5883fb5..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/developer/extension.dart
+++ /dev/null
@@ -1,177 +0,0 @@
-// 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.
-
-part of dart.developer;
-
-/// A response to a service protocol extension RPC.
-///
-/// If the RPC was successful, use [ServiceExtensionResponse.result], otherwise
-/// use [ServiceExtensionResponse.error].
-class ServiceExtensionResponse {
-  final String _result;
-  final int _errorCode;
-  final String _errorDetail;
-
-  /// Creates a successful response to a service protocol extension RPC.
-  ///
-  /// Requires [result] to be a JSON object encoded as a string. When forming
-  /// the JSON-RPC message [result] will be inlined directly.
-  ServiceExtensionResponse.result(String result)
-      : _result = result,
-        _errorCode = null,
-        _errorDetail = null {
-    if (_result is! String) {
-      throw new ArgumentError.value(_result, "result", "Must be a String");
-    }
-  }
-
-  /// Creates an error response to a service protocol extension RPC.
-  ///
-  /// Requires [errorCode] to be [invalidParams] or between [extensionErrorMin]
-  /// and [extensionErrorMax]. Requires [errorDetail] to be a JSON object
-  /// encoded as a string. When forming the JSON-RPC message [errorDetail] will
-  /// be inlined directly.
-  ServiceExtensionResponse.error(int errorCode, String errorDetail)
-      : _result = null,
-        _errorCode = errorCode,
-        _errorDetail = errorDetail {
-    _validateErrorCode(_errorCode);
-    if (_errorDetail is! String) {
-      throw new ArgumentError.value(_errorDetail,
-                                    "errorDetail",
-                                    "Must be a String");
-    }
-  }
-
-  /// Invalid method parameter(s) error code.
-  @deprecated static const kInvalidParams = invalidParams;
-  /// Generic extension error code.
-  @deprecated static const kExtensionError = extensionError;
-  /// Maximum extension provided error code.
-  @deprecated static const kExtensionErrorMax = extensionErrorMax;
-  /// Minimum extension provided error code.
-  @deprecated static const kExtensionErrorMin = extensionErrorMin;
-
-  /// Invalid method parameter(s) error code.
-  static const invalidParams = -32602;
-  /// Generic extension error code.
-  static const extensionError = -32000;
-  /// Maximum extension provided error code.
-  static const extensionErrorMax = -32000;
-  /// Minimum extension provided error code.
-  static const extensionErrorMin = -32016;
-
-
-  static String _errorCodeMessage(int errorCode) {
-    _validateErrorCode(errorCode);
-    if (errorCode == kInvalidParams) {
-      return "Invalid params";
-    }
-    return "Server error";
-  }
-
-  static _validateErrorCode(int errorCode) {
-    if (errorCode is! int) {
-      throw new ArgumentError.value(errorCode, "errorCode", "Must be an int");
-    }
-    if (errorCode == invalidParams) {
-      return;
-    }
-    if ((errorCode >= extensionErrorMin) &&
-        (errorCode <= extensionErrorMax)) {
-      return;
-    }
-    throw new ArgumentError.value(errorCode, "errorCode", "Out of range");
-  }
-
-  bool _isError() => (_errorCode != null) && (_errorDetail != null);
-
-  String _toString() {
-    if (_result != null) {
-      return _result;
-    } else {
-      assert(_errorCode != null);
-      assert(_errorDetail != null);
-      return JSON.encode({
-        'code': _errorCode,
-        'message': _errorCodeMessage(_errorCode),
-        'data': {
-          'details': _errorDetail
-        }
-      });
-    }
-  }
-}
-
-/// A service protocol extension handler. Registered with [registerExtension].
-///
-/// Must complete to a [ServiceExtensionResponse].
-///
-/// [method] - the method name of the service protocol request.
-/// [parameters] - A map holding the parameters to the service protocol request.
-///
-/// *NOTE*: All parameter names and values are **encoded as strings**.
-typedef Future<ServiceExtensionResponse>
-    ServiceExtensionHandler(String method, Map<String, String> parameters);
-
-/// Register a [ServiceExtensionHandler] that will be invoked in this isolate
-/// for [method]. *NOTE*: Service protocol extensions must be registered
-/// in each isolate.
-///
-/// *NOTE*: [method] must begin with 'ext.' and you should use the following
-/// structure to avoid conflicts with other packages: 'ext.package.command'.
-/// That is, immediately following the 'ext.' prefix, should be the registering
-/// package name followed by another period ('.') and then the command name.
-/// For example: 'ext.dart.io.getOpenFiles'.
-///
-/// Because service extensions are isolate specific, clients using extensions
-/// must always include an 'isolateId' parameter with each RPC.
-void registerExtension(String method, ServiceExtensionHandler handler) {
-  if (method is! String) {
-    throw new ArgumentError.value(method,
-                                  'method',
-                                  'Must be a String');
-  }
-  if (!method.startsWith('ext.')) {
-    throw new ArgumentError.value(method,
-                                  'method',
-                                  'Must begin with ext.');
-  }
-  if (_lookupExtension(method) != null) {
-    throw new ArgumentError('Extension already registered: $method');
-  }
-  if (handler is! ServiceExtensionHandler) {
-    throw new ArgumentError.value(handler,
-                                  'handler',
-                                  'Must be a ServiceExtensionHandler');
-  }
-  _registerExtension(method, handler);
-}
-
-/// Post an event of [eventKind] with payload of [eventData] to the `Extension`
-/// event stream.
-void postEvent(String eventKind, Map eventData) {
-  if (eventKind is! String) {
-    throw new ArgumentError.value(eventKind,
-                                  'eventKind',
-                                  'Must be a String');
-  }
-  if (eventData is! Map) {
-    throw new ArgumentError.value(eventData,
-                                  'eventData',
-                                  'Must be a Map');
-  }
-  String eventDataAsString = JSON.encode(eventData);
-  _postEvent(eventKind, eventDataAsString);
-}
-
-external _postEvent(String eventKind, String eventData);
-
-// Both of these functions are written inside C++ to avoid updating the data
-// structures in Dart, getting an OOB, and observing stale state. Do not move
-// these into Dart code unless you can ensure that the operations will can be
-// done atomically. Native code lives in vm/isolate.cc-
-// LookupServiceExtensionHandler and RegisterServiceExtensionHandler.
-external ServiceExtensionHandler _lookupExtension(String method);
-external _registerExtension(String method, ServiceExtensionHandler handler);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart
deleted file mode 100644
index 566d015..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/developer/profiler.dart
+++ /dev/null
@@ -1,197 +0,0 @@
-// 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.
-
-part of dart.developer;
-
-/// A UserTag can be used to group samples in the Observatory profiler.
-abstract class UserTag {
-  /// The maximum number of UserTag instances that can be created by a program.
-  static const MAX_USER_TAGS = 64;
-
-  factory UserTag(String label) => new _FakeUserTag(label);
-
-  /// Label of [this].
-  String get label;
-
-  /// Make [this] the current tag for the isolate. Returns the current tag
-  /// before setting.
-  UserTag makeCurrent();
-
-  /// The default [UserTag] with label 'Default'.
-  static UserTag get defaultTag => _FakeUserTag._defaultTag;
-}
-
-// This is a fake implementation of UserTag so that code can compile and run
-// in dart2js.
-class _FakeUserTag implements UserTag {
-  static Map _instances = {};
-
-  _FakeUserTag.real(this.label);
-
-  factory _FakeUserTag(String label) {
-    // Canonicalize by name.
-    var existingTag = _instances[label];
-    if (existingTag != null) {
-      return existingTag;
-    }
-    // Throw an exception if we've reached the maximum number of user tags.
-    if (_instances.length == UserTag.MAX_USER_TAGS) {
-      throw new UnsupportedError(
-          'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
-    }
-    // Create a new instance and add it to the instance map.
-    var instance = new _FakeUserTag.real(label);
-    _instances[label] = instance;
-    return instance;
-  }
-
-  final String label;
-
-  UserTag makeCurrent() {
-    var old = _currentTag;
-    _currentTag = this;
-    return old;
-  }
-
-  static final UserTag _defaultTag = new _FakeUserTag('Default');
-}
-
-var _currentTag = _FakeUserTag._defaultTag;
-
-/// Returns the current [UserTag] for the isolate.
-UserTag getCurrentTag() {
-  return _currentTag;
-}
-
-/// Abstract [Metric] class. Metric names must be unique, are hierarchical,
-/// and use periods as separators. For example, 'a.b.c'. Uniqueness is only
-/// enforced when a Metric is registered. The name of a metric cannot contain
-/// the slash ('/') character.
-abstract class Metric {
-  /// [name] of this metric.
-  final String name;
-  /// [description] of this metric.
-  final String description;
-
-  Metric(this.name, this.description) {
-    if ((name == 'vm') || name.contains('/')) {
-      throw new ArgumentError('Invalid Metric name.');
-    }
-
-  }
-
-  Map _toJSON();
-}
-
-/// A measured value with a min and max. Initial value is min. Value will
-/// be clamped to the interval [min, max].
-class Gauge extends Metric {
-  final double min;
-  final double max;
-
-  double _value;
-  double get value => _value;
-  set value(double v) {
-    if (v < min) {
-      v = min;
-    } else if (v > max) {
-      v = max;
-    }
-    _value = v;
-  }
-
-  Gauge(String name, String description, this.min, this.max)
-      : super(name, description) {
-    if (min is! double) {
-      throw new ArgumentError('min must be a double');
-    }
-    if (max is! double) {
-      throw new ArgumentError('max must be a double');
-    }
-    if (!(min < max)) {
-      throw new ArgumentError('min must be less than max');
-    }
-    _value = min;
-  }
-
-  Map _toJSON() {
-    var map = {
-      'type': 'Gauge',
-      'id': 'metrics/$name',
-      'name': name,
-      'description': description,
-      'value': value,
-      'min': min,
-      'max': max,
-    };
-    return map;
-  }
-}
-
-
-/// A changing value. Initial value is 0.0.
-class Counter extends Metric {
-  Counter(String name, String description)
-      : super(name, description);
-
-  double _value = 0.0;
-  double get value => _value;
-  set value(double v) {
-    _value = v;
-  }
-
-  Map _toJSON() {
-    var map = {
-      'type': 'Counter',
-      'id': 'metrics/$name',
-      'name': name,
-      'description': description,
-      'value': value,
-    };
-    return map;
-  }
-}
-
-class Metrics {
-  static final Map<String, Metric> _metrics = new Map<String, Metric>();
-
-  /// Register [Metric]s to make them visible to Observatory.
-  static void register(Metric metric) {
-    if (metric is! Metric) {
-      throw new ArgumentError('metric must be a Metric');
-    }
-    if (_metrics[metric.name] != null) {
-      throw new ArgumentError('Registered metrics have unique names');
-    }
-    _metrics[metric.name] = metric;
-  }
-
-  /// Deregister [Metric]s to make them not visible to Observatory.
-  static void deregister(Metric metric) {
-    if (metric is! Metric) {
-      throw new ArgumentError('metric must be a Metric');
-    }
-    _metrics.remove(metric.name);
-  }
-
-  static String _printMetric(String id) {
-    var metric = _metrics[id];
-    if (metric == null) {
-      return null;
-    }
-    return JSON.encode(metric._toJSON());
-  }
-
-  static String _printMetrics() {
-    var metrics = [];
-    for (var metric in _metrics.values) {
-      metrics.add(metric._toJSON());
-    }
-    var map = {
-      'type': 'MetricList',
-      'metrics': metrics,
-    };
-    return JSON.encode(map);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart
deleted file mode 100644
index 9ccf0dc..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/developer/service.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.developer;
-
-/// Service protocol is the protocol that a client like the observatory
-/// could use to access the services provided by the Dart VM for
-/// debugging and inspecting Dart programs. This class encapsulates the
-/// version number and Uri for accessing this service.
-class ServiceProtocolInfo {
-  /// The major version of the protocol. If the running Dart environment does
-  /// not support the service protocol, this is 0.
-  final int majorVersion = _getServiceMajorVersion();
-  /// The minor version of the protocol. If the running Dart environment does
-  /// not support the service protocol, this is 0.
-  final int minorVersion = _getServiceMinorVersion();
-  /// The Uri to access the service. If the web server is not running, this
-  /// will be null.
-  final Uri serverUri;
-
-  ServiceProtocolInfo(this.serverUri);
-
-  String toString() {
-    if (serverUri != null) {
-      return 'Dart VM Service Protocol v$majorVersion.$minorVersion '
-             'listening on $serverUri';
-    } else {
-      return 'Dart VM Service Protocol v$majorVersion.$minorVersion';
-    }
-  }
-}
-
-/// Access information about the service protocol and control the web server
-/// that provides access to the services provided by the Dart VM for
-/// debugging and inspecting Dart programs.
-class Service {
-  /// Get information about the service protocol (version number and
-  /// Uri to access the service).
-  static Future<ServiceProtocolInfo> getInfo() async {
-    // Port to receive response from service isolate.
-    final RawReceivePort receivePort = new RawReceivePort();
-    final Completer<Uri> uriCompleter = new Completer<Uri>();
-    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
-    // Request the information from the service isolate.
-    _getServerInfo(receivePort.sendPort);
-    // Await the response from the service isolate.
-    Uri uri = await uriCompleter.future;
-    // Close the port.
-    receivePort.close();
-    return new ServiceProtocolInfo(uri);
-  }
-
-  /// Control the web server that the service protocol is accessed through.
-  /// The [enable] argument must be a boolean and is used as a toggle to
-  /// enable(true) or disable(false) the web server servicing requests.
-  static Future<ServiceProtocolInfo> controlWebServer(
-      {bool enable: false}) async {
-    if (enable is! bool) {
-      throw new ArgumentError.value(enable,
-                                    'enable',
-                                    'Must be a bool');
-    }
-    // Port to receive response from service isolate.
-    final RawReceivePort receivePort = new RawReceivePort();
-    final Completer<Uri> uriCompleter = new Completer<Uri>();
-    receivePort.handler = (Uri uri) => uriCompleter.complete(uri);
-    // Request the information from the service isolate.
-    _webServerControl(receivePort.sendPort, enable);
-    // Await the response from the service isolate.
-    Uri uri = await uriCompleter.future;
-    // Close the port.
-    receivePort.close();
-    return new ServiceProtocolInfo(uri);
-  }
-}
-
-/// [sp] will receive a Uri or null.
-external void _getServerInfo(SendPort sp);
-
-/// [sp] will receive a Uri or null.
-external void _webServerControl(SendPort sp, bool enable);
-
-/// Returns the major version of the service protocol.
-external int _getServiceMajorVersion();
-
-/// Returns the minor version of the service protocol.
-external int _getServiceMinorVersion();
-
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart b/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart
deleted file mode 100644
index b6118af..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/developer/timeline.dart
+++ /dev/null
@@ -1,328 +0,0 @@
-// 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.
-
-part of dart.developer;
-
-const bool _isProduct = const bool.fromEnvironment("dart.vm.product");
-
-typedef dynamic TimelineSyncFunction();
-typedef Future TimelineAsyncFunction();
-
-/// Add to the timeline.
-class Timeline {
-  /// Start a synchronous operation labeled [name]. Optionally takes
-  /// a [Map] of [arguments]. This operation must be finished before
-  /// returning to the event queue.
-  static void startSync(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name,
-                                    'name',
-                                    'Must be a String');
-    }
-    if (!_isDartStreamEnabled()) {
-      // Push a null onto the stack and return.
-      _stack.add(null);
-      return;
-    }
-    var block = new _SyncBlock._(name, _getTraceClock(), _getThreadCpuClock());
-    if (arguments is Map) {
-      block._appendArguments(arguments);
-    }
-    _stack.add(block);
-  }
-
-  /// Finish the last synchronous operation that was started.
-  static void finishSync() {
-    if (_isProduct) {
-      return;
-    }
-    if (_stack.length == 0) {
-      throw new StateError(
-          'Uneven calls to startSync and finishSync');
-    }
-    // Pop top item off of stack.
-    var block = _stack.removeLast();
-    if (block == null) {
-      // Dart stream was disabled when startSync was called.
-      return;
-    }
-    // Finish it.
-    block.finish();
-  }
-
-  /// Emit an instant event.
-  static void instantSync(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name,
-                                    'name',
-                                    'Must be a String');
-    }
-    if (!_isDartStreamEnabled()) {
-      // Stream is disabled.
-      return;
-    }
-    Map instantArguments;
-    if (arguments is Map) {
-      instantArguments = new Map.from(arguments);
-    }
-    _reportInstantEvent(_getTraceClock(),
-                        'Dart',
-                        name,
-                        _argumentsAsJson(instantArguments));
-  }
-
-
-  /// A utility method to time a synchronous [function]. Internally calls
-  /// [function] bracketed by calls to [startSync] and [finishSync].
-  static dynamic timeSync(String name,
-                          TimelineSyncFunction function,
-                          {Map arguments}) {
-    startSync(name, arguments: arguments);
-    try {
-      return function();
-    } finally {
-      finishSync();
-    }
-  }
-
-  /// The current time stamp from the clock used by the timeline. Units are
-  /// microseconds.
-  static int get now => _getTraceClock();
-  static final List<_SyncBlock> _stack = new List<_SyncBlock>();
-  static final int _isolateId = _getIsolateNum();
-  static final String _isolateIdString = _isolateId.toString();
-}
-
-/// An asynchronous task on the timeline. An asynchronous task can have many
-/// (nested) synchronous operations. Synchronous operations can live longer than
-/// the current isolate event. To pass a [TimelineTask] to another isolate,
-/// you must first call [pass] to get the task id and then construct a new
-/// [TimelineTask] in the other isolate.
-class TimelineTask {
-  /// Create a task. [taskId] will be set by the system.
-  TimelineTask()
-      : _taskId = _getNextAsyncId() {
-  }
-
-  /// Create a task with an explicit [taskId]. This is useful if you are
-  /// passing a task from one isolate to another.
-  TimelineTask.withTaskId(int taskId)
-      : _taskId = taskId {
-    if (taskId is! int) {
-      throw new ArgumentError.value(taskId,
-                                    'taskId',
-                                    'Must be an int');
-    }
-  }
-
-  /// Start a synchronous operation within this task named [name].
-  /// Optionally takes a [Map] of [arguments].
-  void start(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name,
-                                    'name',
-                                    'Must be a String');
-    }
-    var block = new _AsyncBlock._(name, _taskId);
-    if (arguments is Map) {
-      block._appendArguments(arguments);
-    }
-    _stack.add(block);
-    block._start();
-  }
-
-  /// Emit an instant event for this task.
-  void instant(String name, {Map arguments}) {
-    if (_isProduct) {
-      return;
-    }
-    if (name is! String) {
-      throw new ArgumentError.value(name,
-                                    'name',
-                                    'Must be a String');
-    }
-    Map instantArguments;
-    if (arguments is Map) {
-      instantArguments = new Map.from(arguments);
-    }
-    _reportTaskEvent(_getTraceClock(),
-                     _taskId,
-                     'n',
-                     'Dart',
-                     name,
-                     _argumentsAsJson(instantArguments));
-  }
-
-  /// Finish the last synchronous operation that was started.
-  void finish() {
-    if (_isProduct) {
-      return;
-    }
-    if (_stack.length == 0) {
-      throw new StateError(
-          'Uneven calls to start and finish');
-    }
-    // Pop top item off of stack.
-    var block = _stack.removeLast();
-    block._finish();
-  }
-
-  /// Retrieve the [TimelineTask]'s task id. Will throw an exception if the
-  /// stack is not empty.
-  int pass() {
-    if (_stack.length > 0) {
-      throw new StateError(
-          'You cannot pass a TimelineTask without finishing all started '
-          'operations');
-    }
-    int r = _taskId;
-    return r;
-  }
-
-  final int _taskId;
-  final List<_AsyncBlock> _stack = [];
-}
-
-/// An asynchronous block of time on the timeline. This block can be kept
-/// open across isolate messages.
-class _AsyncBlock {
-  /// The category this block belongs to.
-  final String category = 'Dart';
-  /// The name of this block.
-  final String name;
-  /// The asynchronous task id.
-  final int _taskId;
-  /// An (optional) set of arguments which will be serialized to JSON and
-  /// associated with this block.
-  Map _arguments;
-
-  _AsyncBlock._(this.name, this._taskId);
-
-  // Emit the start event.
-  void _start() {
-    _reportTaskEvent(_getTraceClock(),
-                     _taskId,
-                     'b',
-                     category,
-                     name,
-                     _argumentsAsJson(_arguments));
-  }
-
-  // Emit the finish event.
-  void _finish() {
-    _reportTaskEvent(_getTraceClock(),
-                     _taskId,
-                     'e',
-                     category,
-                     name,
-                     _argumentsAsJson(null));
-  }
-
-  void _appendArguments(Map arguments) {
-    if (_arguments == null) {
-      _arguments = {};
-    }
-    _arguments.addAll(arguments);
-  }
-}
-
-/// A synchronous block of time on the timeline. This block should not be
-/// kept open across isolate messages.
-class _SyncBlock {
-  /// The category this block belongs to.
-  final String category = 'Dart';
-  /// The name of this block.
-  final String name;
-  /// An (optional) set of arguments which will be serialized to JSON and
-  /// associated with this block.
-  Map _arguments;
-  // The start time stamp.
-  final int _start;
-  // The start time stamp of the thread cpu clock.
-  final int _startCpu;
-
-  _SyncBlock._(this.name,
-               this._start,
-               this._startCpu);
-
-  /// Finish this block of time. At this point, this block can no longer be
-  /// used.
-  void finish() {
-    // Report event to runtime.
-    _reportCompleteEvent(_start,
-                         _startCpu,
-                         category,
-                         name,
-                         _argumentsAsJson(_arguments));
-  }
-
-  void _appendArguments(Map arguments) {
-    if (arguments == null) {
-      return;
-    }
-    if (_arguments == null) {
-      _arguments = {};
-    }
-    _arguments.addAll(arguments);
-  }
-}
-
-String _fastPathArguments;
-String _argumentsAsJson(Map arguments) {
-  if ((arguments == null) || (arguments.length == 0)) {
-    // Fast path no arguments. Avoid calling JSON.encode.
-    if (_fastPathArguments == null) {
-      _fastPathArguments = '{"isolateNumber":"${Timeline._isolateId}"}';
-    }
-    return _fastPathArguments;
-  }
-  // Add isolateNumber to arguments map.
-  arguments['isolateNumber'] = Timeline._isolateIdString;
-  return JSON.encode(arguments);
-}
-
-/// Returns true if the Dart Timeline stream is enabled.
-external bool _isDartStreamEnabled();
-
-/// Returns the next async task id.
-external int _getNextAsyncId();
-
-/// Returns the current value from the trace clock.
-external int _getTraceClock();
-
-/// Returns the current value from the thread CPU usage clock.
-external int _getThreadCpuClock();
-
-/// Returns the isolate's main port number.
-external int _getIsolateNum();
-
-/// Reports an event for a task.
-external void _reportTaskEvent(int start,
-                               int taskId,
-                               String phase,
-                               String category,
-                               String name,
-                               String argumentsAsJson);
-
-/// Reports a complete synchronous event.
-external void _reportCompleteEvent(int start,
-                                   int startCpu,
-                                   String category,
-                                   String name,
-                                   String argumentsAsJson);
-
-/// Reports an instant event.
-external void _reportInstantEvent(int start,
-                                  String category,
-                                  String name,
-                                  String argumentsAsJson);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/internal.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/internal.dart
deleted file mode 100644
index 3eda7ca..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/internal.dart
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library dart._internal;
-
-import 'dart:collection';
-
-import 'dart:core' hide Symbol;
-import 'dart:core' as core;
-import 'dart:math' show Random;
-
-part 'iterable.dart';
-part 'list.dart';
-part 'lists.dart';
-part 'print.dart';
-part 'sort.dart';
-part 'symbol.dart';
-
-// Powers of 10 up to 10^22 are representable as doubles.
-// Powers of 10 above that are only approximate due to lack of precission.
-// Used by double-parsing.
-const POWERS_OF_TEN = const [
-                        1.0,  /*  0 */
-                       10.0,
-                      100.0,
-                     1000.0,
-                    10000.0,
-                   100000.0,  /*  5 */
-                  1000000.0,
-                 10000000.0,
-                100000000.0,
-               1000000000.0,
-              10000000000.0,  /* 10 */
-             100000000000.0,
-            1000000000000.0,
-           10000000000000.0,
-          100000000000000.0,
-         1000000000000000.0,  /*  15 */
-        10000000000000000.0,
-       100000000000000000.0,
-      1000000000000000000.0,
-     10000000000000000000.0,
-    100000000000000000000.0,  /*  20 */
-   1000000000000000000000.0,
-  10000000000000000000000.0,
-];
-
-/**
- * An [Iterable] of the UTF-16 code units of a [String] in index order.
- */
-class CodeUnits extends UnmodifiableListBase<int> {
-  /** The string that this is the code units of. */
-  final String _string;
-
-  CodeUnits(this._string);
-
-  int get length => _string.length;
-  int operator[](int i) => _string.codeUnitAt(i);
-
-  static String stringOf(CodeUnits u) => u._string;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart
deleted file mode 100644
index 4d404eb..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/iterable.dart
+++ /dev/null
@@ -1,766 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart._internal;
-
-/**
- * Marker interface for [Iterable] subclasses that have an efficient
- * [length] implementation.
- */
-abstract class EfficientLength {
-  /**
-   * Returns the number of elements in the iterable.
-   *
-   * This is an efficient operation that doesn't require iterating through
-   * the elements.
-   */
-  int get length;
-}
-
-/**
- * An [Iterable] for classes that have efficient [length] and [elementAt].
- *
- * All other methods are implemented in terms of [length] and [elementAt],
- * including [iterator].
- */
-abstract class ListIterable<E> extends Iterable<E>
-                               implements EfficientLength {
-  int get length;
-  E elementAt(int i);
-
-  const ListIterable();
-
-  Iterator<E> get iterator => new ListIterator<E>(this);
-
-  void forEach(void action(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      action(elementAt(i));
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-  }
-
-  bool get isEmpty => length == 0;
-
-  E get first {
-    if (length == 0) throw IterableElementError.noElement();
-    return elementAt(0);
-  }
-
-  E get last {
-    if (length == 0) throw IterableElementError.noElement();
-    return elementAt(length - 1);
-  }
-
-  E get single {
-    if (length == 0) throw IterableElementError.noElement();
-    if (length > 1) throw IterableElementError.tooMany();
-    return elementAt(0);
-  }
-
-  bool contains(Object element) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (elementAt(i) == element) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  bool every(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (!test(elementAt(i))) return false;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return true;
-  }
-
-  bool any(bool test(E element)) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      if (test(elementAt(i))) return true;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return false;
-  }
-
-  E firstWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      E element = elementAt(i);
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E lastWhere(bool test(E element), { E orElse() }) {
-    int length = this.length;
-    for (int i = length - 1; i >= 0; i--) {
-      E element = elementAt(i);
-      if (test(element)) return element;
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E singleWhere(bool test(E element)) {
-    int length = this.length;
-    E match = null;
-    bool matchFound = false;
-    for (int i = 0; i < length; i++) {
-      E element = elementAt(i);
-      if (test(element)) {
-        if (matchFound) {
-          throw IterableElementError.tooMany();
-        }
-        matchFound = true;
-        match = element;
-      }
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    if (matchFound) return match;
-    throw IterableElementError.noElement();
-  }
-
-  String join([String separator = ""]) {
-    int length = this.length;
-    if (!separator.isEmpty) {
-      if (length == 0) return "";
-      String first = "${elementAt(0)}";
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-      StringBuffer buffer = new StringBuffer(first);
-      for (int i = 1; i < length; i++) {
-        buffer.write(separator);
-        buffer.write(elementAt(i));
-        if (length != this.length) {
-          throw new ConcurrentModificationError(this);
-        }
-      }
-      return buffer.toString();
-    } else {
-      StringBuffer buffer = new StringBuffer();
-      for (int i = 0; i < length; i++) {
-        buffer.write(elementAt(i));
-        if (length != this.length) {
-          throw new ConcurrentModificationError(this);
-        }
-      }
-      return buffer.toString();
-    }
-  }
-
-  Iterable<E> where(bool test(E element)) => super.where(test);
-
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) =>
-      new MappedListIterable<E, dynamic/*=T*/ >(this, f);
-
-  E reduce(E combine(var value, E element)) {
-    int length = this.length;
-    if (length == 0) throw IterableElementError.noElement();
-    E value = elementAt(0);
-    for (int i = 1; i < length; i++) {
-      value = combine(value, elementAt(i));
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return value;
-  }
-
-  /*=T*/ fold/*<T>*/(
-      var/*=T*/ initialValue, /*=T*/ combine(
-          var/*=T*/ previousValue, E element)) {
-    var value = initialValue;
-    int length = this.length;
-    for (int i = 0; i < length; i++) {
-      value = combine(value, elementAt(i));
-      if (length != this.length) {
-        throw new ConcurrentModificationError(this);
-      }
-    }
-    return value;
-  }
-
-  Iterable<E> skip(int count) => new SubListIterable<E>(this, count, null);
-
-  Iterable<E> skipWhile(bool test(E element)) => super.skipWhile(test);
-
-  Iterable<E> take(int count) => new SubListIterable<E>(this, 0, count);
-
-  Iterable<E> takeWhile(bool test(E element)) => super.takeWhile(test);
-
-  List<E> toList({bool growable: true}) {
-    List<E> result;
-    if (growable) {
-      result = new List<E>()..length = length;
-    } else {
-      result = new List<E>(length);
-    }
-    for (int i = 0; i < length; i++) {
-      result[i] = elementAt(i);
-    }
-    return result;
-  }
-
-  Set<E> toSet() {
-    Set<E> result = new Set<E>();
-    for (int i = 0; i < length; i++) {
-      result.add(elementAt(i));
-    }
-    return result;
-  }
-}
-
-class SubListIterable<E> extends ListIterable<E> {
-  final Iterable<E> _iterable; // Has efficient length and elementAt.
-  final int _start;
-  /** If null, represents the length of the iterable. */
-  final int _endOrLength;
-
-  SubListIterable(this._iterable, this._start, this._endOrLength) {
-    RangeError.checkNotNegative(_start, "start");
-    if (_endOrLength != null) {
-      RangeError.checkNotNegative(_endOrLength, "end");
-      if (_start > _endOrLength) {
-        throw new RangeError.range(_start, 0, _endOrLength, "start");
-      }
-    }
-  }
-
-  int get _endIndex {
-    int length = _iterable.length;
-    if (_endOrLength == null || _endOrLength > length) return length;
-    return _endOrLength;
-  }
-
-  int get _startIndex {
-    int length = _iterable.length;
-    if (_start > length) return length;
-    return _start;
-  }
-
-  int get length {
-    int length = _iterable.length;
-    if (_start >= length) return 0;
-    if (_endOrLength == null || _endOrLength >= length) {
-      return length - _start;
-    }
-    return _endOrLength - _start;
-  }
-
-  E elementAt(int index) {
-    int realIndex = _startIndex + index;
-    if (index < 0 || realIndex >= _endIndex) {
-      throw new RangeError.index(index, this, "index");
-    }
-    return _iterable.elementAt(realIndex);
-  }
-
-  Iterable<E> skip(int count) {
-    RangeError.checkNotNegative(count, "count");
-    int newStart = _start + count;
-    if (_endOrLength != null && newStart >= _endOrLength) {
-      return new EmptyIterable<E>();
-    }
-    return new SubListIterable<E>(_iterable, newStart, _endOrLength);
-  }
-
-  Iterable<E> take(int count) {
-    RangeError.checkNotNegative(count, "count");
-    if (_endOrLength == null) {
-      return new SubListIterable<E>(_iterable, _start, _start + count);
-    } else {
-      int newEnd = _start + count;
-      if (_endOrLength < newEnd) return this;
-      return new SubListIterable<E>(_iterable, _start, newEnd);
-    }
-  }
-
-  List<E> toList({bool growable: true}) {
-    int start = _start;
-    int end = _iterable.length;
-    if (_endOrLength != null && _endOrLength < end) end = _endOrLength;
-    int length = end - start;
-    if (length < 0) length = 0;
-    List<E> result = growable ? (new List<E>()..length = length)
-                              : new List<E>(length);
-    for (int i = 0; i < length; i++) {
-      result[i] = _iterable.elementAt(start + i);
-      if (_iterable.length < end) throw new ConcurrentModificationError(this);
-    }
-    return result;
-  }
-}
-
-/**
- * An [Iterator] that iterates a list-like [Iterable].
- *
- * All iterations is done in terms of [Iterable.length] and
- * [Iterable.elementAt]. These operations are fast for list-like
- * iterables.
- */
-class ListIterator<E> implements Iterator<E> {
-  final Iterable<E> _iterable;
-  final int _length;
-  int _index;
-  E _current;
-
-  ListIterator(Iterable<E> iterable)
-      : _iterable = iterable, _length = iterable.length, _index = 0;
-
-  E get current => _current;
-
-  bool moveNext() {
-    int length = _iterable.length;
-    if (_length != length) {
-      throw new ConcurrentModificationError(_iterable);
-    }
-    if (_index >= length) {
-      _current = null;
-      return false;
-    }
-    _current = _iterable.elementAt(_index);
-    _index++;
-    return true;
-  }
-}
-
-typedef T _Transformation<S, T>(S value);
-
-class MappedIterable<S, T> extends Iterable<T> {
-  final Iterable<S> _iterable;
-  final _Transformation<S, T> _f;
-
-  factory MappedIterable(Iterable<S> iterable, T function(S value)) {
-    if (iterable is EfficientLength) {
-      return new EfficientLengthMappedIterable<S, T>(iterable, function);
-    }
-    return new MappedIterable<S, T>._(iterable, function);
-  }
-
-  MappedIterable._(this._iterable, T this._f(S element));
-
-  Iterator<T> get iterator => new MappedIterator<S, T>(_iterable.iterator, _f);
-
-  // Length related functions are independent of the mapping.
-  int get length => _iterable.length;
-  bool get isEmpty => _iterable.isEmpty;
-
-  // Index based lookup can be done before transforming.
-  T get first => _f(_iterable.first);
-  T get last => _f(_iterable.last);
-  T get single => _f(_iterable.single);
-  T elementAt(int index) => _f(_iterable.elementAt(index));
-}
-
-class EfficientLengthMappedIterable<S, T> extends MappedIterable<S, T>
-                                          implements EfficientLength {
-  EfficientLengthMappedIterable(Iterable<S> iterable, T function(S value))
-      : super._(iterable, function);
-}
-
-class MappedIterator<S, T> extends Iterator<T> {
-  T _current;
-  final Iterator<S> _iterator;
-  final _Transformation<S, T> _f;
-
-  MappedIterator(this._iterator, T this._f(S element));
-
-  bool moveNext() {
-    if (_iterator.moveNext()) {
-      _current = _f(_iterator.current);
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-
-  T get current => _current;
-}
-
-/**
- * Specialized alternative to [MappedIterable] for mapped [List]s.
- *
- * Expects efficient `length` and `elementAt` on the source iterable.
- */
-class MappedListIterable<S, T> extends ListIterable<T>
-                               implements EfficientLength {
-  final Iterable<S> _source;
-  final _Transformation<S, T> _f;
-
-  MappedListIterable(this._source, T this._f(S value));
-
-  int get length => _source.length;
-  T elementAt(int index) => _f(_source.elementAt(index));
-}
-
-
-typedef bool _ElementPredicate<E>(E element);
-
-class WhereIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final _ElementPredicate<E> _f;
-
-  WhereIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator => new WhereIterator<E>(_iterable.iterator, _f);
-}
-
-class WhereIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  final _ElementPredicate<E> _f;
-
-  WhereIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    while (_iterator.moveNext()) {
-      if (_f(_iterator.current)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  E get current => _iterator.current;
-}
-
-typedef Iterable<T> _ExpandFunction<S, T>(S sourceElement);
-
-class ExpandIterable<S, T> extends Iterable<T> {
-  final Iterable<S> _iterable;
-  final _ExpandFunction<S, T> _f;
-
-  ExpandIterable(this._iterable, Iterable<T> this._f(S element));
-
-  Iterator<T> get iterator => new ExpandIterator<S, T>(_iterable.iterator, _f);
-}
-
-class ExpandIterator<S, T> implements Iterator<T> {
-  final Iterator<S> _iterator;
-  final _ExpandFunction<S, T> _f;
-  // Initialize _currentExpansion to an empty iterable. A null value
-  // marks the end of iteration, and we don't want to call _f before
-  // the first moveNext call.
-  Iterator<T> _currentExpansion = const EmptyIterator();
-  T _current;
-
-  ExpandIterator(this._iterator, Iterable<T> this._f(S element));
-
-  T get current => _current;
-
-  bool moveNext() {
-    if (_currentExpansion == null) return false;
-    while (!_currentExpansion.moveNext()) {
-      _current = null;
-      if (_iterator.moveNext()) {
-        // If _f throws, this ends iteration. Otherwise _currentExpansion and
-        // _current will be set again below.
-        _currentExpansion = null;
-        _currentExpansion = _f(_iterator.current).iterator;
-      } else {
-        return false;
-      }
-    }
-    _current = _currentExpansion.current;
-    return true;
-  }
-}
-
-class TakeIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final int _takeCount;
-
-  factory TakeIterable(Iterable<E> iterable, int takeCount) {
-    if (takeCount is! int || takeCount < 0) {
-      throw new ArgumentError(takeCount);
-    }
-    if (iterable is EfficientLength) {
-      return new EfficientLengthTakeIterable<E>(iterable, takeCount);
-    }
-    return new TakeIterable<E>._(iterable, takeCount);
-  }
-
-  TakeIterable._(this._iterable, this._takeCount);
-
-  Iterator<E> get iterator {
-    return new TakeIterator<E>(_iterable.iterator, _takeCount);
-  }
-}
-
-class EfficientLengthTakeIterable<E> extends TakeIterable<E>
-                                     implements EfficientLength {
-  EfficientLengthTakeIterable(Iterable<E> iterable, int takeCount)
-      : super._(iterable, takeCount);
-
-  int get length {
-    int iterableLength = _iterable.length;
-    if (iterableLength > _takeCount) return _takeCount;
-    return iterableLength;
-  }
-}
-
-
-class TakeIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  int _remaining;
-
-  TakeIterator(this._iterator, this._remaining) {
-    assert(_remaining is int && _remaining >= 0);
-  }
-
-  bool moveNext() {
-    _remaining--;
-    if (_remaining >= 0) {
-      return _iterator.moveNext();
-    }
-    _remaining = -1;
-    return false;
-  }
-
-  E get current {
-    if (_remaining < 0) return null;
-    return _iterator.current;
-  }
-}
-
-class TakeWhileIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final _ElementPredicate<E> _f;
-
-  TakeWhileIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator {
-    return new TakeWhileIterator<E>(_iterable.iterator, _f);
-  }
-}
-
-class TakeWhileIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  final _ElementPredicate<E> _f;
-  bool _isFinished = false;
-
-  TakeWhileIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    if (_isFinished) return false;
-    if (!_iterator.moveNext() || !_f(_iterator.current)) {
-      _isFinished = true;
-      return false;
-    }
-    return true;
-  }
-
-  E get current {
-    if (_isFinished) return null;
-    return _iterator.current;
-  }
-}
-
-class SkipIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final int _skipCount;
-
-  factory SkipIterable(Iterable<E> iterable, int count) {
-    if (iterable is EfficientLength) {
-      return new EfficientLengthSkipIterable<E>(iterable, count);
-    }
-    return new SkipIterable<E>._(iterable, count);
-  }
-
-  SkipIterable._(this._iterable, this._skipCount) {
-    if (_skipCount is! int) {
-      throw new ArgumentError.value(_skipCount, "count is not an integer");
-    }
-    RangeError.checkNotNegative(_skipCount, "count");
-  }
-
-  Iterable<E> skip(int count) {
-    if (_skipCount is! int) {
-      throw new ArgumentError.value(_skipCount, "count is not an integer");
-    }
-    RangeError.checkNotNegative(_skipCount, "count");
-    return new SkipIterable<E>._(_iterable, _skipCount + count);
-  }
-
-  Iterator<E> get iterator {
-    return new SkipIterator<E>(_iterable.iterator, _skipCount);
-  }
-}
-
-class EfficientLengthSkipIterable<E> extends SkipIterable<E>
-                                     implements EfficientLength {
-  EfficientLengthSkipIterable(Iterable<E> iterable, int skipCount)
-      : super._(iterable, skipCount);
-
-  int get length {
-    int length = _iterable.length - _skipCount;
-    if (length >= 0) return length;
-    return 0;
-  }
-}
-
-class SkipIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  int _skipCount;
-
-  SkipIterator(this._iterator, this._skipCount) {
-    assert(_skipCount is int && _skipCount >= 0);
-  }
-
-  bool moveNext() {
-    for (int i = 0; i < _skipCount; i++) _iterator.moveNext();
-    _skipCount = 0;
-    return _iterator.moveNext();
-  }
-
-  E get current => _iterator.current;
-}
-
-class SkipWhileIterable<E> extends Iterable<E> {
-  final Iterable<E> _iterable;
-  final _ElementPredicate<E> _f;
-
-  SkipWhileIterable(this._iterable, bool this._f(E element));
-
-  Iterator<E> get iterator {
-    return new SkipWhileIterator<E>(_iterable.iterator, _f);
-  }
-}
-
-class SkipWhileIterator<E> extends Iterator<E> {
-  final Iterator<E> _iterator;
-  final _ElementPredicate<E> _f;
-  bool _hasSkipped = false;
-
-  SkipWhileIterator(this._iterator, bool this._f(E element));
-
-  bool moveNext() {
-    if (!_hasSkipped) {
-      _hasSkipped = true;
-      while (_iterator.moveNext()) {
-        if (!_f(_iterator.current)) return true;
-      }
-    }
-    return _iterator.moveNext();
-  }
-
-  E get current => _iterator.current;
-}
-
-/**
- * The always empty [Iterable].
- */
-class EmptyIterable<E> extends Iterable<E> implements EfficientLength {
-  const EmptyIterable();
-
-  Iterator<E> get iterator => const EmptyIterator();
-
-  void forEach(void action(E element)) {}
-
-  bool get isEmpty => true;
-
-  int get length => 0;
-
-  E get first { throw IterableElementError.noElement(); }
-
-  E get last { throw IterableElementError.noElement(); }
-
-  E get single { throw IterableElementError.noElement(); }
-
-  E elementAt(int index) { throw new RangeError.range(index, 0, 0, "index"); }
-
-  bool contains(Object element) => false;
-
-  bool every(bool test(E element)) => true;
-
-  bool any(bool test(E element)) => false;
-
-  E firstWhere(bool test(E element), {E orElse()}) {
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E lastWhere(bool test(E element), {E orElse()}) {
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  E singleWhere(bool test(E element), {E orElse()}) {
-    if (orElse != null) return orElse();
-    throw IterableElementError.noElement();
-  }
-
-  String join([String separator = ""]) => "";
-
-  Iterable<E> where(bool test(E element)) => this;
-
-  Iterable/*<T>*/ map/*<T>*/(/*=T*/ f(E element)) => const EmptyIterable();
-
-  E reduce(E combine(E value, E element)) {
-    throw IterableElementError.noElement();
-  }
-
-  /*=T*/ fold/*<T>*/(
-      var/*=T*/ initialValue, /*=T*/ combine(
-          var/*=T*/ previousValue, E element)) {
-    return initialValue;
-  }
-
-  Iterable<E> skip(int count) {
-    RangeError.checkNotNegative(count, "count");
-    return this;
-  }
-
-  Iterable<E> skipWhile(bool test(E element)) => this;
-
-  Iterable<E> take(int count) {
-    RangeError.checkNotNegative(count, "count");
-    return this;
-  }
-
-  Iterable<E> takeWhile(bool test(E element)) => this;
-
-  List<E> toList({bool growable: true}) => growable ? <E>[] : new List<E>(0);
-
-  Set<E> toSet() => new Set<E>();
-}
-
-/** The always empty iterator. */
-class EmptyIterator<E> implements Iterator<E> {
-  const EmptyIterator();
-  bool moveNext() => false;
-  E get current => null;
-}
-
-/**
- * Creates errors throw by [Iterable] when the element count is wrong.
- */
-abstract class IterableElementError {
-  /** Error thrown thrown by, e.g., [Iterable.first] when there is no result. */
-  static StateError noElement() => new StateError("No element");
-  /** Error thrown by, e.g., [Iterable.single] if there are too many results. */
-  static StateError tooMany() => new StateError("Too many elements");
-  /** Error thrown by, e.g., [List.setRange] if there are too few elements. */
-  static StateError tooFew() => new StateError("Too few elements");
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/list.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/list.dart
deleted file mode 100644
index 6e975e0..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/list.dart
+++ /dev/null
@@ -1,393 +0,0 @@
-// 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.
-
-part of dart._internal;
-
-/**
- * Mixin that throws on the length changing operations of [List].
- *
- * Intended to mix-in on top of [ListMixin] for fixed-length lists.
- */
-abstract class FixedLengthListMixin<E> {
-  /** This operation is not supported by a fixed length list. */
-  void set length(int newLength) {
-    throw new UnsupportedError(
-        "Cannot change the length of a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void add(E value) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void insert(int index, E value) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void insertAll(int at, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void addAll(Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  bool remove(Object element) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void removeWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void retainWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void clear() {
-    throw new UnsupportedError(
-        "Cannot clear a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  E removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  E removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void removeRange(int start, int end) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-
-  /** This operation is not supported by a fixed length list. */
-  void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot remove from a fixed-length list");
-  }
-}
-
-/**
- * Mixin for an unmodifiable [List] class.
- *
- * This overrides all mutating methods with methods that throw.
- * This mixin is intended to be mixed in on top of [ListMixin] on
- * unmodifiable lists.
- */
-abstract class UnmodifiableListMixin<E> implements List<E> {
-
-  /** This operation is not supported by an unmodifiable list. */
-  void operator []=(int index, E value) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void set length(int newLength) {
-    throw new UnsupportedError(
-        "Cannot change the length of an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void setAll(int at, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void add(E value) {
-    throw new UnsupportedError(
-      "Cannot add to an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void insert(int index, E element) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void insertAll(int at, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void addAll(Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot add to an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  bool remove(Object element) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void removeWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void retainWhere(bool test(E element)) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void sort([Comparator<E> compare]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void shuffle([Random random]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void clear() {
-    throw new UnsupportedError(
-        "Cannot clear an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  E removeAt(int index) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  E removeLast() {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void setRange(int start, int end, Iterable<E> iterable, [int skipCount = 0]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void removeRange(int start, int end) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void replaceRange(int start, int end, Iterable<E> iterable) {
-    throw new UnsupportedError(
-        "Cannot remove from an unmodifiable list");
-  }
-
-  /** This operation is not supported by an unmodifiable list. */
-  void fillRange(int start, int end, [E fillValue]) {
-    throw new UnsupportedError(
-        "Cannot modify an unmodifiable list");
-  }
-}
-
-/**
- * Abstract implementation of a fixed-length list.
- *
- * All operations are defined in terms of `length`, `operator[]` and
- * `operator[]=`, which need to be implemented.
- */
-abstract class FixedLengthListBase<E> =
-    ListBase<E> with FixedLengthListMixin<E>;
-
-/**
- * Abstract implementation of an unmodifiable list.
- *
- * All operations are defined in terms of `length` and `operator[]`,
- * which need to be implemented.
- */
-abstract class UnmodifiableListBase<E> =
-    ListBase<E> with UnmodifiableListMixin<E>;
-
-class _ListIndicesIterable extends ListIterable<int> {
-  List _backedList;
-
-  _ListIndicesIterable(this._backedList);
-
-  int get length => _backedList.length;
-  int elementAt(int index) {
-    RangeError.checkValidIndex(index, this);
-    return index;
-  }
-}
-
-class ListMapView<E> implements Map<int, E> {
-  List<E> _values;
-
-  ListMapView(this._values);
-
-  E operator[] (Object key) => containsKey(key) ? _values[key] : null;
-  int get length => _values.length;
-
-  Iterable<E> get values => new SubListIterable<E>(_values, 0, null);
-  Iterable<int> get keys => new _ListIndicesIterable(_values);
-
-  bool get isEmpty => _values.isEmpty;
-  bool get isNotEmpty => _values.isNotEmpty;
-  bool containsValue(Object value) => _values.contains(value);
-  bool containsKey(Object key) => key is int && key >= 0 && key < length;
-
-  void forEach(void f(int key, E value)) {
-    int length = _values.length;
-    for (int i = 0; i < length; i++) {
-      f(i, _values[i]);
-      if (length != _values.length) {
-        throw new ConcurrentModificationError(_values);
-      }
-    }
-  }
-
-  /** This operation is not supported by an unmodifiable map. */
-  void operator[]= (int key, E value) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-
-  /** This operation is not supported by an unmodifiable map. */
-  E putIfAbsent(int key, E ifAbsent()) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-
-  /** This operation is not supported by an unmodifiable map. */
-  E remove(Object key) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-
-  /** This operation is not supported by an unmodifiable map. */
-  void clear() {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-
-  /** This operation is not supported by an unmodifiable map. */
-  void addAll(Map<int, E> other) {
-    throw new UnsupportedError("Cannot modify an unmodifiable map");
-  }
-
-  String toString() => Maps.mapToString(this);
-}
-
-class ReversedListIterable<E> extends ListIterable<E> {
-  Iterable<E> _source;
-  ReversedListIterable(this._source);
-
-  int get length => _source.length;
-
-  E elementAt(int index) => _source.elementAt(_source.length - 1 - index);
-}
-
-/**
- * Creates errors thrown by unmodifiable lists when they are attempted modified.
- *
- * This class creates [UnsupportedError]s with specialized messages.
- */
-abstract class UnmodifiableListError {
-  /** Error thrown when trying to add elements to an unmodifiable list. */
-  static UnsupportedError add()
-      => new UnsupportedError("Cannot add to unmodifiable List");
-
-  /** Error thrown when trying to add elements to an unmodifiable list. */
-  static UnsupportedError change()
-      => new UnsupportedError(
-             "Cannot change the content of an unmodifiable List");
-
-  /** Error thrown when trying to change the length of an unmodifiable list. */
-  static UnsupportedError length()
-      => new UnsupportedError("Cannot change length of unmodifiable List");
-
-  /** Error thrown when trying to remove elements from an unmodifiable list. */
-  static UnsupportedError remove()
-      => new UnsupportedError("Cannot remove from unmodifiable List");
-}
-
-/**
- * Creates errors thrown by non-growable lists when they are attempted modified.
- *
- * This class creates [UnsupportedError]s with specialized messages.
- */
-abstract class NonGrowableListError {
-  /** Error thrown when trying to add elements to an non-growable list. */
-  static UnsupportedError add()
-      => new UnsupportedError("Cannot add to non-growable List");
-
-  /** Error thrown when trying to change the length of an non-growable list. */
-  static UnsupportedError length()
-      => new UnsupportedError("Cannot change length of non-growable List");
-
-  /** Error thrown when trying to remove elements from an non-growable list. */
-  static UnsupportedError remove()
-      => new UnsupportedError("Cannot remove from non-growable List");
-}
-
-/**
- * Converts a growable list to a fixed length list with the same elements.
- *
- * For internal use only.
- * Only works on growable lists as created by `[]` or `new List()`.
- * May throw on any other list.
- *
- * The operation is efficient. It doesn't copy the elements, but converts
- * the existing list directly to a fixed length list.
- * That means that it is a destructive conversion.
- * The original list should not be used afterwards.
- *
- * The returned list may be the same list as the original,
- * or it may be a different list (according to [identical]).
- * The original list may have changed type to be a fixed list,
- * or become empty or been otherwise modified.
- * It will still be a valid object, so references to it will not, e.g., crash
- * the runtime if accessed, but no promises are made wrt. its contents.
- *
- * This unspecified behavior is the reason the function is not exposed to
- * users. We allow the underlying implementation to make the most efficient
- * conversion, at the cost of leaving the original list in an unspecified
- * state.
- */
-external List/*<E>*/ makeListFixedLength/*<E>*/(List/*<E>*/ growableList);
-
-/**
- * Converts a fixed-length list to an unmodifiable list.
- *
- * For internal use only.
- * Only works for core fixed-length lists as created by `new List(length)`,
- * or as returned by [makeListFixedLength].
- *
- * The operation is efficient. It doesn't copy the elements, but converts
- * the existing list directly to a fixed length list.
- * That means that it is a destructive conversion.
- * The original list should not be used afterwards.
- *
- * The unmodifiable list type is similar to the one used by const lists.
- */
-external List/*<E>*/ makeFixedListUnmodifiable/*<E>*/(
-    List/*<E>*/ fixedLengthList);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/lists.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/lists.dart
deleted file mode 100644
index 0f5d8e7..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/lists.dart
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart._internal;
-
-class Lists {
-  static void copy(List src, int srcStart,
-                   List dst, int dstStart, int count) {
-    if (srcStart < dstStart) {
-      for (int i = srcStart + count - 1, j = dstStart + count - 1;
-           i >= srcStart; i--, j--) {
-        dst[j] = src[i];
-      }
-    } else {
-      for (int i = srcStart, j = dstStart; i < srcStart + count; i++, j++) {
-        dst[j] = src[i];
-      }
-    }
-  }
-
-  static bool areEqual(List a, var b) {
-    if (identical(a, b)) return true;
-    if (!(b is List)) return false;
-    int length = a.length;
-    if (length != b.length) return false;
-
-    for (int i = 0; i < length; i++) {
-      if (!identical(a[i], b[i])) return false;
-    }
-    return true;
-  }
-
-  /**
-   * Returns the index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to [endIndex] (exclusive).
-   * Returns -1 if [element] is not found.
-   */
-  static int indexOf(List a,
-                     Object element,
-                     int startIndex,
-                     int endIndex) {
-    if (startIndex >= a.length) {
-      return -1;
-    }
-    if (startIndex < 0) {
-      startIndex = 0;
-    }
-    for (int i = startIndex; i < endIndex; i++) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  /**
-   * Returns the last index in the list [a] of the given [element], starting
-   * the search at index [startIndex] to 0.
-   * Returns -1 if [element] is not found.
-   */
-  static int lastIndexOf(List a, Object element, int startIndex) {
-    if (startIndex < 0) {
-      return -1;
-    }
-    if (startIndex >= a.length) {
-      startIndex = a.length - 1;
-    }
-    for (int i = startIndex; i >= 0; i--) {
-      if (a[i] == element) {
-        return i;
-      }
-    }
-    return -1;
-  }
-
-  static void indicesCheck(List a, int start, int end) {
-    RangeError.checkValidRange(start, end, a.length);
-  }
-
-  static void rangeCheck(List a, int start, int length) {
-    RangeError.checkNotNegative(length);
-    RangeError.checkNotNegative(start);
-    if (start + length > a.length) {
-      String message = "$start + $length must be in the range [0..${a.length}]";
-      throw new RangeError.range(length, 0, a.length - start,
-                                 "length", message);
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/print.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/print.dart
deleted file mode 100644
index c3e23b8..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/print.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// 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.
-
-part of dart._internal;
-
-/**
- * This function is set by the first allocation of a Zone.
- *
- * Once the function is set the core `print` function calls this closure instead
- * of [printToConsole].
- *
- * This decouples the core library from the async library.
- */
-Function printToZone = null;
-
-external void printToConsole(String line);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/sort.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/sort.dart
deleted file mode 100644
index 63037ea..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/sort.dart
+++ /dev/null
@@ -1,344 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart._internal;
-
-/**
- * Dual-Pivot Quicksort algorithm.
- *
- * This class implements the dual-pivot quicksort algorithm as presented in
- * Vladimir Yaroslavskiy's paper.
- *
- * Some improvements have been copied from Android's implementation.
- */
-class Sort {
-  // When a list has less then [:_INSERTION_SORT_THRESHOLD:] elements it will
-  // be sorted by an insertion sort.
-  static const int _INSERTION_SORT_THRESHOLD = 32;
-
-  /**
-   * Sorts all elements of the given list [:a:] according to the given
-   * [:compare:] function.
-   *
-   * The [:compare:] function takes two arguments [:x:] and [:y:] and returns
-   *  -1 if [:x < y:],
-   *   0 if [:x == y:], and
-   *   1 if [:x > y:].
-   *
-   * The function's behavior must be consistent. It must not return different
-   * results for the same values.
-   */
-  static void sort/*<E>*/(List/*<E>*/ a, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
-    _doSort(a, 0, a.length - 1, compare);
-  }
-
-  /**
-   * Sorts all elements in the range [:from:] (inclusive) to [:to:] (exclusive)
-   * of the given list [:a:].
-   *
-   * If the given range is invalid an "OutOfRange" error is raised.
-   * TODO(floitsch): do we want an error?
-   *
-   * See [:sort:] for requirements of the [:compare:] function.
-   */
-  static void sortRange/*<E>*/(List/*<E>*/ a, int from, int to, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
-    if ((from < 0) || (to > a.length) || (to < from)) {
-      throw "OutOfRange";
-    }
-    _doSort(a, from, to - 1, compare);
-  }
-
-  /**
-   * Sorts the list in the interval [:left:] to [:right:] (both inclusive).
-   */
-  static void _doSort/*<E>*/(List/*<E>*/ a, int left, int right, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
-    if ((right - left) <= _INSERTION_SORT_THRESHOLD) {
-      _insertionSort(a, left, right, compare);
-    } else {
-      _dualPivotQuicksort(a, left, right, compare);
-    }
-  }
-
-  static void _insertionSort/*<E>*/(List/*<E>*/ a, int left, int right, int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
-    for (int i = left + 1; i <= right; i++) {
-      var el = a[i];
-      int j = i;
-      while ((j > left) && (compare(a[j - 1], el) > 0)) {
-        a[j] = a[j - 1];
-        j--;
-      }
-      a[j] = el;
-    }
-  }
-
-  static void _dualPivotQuicksort/*<E>*/(List/*<E>*/ a,
-                                  int left, int right,
-                                  int compare(dynamic /*=E*/ a, dynamic /*=E*/ b)) {
-    assert(right - left > _INSERTION_SORT_THRESHOLD);
-
-    // Compute the two pivots by looking at 5 elements.
-    int sixth = (right - left + 1) ~/ 6;
-    int index1 = left + sixth;
-    int index5 = right - sixth;
-    int index3 = (left + right) ~/ 2;  // The midpoint.
-    int index2 = index3 - sixth;
-    int index4 = index3 + sixth;
-
-    var el1 = a[index1];
-    var el2 = a[index2];
-    var el3 = a[index3];
-    var el4 = a[index4];
-    var el5 = a[index5];
-
-    // Sort the selected 5 elements using a sorting network.
-    if (compare(el1, el2) > 0) { var t = el1; el1 = el2; el2 = t; }
-    if (compare(el4, el5) > 0) { var t = el4; el4 = el5; el5 = t; }
-    if (compare(el1, el3) > 0) { var t = el1; el1 = el3; el3 = t; }
-    if (compare(el2, el3) > 0) { var t = el2; el2 = el3; el3 = t; }
-    if (compare(el1, el4) > 0) { var t = el1; el1 = el4; el4 = t; }
-    if (compare(el3, el4) > 0) { var t = el3; el3 = el4; el4 = t; }
-    if (compare(el2, el5) > 0) { var t = el2; el2 = el5; el5 = t; }
-    if (compare(el2, el3) > 0) { var t = el2; el2 = el3; el3 = t; }
-    if (compare(el4, el5) > 0) { var t = el4; el4 = el5; el5 = t; }
-
-    var pivot1 = el2;
-    var pivot2 = el4;
-
-    // el2 and el4 have been saved in the pivot variables. They will be written
-    // back, once the partioning is finished.
-    a[index1] = el1;
-    a[index3] = el3;
-    a[index5] = el5;
-
-    a[index2] = a[left];
-    a[index4] = a[right];
-
-    int less = left + 1;    // First element in the middle partition.
-    int great = right - 1;  // Last element in the middle partition.
-
-    bool pivots_are_equal = (compare(pivot1, pivot2) == 0);
-    if (pivots_are_equal) {
-      var pivot = pivot1;
-      // Degenerated case where the partioning becomes a dutch national flag
-      // problem.
-      //
-      // [ |  < pivot  | == pivot | unpartitioned | > pivot  | ]
-      //  ^             ^          ^             ^            ^
-      // left         less         k           great         right
-      //
-      // a[left] and a[right] are undefined and are filled after the
-      // partitioning.
-      //
-      // Invariants:
-      //   1) for x in ]left, less[ : x < pivot.
-      //   2) for x in [less, k[ : x == pivot.
-      //   3) for x in ]great, right[ : x > pivot.
-      for (int k = less; k <= great; k++) {
-        var ak = a[k];
-        int comp = compare(ak, pivot);
-        if (comp == 0) continue;
-        if (comp < 0) {
-          if (k != less) {
-            a[k] = a[less];
-            a[less] = ak;
-          }
-          less++;
-        } else {
-          // comp > 0.
-          //
-          // Find the first element <= pivot in the range [k - 1, great] and
-          // put [:ak:] there. We know that such an element must exist:
-          // When k == less, then el3 (which is equal to pivot) lies in the
-          // interval. Otherwise a[k - 1] == pivot and the search stops at k-1.
-          // Note that in the latter case invariant 2 will be violated for a
-          // short amount of time. The invariant will be restored when the
-          // pivots are put into their final positions.
-          while (true) {
-            comp = compare(a[great], pivot);
-            if (comp > 0) {
-              great--;
-              // This is the only location in the while-loop where a new
-              // iteration is started.
-              continue;
-            } else if (comp < 0) {
-              // Triple exchange.
-              a[k] = a[less];
-              a[less++] = a[great];
-              a[great--] = ak;
-              break;
-            } else {
-              // comp == 0;
-              a[k] = a[great];
-              a[great--] = ak;
-              // Note: if great < k then we will exit the outer loop and fix
-              // invariant 2 (which we just violated).
-              break;
-            }
-          }
-        }
-      }
-    } else {
-      // We partition the list into three parts:
-      //  1. < pivot1
-      //  2. >= pivot1 && <= pivot2
-      //  3. > pivot2
-      //
-      // During the loop we have:
-      // [ | < pivot1 | >= pivot1 && <= pivot2 | unpartitioned  | > pivot2  | ]
-      //  ^            ^                        ^              ^             ^
-      // left         less                     k              great        right
-      //
-      // a[left] and a[right] are undefined and are filled after the
-      // partitioning.
-      //
-      // Invariants:
-      //   1. for x in ]left, less[ : x < pivot1
-      //   2. for x in [less, k[ : pivot1 <= x && x <= pivot2
-      //   3. for x in ]great, right[ : x > pivot2
-      for (int k = less; k <= great; k++) {
-        var ak = a[k];
-        int comp_pivot1 = compare(ak, pivot1);
-        if (comp_pivot1 < 0) {
-          if (k != less) {
-            a[k] = a[less];
-            a[less] = ak;
-          }
-          less++;
-        } else {
-          int comp_pivot2 = compare(ak, pivot2);
-          if (comp_pivot2 > 0) {
-            while (true) {
-              int comp = compare(a[great], pivot2);
-              if (comp > 0) {
-                great--;
-                if (great < k) break;
-                // This is the only location inside the loop where a new
-                // iteration is started.
-                continue;
-              } else {
-                // a[great] <= pivot2.
-                comp = compare(a[great], pivot1);
-                if (comp < 0) {
-                  // Triple exchange.
-                  a[k] = a[less];
-                  a[less++] = a[great];
-                  a[great--] = ak;
-                } else {
-                  // a[great] >= pivot1.
-                  a[k] = a[great];
-                  a[great--] = ak;
-                }
-                break;
-              }
-            }
-          }
-        }
-      }
-    }
-
-    // Move pivots into their final positions.
-    // We shrunk the list from both sides (a[left] and a[right] have
-    // meaningless values in them) and now we move elements from the first
-    // and third partition into these locations so that we can store the
-    // pivots.
-    a[left] = a[less - 1];
-    a[less - 1] = pivot1;
-    a[right] = a[great + 1];
-    a[great + 1] = pivot2;
-
-    // The list is now partitioned into three partitions:
-    // [ < pivot1   | >= pivot1 && <= pivot2   |  > pivot2   ]
-    //  ^            ^                        ^             ^
-    // left         less                     great        right
-
-    // Recursive descent. (Don't include the pivot values.)
-    _doSort(a, left, less - 2, compare);
-    _doSort(a, great + 2, right, compare);
-
-    if (pivots_are_equal) {
-      // All elements in the second partition are equal to the pivot. No
-      // need to sort them.
-      return;
-    }
-
-    // In theory it should be enough to call _doSort recursively on the second
-    // partition.
-    // The Android source however removes the pivot elements from the recursive
-    // call if the second partition is too large (more than 2/3 of the list).
-    if (less < index1 && great > index5) {
-      while (compare(a[less], pivot1) == 0) { less++; }
-      while (compare(a[great], pivot2) == 0) { great--; }
-
-      // Copy paste of the previous 3-way partitioning with adaptions.
-      //
-      // We partition the list into three parts:
-      //  1. == pivot1
-      //  2. > pivot1 && < pivot2
-      //  3. == pivot2
-      //
-      // During the loop we have:
-      // [ == pivot1 | > pivot1 && < pivot2 | unpartitioned  | == pivot2 ]
-      //              ^                      ^              ^
-      //            less                     k              great
-      //
-      // Invariants:
-      //   1. for x in [ *, less[ : x == pivot1
-      //   2. for x in [less, k[ : pivot1 < x && x < pivot2
-      //   3. for x in ]great, * ] : x == pivot2
-      for (int k = less; k <= great; k++) {
-        var ak = a[k];
-        int comp_pivot1 = compare(ak, pivot1);
-        if (comp_pivot1 == 0) {
-          if (k != less) {
-            a[k] = a[less];
-            a[less] = ak;
-          }
-          less++;
-        } else {
-          int comp_pivot2 = compare(ak, pivot2);
-          if (comp_pivot2 == 0) {
-            while (true) {
-              int comp = compare(a[great], pivot2);
-              if (comp == 0) {
-                great--;
-                if (great < k) break;
-                // This is the only location inside the loop where a new
-                // iteration is started.
-                continue;
-              } else {
-                // a[great] < pivot2.
-                comp = compare(a[great], pivot1);
-                if (comp < 0) {
-                  // Triple exchange.
-                  a[k] = a[less];
-                  a[less++] = a[great];
-                  a[great--] = ak;
-                } else {
-                  // a[great] == pivot1.
-                  a[k] = a[great];
-                  a[great--] = ak;
-                }
-                break;
-              }
-            }
-          }
-        }
-      }
-      // The second partition has now been cleared of pivot elements and looks
-      // as follows:
-      // [  *  |  > pivot1 && < pivot2  | * ]
-      //        ^                      ^
-      //       less                  great
-      // Sort the second partition using recursive descent.
-      _doSort(a, less, great, compare);
-    } else {
-      // The second partition looks as follows:
-      // [  *  |  >= pivot1 && <= pivot2  | * ]
-      //        ^                        ^
-      //       less                    great
-      // Simply sort it by recursive descent.
-      _doSort(a, less, great, compare);
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart b/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart
deleted file mode 100644
index b1aa855..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/internal/symbol.dart
+++ /dev/null
@@ -1,152 +0,0 @@
-// 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.
-
-part of dart._internal;
-
-/**
- * Implementation of [core.Symbol].  This class uses the same name as
- * a core class so a user can't tell the difference.
- *
- * The purpose of this class is to hide [_name] from user code, but
- * make it accessible to Dart platform code via the static method
- * [getName].
- */
-class Symbol implements core.Symbol {
-  final String _name;
-
-  // Used internally by DDC to map ES6 symbols to Dart.
-  final dynamic _nativeSymbol;
-
-  /**
-   * Source of RegExp matching Dart reserved words.
-   *
-   * Reserved words are not allowed as identifiers.
-   */
-  static const String reservedWordRE =
-      r'(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|'
-      r'e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|'
-      r'ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|'
-      r'v(?:ar|oid)|w(?:hile|ith))';
-  /**
-   * Source of RegExp matching any public identifier.
-   *
-   * A public identifier is a valid identifier (not a reserved word)
-   * that doesn't start with '_'.
-   */
-  static const String publicIdentifierRE =
-      r'(?!' '$reservedWordRE' r'\b(?!\$))[a-zA-Z$][\w$]*';
-  /**
-   * Source of RegExp matching any identifier.
-   *
-   * It matches identifiers but not reserved words. The identifiers
-   * may start with '_'.
-   */
-  static const String identifierRE =
-      r'(?!' '$reservedWordRE' r'\b(?!\$))[a-zA-Z$_][\w$]*';
-  /**
-   * Source of RegExp matching a declarable operator names.
-   *
-   * The operators that can be declared using `operator` declarations are
-   * also the only ones allowed as symbols. The name of the oeprators is
-   * the same as the operator itself except for unary minus, where the name
-   * is "unary-".
-   */
-  static const String operatorRE =
-      r'(?:[\-+*/%&|^]|\[\]=?|==|~/?|<[<=]?|>[>=]?|unary-)';
-
-  // Grammar if symbols:
-  //    symbol ::= qualifiedName | <empty>
-  //    qualifiedName ::= publicIdentifier '.' qualifiedName | name
-  //    name ::= publicIdentifier
-  //           | publicIdentifier '='
-  //           | operator
-  // where publicIdentifier is any valid identifier (not a reserved word)
-  // that isn't private (doesn't start with '_').
-  //
-  // Railroad diagram of the accepted grammar:
-  //
-  //    /----------------\
-  //    |                |
-  //    |          /-[.]-/     /-[=]-\
-  //    \         /           /       \
-  //  -------[id]------------------------->
-  //       \                     /
-  //        \------[operator]---/
-  //            \              /
-  //             \------------/
-  //
-
-  /**
-   * RegExp that validates a non-empty non-private symbol.
-   *
-   * The empty symbol is handled before this regexp is used, and is not
-   * accepted.
-   */
-  static final RegExp publicSymbolPattern = new RegExp(
-      '^(?:$operatorRE\$|$publicIdentifierRE(?:=?\$|[.](?!\$)))+?\$');
-
-  // The grammar of symbols that may be private is the same as for public
-  // symbols, except that "publicIdentifier" is replaced by "identifier",
-  // which matches any identifier.
-
-  /**
-   * RegExp that validates a non-empty symbol.
-   *
-   * Private symbols are accepted.
-   *
-   * The empty symbol is handled before this regexp is used, and is not
-   * accepted.
-   */
-  static final RegExp symbolPattern =
-      new RegExp('^(?:$operatorRE\$|$identifierRE(?:=?\$|[.](?!\$)))+?\$');
-
-  external const Symbol(String name);
-
-  external const Symbol.es6(String name, nativeSymbol);
-
-  /**
-   * Platform-private method used by the mirror system to create
-   * otherwise invalid names.
-   */
-  const Symbol.unvalidated(this._name) : this._nativeSymbol = null;
-
-  // This is called by dart2js.
-  Symbol.validated(String name)
-      : this._name = validatePublicSymbol(name),
-        this._nativeSymbol = null;
-
-  bool operator ==(Object other) =>
-      other is Symbol &&
-      _name == other._name &&
-      _nativeSymbol == other._nativeSymbol;
-
-  external int get hashCode;
-
-  toString() => 'Symbol("$_name")';
-
-  /// Platform-private accessor which cannot be called from user libraries.
-  static String getName(Symbol symbol) => symbol._name;
-
-  static dynamic getNativeSymbol(Symbol symbol) => symbol._nativeSymbol;
-
-  static String validatePublicSymbol(String name) {
-    if (name.isEmpty || publicSymbolPattern.hasMatch(name)) return name;
-    if (name.startsWith('_')) {
-      // There may be other private parts in a qualified name than the first
-      // one, but this is a common case that deserves a specific error
-      // message.
-      throw new ArgumentError('"$name" is a private identifier');
-    }
-    throw new ArgumentError('"$name" is not a valid (qualified) symbol name');
-  }
-
-  /**
-   * Checks whether name is a valid symbol name.
-   *
-   * This test allows both private and non-private symbols.
-   */
-  static bool isValidSymbol(String name) {
-    return (name.isEmpty || symbolPattern.hasMatch(name));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/bytes_builder.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/bytes_builder.dart
deleted file mode 100644
index 979e657..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/bytes_builder.dart
+++ /dev/null
@@ -1,206 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * Builds a list of bytes, allowing bytes and lists of bytes to be added at the
- * end.
- *
- * Used to efficiently collect bytes and lists of bytes.
- */
-abstract class BytesBuilder {
-  /**
-   * Construct a new empty [BytesBuilder].
-   *
-   * If [copy] is true, the data is always copied when added to the list. If
-   * it [copy] is false, the data is only copied if needed. That means that if
-   * the lists are changed after added to the [BytesBuilder], it may effect the
-   * output. Default is `true`.
-   */
-  factory BytesBuilder({bool copy: true}) {
-    if (copy) {
-      return new _CopyingBytesBuilder();
-    } else {
-      return new _BytesBuilder();
-    }
-  }
-
-  /**
-   * Appends [bytes] to the current contents of the builder.
-   *
-   * Each value of [bytes] will be bit-representation truncated to the range
-   * 0 .. 255.
-   */
-  void add(List<int> bytes);
-
-  /**
-   * Append [byte] to the current contents of the builder.
-   *
-   * The [byte] will be bit-representation truncated to the range 0 .. 255.
-   */
-  void addByte(int byte);
-
-  /**
-   * Returns the contents of `this` and clears `this`.
-   *
-   * The list returned is a view of the internal buffer, limited to the
-   * [length].
-   */
-  List<int> takeBytes();
-
-  /**
-   * Returns a copy of the current contents of the builder.
-   *
-   * Leaves the contents of the builder intact.
-   */
-  List<int> toBytes();
-
-  /**
-   * The number of bytes in the builder.
-   */
-  int get length;
-
-  /**
-   * Returns `true` if the buffer is empty.
-   */
-  bool get isEmpty;
-
-  /**
-   * Returns `true` if the buffer is not empty.
-   */
-  bool get isNotEmpty;
-
-  /**
-   * Clear the contents of the builder.
-   */
-  void clear();
-}
-
-
-class _CopyingBytesBuilder implements BytesBuilder {
-  // Start with 1024 bytes.
-  static const int _INIT_SIZE = 1024;
-
-  int _length = 0;
-  Uint8List _buffer;
-
-  void add(List<int> bytes) {
-    int bytesLength = bytes.length;
-    if (bytesLength == 0) return;
-    int required = _length + bytesLength;
-    if (_buffer == null) {
-      int size = _pow2roundup(required);
-      size = max(size, _INIT_SIZE);
-      _buffer = new Uint8List(size);
-    } else if (_buffer.length < required) {
-      // We will create a list in the range of 2-4 times larger than
-      // required.
-      int size = _pow2roundup(required) * 2;
-      var newBuffer = new Uint8List(size);
-      newBuffer.setRange(0, _buffer.length, _buffer);
-      _buffer = newBuffer;
-    }
-    assert(_buffer.length >= required);
-    if (bytes is Uint8List) {
-      _buffer.setRange(_length, required, bytes);
-    } else {
-      for (int i = 0; i < bytesLength; i++) {
-        _buffer[_length + i] = bytes[i];
-      }
-    }
-    _length = required;
-  }
-
-  void addByte(int byte) { add([byte]); }
-
-  List<int> takeBytes() {
-    if (_buffer == null) return new Uint8List(0);
-    var buffer = new Uint8List.view(_buffer.buffer, 0, _length);
-    clear();
-    return buffer;
-  }
-
-  List<int> toBytes() {
-    if (_buffer == null) return new Uint8List(0);
-    return new Uint8List.fromList(
-        new Uint8List.view(_buffer.buffer, 0, _length));
-  }
-
-  int get length => _length;
-
-  bool get isEmpty => _length == 0;
-
-  bool get isNotEmpty => _length != 0;
-
-  void clear() {
-    _length = 0;
-    _buffer = null;
-  }
-
-  int _pow2roundup(int x) {
-    --x;
-    x |= x >> 1;
-    x |= x >> 2;
-    x |= x >> 4;
-    x |= x >> 8;
-    x |= x >> 16;
-    return x + 1;
-  }
-}
-
-
-class _BytesBuilder implements BytesBuilder {
-  int _length = 0;
-  final _chunks = <List<int>>[];
-
-  void add(List<int> bytes) {
-    if (bytes is! Uint8List) {
-      bytes = new Uint8List.fromList(bytes);
-    }
-    _chunks.add(bytes);
-    _length += bytes.length;
-  }
-
-  void addByte(int byte) { add([byte]); }
-
-  List<int> takeBytes() {
-    if (_chunks.length == 0) return new Uint8List(0);
-    if (_chunks.length == 1) {
-      var buffer = _chunks.single;
-      clear();
-      return buffer;
-    }
-    var buffer = new Uint8List(_length);
-    int offset = 0;
-    for (var chunk in _chunks) {
-      buffer.setRange(offset, offset + chunk.length, chunk);
-      offset += chunk.length;
-    }
-    clear();
-    return buffer;
-  }
-
-  List<int> toBytes() {
-    if (_chunks.length == 0) return new Uint8List(0);
-    var buffer = new Uint8List(_length);
-    int offset = 0;
-    for (var chunk in _chunks) {
-      buffer.setRange(offset, offset + chunk.length, chunk);
-      offset += chunk.length;
-    }
-    return buffer;
-  }
-
-  int get length => _length;
-
-  bool get isEmpty => _length == 0;
-
-  bool get isNotEmpty => _length != 0;
-
-  void clear() {
-    _length = 0;
-    _chunks.clear();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/common.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/common.dart
deleted file mode 100644
index ea35580..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/common.dart
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-// Constants used when working with native ports.
-// These must match the constants in runtime/bin/dartutils.h class CObject.
-const int _SUCCESS_RESPONSE = 0;
-const int _ILLEGAL_ARGUMENT_RESPONSE = 1;
-const int _OSERROR_RESPONSE = 2;
-const int _FILE_CLOSED_RESPONSE = 3;
-
-const int _ERROR_RESPONSE_ERROR_TYPE = 0;
-const int _OSERROR_RESPONSE_ERROR_CODE = 1;
-const int _OSERROR_RESPONSE_MESSAGE = 2;
-
-// Functions used to receive exceptions from native ports.
-bool _isErrorResponse(response) =>
-    response is List && response[0] != _SUCCESS_RESPONSE;
-
-/**
- * Returns an Exception or an Error
- */
-_exceptionFromResponse(response, String message, String path) {
-  assert(_isErrorResponse(response));
-  switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-    case _ILLEGAL_ARGUMENT_RESPONSE:
-      return new ArgumentError();
-    case _OSERROR_RESPONSE:
-      var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-                            response[_OSERROR_RESPONSE_ERROR_CODE]);
-      return new FileSystemException(message, path, err);
-    case _FILE_CLOSED_RESPONSE:
-      return new FileSystemException("File closed", path);
-    default:
-      return new Exception("Unknown error");
-  }
-}
-
-/**
- * Base class for all IO related exceptions.
- */
-abstract class IOException implements Exception {
-  String toString() => "IOException";
-}
-
-/**
-  * An [OSError] object holds information about an error from the
-  * operating system.
-  */
-class OSError {
-  /** Constant used to indicate that no OS error code is available. */
-  static const int noErrorCode = -1;
-
-  /**
-    * Error message supplied by the operating system. null if no message is
-    * associated with the error.
-    */
-  final String message;
-
-  /**
-    * Error code supplied by the operating system. Will have the value
-    * [noErrorCode] if there is no error code associated with the error.
-    */
-  final int errorCode;
-
-  /** Creates an OSError object from a message and an errorCode. */
-  const OSError([this.message = "", this.errorCode = noErrorCode]);
-
-  /** Converts an OSError object to a string representation. */
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("OS Error");
-    if (!message.isEmpty) {
-      sb..write(": ")
-        ..write(message);
-      if (errorCode != noErrorCode) {
-        sb..write(", errno = ")
-          ..write(errorCode.toString());
-      }
-    } else if (errorCode != noErrorCode) {
-      sb..write(": errno = ")
-        ..write(errorCode.toString());
-    }
-    return sb.toString();
-  }
-}
-
-
-// Object for holding a buffer and an offset.
-class _BufferAndStart {
-  List buffer;
-  int start;
-  _BufferAndStart(this.buffer, this.start);
-}
-
-// Ensure that the input List can be serialized through a native port.
-// Only Int8List and Uint8List Lists are serialized directly.
-// All other lists are first copied into a Uint8List. This has the added
-// benefit that it is faster to access from the C code as well.
-_BufferAndStart _ensureFastAndSerializableByteData(
-    List buffer, int start, int end) {
-  if (buffer is Uint8List || buffer is Int8List) {
-    return new _BufferAndStart(buffer, start);
-  }
-  int length = end - start;
-  var newBuffer = new Uint8List(length);
-  int j = start;
-  for (int i = 0; i < length; i++) {
-    int value = buffer[j];
-    if (value is! int) {
-      throw new ArgumentError("List element is not an integer at index $j");
-    }
-    newBuffer[i] = value;
-    j++;
-  }
-  return new _BufferAndStart(newBuffer, 0);
-}
-
-
-class _IOCrypto {
-  external static Uint8List getRandomBytes(int count);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/crypto.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/crypto.dart
deleted file mode 100644
index 82cff5e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/crypto.dart
+++ /dev/null
@@ -1,448 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-class _CryptoUtils {
-  static const int PAD = 61; // '='
-  static const int CR = 13;  // '\r'
-  static const int LF = 10;  // '\n'
-  static const int LINE_LENGTH = 76;
-
-  static const String _encodeTable =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
-
-  static const String _encodeTableUrlSafe =
-      "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
-
-  // Lookup table used for finding Base 64 alphabet index of a given byte.
-  // -2 : Outside Base 64 alphabet.
-  // -1 : '\r' or '\n'
-  //  0 : = (Padding character).
-  // >0 : Base 64 alphabet index of given byte.
-  static const List<int> _decodeTable =
-      const [ -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -2, -2, -1, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, 62, -2, 63,
-              52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2,  0, -2, -2,
-              -2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
-              15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, 63,
-              -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
-              41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
-              -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2 ];
-
-  static String bytesToHex(List<int> bytes) {
-    var result = new StringBuffer();
-    for (var part in bytes) {
-      result.write('${part < 16 ? '0' : ''}${part.toRadixString(16)}');
-    }
-    return result.toString();
-  }
-
-  static String bytesToBase64(List<int> bytes,
-                              [bool urlSafe = false,
-                               bool addLineSeparator = false]) {
-    int len = bytes.length;
-    if (len == 0) {
-      return "";
-    }
-    final String lookup = urlSafe ? _encodeTableUrlSafe : _encodeTable;
-    // Size of 24 bit chunks.
-    final int remainderLength = len.remainder(3);
-    final int chunkLength = len - remainderLength;
-    // Size of base output.
-    int outputLen = ((len ~/ 3) * 4) + ((remainderLength > 0) ? 4 : 0);
-    // Add extra for line separators.
-    if (addLineSeparator) {
-      outputLen += ((outputLen - 1) ~/ LINE_LENGTH) << 1;
-    }
-    List<int> out = new List<int>(outputLen);
-
-    // Encode 24 bit chunks.
-    int j = 0, i = 0, c = 0;
-    while (i < chunkLength) {
-      int x = ((bytes[i++] << 16) & 0xFFFFFF) |
-              ((bytes[i++] << 8) & 0xFFFFFF) |
-                bytes[i++];
-      out[j++] = lookup.codeUnitAt(x >> 18);
-      out[j++] = lookup.codeUnitAt((x >> 12) & 0x3F);
-      out[j++] = lookup.codeUnitAt((x >> 6)  & 0x3F);
-      out[j++] = lookup.codeUnitAt(x & 0x3f);
-      // Add optional line separator for each 76 char output.
-      if (addLineSeparator && ++c == 19 && j < outputLen - 2) {
-          out[j++] = CR;
-          out[j++] = LF;
-          c = 0;
-      }
-    }
-
-    // If input length if not a multiple of 3, encode remaining bytes and
-    // add padding.
-    if (remainderLength == 1) {
-      int x = bytes[i];
-      out[j++] = lookup.codeUnitAt(x >> 2);
-      out[j++] = lookup.codeUnitAt((x << 4) & 0x3F);
-      out[j++] = PAD;
-      out[j++] = PAD;
-    } else if (remainderLength == 2) {
-      int x = bytes[i];
-      int y = bytes[i + 1];
-      out[j++] = lookup.codeUnitAt(x >> 2);
-      out[j++] = lookup.codeUnitAt(((x << 4) | (y >> 4)) & 0x3F);
-      out[j++] = lookup.codeUnitAt((y << 2) & 0x3F);
-      out[j++] = PAD;
-    }
-
-    return new String.fromCharCodes(out);
-  }
-
-  static List<int> base64StringToBytes(String input,
-                                       [bool ignoreInvalidCharacters = true]) {
-    int len = input.length;
-    if (len == 0) {
-      return new List<int>(0);
-    }
-
-    // Count '\r', '\n' and illegal characters, For illegal characters,
-    // if [ignoreInvalidCharacters] is false, throw an exception.
-    int extrasLen = 0;
-    for (int i = 0; i < len; i++) {
-      int c = _decodeTable[input.codeUnitAt(i)];
-      if (c < 0) {
-        extrasLen++;
-        if(c == -2 && !ignoreInvalidCharacters) {
-          throw new FormatException('Invalid character: ${input[i]}');
-        }
-      }
-    }
-
-    if ((len - extrasLen) % 4 != 0) {
-      throw new FormatException('''Size of Base 64 characters in Input
-          must be a multiple of 4. Input: $input''');
-    }
-
-    // Count pad characters, ignore illegal characters at the end.
-    int padLength = 0;
-    for (int i = len - 1; i >= 0; i--) {
-      int currentCodeUnit = input.codeUnitAt(i);
-      if (_decodeTable[currentCodeUnit] > 0) break;
-      if (currentCodeUnit == PAD) padLength++;
-    }
-    int outputLen = (((len - extrasLen) * 6) >> 3) - padLength;
-    List<int> out = new List<int>(outputLen);
-
-    for (int i = 0, o = 0; o < outputLen;) {
-      // Accumulate 4 valid 6 bit Base 64 characters into an int.
-      int x = 0;
-      for (int j = 4; j > 0;) {
-        int c = _decodeTable[input.codeUnitAt(i++)];
-        if (c >= 0) {
-          x = ((x << 6) & 0xFFFFFF) | c;
-          j--;
-        }
-      }
-      out[o++] = x >> 16;
-      if (o < outputLen) {
-        out[o++] = (x >> 8) & 0xFF;
-        if (o < outputLen) out[o++] = x & 0xFF;
-      }
-    }
-    return out;
-  }
-
-}
-
-// Constants.
-const _MASK_8 = 0xff;
-const _MASK_32 = 0xffffffff;
-const _BITS_PER_BYTE = 8;
-const _BYTES_PER_WORD = 4;
-
-// Base class encapsulating common behavior for cryptographic hash
-// functions.
-abstract class _HashBase {
-  // Hasher state.
-  final int _chunkSizeInWords;
-  final int _digestSizeInWords;
-  final bool _bigEndianWords;
-  int _lengthInBytes = 0;
-  List<int> _pendingData;
-  List<int> _currentChunk;
-  List<int> _h;
-  bool _digestCalled = false;
-
-  _HashBase(this._chunkSizeInWords,
-            this._digestSizeInWords,
-            this._bigEndianWords)
-      : _pendingData = [] {
-    _currentChunk = new List(_chunkSizeInWords);
-    _h = new List(_digestSizeInWords);
-  }
-
-  // Update the hasher with more data.
-  add(List<int> data) {
-    if (_digestCalled) {
-      throw new StateError(
-          'Hash update method called after digest was retrieved');
-    }
-    _lengthInBytes += data.length;
-    _pendingData.addAll(data);
-    _iterate();
-  }
-
-  // Finish the hash computation and return the digest string.
-  List<int> close() {
-    if (_digestCalled) {
-      return _resultAsBytes();
-    }
-    _digestCalled = true;
-    _finalizeData();
-    _iterate();
-    assert(_pendingData.length == 0);
-    return _resultAsBytes();
-  }
-
-  // Returns the block size of the hash in bytes.
-  int get blockSize {
-    return _chunkSizeInWords * _BYTES_PER_WORD;
-  }
-
-  // Create a fresh instance of this Hash.
-  newInstance();
-
-  // One round of the hash computation.
-  _updateHash(List<int> m);
-
-  // Helper methods.
-  _add32(x, y) => (x + y) & _MASK_32;
-  _roundUp(val, n) => (val + n - 1) & -n;
-
-  // Rotate left limiting to unsigned 32-bit values.
-  int _rotl32(int val, int shift) {
-    var mod_shift = shift & 31;
-    return ((val << mod_shift) & _MASK_32) |
-        ((val & _MASK_32) >> (32 - mod_shift));
-  }
-
-
-  // Compute the final result as a list of bytes from the hash words.
-  _resultAsBytes() {
-    var result = [];
-    for (var i = 0; i < _h.length; i++) {
-      result.addAll(_wordToBytes(_h[i]));
-    }
-    return result;
-  }
-
-  // Converts a list of bytes to a chunk of 32-bit words.
-  _bytesToChunk(List<int> data, int dataIndex) {
-    assert((data.length - dataIndex) >= (_chunkSizeInWords * _BYTES_PER_WORD));
-
-    for (var wordIndex = 0; wordIndex < _chunkSizeInWords; wordIndex++) {
-      var w3 = _bigEndianWords ? data[dataIndex] : data[dataIndex + 3];
-      var w2 = _bigEndianWords ? data[dataIndex + 1] : data[dataIndex + 2];
-      var w1 = _bigEndianWords ? data[dataIndex + 2] : data[dataIndex + 1];
-      var w0 = _bigEndianWords ? data[dataIndex + 3] : data[dataIndex];
-      dataIndex += 4;
-      var word = (w3 & 0xff) << 24;
-      word |= (w2 & _MASK_8) << 16;
-      word |= (w1 & _MASK_8) << 8;
-      word |= (w0 & _MASK_8);
-      _currentChunk[wordIndex] = word;
-    }
-  }
-
-  // Convert a 32-bit word to four bytes.
-  _wordToBytes(int word) {
-    List<int> bytes = new List(_BYTES_PER_WORD);
-    bytes[0] = (word >> (_bigEndianWords ? 24 : 0)) & _MASK_8;
-    bytes[1] = (word >> (_bigEndianWords ? 16 : 8)) & _MASK_8;
-    bytes[2] = (word >> (_bigEndianWords ? 8 : 16)) & _MASK_8;
-    bytes[3] = (word >> (_bigEndianWords ? 0 : 24)) & _MASK_8;
-    return bytes;
-  }
-
-  // Iterate through data updating the hash computation for each
-  // chunk.
-  _iterate() {
-    var len = _pendingData.length;
-    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
-    if (len >= chunkSizeInBytes) {
-      var index = 0;
-      for (; (len - index) >= chunkSizeInBytes; index += chunkSizeInBytes) {
-        _bytesToChunk(_pendingData, index);
-        _updateHash(_currentChunk);
-      }
-      _pendingData = _pendingData.sublist(index, len);
-    }
-  }
-
-  // Finalize the data. Add a 1 bit to the end of the message. Expand with
-  // 0 bits and add the length of the message.
-  _finalizeData() {
-    _pendingData.add(0x80);
-    var contentsLength = _lengthInBytes + 9;
-    var chunkSizeInBytes = _chunkSizeInWords * _BYTES_PER_WORD;
-    var finalizedLength = _roundUp(contentsLength, chunkSizeInBytes);
-    var zeroPadding = finalizedLength - contentsLength;
-    for (var i = 0; i < zeroPadding; i++) {
-      _pendingData.add(0);
-    }
-    var lengthInBits = _lengthInBytes * _BITS_PER_BYTE;
-    assert(lengthInBits < pow(2, 32));
-    if (_bigEndianWords) {
-      _pendingData.addAll(_wordToBytes(0));
-      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
-    } else {
-      _pendingData.addAll(_wordToBytes(lengthInBits & _MASK_32));
-      _pendingData.addAll(_wordToBytes(0));
-    }
-  }
-}
-
-// The MD5 hasher is used to compute an MD5 message digest.
-class _MD5 extends _HashBase {
-  _MD5() : super(16, 4, false) {
-    _h[0] = 0x67452301;
-    _h[1] = 0xefcdab89;
-    _h[2] = 0x98badcfe;
-    _h[3] = 0x10325476;
-  }
-
-  // Returns a new instance of this Hash.
-  _MD5 newInstance() {
-    return new _MD5();
-  }
-
-  static const _k = const [
-    0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, 0xf57c0faf, 0x4787c62a,
-    0xa8304613, 0xfd469501, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
-    0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, 0xf61e2562, 0xc040b340,
-    0x265e5a51, 0xe9b6c7aa, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
-    0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, 0xa9e3e905, 0xfcefa3f8,
-    0x676f02d9, 0x8d2a4c8a, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
-    0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, 0x289b7ec6, 0xeaa127fa,
-    0xd4ef3085, 0x04881d05, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
-    0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, 0x655b59c3, 0x8f0ccc92,
-    0xffeff47d, 0x85845dd1, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
-    0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 ];
-
-  static const _r = const [
-    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5,  9, 14,
-    20, 5,  9, 14, 20, 5,  9, 14, 20, 5,  9, 14, 20, 4, 11, 16, 23, 4, 11,
-    16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6,
-    10, 15, 21, 6, 10, 15, 21 ];
-
-  // Compute one iteration of the MD5 algorithm with a chunk of
-  // 16 32-bit pieces.
-  void _updateHash(List<int> m) {
-    assert(m.length == 16);
-
-    var a = _h[0];
-    var b = _h[1];
-    var c = _h[2];
-    var d = _h[3];
-
-    var t0;
-    var t1;
-
-    for (var i = 0; i < 64; i++) {
-      if (i < 16) {
-        t0 = (b & c) | ((~b & _MASK_32) & d);
-        t1 = i;
-      } else if (i < 32) {
-        t0 = (d & b) | ((~d & _MASK_32) & c);
-        t1 = ((5 * i) + 1) % 16;
-      } else if (i < 48) {
-        t0 = b ^ c ^ d;
-        t1 = ((3 * i) + 5) % 16;
-      } else {
-        t0 = c ^ (b | (~d & _MASK_32));
-        t1 = (7 * i) % 16;
-      }
-
-      var temp = d;
-      d = c;
-      c = b;
-      b = _add32(b, _rotl32(_add32(_add32(a, t0),
-                                   _add32(_k[i], m[t1])),
-                            _r[i]));
-      a = temp;
-    }
-
-    _h[0] = _add32(a, _h[0]);
-    _h[1] = _add32(b, _h[1]);
-    _h[2] = _add32(c, _h[2]);
-    _h[3] = _add32(d, _h[3]);
-  }
-}
-
-// The SHA1 hasher is used to compute an SHA1 message digest.
-class _SHA1 extends _HashBase {
-  // Construct a SHA1 hasher object.
-  _SHA1() : _w = new List(80), super(16, 5, true) {
-    _h[0] = 0x67452301;
-    _h[1] = 0xEFCDAB89;
-    _h[2] = 0x98BADCFE;
-    _h[3] = 0x10325476;
-    _h[4] = 0xC3D2E1F0;
-  }
-
-  // Returns a new instance of this Hash.
-  _SHA1 newInstance() {
-    return new _SHA1();
-  }
-
-  // Compute one iteration of the SHA1 algorithm with a chunk of
-  // 16 32-bit pieces.
-  void _updateHash(List<int> m) {
-    assert(m.length == 16);
-
-    var a = _h[0];
-    var b = _h[1];
-    var c = _h[2];
-    var d = _h[3];
-    var e = _h[4];
-
-    for (var i = 0; i < 80; i++) {
-      if (i < 16) {
-        _w[i] = m[i];
-      } else {
-        var n = _w[i - 3] ^ _w[i - 8] ^ _w[i - 14] ^ _w[i - 16];
-        _w[i] = _rotl32(n, 1);
-      }
-      var t = _add32(_add32(_rotl32(a, 5), e), _w[i]);
-      if (i < 20) {
-        t = _add32(_add32(t, (b & c) | (~b & d)), 0x5A827999);
-      } else if (i < 40) {
-        t = _add32(_add32(t, (b ^ c ^ d)), 0x6ED9EBA1);
-      } else if (i < 60) {
-        t = _add32(_add32(t, (b & c) | (b & d) | (c & d)), 0x8F1BBCDC);
-      } else {
-        t = _add32(_add32(t, b ^ c ^ d), 0xCA62C1D6);
-      }
-
-      e = d;
-      d = c;
-      c = _rotl32(b, 30);
-      b = a;
-      a = t & _MASK_32;
-    }
-
-    _h[0] = _add32(a, _h[0]);
-    _h[1] = _add32(b, _h[1]);
-    _h[2] = _add32(c, _h[2]);
-    _h[3] = _add32(d, _h[3]);
-    _h[4] = _add32(e, _h[4]);
-  }
-
-  List<int> _w;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/data_transformer.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/data_transformer.dart
deleted file mode 100644
index 968fd20..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/data_transformer.dart
+++ /dev/null
@@ -1,587 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * Exposes ZLib options for input parameters.
- *
- * See http://www.zlib.net/manual.html for more documentation.
- */
-abstract class ZLibOption {
-  /// Minimal value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
-  /// and [ZLibDecoder.windowBits].
-  static const int MIN_WINDOW_BITS = 8;
-  /// Maximal value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
-  /// and [ZLibDecoder.windowBits].
-  static const int MAX_WINDOW_BITS = 15;
-  /// Default value for [ZLibCodec.windowBits], [ZLibEncoder.windowBits]
-  /// and [ZLibDecoder.windowBits].
-  static const int DEFAULT_WINDOW_BITS = 15;
-
-  /// Minimal value for [ZLibCodec.level], [ZLibEncoder.level]
-  /// and [ZLibDecoder.level].
-  static const int MIN_LEVEL = -1;
-  /// Maximal value for [ZLibCodec.level], [ZLibEncoder.level]
-  /// and [ZLibDecoder.level].
-  static const int MAX_LEVEL = 9;
-  /// Default value for [ZLibCodec.level], [ZLibEncoder.level]
-  /// and [ZLibDecoder.level].
-  static const int DEFAULT_LEVEL = 6;
-
-  /// Minimal value for [ZLibCodec.memLevel], [ZLibEncoder.memLevel]
-  /// and [ZLibDecoder.memLevel].
-  static const int MIN_MEM_LEVEL = 1;
-  /// Maximal value for [ZLibCodec.memLevel], [ZLibEncoder.memLevel]
-  /// and [ZLibDecoder.memLevel].
-  static const int MAX_MEM_LEVEL = 9;
-  /// Default value for [ZLibCodec.memLevel], [ZLibEncoder.memLevel]
-  /// and [ZLibDecoder.memLevel].
-  static const int DEFAULT_MEM_LEVEL = 8;
-
-
-  /// Recommended strategy for data produced by a filter (or predictor)
-  static const int STRATEGY_FILTERED = 1;
-  /// Use this strategy to force Huffman encoding only (no string match)
-  static const int STRATEGY_HUFFMAN_ONLY = 2;
-  /// Use this strategy to limit match distances to one (run-length encoding)
-  static const int STRATEGY_RLE = 3;
-  /// This strategy prevents the use of dynamic Huffman codes, allowing for a
-  /// simpler decoder
-  static const int STRATEGY_FIXED = 4;
-  /// Recommended strategy for normal data
-  static const int STRATEGY_DEFAULT = 0;
-}
-
-/**
- * An instance of the default implementation of the [ZLibCodec].
- */
-const ZLibCodec ZLIB = const ZLibCodec._default();
-
-/**
- * The [ZLibCodec] encodes raw bytes to ZLib compressed bytes and decodes ZLib
- * compressed bytes to raw bytes.
- */
-class ZLibCodec extends Codec<List<int>, List<int>> {
-  /**
-   * When true, `GZip` frames will be added to the compressed data.
-   */
-  final bool gzip;
-
-  /**
-   * The compression-[level] can be set in the range of `-1..9`, with `6` being
-   * the default compression level. Levels above `6` will have higher
-   * compression rates at the cost of more CPU and memory usage. Levels below
-   * `6` will use less CPU and memory at the cost of lower compression rates.
-   */
-  final int level;
-
-  /**
-   * Specifies how much memory should be allocated for the internal compression
-   * state. `1` uses minimum memory but is slow and reduces compression ratio;
-   * `9` uses maximum memory for optimal speed. The default value is `8`.
-   *
-   * The memory requirements for deflate are (in bytes):
-   *
-   *     (1 << (windowBits + 2)) +  (1 << (memLevel + 9))
-   * that is: 128K for windowBits = 15 + 128K for memLevel = 8 (default values)
-   */
-  final int memLevel;
-
-  /**
-   * Tunes the compression algorithm. Use the value STRATEGY_DEFAULT for normal
-   * data, STRATEGY_FILTERED for data produced by a filter (or predictor),
-   * STRATEGY_HUFFMAN_ONLY to force Huffman encoding only (no string match), or
-   * STRATEGY_RLE to limit match distances to one (run-length encoding).
-   */
-  final int strategy;
-
-  /**
-   * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range 8..15. Larger values result in better compression at
-   * the expense of memory usage. The default value is 15
-   */
-  final int windowBits;
-
-  /**
-   * When true, deflate generates raw data with no zlib header or trailer, and
-   * will not compute an adler32 check value
-   */
-  final bool raw;
-
-  /**
-   * Initial compression dictionary.
-   *
-   * It should consist of strings (byte sequences) that are likely to be
-   * encountered later in the data to be compressed, with the most commonly used
-   * strings preferably put towards the end of the dictionary. Using a
-   * dictionary is most useful when the data to be compressed is short and can
-   * be predicted with good accuracy; the data can then be compressed better
-   * than with the default empty dictionary.
-   */
-  final List<int> dictionary;
-
-  ZLibCodec({this.level: ZLibOption.DEFAULT_LEVEL,
-            this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-            this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-            this.strategy: ZLibOption.STRATEGY_DEFAULT,
-            this.dictionary: null,
-            this.raw: false,
-            this.gzip: false}) {
-    _validateZLibeLevel(level);
-    _validateZLibMemLevel(memLevel);
-    _validateZLibStrategy(strategy);
-    _validateZLibWindowBits(windowBits);
-  }
-
-  const ZLibCodec._default()
-      : level = ZLibOption.DEFAULT_LEVEL,
-        windowBits = ZLibOption.DEFAULT_WINDOW_BITS,
-        memLevel = ZLibOption.DEFAULT_MEM_LEVEL,
-        strategy = ZLibOption.STRATEGY_DEFAULT,
-        raw = false,
-        gzip = false,
-        dictionary = null;
-
-  /**
-   * Get a [ZLibEncoder] for encoding to `ZLib` compressed data.
-   */
-  ZLibEncoder get encoder =>
-      new ZLibEncoder(gzip: false, level: level, windowBits: windowBits,
-                      memLevel: memLevel, strategy: strategy,
-                      dictionary: dictionary, raw: raw);
-
-  /**
-   * Get a [ZLibDecoder] for decoding `ZLib` compressed data.
-   */
-  ZLibDecoder get decoder =>
-      new ZLibDecoder(windowBits: windowBits, dictionary: dictionary, raw: raw);
-}
-
-
-/**
- * An instance of the default implementation of the [GZipCodec].
- */
-const GZipCodec GZIP = const GZipCodec._default();
-
-
-/**
- * The [GZipCodec] encodes raw bytes to GZip compressed bytes and decodes GZip
- * compressed bytes to raw bytes.
- *
- * The difference between [ZLibCodec] and [GZipCodec] is that the [GZipCodec]
- * wraps the `ZLib` compressed bytes in `GZip` frames.
- */
-class GZipCodec extends Codec<List<int>, List<int>> {
-  /**
-   * When true, `GZip` frames will be added to the compressed data.
-   */
-  final bool gzip;
-
-  /**
-   * The compression-[level] can be set in the range of `-1..9`, with `6` being
-   * the default compression level. Levels above `6` will have higher
-   * compression rates at the cost of more CPU and memory usage. Levels below
-   * `6` will use less CPU and memory at the cost of lower compression rates.
-   */
-  final int level;
-
-  /**
-   * Specifies how much memory should be allocated for the internal compression
-   * state. `1` uses minimum memory but is slow and reduces compression ratio;
-   * `9` uses maximum memory for optimal speed. The default value is `8`.
-   *
-   * The memory requirements for deflate are (in bytes):
-   *
-   *     (1 << (windowBits + 2)) +  (1 << (memLevel + 9))
-   * that is: 128K for windowBits = 15 + 128K for memLevel = 8 (default values)
-   */
-  final int memLevel;
-
-  /**
-   * Tunes the compression algorithm. Use the value
-   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
-   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
-   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
-   * match distances to one (run-length encoding).
-   */
-  final int strategy;
-
-  /**
-   * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range `8..15`. Larger values result in better compression
-   * at the expense of memory usage. The default value is `15`
-   */
-  final int windowBits;
-
-  /**
-   * Initial compression dictionary.
-   *
-   * It should consist of strings (byte sequences) that are likely to be
-   * encountered later in the data to be compressed, with the most commonly used
-   * strings preferably put towards the end of the dictionary. Using a
-   * dictionary is most useful when the data to be compressed is short and can
-   * be predicted with good accuracy; the data can then be compressed better
-   * than with the default empty dictionary.
-   */
-  final List<int> dictionary;
-
-  /**
-   * When true, deflate generates raw data with no zlib header or trailer, and
-   * will not compute an adler32 check value
-   */
-  final bool raw;
-
-  GZipCodec({this.level: ZLibOption.DEFAULT_LEVEL,
-            this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-            this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-            this.strategy: ZLibOption.STRATEGY_DEFAULT,
-            this.dictionary: null,
-            this.raw: false,
-            this.gzip: true}) {
-    _validateZLibeLevel(level);
-    _validateZLibMemLevel(memLevel);
-    _validateZLibStrategy(strategy);
-    _validateZLibWindowBits(windowBits);
-  }
-
-  const GZipCodec._default()
-      : level = ZLibOption.DEFAULT_LEVEL,
-        windowBits = ZLibOption.DEFAULT_WINDOW_BITS,
-        memLevel = ZLibOption.DEFAULT_MEM_LEVEL,
-        strategy = ZLibOption.STRATEGY_DEFAULT,
-        raw = false,
-        gzip = true,
-        dictionary = null;
-
-  /**
-   * Get a [ZLibEncoder] for encoding to `GZip` compressed data.
-   */
-  ZLibEncoder get encoder =>
-      new ZLibEncoder(gzip: true, level: level, windowBits: windowBits,
-                      memLevel: memLevel, strategy: strategy,
-                      dictionary: dictionary, raw: raw);
-
-  /**
-   * Get a [ZLibDecoder] for decoding `GZip` compressed data.
-   */
-  ZLibDecoder get decoder =>
-      new ZLibDecoder(windowBits: windowBits, dictionary: dictionary, raw: raw);
-}
-
-/**
- * The [ZLibEncoder] encoder is used by [ZLibCodec] and [GZipCodec] to compress
- * data.
- */
-class ZLibEncoder extends Converter<List<int>, List<int>> {
-  /**
-   * When true, `GZip` frames will be added to the compressed data.
-   */
-  final bool gzip;
-
-  /**
-   * The compression-[level] can be set in the range of `-1..9`, with `6` being
-   * the default compression level. Levels above `6` will have higher
-   * compression rates at the cost of more CPU and memory usage. Levels below
-   * `6` will use less CPU and memory at the cost of lower compression rates.
-   */
-  final int level;
-
-  /**
-   * Specifies how much memory should be allocated for the internal compression
-   * state. `1` uses minimum memory but is slow and reduces compression ratio;
-   * `9` uses maximum memory for optimal speed. The default value is `8`.
-   *
-   * The memory requirements for deflate are (in bytes):
-   *
-   *     (1 << (windowBits + 2)) +  (1 << (memLevel + 9))
-   * that is: 128K for windowBits = 15 + 128K for memLevel = 8 (default values)
-   */
-  final int memLevel;
-
-  /**
-   * Tunes the compression algorithm. Use the value
-   * [ZLibOption.STRATEGY_DEFAULT] for normal data,
-   * [ZLibOption.STRATEGY_FILTERED] for data produced by a filter
-   * (or predictor), [ZLibOption.STRATEGY_HUFFMAN_ONLY] to force Huffman
-   * encoding only (no string match), or [ZLibOption.STRATEGY_RLE] to limit
-   * match distances to one (run-length encoding).
-   */
-  final int strategy;
-
-  /**
-   * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range `8..15`. Larger values result in better compression
-   * at the expense of memory usage. The default value is `15`
-   */
-  final int windowBits;
-
-  /**
-   * Initial compression dictionary.
-   *
-   * It should consist of strings (byte sequences) that are likely to be
-   * encountered later in the data to be compressed, with the most commonly used
-   * strings preferably put towards the end of the dictionary. Using a
-   * dictionary is most useful when the data to be compressed is short and can
-   * be predicted with good accuracy; the data can then be compressed better
-   * than with the default empty dictionary.
-   */
-  final List<int> dictionary;
-
-
-  /**
-   * When true, deflate generates raw data with no zlib header or trailer, and
-   * will not compute an adler32 check value
-   */
-  final bool raw;
-
-  ZLibEncoder({this.gzip: false,
-              this.level: ZLibOption.DEFAULT_LEVEL,
-              this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-              this.memLevel: ZLibOption.DEFAULT_MEM_LEVEL,
-              this.strategy: ZLibOption.STRATEGY_DEFAULT,
-              this.dictionary: null,
-              this.raw: false}) {
-    _validateZLibeLevel(level);
-    _validateZLibMemLevel(memLevel);
-    _validateZLibStrategy(strategy);
-    _validateZLibWindowBits(windowBits);
-  }
-
-  /**
-   * Convert a list of bytes using the options given to the ZLibEncoder
-   * constructor.
-   */
-  List<int> convert(List<int> bytes) {
-    _BufferSink sink = new _BufferSink();
-    startChunkedConversion(sink)..add(bytes)..close();
-    return sink.builder.takeBytes();
-  }
-
-  /**
-   * Start a chunked conversion using the options given to the [ZLibEncoder]
-   * constructor. While it accepts any [Sink] taking [List<int>]'s,
-   * the optimal sink to be passed as [sink] is a [ByteConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _ZLibEncoderSink(sink, gzip, level, windowBits, memLevel,
-                                strategy, dictionary, raw);
-  }
-}
-
-
-/**
- * The [ZLibDecoder] is used by [ZLibCodec] and [GZipCodec] to decompress data.
- */
-class ZLibDecoder extends  Converter<List<int>, List<int>> {
-  /**
-   * Base two logarithm of the window size (the size of the history buffer). It
-   * should be in the range `8..15`. Larger values result in better compression
-   * at the expense of memory usage. The default value is `15`.
-   */
-  final int windowBits;
-
-  /**
-   * Initial compression dictionary.
-   *
-   * It should consist of strings (byte sequences) that are likely to be
-   * encountered later in the data to be compressed, with the most commonly used
-   * strings preferably put towards the end of the dictionary. Using a
-   * dictionary is most useful when the data to be compressed is short and can
-   * be predicted with good accuracy; the data can then be compressed better
-   * than with the default empty dictionary.
-   */
-  final List<int> dictionary;
-
-  /**
-   * When true, deflate generates raw data with no zlib header or trailer, and
-   * will not compute an adler32 check value
-   */
-  final bool raw;
-
-  ZLibDecoder({this.windowBits: ZLibOption.DEFAULT_WINDOW_BITS,
-              this.dictionary: null, this.raw: false}) {
-    _validateZLibWindowBits(windowBits);
-  }
-
-  /**
-   * Convert a list of bytes using the options given to the [ZLibDecoder]
-   * constructor.
-   */
-  List<int> convert(List<int> bytes) {
-    _BufferSink sink = new _BufferSink();
-    startChunkedConversion(sink)..add(bytes)..close();
-    return sink.builder.takeBytes();
-  }
-
-  /**
-   * Start a chunked conversion. While it accepts any [Sink]
-   * taking [List<int>]'s, the optimal sink to be passed as [sink] is a
-   * [ByteConversionSink].
-   */
-  ByteConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    if (sink is! ByteConversionSink) {
-      sink = new ByteConversionSink.from(sink);
-    }
-    return new _ZLibDecoderSink(sink, windowBits, dictionary, raw);
-  }
-}
-
-
-class _BufferSink extends ByteConversionSink {
-  final BytesBuilder builder = new BytesBuilder(copy: false);
-
-  void add(List<int> chunk) {
-    builder.add(chunk);
-  }
-
-  void addSlice(List<int> chunk, int start, int end, bool isLast) {
-    if (chunk is Uint8List) {
-      Uint8List list = chunk;
-      builder.add(new Uint8List.view(list.buffer, start, end - start));
-    } else {
-      builder.add(chunk.sublist(start, end));
-    }
-  }
-
-  void close() {}
-}
-
-
-class _ZLibEncoderSink extends _FilterSink {
-  _ZLibEncoderSink(ByteConversionSink sink, bool gzip, int level,
-                   int windowBits, int memLevel, int strategy,
-                   List<int> dictionary, bool raw)
-      : super(sink, _Filter._newZLibDeflateFilter(gzip, level, windowBits,
-                                                  memLevel, strategy,
-                                                  dictionary, raw));
-}
-
-class _ZLibDecoderSink extends _FilterSink {
-  _ZLibDecoderSink(ByteConversionSink sink, int windowBits,
-                   List<int> dictionary, bool raw)
-      : super(sink, _Filter._newZLibInflateFilter(windowBits, dictionary, raw));
-}
-
-
-class _FilterSink extends ByteConversionSink {
-  final _Filter _filter;
-  final ByteConversionSink _sink;
-  bool _closed = false;
-  bool _empty = true;
-
-  _FilterSink(this._sink, this._filter);
-
-  void add(List<int> data) {
-    addSlice(data, 0, data.length, false);
-  }
-
-  void addSlice(List<int> data, int start, int end, bool isLast) {
-    if (_closed) return;
-    if (end == null) throw new ArgumentError.notNull("end");
-    RangeError.checkValidRange(start, end, data.length);
-    try {
-      _empty = false;
-      _BufferAndStart bufferAndStart =
-          _ensureFastAndSerializableByteData(data, start, end);
-      _filter.process(bufferAndStart.buffer,
-                      bufferAndStart.start,
-                      end - (start - bufferAndStart.start));
-      var out;
-      while ((out = _filter.processed(flush: false)) != null) {
-        _sink.add(out);
-      }
-    } catch (e) {
-      _closed = true;
-      rethrow;
-    }
-
-    if (isLast) close();
-  }
-
-  void close() {
-    if (_closed) return;
-    // Be sure to send process an empty chunk of data. Without this, the empty
-    // message would not have a GZip frame (if compressed with GZip).
-    if (_empty) _filter.process(const [], 0, 0);
-    try {
-      var out;
-      while ((out = _filter.processed(end: true)) != null) {
-        _sink.add(out);
-      }
-    } catch (e) {
-      _closed = true;
-      throw e;
-    }
-    _closed = true;
-    _sink.close();
-  }
-}
-
-
-/**
- * Private helper-class to handle native filters.
- */
-abstract class _Filter {
-  /**
-   * Call to process a chunk of data. A call to [process] should only be made
-   * when [processed] returns [:null:].
-   */
-  void process(List<int> data, int start, int end);
-
-  /**
-   * Get a chunk of processed data. When there are no more data available,
-   * [processed] will return [:null:]. Set [flush] to [:false:] for non-final
-   * calls to improve performance of some filters.
-   *
-   * The last call to [processed] should have [end] set to [:true:]. This will
-   * make sure an 'end' packet is written on the stream.
-   */
-  List<int> processed({bool flush: true, bool end: false});
-
-  external static _Filter _newZLibDeflateFilter(bool gzip, int level,
-                                                int windowBits, int memLevel,
-                                                int strategy,
-                                                List<int> dictionary, bool raw);
-
-  external static _Filter _newZLibInflateFilter(int windowBits,
-                                                List<int> dictionary, bool raw);
-}
-
-void _validateZLibWindowBits(int windowBits) {
-  if (ZLibOption.MIN_WINDOW_BITS > windowBits ||
-      ZLibOption.MAX_WINDOW_BITS < windowBits) {
-    throw new RangeError.range(windowBits, ZLibOption.MIN_WINDOW_BITS,
-        ZLibOption.MAX_WINDOW_BITS);
-  }
-}
-
-void _validateZLibeLevel(int level) {
-  if (ZLibOption.MIN_LEVEL > level ||
-      ZLibOption.MAX_LEVEL < level) {
-    throw new RangeError.range(level, ZLibOption.MIN_LEVEL,
-        ZLibOption.MAX_LEVEL);
-  }
-}
-
-void _validateZLibMemLevel(int memLevel) {
-  if (ZLibOption.MIN_MEM_LEVEL > memLevel ||
-      ZLibOption.MAX_MEM_LEVEL < memLevel) {
-    throw new RangeError.range(memLevel, ZLibOption.MIN_MEM_LEVEL,
-        ZLibOption.MAX_MEM_LEVEL);
-  }
-}
-
-void _validateZLibStrategy(int strategy) {
-  const strategies = const <int>[ZLibOption.STRATEGY_FILTERED,
-      ZLibOption.STRATEGY_HUFFMAN_ONLY, ZLibOption.STRATEGY_RLE,
-      ZLibOption.STRATEGY_FIXED, ZLibOption.STRATEGY_DEFAULT];
-  if (strategies.indexOf(strategy) == -1) {
-    throw new ArgumentError("Unsupported 'strategy'");
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/directory.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/directory.dart
deleted file mode 100644
index e890fcf..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/directory.dart
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-/**
- * A reference to a directory (or _folder_) on the file system.
- *
- * A Directory instance is an object holding a [path] on which operations can
- * be performed. The path to the directory can be [absolute] or [relative].
- * You can get the parent directory using the getter [parent],
- * a property inherited from [FileSystemEntity].
- *
- * In addition to being used as an instance to access the file system,
- * Directory has a number of static properties, such as [systemTemp],
- * which gets the system's temporary directory, and the getter and setter
- * [current], which you can use to access or change the current directory.
- *
- * Create a new Directory object with a pathname to access the specified
- * directory on the file system from your program.
- *
- *     var myDir = new Directory('myDir');
- *
- * Most methods in this class occur in synchronous and asynchronous pairs,
- * for example, [create] and [createSync].
- * Unless you have a specific reason for using the synchronous version
- * of a method, prefer the asynchronous version to avoid blocking your program.
- *
- * ## Create a directory
- *
- * The following code sample creates a directory using the [create] method.
- * By setting the `recursive` parameter to true, you can create the
- * named directory and all its necessary parent directories,
- * if they do not already exist.
- *
- *     import 'dart:io';
- *
- *     void main() {
- *       // Creates dir/ and dir/subdir/.
- *       new Directory('dir/subdir').create(recursive: true)
- *         // The created directory is returned as a Future.
- *         .then((Directory directory) {
- *           print(directory.path);
- *       });
- *     }
- *
- * ## List a directory
- *
- * Use the [list] or [listSync] methods to get the files and directories
- * contained by a directory.
- * Set `recursive` to true to recursively list all subdirectories.
- * Set `followLinks` to true to follow symbolic links.
- * The list method returns a [Stream] that provides FileSystemEntity
- * objects. Use the listen callback function to process each object
- * as it become available.
- *
- *     import 'dart:io';
- *
- *     void main() {
- *       // Get the system temp directory.
- *       var systemTempDir = Directory.systemTemp;
- *
- *       // List directory contents, recursing into sub-directories,
- *       // but not following symbolic links.
- *       systemTempDir.list(recursive: true, followLinks: false)
- *         .listen((FileSystemEntity entity) {
- *           print(entity.path);
- *         });
- *     }
- *
- * ## The use of Futures
- *
- * I/O operations can block a program for some period of time while it waits for
- * the operation to complete. To avoid this, all
- * methods involving I/O have an asynchronous variant which returns a [Future].
- * This future completes when the I/O operation finishes. While the I/O
- * operation is in progress, the Dart program is not blocked,
- * and can perform other operations.
- *
- * For example,
- * the [exists] method, which determines whether the directory exists,
- * returns a boolean value using a Future.
- * Use `then` to register a callback function, which is called when
- * the value is ready.
- *
- *     import 'dart:io';
- *
- *     main() {
- *       final myDir = new Directory('dir');
- *       myDir.exists().then((isThere) {
- *         isThere ? print('exists') : print('non-existent');
- *       });
- *     }
- *
- *
- * In addition to exists, the [stat], [rename], and
- * other methods, return Futures.
- *
- * ## Other resources
- *
- * * [Dart by Example](https://www.dartlang.org/dart-by-example/#files-directories-and-symlinks)
- *   provides additional task-oriented code samples that show how to use
- *   various API from the Directory class and the related [File] class.
- *
- * * [I/O for Command-Line
- *   Apps](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartio---io-for-command-line-apps)
- *   a section from _A Tour of the Dart Libraries_ covers files and directories.
- *
- * * [Write Command-Line Apps](https://www.dartlang.org/docs/tutorials/cmdline/),
- *   a tutorial about writing command-line apps, includes information about
- *   files and directories.
- */
-abstract class Directory implements FileSystemEntity {
-  /**
-   * Gets the path of this directory.
-   */
-  final String path;
-
-  /**
-   * Creates a [Directory] object.
-   *
-   * If [path] is a relative path, it will be interpreted relative to the
-   * current working directory (see [Directory.current]), when used.
-   *
-   * If [path] is an absolute path, it will be immune to changes to the
-   * current working directory.
-   */
-  factory Directory(String path) => new _Directory(path);
-
-  /**
-   * Create a Directory object from a URI.
-   *
-   * If [uri] cannot reference a directory this throws [UnsupportedError].
-   */
-  factory Directory.fromUri(Uri uri) => new Directory(uri.toFilePath());
-
-  /**
-   * Creates a directory object pointing to the current working
-   * directory.
-   */
-  static Directory get current => _Directory.current;
-
-  /**
-   * Returns a [Uri] representing the directory's location.
-   *
-   * The returned URI's scheme is always "file" if the entity's [path] is
-   * absolute, otherwise the scheme will be empty.
-   * The returned URI's path always ends in a slash ('/').
-   */
-  Uri get uri;
-
-  /**
-   * Sets the current working directory of the Dart process including
-   * all running isolates. The new value set can be either a [Directory]
-   * or a [String].
-   *
-   * The new value is passed to the OS's system call unchanged, so a
-   * relative path passed as the new working directory will be
-   * resolved by the OS.
-   *
-   * Note that setting the current working directory is a synchronous
-   * operation and that it changes the working directory of *all*
-   * isolates.
-   *
-   * Use this with care - especially when working with asynchronous
-   * operations and multiple isolates. Changing the working directory,
-   * while asynchronous operations are pending or when other isolates
-   * are working with the file system, can lead to unexpected results.
-   */
-  static void set current(path) {
-    _Directory.current = path;
-  }
-
-  /**
-   * Creates the directory with this name.
-   *
-   * If [recursive] is false, only the last directory in the path is
-   * created. If [recursive] is true, all non-existing path components
-   * are created. If the directory already exists nothing is done.
-   *
-   * Returns a [:Future<Directory>:] that completes with this
-   * directory once it has been created. If the directory cannot be
-   * created the future completes with an exception.
-   */
-  Future<Directory> create({bool recursive: false});
-
-  /**
-   * Synchronously creates the directory with this name.
-   *
-   * If [recursive] is false, only the last directory in the path is
-   * created. If [recursive] is true, all non-existing path components
-   * are created. If the directory already exists nothing is done.
-   *
-   * If the directory cannot be created an exception is thrown.
-   */
-  void createSync({bool recursive: false});
-
-  /**
-   * Gets the system temp directory.
-   *
-   * Gets the directory provided by the operating system for creating
-   * temporary files and directories in.
-   * The location of the system temp directory is platform-dependent,
-   * and may be set by an environment variable.
-   */
-  static Directory get systemTemp => _Directory.systemTemp;
-
-  /**
-   * Creates a temporary directory in this directory. Additional random
-   * characters are appended to [prefix] to produce a unique directory
-   * name. If [prefix] is missing or null, the empty string is used
-   * for [prefix].
-   *
-   * Returns a [:Future<Directory>:] that completes with the newly
-   * created temporary directory.
-   */
-  Future<Directory> createTemp([String prefix]);
-
-  /**
-   * Synchronously creates a temporary directory in this directory.
-   * Additional random characters are appended to [prefix] to produce
-   * a unique directory name. If [prefix] is missing or null, the empty
-   * string is used for [prefix].
-   *
-   * Returns the newly created temporary directory.
-   */
-  Directory createTempSync([String prefix]);
-
-  Future<String> resolveSymbolicLinks();
-
-  String resolveSymbolicLinksSync();
-
-  /**
-   * Renames this directory. Returns a [:Future<Directory>:] that completes
-   * with a [Directory] instance for the renamed directory.
-   *
-   * If newPath identifies an existing directory, that directory is
-   * replaced. If newPath identifies an existing file, the operation
-   * fails and the future completes with an exception.
-   */
-  Future<Directory> rename(String newPath);
-
-  /**
-   * Synchronously renames this directory. Returns a [Directory]
-   * instance for the renamed directory.
-   *
-   * If newPath identifies an existing directory, that directory is
-   * replaced. If newPath identifies an existing file the operation
-   * fails and an exception is thrown.
-   */
-  Directory renameSync(String newPath);
-
-  /**
-   * Returns a [Directory] instance whose path is the absolute path to [this].
-   *
-   * The absolute path is computed by prefixing
-   * a relative path with the current working directory, and returning
-   * an absolute path unchanged.
-   */
-  Directory get absolute;
-
-  /**
-   * Lists the sub-directories and files of this [Directory].
-   * Optionally recurses into sub-directories.
-   *
-   * If [followLinks] is false, then any symbolic links found
-   * are reported as [Link] objects, rather than as directories or files,
-   * and are not recursed into.
-   *
-   * If [followLinks] is true, then working links are reported as
-   * directories or files, depending on
-   * their type, and links to directories are recursed into.
-   * Broken links are reported as [Link] objects.
-   * If a symbolic link makes a loop in the file system, then a recursive
-   * listing will not follow a link twice in the
-   * same recursive descent, but will report it as a [Link]
-   * the second time it is seen.
-   *
-   * The result is a stream of [FileSystemEntity] objects
-   * for the directories, files, and links.
-   */
-  Stream<FileSystemEntity> list({bool recursive: false,
-                                 bool followLinks: true});
-
-  /**
-   * Lists the sub-directories and files of this [Directory].
-   * Optionally recurses into sub-directories.
-   *
-   * If [followLinks] is false, then any symbolic links found
-   * are reported as [Link] objects, rather than as directories or files,
-   * and are not recursed into.
-   *
-   * If [followLinks] is true, then working links are reported as
-   * directories or files, depending on
-   * their type, and links to directories are recursed into.
-   * Broken links are reported as [Link] objects.
-   * If a link makes a loop in the file system, then a recursive
-   * listing will not follow a link twice in the
-   * same recursive descent, but will report it as a [Link]
-   * the second time it is seen.
-   *
-   * Returns a [List] containing [FileSystemEntity] objects for the
-   * directories, files, and links.
-   */
-  List<FileSystemEntity> listSync({bool recursive: false,
-                                   bool followLinks: true});
-
-  /**
-   * Returns a human readable string for this Directory instance.
-   */
-  String toString();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/directory_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/directory_impl.dart
deleted file mode 100644
index 52cf548..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/directory_impl.dart
+++ /dev/null
@@ -1,428 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-class _Directory extends FileSystemEntity implements Directory {
-  final String path;
-
-  _Directory(this.path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} '
-                              'is not a String');
-    }
-  }
-
-  external static _current();
-  external static _setCurrent(path);
-  external static _createTemp(String path);
-  external static String _systemTemp();
-  external static _exists(String path);
-  external static _create(String path);
-  external static _deleteNative(String path, bool recursive);
-  external static _rename(String path, String newPath);
-  external static void _fillWithDirectoryListing(
-      List<FileSystemEntity> list, String path, bool recursive,
-      bool followLinks);
-
-  static Directory get current {
-    var result = _current();
-    if (result is OSError) {
-      throw new FileSystemException(
-          "Getting current working directory failed", "", result);
-    }
-    return new _Directory(result);
-  }
-
-  static void set current(path) {
-    if (path is Directory) path = path.path;
-    var result = _setCurrent(path);
-    if (result is ArgumentError) throw result;
-    if (result is OSError) {
-      throw new FileSystemException(
-          "Setting current working directory failed", path, result);
-    }
-  }
-
-  Uri get uri {
-    return new Uri.directory(path);
-  }
-
-  Future<bool> exists() {
-    return _IOService._dispatch(_DIRECTORY_EXISTS, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionOrErrorFromResponse(response, "Exists failed");
-      }
-      return response == 1;
-    });
-  }
-
-  bool existsSync() {
-    var result = _exists(path);
-    if (result is OSError) {
-      throw new FileSystemException("Exists failed", path, result);
-    }
-    return (result == 1);
-  }
-
-  Directory get absolute => new Directory(_absolutePath);
-
-  Future<FileStat> stat() => FileStat.stat(path);
-
-  FileStat statSync() => FileStat.statSync(path);
-
-  // Compute the index of the first directory in the list that exists. If
-  // none of the directories exist dirsToCreate.length is returned.
-  Future<int> _computeExistingIndex(List dirsToCreate) {
-    var future;
-    var notFound = dirsToCreate.length;
-    for (var i = 0; i < dirsToCreate.length; i++) {
-      if (future == null) {
-        future = dirsToCreate[i].exists().then((e) => e ? i : notFound);
-      } else {
-        future = future.then((index) {
-          if (index != notFound) {
-            return new Future.value(index);
-          }
-          return dirsToCreate[i].exists().then((e) => e ? i : notFound);
-        });
-      }
-    }
-    if (future == null) {
-      return new Future.value(notFound);
-    } else {
-      return future;
-    }
-  }
-
-  Future<Directory> create({bool recursive: false}) {
-    if (recursive) {
-      return exists().then((exists) {
-        if (exists) return this;
-        if (path != parent.path) {
-          return parent.create(recursive: true).then((_) {
-            return create();
-          });
-        } else {
-          return create();
-        }
-      });
-    } else {
-      return _IOService._dispatch(_DIRECTORY_CREATE, [path]).then((response) {
-        if (_isErrorResponse(response)) {
-          throw _exceptionOrErrorFromResponse(response, "Creation failed");
-        }
-        return this;
-      });
-    }
-  }
-
-  void createSync({bool recursive: false}) {
-    if (recursive) {
-      if (existsSync()) return;
-      if (path != parent.path) {
-        parent.createSync(recursive: true);
-      }
-    }
-    var result = _create(path);
-    if (result is OSError) {
-      throw new FileSystemException("Creation failed", path, result);
-    }
-  }
-
-  static Directory get systemTemp => new Directory(_systemTemp());
-
-  Future<Directory> createTemp([String prefix]) {
-    if (prefix == null) prefix = '';
-    if (path == '') {
-      throw new ArgumentError(
-          "Directory.createTemp called with an empty path. "
-          "To use the system temp directory, use Directory.systemTemp");
-    }
-    String fullPrefix;
-    if (path.endsWith('/') || (Platform.isWindows && path.endsWith('\\'))) {
-      fullPrefix = "$path$prefix";
-    } else {
-      fullPrefix = "$path${Platform.pathSeparator}$prefix";
-    }
-    return _IOService._dispatch(_DIRECTORY_CREATE_TEMP, [fullPrefix])
-        .then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionOrErrorFromResponse(
-            response, "Creation of temporary directory failed");
-      }
-      return new Directory(response);
-    });
-  }
-
-  Directory createTempSync([String prefix]) {
-    if (prefix == null) prefix = '';
-    if (path == '') {
-      throw new ArgumentError(
-          "Directory.createTemp called with an empty path. "
-          "To use the system temp directory, use Directory.systemTemp");
-    }
-    String fullPrefix;
-    if (path.endsWith('/') || (Platform.isWindows && path.endsWith('\\'))) {
-      fullPrefix = "$path$prefix";
-    } else {
-      fullPrefix = "$path${Platform.pathSeparator}$prefix";
-    }
-    var result = _createTemp(fullPrefix);
-    if (result is OSError) {
-      throw new FileSystemException("Creation of temporary directory failed",
-                                   fullPrefix,
-                                   result);
-    }
-    return new Directory(result);
-  }
-
-  Future<Directory> _delete({bool recursive: false}) {
-    return _IOService._dispatch(_DIRECTORY_DELETE, [path, recursive])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionOrErrorFromResponse(response, "Deletion failed");
-          }
-          return this;
-        });
-  }
-
-  void _deleteSync({bool recursive: false}) {
-    var result = _deleteNative(path, recursive);
-    if (result is OSError) {
-      throw new FileSystemException("Deletion failed", path, result);
-    }
-  }
-
-  Future<Directory> rename(String newPath) {
-    return _IOService._dispatch(_DIRECTORY_RENAME, [path, newPath])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionOrErrorFromResponse(response, "Rename failed");
-          }
-          return new Directory(newPath);
-        });
-  }
-
-  Directory renameSync(String newPath) {
-    if (newPath is !String) {
-      throw new ArgumentError();
-    }
-    var result = _rename(path, newPath);
-    if (result is OSError) {
-      throw new FileSystemException("Rename failed", path, result);
-    }
-    return new Directory(newPath);
-  }
-
-  Stream<FileSystemEntity> list({bool recursive: false,
-                                 bool followLinks: true}) {
-    return new _AsyncDirectoryLister(
-        FileSystemEntity._ensureTrailingPathSeparators(path),
-        recursive,
-        followLinks).stream;
-  }
-
-  List<FileSystemEntity> listSync(
-      {bool recursive: false, bool followLinks: true}) {
-    if (recursive is! bool || followLinks is! bool) {
-      throw new ArgumentError();
-    }
-    var result = <FileSystemEntity>[];
-    _fillWithDirectoryListing(
-        result,
-        FileSystemEntity._ensureTrailingPathSeparators(path),
-        recursive,
-        followLinks);
-    return result;
-  }
-
-  String toString() => "Directory: '$path'";
-
-  bool _isErrorResponse(response) =>
-      response is List && response[0] != _SUCCESS_RESPONSE;
-
-  _exceptionOrErrorFromResponse(response, String message) {
-    assert(_isErrorResponse(response));
-    switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-      case _ILLEGAL_ARGUMENT_RESPONSE:
-        return new ArgumentError();
-      case _OSERROR_RESPONSE:
-        var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-                              response[_OSERROR_RESPONSE_ERROR_CODE]);
-        return new FileSystemException(message, path, err);
-      default:
-        return new Exception("Unknown error");
-    }
-  }
-}
-
-abstract class _AsyncDirectoryListerOps {
-  external factory _AsyncDirectoryListerOps(int pointer);
-
-  int getPointer();
-}
-
-class _AsyncDirectoryLister {
-  static const int LIST_FILE = 0;
-  static const int LIST_DIRECTORY = 1;
-  static const int LIST_LINK = 2;
-  static const int LIST_ERROR = 3;
-  static const int LIST_DONE = 4;
-
-  static const int RESPONSE_TYPE = 0;
-  static const int RESPONSE_PATH = 1;
-  static const int RESPONSE_COMPLETE = 1;
-  static const int RESPONSE_ERROR = 2;
-
-  final String path;
-  final bool recursive;
-  final bool followLinks;
-
-  StreamController controller;
-  bool canceled = false;
-  bool nextRunning = false;
-  bool closed = false;
-  _AsyncDirectoryListerOps _ops;
-  Completer closeCompleter = new Completer();
-
-  _AsyncDirectoryLister(this.path, this.recursive, this.followLinks) {
-    controller = new StreamController(onListen: onListen,
-                                      onResume: onResume,
-                                      onCancel: onCancel,
-                                      sync: true);
-  }
-
-  // Calling this function will increase the reference count on the native
-  // object that implements the async directory lister operations. It should
-  // only be called to pass the pointer to the IO Service, which will decrement
-  // the reference count when it is finished with it.
-  int _pointer() {
-    return (_ops == null) ? null : _ops.getPointer();
-  }
-
-  Stream get stream => controller.stream;
-
-  void onListen() {
-    _IOService._dispatch(_DIRECTORY_LIST_START, [path, recursive, followLinks])
-        .then((response) {
-          if (response is int) {
-            _ops = new _AsyncDirectoryListerOps(response);
-            next();
-          } else if (response is Error) {
-            controller.addError(response, response.stackTrace);
-            close();
-          } else {
-            error(response);
-            close();
-          }
-        });
-  }
-
-  void onResume() {
-    if (!nextRunning) {
-      next();
-    }
-  }
-
-  Future onCancel() {
-    canceled = true;
-    // If we are active, but not requesting, close.
-    if (!nextRunning) {
-      close();
-    }
-
-    return closeCompleter.future;
-  }
-
-  void next() {
-    if (canceled) {
-      close();
-      return;
-    }
-    if (controller.isPaused || nextRunning) {
-      return;
-    }
-    var pointer = _pointer();
-    if (pointer == null) {
-      return;
-    }
-    nextRunning = true;
-    _IOService._dispatch(_DIRECTORY_LIST_NEXT, [pointer]).then((result) {
-      nextRunning = false;
-      if (result is List) {
-        next();
-        assert(result.length % 2 == 0);
-        for (int i = 0; i < result.length; i++) {
-          assert(i % 2 == 0);
-          switch (result[i++]) {
-            case LIST_FILE:
-              controller.add(new File(result[i]));
-              break;
-            case LIST_DIRECTORY:
-              controller.add(new Directory(result[i]));
-              break;
-            case LIST_LINK:
-              controller.add(new Link(result[i]));
-              break;
-            case LIST_ERROR:
-              error(result[i]);
-              break;
-            case LIST_DONE:
-              canceled = true;
-              return;
-          }
-        }
-      } else {
-        controller.addError(new FileSystemException("Internal error"));
-      }
-    });
-  }
-
-  void _cleanup() {
-    controller.close();
-    closeCompleter.complete();
-    _ops = null;
-  }
-
-  void close() {
-    if (closed) {
-      return;
-    }
-    if (nextRunning) {
-      return;
-    }
-    closed = true;
-
-    var pointer = _pointer();
-    if (pointer == null) {
-      _cleanup();
-    } else {
-      _IOService._dispatch(_DIRECTORY_LIST_STOP, [pointer])
-                .whenComplete(_cleanup);
-    }
-  }
-
-  void error(message) {
-    var errorType =
-        message[RESPONSE_ERROR][_ERROR_RESPONSE_ERROR_TYPE];
-    if (errorType == _ILLEGAL_ARGUMENT_RESPONSE) {
-      controller.addError(new ArgumentError());
-    } else if (errorType == _OSERROR_RESPONSE) {
-      var responseError = message[RESPONSE_ERROR];
-      var err = new OSError(
-          responseError[_OSERROR_RESPONSE_MESSAGE],
-          responseError[_OSERROR_RESPONSE_ERROR_CODE]);
-      var errorPath = message[RESPONSE_PATH];
-      if (errorPath == null) errorPath = path;
-      controller.addError(
-          new FileSystemException("Directory listing failed",
-                                  errorPath,
-                                  err));
-    } else {
-      controller.addError(
-          new FileSystemException("Internal error"));
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/eventhandler.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/eventhandler.dart
deleted file mode 100644
index 883c2e1..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/eventhandler.dart
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-class _EventHandler {
-  external static void _sendData(Object sender,
-                                 SendPort sendPort,
-                                 int data);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/file.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/file.dart
deleted file mode 100644
index de526ed..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/file.dart
+++ /dev/null
@@ -1,885 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * The modes in which a File can be opened.
- */
-class FileMode {
-  /// The mode for opening a file only for reading.
-  static const READ = const FileMode._internal(0);
-  /// Mode for opening a file for reading and writing. The file is
-  /// overwritten if it already exists. The file is created if it does not
-  /// already exist.
-  static const WRITE = const FileMode._internal(1);
-  /// Mode for opening a file for reading and writing to the
-  /// end of it. The file is created if it does not already exist.
-  static const APPEND = const FileMode._internal(2);
-  /// Mode for opening a file for writing *only*. The file is
-  /// overwritten if it already exists. The file is created if it does not
-  /// already exist.
-  static const WRITE_ONLY = const FileMode._internal(3);
-  /// Mode for opening a file for writing *only* to the
-  /// end of it. The file is created if it does not already exist.
-  static const WRITE_ONLY_APPEND = const FileMode._internal(4);
-  final int _mode;
-
-  const FileMode._internal(this._mode);
-}
-
-/// The mode for opening a file only for reading.
-const READ = FileMode.READ;
-/// The mode for opening a file for reading and writing. The file is
-/// overwritten if it already exists. The file is created if it does not
-/// already exist.
-const WRITE = FileMode.WRITE;
-/// The mode for opening a file for reading and writing to the
-/// end of it. The file is created if it does not already exist.
-const APPEND = FileMode.APPEND;
-/// Mode for opening a file for writing *only*. The file is
-/// overwritten if it already exists. The file is created if it does not
-/// already exist.
-const WRITE_ONLY = FileMode.WRITE_ONLY;
-/// Mode for opening a file for writing *only* to the
-/// end of it. The file is created if it does not already exist.
-const WRITE_ONLY_APPEND = FileMode.WRITE_ONLY_APPEND;
-
-
-/// Type of lock when requesting a lock on a file.
-enum FileLock {
-  /// Shared file lock.
-  SHARED,
-  /// Exclusive file lock.
-  EXCLUSIVE
-}
-
-/**
- * A reference to a file on the file system.
- *
- * A File instance is an object that holds a [path] on which operations can
- * be performed.
- * You can get the parent directory of the file using the getter [parent],
- * a property inherited from [FileSystemEntity].
- *
- * Create a new File object with a pathname to access the specified file on the
- * file system from your program.
- *
- *     var myFile = new File('file.txt');
- *
- * The File class contains methods for manipulating files and their contents.
- * Using methods in this class, you can open and close files, read to and write
- * from them, create and delete them, and check for their existence.
- *
- * When reading or writing a file, you can use streams (with [openRead]),
- * random access operations (with [open]),
- * or convenience methods such as [readAsString],
- *
- * Most methods in this class occur in synchronous and asynchronous pairs,
- * for example, [readAsString] and [readAsStringSync].
- * Unless you have a specific reason for using the synchronous version
- * of a method, prefer the asynchronous version to avoid blocking your program.
- *
- * ## If path is a link
- *
- * If [path] is a symbolic link, rather than a file,
- * then the methods of File operate on the ultimate target of the
- * link, except for [delete] and [deleteSync], which operate on
- * the link.
- *
- * ## Read from a file
- *
- * The following code sample reads the entire contents from a file as a string
- * using the asynchronous [readAsString] method:
- *
- *     import 'dart:async';
- *     import 'dart:io';
- *
- *     void main() {
- *       new File('file.txt').readAsString().then((String contents) {
- *         print(contents);
- *       });
- *     }
- *
- * A more flexible and useful way to read a file is with a [Stream].
- * Open the file with [openRead], which returns a stream that
- * provides the data in the file as chunks of bytes.
- * Listen to the stream for data and process as needed.
- * You can use various transformers in succession to manipulate the
- * data into the required format or to prepare it for output.
- *
- * You might want to use a stream to read large files,
- * to manipulate the data with tranformers,
- * or for compatibility with another API, such as [WebSocket]s.
- *
- *     import 'dart:io';
- *     import 'dart:convert';
- *     import 'dart:async';
- *
- *     main() {
- *       final file = new File('file.txt');
- *       Stream<List<int>> inputStream = file.openRead();
- *
- *       inputStream
- *         .transform(UTF8.decoder)       // Decode bytes to UTF8.
- *         .transform(new LineSplitter()) // Convert stream to individual lines.
- *         .listen((String line) {        // Process results.
- *             print('$line: ${line.length} bytes');
- *           },
- *           onDone: () { print('File is now closed.'); },
- *           onError: (e) { print(e.toString()); });
- *     }
- *
- * ## Write to a file
- *
- * To write a string to a file, use the [writeAsString] method:
- *
- *     import 'dart:io';
- *
- *     void main() {
- *       final filename = 'file.txt';
- *       new File(filename).writeAsString('some content')
- *         .then((File file) {
- *           // Do something with the file.
- *         });
- *     }
- *
- * You can also write to a file using a [Stream]. Open the file with
- * [openWrite], which returns a stream to which you can write data.
- * Be sure to close the file with the [close] method.
- *
- *     import 'dart:io';
- *
- *     void main() {
- *       var file = new File('file.txt');
- *       var sink = file.openWrite();
- *       sink.write('FILE ACCESSED ${new DateTime.now()}\n');
- *
- *       // Close the IOSink to free system resources.
- *       sink.close();
- *     }
- *
- * ## The use of Futures
- *
- * To avoid unintentional blocking of the program,
- * several methods use a [Future] to return a value. For example,
- * the [length] method, which gets the length of a file, returns a Future.
- * Use `then` to register a callback function, which is called when
- * the value is ready.
- *
- *     import 'dart:io';
- *
- *     main() {
- *       final file = new File('file.txt');
- *
- *       file.length().then((len) {
- *         print(len);
- *       });
- *     }
- *
- * In addition to length, the [exists], [lastModified], [stat], and
- * other methods, return Futures.
- *
- * ## Other resources
- *
- * * [Dart by Example](https://www.dartlang.org/dart-by-example/#files-directories-and-symlinks)
- *   provides additional task-oriented code samples that show how to use
- *   various API from the Directory class and the related [File] class.
- *
- * * [I/O for Command-Line
- *   Apps](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartio---io-for-command-line-apps)
- *   a section from _A Tour of the Dart Libraries_ covers files and directories.
- *
- * * [Write Command-Line Apps](https://www.dartlang.org/docs/tutorials/cmdline/),
- *   a tutorial about writing command-line apps, includes information about
- *   files and directories.
- */
-abstract class File implements FileSystemEntity {
-  /**
-   * Creates a [File] object.
-   *
-   * If [path] is a relative path, it will be interpreted relative to the
-   * current working directory (see [Directory.current]), when used.
-   *
-   * If [path] is an absolute path, it will be immune to changes to the
-   * current working directory.
-   */
-  factory File(String path) => new _File(path);
-
-  /**
-   * Create a File object from a URI.
-   *
-   * If [uri] cannot reference a file this throws [UnsupportedError].
-   */
-  factory File.fromUri(Uri uri) => new File(uri.toFilePath());
-
-  /**
-   * Create the file. Returns a [:Future<File>:] that completes with
-   * the file when it has been created.
-   *
-   * If [recursive] is false, the default, the file is created only if
-   * all directories in the path exist. If [recursive] is true, all
-   * non-existing path components are created.
-   *
-   * Existing files are left untouched by [create]. Calling [create] on an
-   * existing file might fail if there are restrictive permissions on
-   * the file.
-   *
-   * Completes the future with a [FileSystemException] if the operation fails.
-   */
-  Future<File> create({bool recursive: false});
-
-  /**
-   * Synchronously create the file. Existing files are left untouched
-   * by [createSync]. Calling [createSync] on an existing file might fail
-   * if there are restrictive permissions on the file.
-   *
-   * If [recursive] is false, the default, the file is created
-   * only if all directories in the path exist.
-   * If [recursive] is true, all non-existing path components are created.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void createSync({bool recursive: false});
-
-  /**
-   * Renames this file. Returns a `Future<File>` that completes
-   * with a [File] instance for the renamed file.
-   *
-   * If [newPath] identifies an existing file, that file is
-   * replaced. If [newPath] identifies an existing directory, the
-   * operation fails and the future completes with an exception.
-   */
-  Future<File> rename(String newPath);
-
-   /**
-   * Synchronously renames this file. Returns a [File]
-   * instance for the renamed file.
-   *
-   * If [newPath] identifies an existing file, that file is
-   * replaced. If [newPath] identifies an existing directory the
-   * operation fails and an exception is thrown.
-   */
-  File renameSync(String newPath);
-
-  /**
-   * Copy this file. Returns a `Future<File>` that completes
-   * with a [File] instance for the copied file.
-   *
-   * If [newPath] identifies an existing file, that file is
-   * replaced. If [newPath] identifies an existing directory, the
-   * operation fails and the future completes with an exception.
-   */
-  Future<File> copy(String newPath);
-
-   /**
-   * Synchronously copy this file. Returns a [File]
-   * instance for the copied file.
-   *
-   * If [newPath] identifies an existing file, that file is
-   * replaced. If [newPath] identifies an existing directory the
-   * operation fails and an exception is thrown.
-   */
-  File copySync(String newPath);
-
-  /**
-   * Get the length of the file. Returns a [:Future<int>:] that
-   * completes with the length in bytes.
-   */
-  Future<int> length();
-
-  /**
-   * Synchronously get the length of the file.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int lengthSync();
-
-  /**
-   * Returns a [File] instance whose path is the absolute path to [this].
-   *
-   * The absolute path is computed by prefixing
-   * a relative path with the current working directory, and returning
-   * an absolute path unchanged.
-   */
-  File get absolute;
-
-  /**
-   * Get the last-modified time of the file. Returns a
-   * [:Future<DateTime>:] that completes with a [DateTime] object for the
-   * modification date.
-   */
-  Future<DateTime> lastModified();
-
-  /**
-   * Get the last-modified time of the file. Throws an exception
-   * if the file does not exist.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  DateTime lastModifiedSync();
-
-  /**
-   * Open the file for random access operations. Returns a
-   * [:Future<RandomAccessFile>:] that completes with the opened
-   * random access file. [RandomAccessFile]s must be closed using the
-   * [RandomAccessFile.close] method.
-   *
-   * Files can be opened in three modes:
-   *
-   * [FileMode.READ]: open the file for reading.
-   *
-   * [FileMode.WRITE]: open the file for both reading and writing and
-   * truncate the file to length zero. If the file does not exist the
-   * file is created.
-   *
-   * [FileMode.APPEND]: same as [FileMode.WRITE] except that the file is
-   * not truncated.
-   */
-  Future<RandomAccessFile> open({FileMode mode: FileMode.READ});
-
-  /**
-   * Synchronously open the file for random access operations. The
-   * result is a [RandomAccessFile] on which random access operations
-   * can be performed. Opened [RandomAccessFile]s must be closed using
-   * the [RandomAccessFile.close] method.
-   *
-   * See [open] for information on the [mode] argument.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  RandomAccessFile openSync({FileMode mode: FileMode.READ});
-
-  /**
-   * Create a new independent [Stream] for the contents of this file.
-   *
-   * If [start] is present, the file will be read from byte-offset [start].
-   * Otherwise from the beginning (index 0).
-   *
-   * If [end] is present, only up to byte-index [end] will be read. Otherwise,
-   * until end of file.
-   *
-   * In order to make sure that system resources are freed, the stream
-   * must be read to completion or the subscription on the stream must
-   * be cancelled.
-   */
-  Stream<List<int>> openRead([int start, int end]);
-
-  /**
-   * Creates a new independent [IOSink] for the file. The
-   * [IOSink] must be closed when no longer used, to free
-   * system resources.
-   *
-   * An [IOSink] for a file can be opened in two modes:
-   *
-   * * [FileMode.WRITE]: truncates the file to length zero.
-   * * [FileMode.APPEND]: sets the initial write position to the end
-   *   of the file.
-   *
-   *  When writing strings through the returned [IOSink] the encoding
-   *  specified using [encoding] will be used. The returned [IOSink]
-   *  has an [:encoding:] property which can be changed after the
-   *  [IOSink] has been created.
-   */
-  IOSink openWrite({FileMode mode: FileMode.WRITE,
-                    Encoding encoding: UTF8});
-
-  /**
-   * Read the entire file contents as a list of bytes. Returns a
-   * [:Future<List<int>>:] that completes with the list of bytes that
-   * is the contents of the file.
-   */
-  Future<List<int>> readAsBytes();
-
-  /**
-   * Synchronously read the entire file contents as a list of bytes.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  List<int> readAsBytesSync();
-
-  /**
-   * Read the entire file contents as a string using the given
-   * [Encoding].
-   *
-   * Returns a [:Future<String>:] that completes with the string once
-   * the file contents has been read.
-   */
-  Future<String> readAsString({Encoding encoding: UTF8});
-
-  /**
-   * Synchronously read the entire file contents as a string using the
-   * given [Encoding].
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  String readAsStringSync({Encoding encoding: UTF8});
-
-  /**
-   * Read the entire file contents as lines of text using the given
-   * [Encoding].
-   *
-   * Returns a [:Future<List<String>>:] that completes with the lines
-   * once the file contents has been read.
-   */
-  Future<List<String>> readAsLines({Encoding encoding: UTF8});
-
-  /**
-   * Synchronously read the entire file contents as lines of text
-   * using the given [Encoding].
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  List<String> readAsLinesSync({Encoding encoding: UTF8});
-
-  /**
-   * Write a list of bytes to a file.
-   *
-   * Opens the file, writes the list of bytes to it, and closes the file.
-   * Returns a [:Future<File>:] that completes with this [File] object once
-   * the entire operation has completed.
-   *
-   * By default [writeAsBytes] creates the file for writing and truncates the
-   * file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
-   *
-   * If the argument [flush] is set to `true`, the data written will be
-   * flushed to the file system before the returned future completes.
-   */
-  Future<File> writeAsBytes(List<int> bytes,
-                            {FileMode mode: FileMode.WRITE,
-                             bool flush: false});
-
-  /**
-   * Synchronously write a list of bytes to a file.
-   *
-   * Opens the file, writes the list of bytes to it and closes the file.
-   *
-   * By default [writeAsBytesSync] creates the file for writing and truncates
-   * the file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
-   *
-   * If the [flush] argument is set to `true` data written will be
-   * flushed to the file system before returning.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void writeAsBytesSync(List<int> bytes,
-                        {FileMode mode: FileMode.WRITE,
-                         bool flush: false});
-
-  /**
-   * Write a string to a file.
-   *
-   * Opens the file, writes the string in the given encoding, and closes the
-   * file. Returns a [:Future<File>:] that completes with this [File] object
-   * once the entire operation has completed.
-   *
-   * By default [writeAsString] creates the file for writing and truncates the
-   * file if it already exists. In order to append the bytes to an existing
-   * file, pass [FileMode.APPEND] as the optional mode parameter.
-   *
-   * If the argument [flush] is set to `true`, the data written will be
-   * flushed to the file system before the returned future completes.
-   *
-   */
-  Future<File> writeAsString(String contents,
-                             {FileMode mode: FileMode.WRITE,
-                              Encoding encoding: UTF8,
-                              bool flush: false});
-
-  /**
-   * Synchronously write a string to a file.
-   *
-   * Opens the file, writes the string in the given encoding, and closes the
-   * file.
-   *
-   * By default [writeAsStringSync] creates the file for writing and
-   * truncates the file if it already exists. In order to append the bytes
-   * to an existing file, pass [FileMode.APPEND] as the optional mode
-   * parameter.
-   *
-   * If the [flush] argument is set to `true` data written will be
-   * flushed to the file system before returning.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void writeAsStringSync(String contents,
-                         {FileMode mode: FileMode.WRITE,
-                          Encoding encoding: UTF8,
-                          bool flush: false});
-
-  /**
-   * Get the path of the file.
-   */
-  String get path;
-}
-
-
-/**
- * `RandomAccessFile` provides random access to the data in a
- * file.
- *
- * `RandomAccessFile` objects are obtained by calling the
- * [:open:] method on a [File] object.
- *
- * A `RandomAccessFile` have both asynchronous and synchronous
- * methods. The asynchronous methods all return a `Future`
- * whereas the synchronous methods will return the result directly,
- * and block the current isolate until the result is ready.
- *
- * At most one asynchronous method can be pending on a given `RandomAccessFile`
- * instance at the time. If an asynchronous method is called when one is
- * already in progress a [FileSystemException] is thrown.
- *
- * If an asynchronous method is pending it is also not possible to call any
- * synchronous methods. This will also throw a [FileSystemException].
- */
-abstract class RandomAccessFile {
-  /**
-   * Closes the file. Returns a [:Future<RandomAccessFile>:] that
-   * completes with this RandomAccessFile when it has been closed.
-   */
-  Future<RandomAccessFile> close();
-
-  /**
-   * Synchronously closes the file.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void closeSync();
-
-  /**
-   * Reads a byte from the file. Returns a [:Future<int>:] that
-   * completes with the byte, or with -1 if end-of-file has been reached.
-   */
-  Future<int> readByte();
-
-  /**
-   * Synchronously reads a single byte from the file. If end-of-file
-   * has been reached -1 is returned.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int readByteSync();
-
-  /**
-   * Reads [bytes] bytes from a file and returns the result as a list of bytes.
-   */
-  Future<List<int>> read(int bytes);
-
-  /**
-   * Synchronously reads a maximum of [bytes] bytes from a file and
-   * returns the result in a list of bytes.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  List<int> readSync(int bytes);
-
-  /**
-   * Reads into an existing List<int> from the file. If [start] is present, the
-   * bytes will be filled into [buffer] from at index [start], otherwise index
-   * 0. If [end] is present, the [end] - [start] bytes will be read into
-   * [buffer], otherwise up to [buffer.length]. If [end] == [start] nothing
-   * happens.
-   *
-   * Returns a [:Future<int>:] that completes with the number of bytes read.
-   */
-  Future<int> readInto(List<int> buffer, [int start = 0, int end]);
-
-  /**
-   * Synchronously reads into an existing List<int> from the file. If [start] is
-   * present, the bytes will be filled into [buffer] from at index [start],
-   * otherwise index 0.  If [end] is present, the [end] - [start] bytes will be
-   * read into [buffer], otherwise up to [buffer.length]. If [end] == [start]
-   * nothing happens.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int readIntoSync(List<int> buffer, [int start = 0, int end]);
-
-  /**
-   * Writes a single byte to the file. Returns a
-   * [:Future<RandomAccessFile>:] that completes with this
-   * RandomAccessFile when the write completes.
-   */
-  Future<RandomAccessFile> writeByte(int value);
-
-  /**
-   * Synchronously writes a single byte to the file. Returns the
-   * number of bytes successfully written.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int writeByteSync(int value);
-
-  /**
-   * Writes from a [List<int>] to the file. It will read the buffer from index
-   * [start] to index [end]. If [start] is omitted, it'll start from index 0.
-   * If [end] is omitted, it will write to end of [buffer].
-   *
-   * Returns a [:Future<RandomAccessFile>:] that completes with this
-   * [RandomAccessFile] when the write completes.
-   */
-  Future<RandomAccessFile> writeFrom(
-      List<int> buffer, [int start = 0, int end]);
-
-  /**
-   * Synchronously writes from a [List<int>] to the file. It will read the
-   * buffer from index [start] to index [end]. If [start] is omitted, it'll
-   * start from index 0. If [end] is omitted, it will write to the end of
-   * [buffer].
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void writeFromSync(List<int> buffer, [int start = 0, int end]);
-
-  /**
-   * Writes a string to the file using the given [Encoding]. Returns a
-   * [:Future<RandomAccessFile>:] that completes with this
-   * RandomAccessFile when the write completes.
-   */
-  Future<RandomAccessFile> writeString(String string,
-                                       {Encoding encoding: UTF8});
-
-  /**
-   * Synchronously writes a single string to the file using the given
-   * [Encoding].
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void writeStringSync(String string,
-                       {Encoding encoding: UTF8});
-
-  /**
-   * Gets the current byte position in the file. Returns a
-   * [:Future<int>:] that completes with the position.
-   */
-  Future<int> position();
-
-  /**
-   * Synchronously gets the current byte position in the file.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int positionSync();
-
-  /**
-   * Sets the byte position in the file. Returns a
-   * [:Future<RandomAccessFile>:] that completes with this
-   * RandomAccessFile when the position has been set.
-   */
-  Future<RandomAccessFile> setPosition(int position);
-
-  /**
-   * Synchronously sets the byte position in the file.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void setPositionSync(int position);
-
-  /**
-   * Truncates (or extends) the file to [length] bytes. Returns a
-   * [:Future<RandomAccessFile>:] that completes with this
-   * RandomAccessFile when the truncation has been performed.
-   */
-  Future<RandomAccessFile> truncate(int length);
-
-  /**
-   * Synchronously truncates (or extends) the file to [length] bytes.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void truncateSync(int length);
-
-  /**
-   * Gets the length of the file. Returns a [:Future<int>:] that
-   * completes with the length in bytes.
-   */
-  Future<int> length();
-
-  /**
-   * Synchronously gets the length of the file.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  int lengthSync();
-
-  /**
-   * Flushes the contents of the file to disk. Returns a
-   * [:Future<RandomAccessFile>:] that completes with this
-   * RandomAccessFile when the flush operation completes.
-   */
-  Future<RandomAccessFile> flush();
-
-  /**
-   * Synchronously flushes the contents of the file to disk.
-   *
-   * Throws a [FileSystemException] if the operation fails.
-   */
-  void flushSync();
-
-  /**
-   * Locks the file or part of the file.
-   *
-   * By default an exclusive lock will be obtained, but that can be overridden
-   * by the [mode] argument.
-   *
-   * Locks the byte range from [start] to [end] of the file, with the
-   * byte at position `end` not included. If no arguments are
-   * specified, the full file is locked, If only `start` is specified
-   * the file is locked from byte position `start` to the end of the
-   * file, no matter how large it grows. It is possible to specify an
-   * explicit value of `end` which is past the current length of the file.
-   *
-   * To obtain an exclusive lock on a file it must be opened for writing.
-   *
-   * *NOTE* file locking does have slight differences in behavior across
-   * platforms:
-   *
-   * On Linux and OS X this uses advisory locks, which have the
-   * surprising semantics that all locks associated with a given file
-   * are removed when *any* file descriptor for that file is closed by
-   * the process. Note that this does not actually lock the file for
-   * access. Also note that advisory locks are on a process
-   * level. This means that several isolates in the same process can
-   * obtain an exclusive lock on the same file.
-   *
-   * On Windows the regions used for lock and unlock needs to match. If that
-   * is not the case unlocking will result in the OS error "The segment is
-   * already unlocked".
-   */
-  Future<RandomAccessFile> lock(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]);
-
-  /**
-   * Synchronously locks the file or part of the file.
-   *
-   * By default an exclusive lock will be obtained, but that can be overridden
-   * by the [mode] argument.
-   *
-   * Locks the byte range from [start] to [end] of the file ,with the
-   * byte at position `end` not included. If no arguments are
-   * specified, the full file is locked, If only `start` is specified
-   * the file is locked from byte position `start` to the end of the
-   * file, no matter how large it grows. It is possible to specify an
-   * explicit value of `end` which is past the current length of the file.
-   *
-   * To obtain an exclusive lock on a file it must be opened for writing.
-   *
-   * *NOTE* file locking does have slight differences in behavior across
-   * platforms:
-   *
-   * On Linux and OS X this uses advisory locks, which have the
-   * surprising semantics that all locks associated with a given file
-   * are removed when *any* file descriptor for that file is closed by
-   * the process. Note that this does not actually lock the file for
-   * access. Also note that advisory locks are on a process
-   * level. This means that several isolates in the same process can
-   * obtain an exclusive lock on the same file.
-   *
-   * On Windows the regions used for lock and unlock needs to match. If that
-   * is not the case unlocking will result in the OS error "The segment is
-   * already unlocked".
-   *
-   */
-  void lockSync(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]);
-
-  /**
-   * Unlocks the file or part of the file.
-   *
-   * Unlocks the byte range from [start] to [end] of the file, with
-   * the byte at position `end` not included. If no arguments are
-   * specified, the full file is unlocked, If only `start` is
-   * specified the file is unlocked from byte position `start` to the
-   * end of the file.
-   *
-   * *NOTE* file locking does have slight differences in behavior across
-   * platforms:
-   *
-   * See [lock] for more details.
-   */
-  Future<RandomAccessFile> unlock([int start = 0, int end = -1]);
-
-  /**
-   * Synchronously unlocks the file or part of the file.
-   *
-   * Unlocks the byte range from [start] to [end] of the file, with
-   * the byte at position `end` not included. If no arguments are
-   * specified, the full file is unlocked, If only `start` is
-   * specified the file is unlocked from byte position `start` to the
-   * end of the file.
-   *
-   * *NOTE* file locking does have slight differences in behavior across
-   * platforms:
-   *
-   * See [lockSync] for more details.
-   */
-  void unlockSync([int start = 0, int end = -1]);
-
-  /**
-   * Returns a human-readable string for this RandomAccessFile instance.
-   */
-  String toString();
-
-  /**
-   * Gets the path of the file underlying this RandomAccessFile.
-   */
-  String get path;
-}
-
-
-/**
- * Exception thrown when a file operation fails.
- */
-class FileSystemException implements IOException {
-  /**
-   * Message describing the error. This does not include any detailed
-   * information form the underlying OS error. Check [osError] for
-   * that information.
-   */
-  final String message;
-
-  /**
-   * The file system path on which the error occurred. Can be `null`
-   * if the exception does not relate directly to a file system path.
-   */
-  final String path;
-
-  /**
-   * The underlying OS error. Can be `null` if the exception is not
-   * raised due to an OS error.
-   */
-  final OSError osError;
-
-  /**
-   * Creates a new FileSystemException with an optional error message
-   * [message], optional file system path [path] and optional OS error
-   * [osError].
-   */
-  const FileSystemException([this.message = "", this.path = "", this.osError]);
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("FileSystemException");
-    if (!message.isEmpty) {
-      sb.write(": $message");
-      if (path != null) {
-        sb.write(", path = '$path'");
-      }
-      if (osError != null) {
-        sb.write(" ($osError)");
-      }
-    } else if (osError != null) {
-      sb.write(": $osError");
-      if (path != null) {
-        sb.write(", path = '$path'");
-      }
-    } else if (path != null) {
-      sb.write(": $path");
-    }
-    return sb.toString();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/file_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/file_impl.dart
deleted file mode 100644
index a6fdde8..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/file_impl.dart
+++ /dev/null
@@ -1,1025 +0,0 @@
-// 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.
-
-part of dart.io;
-
-// Read the file in blocks of size 64k.
-const int _BLOCK_SIZE = 64 * 1024;
-
-
-class _FileStream extends Stream<List<int>> {
-  // Stream controller.
-  StreamController<List<int>> _controller;
-
-  // Information about the underlying file.
-  String _path;
-  RandomAccessFile _openedFile;
-  int _position;
-  int _end;
-  final Completer _closeCompleter = new Completer();
-
-  // Has the stream been paused or unsubscribed?
-  bool _unsubscribed = false;
-
-  // Is there a read currently in progress?
-  bool _readInProgress = true;
-  bool _closed = false;
-
-  bool _atEnd = false;
-
-  _FileStream(this._path, this._position, this._end) {
-    if (_position == null) _position = 0;
-  }
-
-  _FileStream.forStdin() : _position = 0;
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    _setupController();
-    return _controller.stream.listen(onData,
-                                     onError: onError,
-                                     onDone: onDone,
-                                     cancelOnError: cancelOnError);
-  }
-
-  void _setupController() {
-    _controller = new StreamController<List<int>>(sync: true,
-        onListen: _start,
-        onResume: _readBlock,
-        onCancel: () {
-          _unsubscribed = true;
-          return _closeFile();
-        });
-  }
-
-  Future _closeFile() {
-    if (_readInProgress || _closed) {
-      return _closeCompleter.future;
-    }
-    _closed = true;
-
-    void done() {
-      _closeCompleter.complete();
-      _controller.close();
-    }
-
-    _openedFile.close()
-        .catchError(_controller.addError)
-        .whenComplete(done);
-    return _closeCompleter.future;
-  }
-
-  void _readBlock() {
-    // Don't start a new read if one is already in progress.
-    if (_readInProgress) return;
-    if (_atEnd) {
-      _closeFile();
-      return;
-    }
-    _readInProgress = true;
-    int readBytes = _BLOCK_SIZE;
-    if (_end != null) {
-      readBytes = min(readBytes, _end - _position);
-      if (readBytes < 0) {
-        _readInProgress = false;
-        if (!_unsubscribed) {
-          _controller.addError(new RangeError("Bad end position: $_end"));
-          _closeFile();
-          _unsubscribed = true;
-        }
-        return;
-      }
-    }
-    _openedFile.read(readBytes)
-      .then((block) {
-        _readInProgress = false;
-        if (_unsubscribed) {
-          _closeFile();
-          return;
-        }
-        _position += block.length;
-        if (block.length < readBytes ||
-            (_end != null && _position == _end)) {
-          _atEnd = true;
-        }
-        if (!_atEnd && !_controller.isPaused) {
-          _readBlock();
-        }
-        _controller.add(block);
-        if (_atEnd) {
-          _closeFile();
-        }
-      })
-      .catchError((e, s) {
-        if (!_unsubscribed) {
-          _controller.addError(e, s);
-          _closeFile();
-          _unsubscribed = true;
-        }
-      });
-  }
-
-  void _start() {
-    if (_position < 0) {
-      _controller.addError(new RangeError("Bad start position: $_position"));
-      _controller.close();
-      _closeCompleter.complete();
-      return;
-    }
-
-    void onReady(RandomAccessFile file) {
-      _openedFile = file;
-      _readInProgress = false;
-      _readBlock();
-    }
-
-    void onOpenFile(RandomAccessFile file) {
-      if (_position > 0) {
-        file.setPosition(_position)
-            .then(onReady, onError: (e, s) {
-              _controller.addError(e, s);
-              _readInProgress = false;
-              _closeFile();
-            });
-      } else {
-        onReady(file);
-      }
-    }
-
-    void openFailed(error, stackTrace) {
-      _controller.addError(error, stackTrace);
-      _controller.close();
-      _closeCompleter.complete();
-    }
-
-    if (_path != null) {
-      new File(_path).open(mode: FileMode.READ)
-          .then(onOpenFile, onError: openFailed);
-    } else {
-      try {
-        onOpenFile(_File._openStdioSync(0));
-      } catch (e, s) {
-        openFailed(e, s);
-      }
-    }
-  }
-}
-
-class _FileStreamConsumer extends StreamConsumer<List<int>> {
-  File _file;
-  Future<RandomAccessFile> _openFuture;
-
-  _FileStreamConsumer(File this._file, FileMode mode) {
-    _openFuture = _file.open(mode: mode);
-  }
-
-  _FileStreamConsumer.fromStdio(int fd) {
-    assert(1 <= fd && fd <= 2);
-    _openFuture = new Future.value(_File._openStdioSync(fd));
-  }
-
-  Future<File> addStream(Stream<List<int>> stream) {
-    Completer<File> completer = new Completer<File>.sync();
-    _openFuture
-      .then((openedFile) {
-        var _subscription;
-        void error(e, [StackTrace stackTrace]) {
-          _subscription.cancel();
-          openedFile.close();
-          completer.completeError(e, stackTrace);
-        }
-        _subscription = stream.listen(
-          (d) {
-            _subscription.pause();
-            try {
-              openedFile.writeFrom(d, 0, d.length)
-                .then((_) => _subscription.resume(),
-                      onError: error);
-            } catch (e, stackTrace) {
-              error(e, stackTrace);
-            }
-          },
-          onDone: () {
-            completer.complete(_file);
-          },
-          onError: error,
-          cancelOnError: true);
-      })
-      .catchError(completer.completeError);
-    return completer.future;
-  }
-
-  Future<File> close() =>
-      _openFuture.then((openedFile) => openedFile.close());
-}
-
-
-// Class for encapsulating the native implementation of files.
-class _File extends FileSystemEntity implements File {
-  final String path;
-
-  // Constructor for file.
-  _File(this.path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} '
-                              'is not a String');
-    }
-  }
-
-  Future<bool> exists() {
-    return _IOService._dispatch(_FILE_EXISTS, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Cannot check existence", path);
-      }
-      return response;
-    });
-  }
-
-  external static _exists(String path);
-
-  bool existsSync() {
-    var result = _exists(path);
-    throwIfError(result, "Cannot check existence of file", path);
-    return result;
-  }
-
-  File get absolute => new File(_absolutePath);
-
-  Future<FileStat> stat() => FileStat.stat(path);
-
-  FileStat statSync() => FileStat.statSync(path);
-
-  Future<File> create({bool recursive: false}) {
-    var result = recursive ? parent.create(recursive: true)
-                           : new Future.value(null);
-    return result
-      .then((_) => _IOService._dispatch(_FILE_CREATE, [path]))
-      .then((response) {
-        if (_isErrorResponse(response)) {
-          throw _exceptionFromResponse(response, "Cannot create file", path);
-        }
-        return this;
-      });
-  }
-
-  external static _create(String path);
-
-  external static _createLink(String path, String target);
-
-  external static _linkTarget(String path);
-
-  void createSync({bool recursive: false}) {
-    if (recursive) {
-      parent.createSync(recursive: true);
-    }
-    var result = _create(path);
-    throwIfError(result, "Cannot create file", path);
-  }
-
-  Future<File> _delete({bool recursive: false}) {
-    if (recursive) {
-      return new Directory(path).delete(recursive: true).then((_) => this);
-    }
-    return _IOService._dispatch(_FILE_DELETE, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Cannot delete file", path);
-      }
-      return this;
-    });
-  }
-
-  external static _deleteNative(String path);
-
-  external static _deleteLinkNative(String path);
-
-  void _deleteSync({bool recursive: false}) {
-    if (recursive) {
-      return new Directory(path).deleteSync(recursive: true);
-    }
-    var result = _deleteNative(path);
-    throwIfError(result, "Cannot delete file", path);
-  }
-
-  Future<File> rename(String newPath) {
-    return _IOService._dispatch(_FILE_RENAME, [path, newPath]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(
-            response, "Cannot rename file to '$newPath'", path);
-      }
-      return new File(newPath);
-    });
-  }
-
-  external static _rename(String oldPath, String newPath);
-
-  external static _renameLink(String oldPath, String newPath);
-
-  File renameSync(String newPath) {
-    var result = _rename(path, newPath);
-    throwIfError(result, "Cannot rename file to '$newPath'", path);
-    return new File(newPath);
-  }
-
-  Future<File> copy(String newPath) {
-    return _IOService._dispatch(_FILE_COPY, [path, newPath]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(
-            response, "Cannot copy file to '$newPath'", path);
-      }
-      return new File(newPath);
-    });
-  }
-
-  external static _copy(String oldPath, String newPath);
-
-  File copySync(String newPath) {
-    var result = _copy(path, newPath);
-    throwIfError(result, "Cannot copy file to '$newPath'", path);
-    return new File(newPath);
-  }
-
-  Future<RandomAccessFile> open({FileMode mode: FileMode.READ}) {
-    if (mode != FileMode.READ &&
-        mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
-      return new Future.error(
-          new ArgumentError('Invalid file mode for this operation'));
-    }
-    return _IOService._dispatch(_FILE_OPEN, [path, mode._mode])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response, "Cannot open file", path);
-          }
-          return new _RandomAccessFile(response, path);
-        });
-  }
-
-  Future<int> length() {
-    return _IOService._dispatch(_FILE_LENGTH_FROM_PATH, [path])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response,
-                                         "Cannot retrieve length of file",
-                                         path);
-          }
-          return response;
-        });
-  }
-
-
-  external static _lengthFromPath(String path);
-
-  int lengthSync() {
-    var result = _lengthFromPath(path);
-    throwIfError(result, "Cannot retrieve length of file", path);
-    return result;
-  }
-
-  Future<DateTime> lastModified() {
-    return _IOService._dispatch(_FILE_LAST_MODIFIED, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response,
-                                     "Cannot retrieve modification time",
-                                     path);
-      }
-      return new DateTime.fromMillisecondsSinceEpoch(response);
-    });
-  }
-
-  external static _lastModified(String path);
-
-  DateTime lastModifiedSync() {
-    var ms = _lastModified(path);
-    throwIfError(ms, "Cannot retrieve modification time", path);
-    return new DateTime.fromMillisecondsSinceEpoch(ms);
-  }
-
-  external static _open(String path, int mode);
-
-  RandomAccessFile openSync({FileMode mode: FileMode.READ}) {
-    if (mode != FileMode.READ &&
-        mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
-      throw new ArgumentError('Invalid file mode for this operation');
-    }
-    var id = _open(path, mode._mode);
-    throwIfError(id, "Cannot open file", path);
-    return new _RandomAccessFile(id, path);
-  }
-
-  external static int _openStdio(int fd);
-
-  static RandomAccessFile _openStdioSync(int fd) {
-    var id = _openStdio(fd);
-    if (id == 0) {
-      throw new FileSystemException("Cannot open stdio file for: $fd");
-    }
-    return new _RandomAccessFile(id, "");
-  }
-
-  Stream<List<int>> openRead([int start, int end]) {
-    return new _FileStream(path, start, end);
-  }
-
-  IOSink openWrite({FileMode mode: FileMode.WRITE,
-                    Encoding encoding: UTF8}) {
-    if (mode != FileMode.WRITE &&
-        mode != FileMode.APPEND &&
-        mode != FileMode.WRITE_ONLY &&
-        mode != FileMode.WRITE_ONLY_APPEND) {
-      throw new ArgumentError('Invalid file mode for this operation');
-    }
-    var consumer = new _FileStreamConsumer(this, mode);
-    return new IOSink(consumer, encoding: encoding);
-  }
-
-  Future<List<int>> readAsBytes() {
-    Future<List<int>> readDataChunked(file) {
-      var builder = new BytesBuilder(copy: false);
-      var completer = new Completer();
-      void read() {
-        file.read(_BLOCK_SIZE).then((data) {
-          if (data.length > 0) {
-            builder.add(data);
-            read();
-          } else {
-            completer.complete(builder.takeBytes());
-          }
-        }, onError: completer.completeError);
-      }
-      read();
-      return completer.future;
-    }
-
-    return open().then((file) {
-      return file.length().then((length) {
-        if (length == 0) {
-          // May be character device, try to read it in chunks.
-          return readDataChunked(file);
-        }
-        return file.read(length);
-      }).whenComplete(file.close);
-    });
-  }
-
-  List<int> readAsBytesSync() {
-    var opened = openSync();
-    try {
-      var data;
-      var length = opened.lengthSync();
-      if (length == 0) {
-        // May be character device, try to read it in chunks.
-        var builder = new BytesBuilder(copy: false);
-        do {
-          data = opened.readSync(_BLOCK_SIZE);
-          if (data.length > 0) builder.add(data);
-        } while (data.length > 0);
-        data = builder.takeBytes();
-      } else {
-        data = opened.readSync(length);
-      }
-      return data;
-    } finally {
-      opened.closeSync();
-    }
-  }
-
-  String _tryDecode(List<int> bytes, Encoding encoding) {
-    try {
-      return encoding.decode(bytes);
-    } catch (_) {
-      throw new FileSystemException(
-          "Failed to decode data using encoding '${encoding.name}'", path);
-    }
-  }
-
-  Future<String> readAsString({Encoding encoding: UTF8}) =>
-    readAsBytes().then((bytes) => _tryDecode(bytes, encoding));
-
-  String readAsStringSync({Encoding encoding: UTF8}) =>
-    _tryDecode(readAsBytesSync(), encoding);
-
-  Future<List<String>> readAsLines({Encoding encoding: UTF8}) =>
-    readAsString(encoding: encoding).then(const LineSplitter().convert);
-
-  List<String> readAsLinesSync({Encoding encoding: UTF8}) =>
-    const LineSplitter().convert(readAsStringSync(encoding: encoding));
-
-  Future<File> writeAsBytes(List<int> bytes,
-                            {FileMode mode: FileMode.WRITE,
-                             bool flush: false}) {
-    return open(mode: mode).then((file) {
-      return file.writeFrom(bytes, 0, bytes.length)
-          .then((_) {
-            if (flush) return file.flush().then((_) => this);
-            return this;
-          })
-          .whenComplete(file.close);
-    });
-  }
-
-  void writeAsBytesSync(List<int> bytes,
-                        {FileMode mode: FileMode.WRITE,
-                         bool flush: false}) {
-    RandomAccessFile opened = openSync(mode: mode);
-    try {
-      opened.writeFromSync(bytes, 0, bytes.length);
-      if (flush) opened.flushSync();
-    } finally {
-      opened.closeSync();
-    }
-  }
-
-  Future<File> writeAsString(String contents,
-                             {FileMode mode: FileMode.WRITE,
-                              Encoding encoding: UTF8,
-                              bool flush: false}) {
-    try {
-      return writeAsBytes(encoding.encode(contents), mode: mode, flush: flush);
-    } catch (e) {
-      return new Future.error(e);
-    }
-  }
-
-  void writeAsStringSync(String contents,
-                         {FileMode mode: FileMode.WRITE,
-                          Encoding encoding: UTF8,
-                          bool flush: false}) {
-    writeAsBytesSync(encoding.encode(contents), mode: mode, flush: flush);
-  }
-
-  String toString() => "File: '$path'";
-
-  static throwIfError(Object result, String msg, String path) {
-    if (result is OSError) {
-      throw new FileSystemException(msg, path, result);
-    }
-  }
-}
-
-abstract class _RandomAccessFileOps {
-  external factory _RandomAccessFileOps(int pointer);
-
-  int getPointer();
-  int close();
-  readByte();
-  read(int bytes);
-  readInto(List<int> buffer, int start, int end);
-  writeByte(int value);
-  writeFrom(List<int> buffer, int start, int end);
-  position();
-  setPosition(int position);
-  truncate(int length);
-  length();
-  flush();
-  lock(int lock, int start, int end);
-}
-
-class _RandomAccessFile implements RandomAccessFile {
-  static bool _connectedResourceHandler = false;
-
-  final String path;
-
-  bool _asyncDispatched = false;
-  SendPort _fileService;
-
-  _FileResourceInfo _resourceInfo;
-  _RandomAccessFileOps _ops;
-
-  _RandomAccessFile(int pointer, this.path) {
-    _ops = new _RandomAccessFileOps(pointer);
-    _resourceInfo = new _FileResourceInfo(this);
-    _maybeConnectHandler();
-  }
-
-  void _maybePerformCleanup() {
-    if (closed) {
-      _FileResourceInfo.FileClosed(_resourceInfo);
-    }
-  }
-
-  _maybeConnectHandler() {
-    if (!_connectedResourceHandler) {
-      // TODO(ricow): We probably need to set these in some initialization code.
-      // We need to make sure that these are always available from the
-      // observatory even if no files (or sockets for the socket ones) are
-      // open.
-      registerExtension('ext.dart.io.getOpenFiles',
-                        _FileResourceInfo.getOpenFiles);
-      registerExtension('ext.dart.io.getFileByID',
-                        _FileResourceInfo.getFileInfoMapByID);
-      _connectedResourceHandler = true;
-    }
-  }
-
-  Future<RandomAccessFile> close() {
-    return _dispatch(_FILE_CLOSE, [null], markClosed: true).then((result) {
-      if (result != -1) {
-        closed = closed || (result == 0);
-        _maybePerformCleanup();
-        return this;
-      } else {
-        throw new FileSystemException("Cannot close file", path);
-      }
-    });
-  }
-
-  void closeSync() {
-    _checkAvailable();
-    var id = _ops.close();
-    if (id == -1) {
-      throw new FileSystemException("Cannot close file", path);
-    }
-    closed = closed || (id == 0);
-    _maybePerformCleanup();
-  }
-
-  Future<int> readByte() {
-    return _dispatch(_FILE_READ_BYTE, [null]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "readByte failed", path);
-      }
-      _resourceInfo.addRead(1);
-      return response;
-    });
-  }
-
-  int readByteSync() {
-    _checkAvailable();
-    var result = _ops.readByte();
-    if (result is OSError) {
-      throw new FileSystemException("readByte failed", path, result);
-    }
-    _resourceInfo.addRead(1);
-    return result;
-  }
-
-  Future<List<int>> read(int bytes) {
-    if (bytes is !int) {
-      throw new ArgumentError(bytes);
-    }
-    return _dispatch(_FILE_READ, [null, bytes]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "read failed", path);
-      }
-      _resourceInfo.addRead(response[1].length);
-      return response[1];
-    });
-  }
-
-  List<int> readSync(int bytes) {
-    _checkAvailable();
-    if (bytes is !int) {
-      throw new ArgumentError(bytes);
-    }
-    var result = _ops.read(bytes);
-    if (result is OSError) {
-      throw new FileSystemException("readSync failed", path, result);
-    }
-    _resourceInfo.addRead(result.length);
-    return result;
-  }
-
-  Future<int> readInto(List<int> buffer, [int start = 0, int end]) {
-    if ((buffer is !List) ||
-        ((start != null) && (start is !int)) ||
-        ((end != null) && (end is !int))) {
-      throw new ArgumentError();
-    }
-    end = RangeError.checkValidRange(start, end, buffer.length);
-    if (end == start) {
-      return new Future.value(0);
-    }
-    int length = end - start;
-    return _dispatch(_FILE_READ_INTO, [null, length]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "readInto failed", path);
-      }
-      var read = response[1];
-      var data = response[2];
-      buffer.setRange(start, start + read, data);
-      _resourceInfo.addRead(read);
-      return read;
-    });
-  }
-
-  int readIntoSync(List<int> buffer, [int start = 0, int end]) {
-    _checkAvailable();
-    if ((buffer is !List) ||
-        ((start != null) && (start is !int)) ||
-        ((end != null) && (end is !int))) {
-      throw new ArgumentError();
-    }
-    end = RangeError.checkValidRange(start, end, buffer.length);
-    if (end == start) {
-      return 0;
-    }
-    var result = _ops.readInto(buffer, start, end);
-    if (result is OSError) {
-      throw new FileSystemException("readInto failed", path, result);
-    }
-    _resourceInfo.addRead(result);
-    return result;
-  }
-
-  Future<RandomAccessFile> writeByte(int value) {
-    if (value is !int) {
-      throw new ArgumentError(value);
-    }
-    return _dispatch(_FILE_WRITE_BYTE, [null, value]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "writeByte failed", path);
-      }
-      _resourceInfo.addWrite(1);
-      return this;
-    });
-  }
-
-  int writeByteSync(int value) {
-    _checkAvailable();
-    if (value is !int) {
-      throw new ArgumentError(value);
-    }
-    var result = _ops.writeByte(value);
-    if (result is OSError) {
-      throw new FileSystemException("writeByte failed", path, result);
-    }
-    _resourceInfo.addWrite(1);
-    return result;
-  }
-
-  Future<RandomAccessFile> writeFrom(
-      List<int> buffer, [int start = 0, int end]) {
-    if ((buffer is !List) ||
-        ((start != null) && (start is !int)) ||
-        ((end != null) && (end is !int))) {
-      throw new ArgumentError("Invalid arguments to writeFrom");
-    }
-    end = RangeError.checkValidRange(start, end, buffer.length);
-    if (end == start) {
-      return new Future.value(this);
-    }
-    _BufferAndStart result;
-    try {
-      result = _ensureFastAndSerializableByteData(buffer, start, end);
-    } catch (e) {
-      return new Future.error(e);
-    }
-
-    List request = new List(4);
-    request[0] = null;
-    request[1] = result.buffer;
-    request[2] = result.start;
-    request[3] = end - (start - result.start);
-    return _dispatch(_FILE_WRITE_FROM, request).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "writeFrom failed", path);
-      }
-      _resourceInfo.addWrite(end - (start - result.start));
-      return this;
-    });
-  }
-
-  void writeFromSync(List<int> buffer, [int start = 0, int end]) {
-    _checkAvailable();
-    if ((buffer is !List) ||
-        ((start != null) && (start is !int)) ||
-        ((end != null) && (end is !int))) {
-      throw new ArgumentError("Invalid arguments to writeFromSync");
-    }
-    end = RangeError.checkValidRange(start, end, buffer.length);
-    if (end == start) {
-      return;
-    }
-    _BufferAndStart bufferAndStart =
-        _ensureFastAndSerializableByteData(buffer, start, end);
-    var result = _ops.writeFrom(bufferAndStart.buffer,
-                                bufferAndStart.start,
-                                end - (start - bufferAndStart.start));
-    if (result is OSError) {
-      throw new FileSystemException("writeFrom failed", path, result);
-    }
-    _resourceInfo.addWrite(end - (start - bufferAndStart.start));
-  }
-
-  Future<RandomAccessFile> writeString(String string,
-                                       {Encoding encoding: UTF8}) {
-    if (encoding is! Encoding) {
-      throw new ArgumentError(encoding);
-    }
-    var data = encoding.encode(string);
-    return writeFrom(data, 0, data.length);
-  }
-
-  void writeStringSync(String string, {Encoding encoding: UTF8}) {
-    if (encoding is! Encoding) {
-      throw new ArgumentError(encoding);
-    }
-    var data = encoding.encode(string);
-    writeFromSync(data, 0, data.length);
-  }
-
-  Future<int> position() {
-    return _dispatch(_FILE_POSITION, [null]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "position failed", path);
-      }
-      return response;
-    });
-  }
-
-  int positionSync() {
-    _checkAvailable();
-    var result = _ops.position();
-    if (result is OSError) {
-      throw new FileSystemException("position failed", path, result);
-    }
-    return result;
-  }
-
-  Future<RandomAccessFile> setPosition(int position) {
-    return _dispatch(_FILE_SET_POSITION, [null, position])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response, "setPosition failed", path);
-          }
-          return this;
-        });
-  }
-
-  void setPositionSync(int position) {
-    _checkAvailable();
-    var result = _ops.setPosition(position);
-    if (result is OSError) {
-      throw new FileSystemException("setPosition failed", path, result);
-    }
-  }
-
-  Future<RandomAccessFile> truncate(int length) {
-    return _dispatch(_FILE_TRUNCATE, [null, length]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "truncate failed", path);
-      }
-      return this;
-    });
-  }
-
-  void truncateSync(int length) {
-    _checkAvailable();
-    var result = _ops.truncate(length);
-    if (result is OSError) {
-      throw new FileSystemException("truncate failed", path, result);
-    }
-  }
-
-  Future<int> length() {
-    return _dispatch(_FILE_LENGTH, [null]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "length failed", path);
-      }
-      return response;
-    });
-  }
-
-  int lengthSync() {
-    _checkAvailable();
-    var result = _ops.length();
-    if (result is OSError) {
-      throw new FileSystemException("length failed", path, result);
-    }
-    return result;
-  }
-
-  Future<RandomAccessFile> flush() {
-    return _dispatch(_FILE_FLUSH, [null]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response,
-                                     "flush failed",
-                                     path);
-      }
-      return this;
-    });
-  }
-
-  void flushSync() {
-    _checkAvailable();
-    var result = _ops.flush();
-    if (result is OSError) {
-      throw new FileSystemException("flush failed", path, result);
-    }
-  }
-
-  static final int LOCK_UNLOCK = 0;
-  static final int LOCK_SHARED = 1;
-  static final int LOCK_EXCLUSIVE = 2;
-
-  Future<RandomAccessFile> lock(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) {
-    if ((mode is !FileLock) || (start is !int) || (end is !int)) {
-      throw new ArgumentError();
-    }
-    if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) {
-      throw new ArgumentError();
-    }
-    int lock = (mode == FileLock.EXCLUSIVE) ? LOCK_EXCLUSIVE : LOCK_SHARED;
-    return _dispatch(_FILE_LOCK, [null, lock, start, end])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response, 'lock failed', path);
-          }
-          return this;
-        });
-  }
-
-  Future<RandomAccessFile> unlock([int start = 0, int end = -1]) {
-    if ((start is !int) || (end is !int)) {
-      throw new ArgumentError();
-    }
-    if (start == end) {
-      throw new ArgumentError();
-    }
-    return _dispatch(_FILE_LOCK, [null, LOCK_UNLOCK, start, end])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response, 'unlock failed', path);
-          }
-          return this;
-        });
-  }
-
-  void lockSync(
-      [FileLock mode = FileLock.EXCLUSIVE, int start = 0, int end = -1]) {
-    _checkAvailable();
-    if ((mode is !FileLock) || (start is !int) || (end is !int)) {
-      throw new ArgumentError();
-    }
-    if ((start < 0) || (end < -1) || ((end != -1) && (start >= end))) {
-      throw new ArgumentError();
-    }
-    int lock = (mode == FileLock.EXCLUSIVE) ? LOCK_EXCLUSIVE : LOCK_SHARED;
-    var result = _ops.lock(lock, start, end);
-    if (result is OSError) {
-      throw new FileSystemException('lock failed', path, result);
-    }
-  }
-
-  void unlockSync([int start = 0, int end = -1]) {
-    _checkAvailable();
-    if ((start is !int) || (end is !int)) {
-      throw new ArgumentError();
-    }
-    if (start == end) {
-      throw new ArgumentError();
-    }
-    var result = _ops.lock(LOCK_UNLOCK, start, end);
-    if (result is OSError) {
-      throw new FileSystemException('unlock failed', path, result);
-    }
-  }
-
-  bool closed = false;
-
-  // Calling this function will increase the reference count on the native
-  // object that implements the file operations. It should only be called to
-  // pass the pointer to the IO Service, which will decrement the reference
-  // count when it is finished with it.
-  int _pointer() => _ops.getPointer();
-
-  Future _dispatch(int request, List data, { bool markClosed: false }) {
-    if (closed) {
-      return new Future.error(new FileSystemException("File closed", path));
-    }
-    if (_asyncDispatched) {
-      var msg = "An async operation is currently pending";
-      return new Future.error(new FileSystemException(msg, path));
-    }
-    if (markClosed) {
-      // Set closed to true to ensure that no more async requests can be issued
-      // for this file.
-      closed = true;
-    }
-    _asyncDispatched = true;
-    data[0] = _pointer();
-    return _IOService._dispatch(request, data)
-        .whenComplete(() {
-          _asyncDispatched = false;
-        });
-  }
-
-  void _checkAvailable() {
-    if (_asyncDispatched) {
-      throw new FileSystemException("An async operation is currently pending",
-                                    path);
-    }
-    if (closed) {
-      throw new FileSystemException("File closed", path);
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/file_system_entity.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/file_system_entity.dart
deleted file mode 100644
index d197949..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/file_system_entity.dart
+++ /dev/null
@@ -1,841 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * The type of an entity on the file system, such as a file, directory, or link.
- *
- * These constants are used by the [FileSystemEntity] class
- * to indicate the object's type.
- *
- */
-
-class FileSystemEntityType {
-  static const FILE = const FileSystemEntityType._internal(0);
-  static const DIRECTORY = const FileSystemEntityType._internal(1);
-  static const LINK = const FileSystemEntityType._internal(2);
-  static const NOT_FOUND = const FileSystemEntityType._internal(3);
-  static const _typeList = const [FileSystemEntityType.FILE,
-                                  FileSystemEntityType.DIRECTORY,
-                                  FileSystemEntityType.LINK,
-                                  FileSystemEntityType.NOT_FOUND];
-  final int _type;
-
-  const FileSystemEntityType._internal(this._type);
-
-  static FileSystemEntityType _lookup(int type) => _typeList[type];
-  String toString() => const ['FILE', 'DIRECTORY', 'LINK', 'NOT_FOUND'][_type];
-}
-
-/**
- * A FileStat object represents the result of calling the POSIX stat() function
- * on a file system object.  It is an immutable object, representing the
- * snapshotted values returned by the stat() call.
- */
-class FileStat {
-  // These must agree with enum FileStat in file.h.
-  static const _TYPE = 0;
-  static const _CHANGED_TIME = 1;
-  static const _MODIFIED_TIME = 2;
-  static const _ACCESSED_TIME = 3;
-  static const _MODE = 4;
-  static const _SIZE = 5;
-
-  static const _notFound = const FileStat._internalNotFound();
-
-  /**
-   * The time of the last change to the data or metadata of the file system
-   * object.  On Windows platforms, this is instead the file creation time.
-   */
-  final DateTime changed;
-  /**
-   * The time of the last change to the data of the file system
-   * object.
-   */
-  final DateTime modified;
-  /**
-   * The time of the last access to the data of the file system
-   * object.  On Windows platforms, this may have 1 day granularity, and be
-   * out of date by an hour.
-   */
-  final DateTime accessed;
-  /**
-   * The type of the object (file, directory, or link).  If the call to
-   * stat() fails, the type of the returned object is NOT_FOUND.
-   */
-  final FileSystemEntityType type;
-  /**
-   * The mode of the file system object.  Permissions are encoded in the lower
-   * 16 bits of this number, and can be decoded using the [modeString] getter.
-   */
-  final int mode;
-  /**
-   * The size of the file system object.
-   */
-  final int size;
-
-  FileStat._internal(this.changed,
-                     this.modified,
-                     this.accessed,
-                     this.type,
-                     this.mode,
-                     this.size);
-
-  const FileStat._internalNotFound() :
-      changed = null,  modified = null, accessed = null,
-      type = FileSystemEntityType.NOT_FOUND, mode = 0, size = -1;
-
-  external static _statSync(String path);
-
-
-  /**
-   * Calls the operating system's stat() function on [path].
-   * Returns a [FileStat] object containing the data returned by stat().
-   * If the call fails, returns a [FileStat] object with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
-   */
-  static FileStat statSync(String path) {
-    // Trailing path is not supported on Windows.
-    if (Platform.isWindows) {
-      path = FileSystemEntity._trimTrailingPathSeparators(path);
-    }
-    var data = _statSync(path);
-    if (data is OSError) return FileStat._notFound;
-    return new FileStat._internal(
-        new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
-        new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
-        new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
-        FileSystemEntityType._lookup(data[_TYPE]),
-        data[_MODE],
-        data[_SIZE]);
-  }
-
-  /**
-   * Asynchronously calls the operating system's stat() function on [path].
-   * Returns a Future which completes with a [FileStat] object containing
-   * the data returned by stat().
-   * If the call fails, completes the future with a [FileStat] object with
-   * .type set to FileSystemEntityType.NOT_FOUND and the other fields invalid.
-   */
-  static Future<FileStat> stat(String path) {
-    // Trailing path is not supported on Windows.
-    if (Platform.isWindows) {
-      path = FileSystemEntity._trimTrailingPathSeparators(path);
-    }
-    return _IOService._dispatch(_FILE_STAT, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        return FileStat._notFound;
-      }
-      // Unwrap the real list from the "I'm not an error" wrapper.
-      List data = response[1];
-      return new FileStat._internal(
-          new DateTime.fromMillisecondsSinceEpoch(data[_CHANGED_TIME]),
-          new DateTime.fromMillisecondsSinceEpoch(data[_MODIFIED_TIME]),
-          new DateTime.fromMillisecondsSinceEpoch(data[_ACCESSED_TIME]),
-          FileSystemEntityType._lookup(data[_TYPE]),
-          data[_MODE],
-          data[_SIZE]);
-    });
-  }
-
-  String toString() => """
-FileStat: type $type
-          changed $changed
-          modified $modified
-          accessed $accessed
-          mode ${modeString()}
-          size $size""";
-
-  /**
-   * Returns the mode value as a human-readable string, in the format
-   * "rwxrwxrwx", reflecting the user, group, and world permissions to
-   * read, write, and execute the file system object, with "-" replacing the
-   * letter for missing permissions.  Extra permission bits may be represented
-   * by prepending "(suid)", "(guid)", and/or "(sticky)" to the mode string.
-   */
-  String modeString() {
-    var permissions = mode & 0xFFF;
-    var codes = const ['---', '--x', '-w-', '-wx', 'r--', 'r-x', 'rw-', 'rwx'];
-    var result = [];
-    if ((permissions & 0x800) != 0) result.add("(suid) ");
-    if ((permissions & 0x400) != 0) result.add("(guid) ");
-    if ((permissions & 0x200) != 0) result.add("(sticky) ");
-    result
-        ..add(codes[(permissions >> 6) & 0x7])
-        ..add(codes[(permissions >> 3) & 0x7])
-        ..add(codes[permissions & 0x7]);
-    return result.join();
-  }
-}
-
-
-/**
- * The common super class for [File], [Directory], and [Link] objects.
- *
- * [FileSystemEntity] objects are returned from directory listing
- * operations. To determine if a FileSystemEntity is a [File], a
- * [Directory], or a [Link] perform a type check:
- *
- *     if (entity is File) (entity as File).readAsStringSync();
- *
- * You can also use the [type] or [typeSync] methods to determine
- * the type of a file system object.
- *
- * Most methods in this class occur in synchronous and asynchronous pairs,
- * for example, [exists] and [existsSync].
- * Unless you have a specific reason for using the synchronous version
- * of a method, prefer the asynchronous version to avoid blocking your program.
- *
- * Here's the exists method in action:
- *
- *     entity.exists().then((isThere) {
- *       isThere ? print('exists') : print('non-existent');
- *     });
- *
- *
- * ## Other resources
- *
- * * [Dart by
- *   Example](https://www.dartlang.org/dart-by-example/#files-directories-and-symlinks)
- *   provides additional task-oriented code samples that show how to use various
- *   API from the [Directory] class and the [File] class, both subclasses of
- *   FileSystemEntity.
- *
- * * [I/O for Command-Line
- *   Apps](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartio---io-for-command-line-apps),
- *   a section from _A Tour of the Dart Libraries_ covers files and directories.
- *
- * * [Write Command-Line Apps](https://www.dartlang.org/docs/tutorials/cmdline/),
- *   a tutorial about writing command-line apps, includes information about
- *   files and directories.
- */
-abstract class FileSystemEntity {
-  String get path;
-
-  /**
-   * Returns a [Uri] representing the file system entity's location.
-   *
-   * The returned URI's scheme is always "file" if the entity's [path] is
-   * absolute, otherwise the scheme will be empty.
-   */
-  Uri get uri => new Uri.file(path);
-
-  /**
-   * Checks whether the file system entity with this path exists. Returns
-   * a [:Future<bool>:] that completes with the result.
-   *
-   * Since FileSystemEntity is abstract, every FileSystemEntity object
-   * is actually an instance of one of the subclasses [File],
-   * [Directory], and [Link].  Calling [exists] on an instance of one
-   * of these subclasses checks whether the object exists in the file
-   * system object exists and is of the correct type (file, directory,
-   * or link).  To check whether a path points to an object on the
-   * file system, regardless of the object's type, use the [type]
-   * static method.
-   *
-   */
-  Future<bool> exists();
-
-  /**
-   * Synchronously checks whether the file system entity with this path
-   * exists.
-   *
-   * Since FileSystemEntity is abstract, every FileSystemEntity object
-   * is actually an instance of one of the subclasses [File],
-   * [Directory], and [Link].  Calling [existsSync] on an instance of
-   * one of these subclasses checks whether the object exists in the
-   * file system object exists and is of the correct type (file,
-   * directory, or link).  To check whether a path points to an object
-   * on the file system, regardless of the object's type, use the
-   * [typeSync] static method.
-   */
-  bool existsSync();
-
-  /**
-   * Renames this file system entity. Returns a `Future<FileSystemEntity>`
-   * that completes with a [FileSystemEntity] instance for the renamed
-   * file system entity.
-   *
-   * If [newPath] identifies an existing entity of the same type, that entity
-   * is replaced. If [newPath] identifies an existing entity of a different
-   * type, the operation fails and the future completes with an exception.
-   */
-  Future<FileSystemEntity> rename(String newPath);
-
-   /**
-   * Synchronously renames this file system entity. Returns a [FileSystemEntity]
-   * instance for the renamed entity.
-   *
-   * If [newPath] identifies an existing entity of the same type, that entity
-   * is replaced. If [newPath] identifies an existing entity of a different
-   * type, the operation fails and an exception is thrown.
-   */
-  FileSystemEntity renameSync(String newPath);
-
-  /**
-   * Resolves the path of a file system object relative to the
-   * current working directory, resolving all symbolic links on
-   * the path and resolving all `..` and `.` path segments.
-   *
-   * [resolveSymbolicLinks] uses the operating system's native
-   * file system API to resolve the path, using the `realpath` function
-   * on linux and OS X, and the `GetFinalPathNameByHandle` function on
-   * Windows. If the path does not point to an existing file system object,
-   * `resolveSymbolicLinks` throws a `FileSystemException`.
-   *
-   * On Windows the `..` segments are resolved _before_ resolving the symbolic
-   * link, and on other platforms the symbolic links are _resolved to their
-   * target_ before applying a `..` that follows.
-   *
-   * To ensure the same behavior on all platforms resolve `..` segments before
-   * calling `resolveSymbolicLinks`. One way of doing this is with the `Uri`
-   * class:
-   *
-   *     var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
-   *     if (path == '') path = '.';
-   *     new File(path).resolveSymbolicLinks().then((resolved) {
-   *       print(resolved);
-   *     });
-   *
-   * since `Uri.resolve` removes `..` segments. This will result in the Windows
-   * behavior.
-   */
-  Future<String> resolveSymbolicLinks() {
-    return _IOService._dispatch(_FILE_RESOLVE_SYMBOLIC_LINKS, [path])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(response,
-                                         "Cannot resolve symbolic links",
-                                         path);
-          }
-          return response;
-        });
-  }
-
-  /**
-   * Resolves the path of a file system object relative to the
-   * current working directory, resolving all symbolic links on
-   * the path and resolving all `..` and `.` path segments.
-   *
-   * [resolveSymbolicLinksSync] uses the operating system's native
-   * file system API to resolve the path, using the `realpath` function
-   * on linux and OS X, and the `GetFinalPathNameByHandle` function on
-   * Windows. If the path does not point to an existing file system object,
-   * `resolveSymbolicLinksSync` throws a `FileSystemException`.
-   *
-   * On Windows the `..` segments are resolved _before_ resolving the symbolic
-   * link, and on other platforms the symbolic links are _resolved to their
-   * target_ before applying a `..` that follows.
-   *
-   * To ensure the same behavior on all platforms resolve `..` segments before
-   * calling `resolveSymbolicLinksSync`. One way of doing this is with the `Uri`
-   * class:
-   *
-   *     var path = Uri.parse('.').resolveUri(new Uri.file(input)).toFilePath();
-   *     if (path == '') path = '.';
-   *     var resolved = new File(path).resolveSymbolicLinksSync();
-   *     print(resolved);
-   *
-   * since `Uri.resolve` removes `..` segments. This will result in the Windows
-   * behavior.
-   */
-  String resolveSymbolicLinksSync() {
-    var result = _resolveSymbolicLinks(path);
-    _throwIfError(result, "Cannot resolve symbolic links", path);
-    return result;
-  }
-
-
-  /**
-   * Calls the operating system's stat() function on the [path] of this
-   * [FileSystemEntity].  Identical to [:FileStat.stat(this.path):].
-   *
-   * Returns a [:Future<FileStat>:] object containing the data returned by
-   * stat().
-   *
-   * If the call fails, completes the future with a [FileStat] object
-   * with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
-   */
-  Future<FileStat> stat();
-
-  /**
-   * Synchronously calls the operating system's stat() function on the
-   * [path] of this [FileSystemEntity].
-   * Identical to [:FileStat.statSync(this.path):].
-   *
-   * Returns a [FileStat] object containing the data returned by stat().
-   *
-   * If the call fails, returns a [FileStat] object with .type set to
-   * FileSystemEntityType.NOT_FOUND and the other fields invalid.
-   */
-  FileStat statSync();
-
-  /**
-   * Deletes this [FileSystemEntity].
-   *
-   * If the [FileSystemEntity] is a directory, and if [recursive] is false,
-   * the directory must be empty. Otherwise, if [recursive] is true, the
-   * directory and all sub-directories and files in the directories are
-   * deleted. Links are not followed when deleting recursively. Only the link
-   * is deleted, not its target.
-   *
-   * If [recursive] is true, the [FileSystemEntity] is deleted even if the type
-   * of the [FileSystemEntity] doesn't match the content of the file system.
-   * This behavior allows [delete] to be used to unconditionally delete any file
-   * system object.
-   *
-   * Returns a [:Future<FileSystemEntity>:] that completes with this
-   * [FileSystemEntity] when the deletion is done. If the [FileSystemEntity]
-   * cannot be deleted, the future completes with an exception.
-   */
-  Future<FileSystemEntity> delete({bool recursive: false})
-      => _delete(recursive: recursive);
-
-  /**
-   * Synchronously deletes this [FileSystemEntity].
-   *
-   * If the [FileSystemEntity] is a directory, and if [recursive] is false,
-   * the directory must be empty. Otherwise, if [recursive] is true, the
-   * directory and all sub-directories and files in the directories are
-   * deleted. Links are not followed when deleting recursively. Only the link
-   * is deleted, not its target.
-   *
-   * If [recursive] is true, the [FileSystemEntity] is deleted even if the type
-   * of the [FileSystemEntity] doesn't match the content of the file system.
-   * This behavior allows [deleteSync] to be used to unconditionally delete any
-   * file system object.
-   *
-   * Throws an exception if the [FileSystemEntity] cannot be deleted.
-   */
-  void deleteSync({bool recursive: false})
-      => _deleteSync(recursive: recursive);
-
-
-  /**
-   * Start watching the [FileSystemEntity] for changes.
-   *
-   * The implementation uses platform-dependent event-based APIs for receiving
-   * file-system notifications, thus behavior depends on the platform.
-   *
-   *   * `Windows`: Uses `ReadDirectoryChangesW`. The implementation only
-   *     supports watching directories. Recursive watching is supported.
-   *   * `Linux`: Uses `inotify`. The implementation supports watching both
-   *     files and directories. Recursive watching is not supported.
-   *     Note: When watching files directly, delete events might not happen
-   *     as expected.
-   *   * `OS X`: Uses `FSEvents`. The implementation supports watching both
-   *     files and directories. Recursive watching is supported.
-   *
-   * The system will start listening for events once the returned [Stream] is
-   * being listened to, not when the call to [watch] is issued.
-   *
-   * The returned value is an endless broadcast [Stream], that only stops when
-   * one of the following happens:
-   *
-   *   * The [Stream] is canceled, e.g. by calling `cancel` on the
-   *      [StreamSubscription].
-   *   * The [FileSystemEntity] being watches, is deleted.
-   *
-   * Use `events` to specify what events to listen for. The constants in
-   * [FileSystemEvent] can be or'ed together to mix events. Default is
-   * [FileSystemEvent.ALL].
-   *
-   * A move event may be reported as seperate delete and create events.
-   */
-  Stream<FileSystemEvent> watch({int events: FileSystemEvent.ALL,
-                                 bool recursive: false})
-     => _FileSystemWatcher._watch(_trimTrailingPathSeparators(path),
-                                 events,
-                                 recursive);
-
-  Future<FileSystemEntity> _delete({bool recursive: false});
-  void _deleteSync({bool recursive: false});
-
-  /**
-   * Checks whether two paths refer to the same object in the
-   * file system. Returns a [:Future<bool>:] that completes with the result.
-   *
-   * Comparing a link to its target returns false, as does comparing two links
-   * that point to the same target.  To check the target of a link, use
-   * Link.target explicitly to fetch it.  Directory links appearing
-   * inside a path are followed, though, to find the file system object.
-   *
-   * Completes the returned Future with an error if one of the paths points
-   * to an object that does not exist.
-   */
-  static Future<bool> identical(String path1, String path2) {
-    return _IOService._dispatch(_FILE_IDENTICAL, [path1, path2]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response,
-            "Error in FileSystemEntity.identical($path1, $path2)", "");
-      }
-      return response;
-    });
-  }
-
-  static final RegExp _absoluteWindowsPathPattern =
-      new RegExp(r'^(\\\\|[a-zA-Z]:[/\\])');
-
-  /**
-   * Returns a [bool] indicating whether this object's path is absolute.
-   *
-   * On Windows, a path is absolute if it starts with \\ or a drive letter
-   * between a and z (upper or lower case) followed by :\ or :/.
-   * On non-Windows, a path is absolute if it starts with /.
-   */
-  bool get isAbsolute {
-    if (Platform.isWindows) {
-      return path.startsWith(_absoluteWindowsPathPattern);
-    } else {
-      return path.startsWith('/');
-    }
-  }
-
-  /**
-   * Returns a [FileSystemEntity] whose path is the absolute path to [this].
-   * The type of the returned instance is the type of [this].
-   *
-   * The absolute path is computed by prefixing
-   * a relative path with the current working directory, and returning
-   * an absolute path unchanged.
-   */
-  FileSystemEntity get absolute;
-
-  String get _absolutePath {
-    if (isAbsolute) return path;
-    String current = Directory.current.path;
-    if (current.endsWith('/') ||
-        (Platform.isWindows && current.endsWith('\\'))) {
-      return '$current$path';
-    } else {
-      return '$current${Platform.pathSeparator}$path';
-    }
-  }
-
-
-  /**
-   * Synchronously checks whether two paths refer to the same object in the
-   * file system.
-   *
-   * Comparing a link to its target returns false, as does comparing two links
-   * that point to the same target.  To check the target of a link, use
-   * Link.target explicitly to fetch it.  Directory links appearing
-   * inside a path are followed, though, to find the file system object.
-   *
-   * Throws an error if one of the paths points to an object that does not
-   * exist.
-   */
-  static bool identicalSync(String path1, String path2) {
-    var result = _identical(path1, path2);
-    _throwIfError(result, 'Error in FileSystemEntity.identicalSync');
-    return result;
-  }
-
-  /**
-   * Test if [watch] is supported on the current system.
-   *
-   * OS X 10.6 and below is not supported.
-   */
-  static bool get isWatchSupported => _FileSystemWatcher.isSupported;
-
-  /**
-   * Finds the type of file system object that a path points to. Returns
-   * a [:Future<FileSystemEntityType>:] that completes with the result.
-   *
-   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
-   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
-   * named argument [followLinks] is false, and [path] points to a link.
-   * If the path does not point to a file system object, or any other error
-   * occurs in looking up the path, NOT_FOUND is returned.  The only
-   * error or exception that may be put on the returned future is ArgumentError,
-   * caused by passing the wrong type of arguments to the function.
-   */
-  static Future<FileSystemEntityType> type(String path,
-                                           {bool followLinks: true})
-      => _getTypeAsync(path, followLinks).then(FileSystemEntityType._lookup);
-
-  /**
-   * Synchronously finds the type of file system object that a path points to.
-   * Returns a [FileSystemEntityType].
-   *
-   * [FileSystemEntityType] has the constant instances FILE, DIRECTORY,
-   * LINK, and NOT_FOUND.  [type] will return LINK only if the optional
-   * named argument [followLinks] is false, and [path] points to a link.
-   * If the path does not point to a file system object, or any other error
-   * occurs in looking up the path, NOT_FOUND is returned.  The only
-   * error or exception that may be thrown is ArgumentError,
-   * caused by passing the wrong type of arguments to the function.
-   */
-  static FileSystemEntityType typeSync(String path, {bool followLinks: true})
-      => FileSystemEntityType._lookup(_getTypeSync(path, followLinks));
-
-  /**
-   * Checks if type(path, followLinks: false) returns
-   * FileSystemEntityType.LINK.
-   */
-  static Future<bool> isLink(String path) => _getTypeAsync(path, false)
-      .then((type) => (type == FileSystemEntityType.LINK._type));
-
-  /**
-   * Checks if type(path) returns FileSystemEntityType.FILE.
-   */
-  static Future<bool> isFile(String path) => _getTypeAsync(path, true)
-      .then((type) => (type == FileSystemEntityType.FILE._type));
-
-  /**
-   * Checks if type(path) returns FileSystemEntityType.DIRECTORY.
-   */
-  static Future<bool> isDirectory(String path) => _getTypeAsync(path, true)
-      .then((type) => (type == FileSystemEntityType.DIRECTORY._type));
-
-  /**
-   * Synchronously checks if typeSync(path, followLinks: false) returns
-   * FileSystemEntityType.LINK.
-   */
-  static bool isLinkSync(String path) =>
-      (_getTypeSync(path, false) == FileSystemEntityType.LINK._type);
-
-  /**
-   * Synchronously checks if typeSync(path) returns
-   * FileSystemEntityType.FILE.
-   */
-  static bool isFileSync(String path) =>
-      (_getTypeSync(path, true) == FileSystemEntityType.FILE._type);
-
-  /**
-   * Synchronously checks if typeSync(path) returns
-   * FileSystemEntityType.DIRECTORY.
-   */
-  static bool isDirectorySync(String path) =>
-      (_getTypeSync(path, true) == FileSystemEntityType.DIRECTORY._type);
-
-  external static _getType(String path, bool followLinks);
-  external static _identical(String path1, String path2);
-  external static _resolveSymbolicLinks(String path);
-
-  // Finds the next-to-last component when dividing at path separators.
-  static final RegExp _parentRegExp = Platform.isWindows ?
-     new RegExp(r'[^/\\][/\\]+[^/\\]') :
-     new RegExp(r'[^/]/+[^/]');
-
-  /**
-   * Removes the final path component of a path, using the platform's
-   * path separator to split the path.  Will not remove the root component
-   * of a Windows path, like "C:\" or "\\server_name\".
-   * Ignores trailing path separators, and leaves no trailing path separators.
-   */
-  static String parentOf(String path) {
-    int rootEnd = -1;
-    if (Platform.isWindows) {
-      if (path.startsWith(_absoluteWindowsPathPattern)) {
-        // Root ends at first / or \ after the first two characters.
-        rootEnd = path.indexOf(new RegExp(r'[/\\]'), 2);
-        if (rootEnd == -1) return path;
-      } else if (path.startsWith('\\') || path.startsWith('/')) {
-        rootEnd = 0;
-      }
-    } else if (path.startsWith('/')) {
-      rootEnd = 0;
-    }
-    // Ignore trailing slashes.
-    // All non-trivial cases have separators between two non-separators.
-    int pos = path.lastIndexOf(_parentRegExp);
-    if (pos > rootEnd) {
-      return path.substring(0, pos + 1);
-    } else if (rootEnd > -1) {
-      return path.substring(0, rootEnd + 1);
-    } else {
-      return '.';
-    }
-  }
-
-  /**
-   * The directory containing [this].  If [this] is a root
-   * directory, returns [this].
-   */
-  Directory get parent => new Directory(parentOf(path));
-
-  static int _getTypeSync(String path, bool followLinks) {
-    var result = _getType(path, followLinks);
-    _throwIfError(result, 'Error getting type of FileSystemEntity');
-    return result;
-  }
-
-  static Future<int> _getTypeAsync(String path, bool followLinks) {
-    return _IOService._dispatch(_FILE_TYPE, [path, followLinks])
-      .then((response) {
-        if (_isErrorResponse(response)) {
-          throw _exceptionFromResponse(response, "Error getting type", path);
-        }
-        return response;
-      });
-  }
-
-  static _throwIfError(Object result, String msg, [String path]) {
-    if (result is OSError) {
-      throw new FileSystemException(msg, path, result);
-    } else if (result is ArgumentError) {
-      throw result;
-    }
-  }
-
-  static String _trimTrailingPathSeparators(String path) {
-    // Don't handle argument errors here.
-    if (path is! String) return path;
-    if (Platform.isWindows) {
-      while (path.length > 1 &&
-             (path.endsWith(Platform.pathSeparator) ||
-              path.endsWith('/'))) {
-        path = path.substring(0, path.length - 1);
-      }
-    } else {
-      while (path.length > 1 && path.endsWith(Platform.pathSeparator)) {
-        path = path.substring(0, path.length - 1);
-      }
-    }
-    return path;
-  }
-
-  static String _ensureTrailingPathSeparators(String path) {
-    // Don't handle argument errors here.
-    if (path is! String) return path;
-    if (path.isEmpty) path = '.';
-    if (Platform.isWindows) {
-      while (!path.endsWith(Platform.pathSeparator) && !path.endsWith('/')) {
-        path = "$path${Platform.pathSeparator}";
-      }
-    } else {
-      while (!path.endsWith(Platform.pathSeparator)) {
-        path = "$path${Platform.pathSeparator}";
-      }
-    }
-    return path;
-  }
-}
-
-
-/**
- * Base event class emitted by [FileSystemEntity.watch].
- */
-class FileSystemEvent {
-  /**
-   * Bitfield for [FileSystemEntity.watch], to enable [FileSystemCreateEvent]s.
-   */
-  static const int CREATE = 1 << 0;
-
-  /**
-   * Bitfield for [FileSystemEntity.watch], to enable [FileSystemModifyEvent]s.
-   */
-  static const int MODIFY = 1 << 1;
-
-  /**
-   * Bitfield for [FileSystemEntity.watch], to enable [FileSystemDeleteEvent]s.
-   */
-  static const int DELETE = 1 << 2;
-
-  /**
-   * Bitfield for [FileSystemEntity.watch], to enable [FileSystemMoveEvent]s.
-   */
-  static const int MOVE = 1 << 3;
-
-  /**
-   * Bitfield for [FileSystemEntity.watch], for enabling all of [CREATE],
-   * [MODIFY], [DELETE] and [MOVE].
-   */
-  static const int ALL = CREATE | MODIFY | DELETE | MOVE;
-
-  static const int _MODIFY_ATTRIBUTES = 1 << 4;
-  static const int _DELETE_SELF = 1 << 5;
-  static const int _IS_DIR = 1 << 6;
-
-  /**
-   * The type of event. See [FileSystemEvent] for a list of events.
-   */
-  final int type;
-
-  /**
-   * The path that triggered the event. Depending on the platform and the
-   * FileSystemEntity, the path may be relative.
-   */
-  final String path;
-
-  /**
-   * Is `true` if the event target was a directory.
-   */
-  final bool isDirectory;
-
-  FileSystemEvent._(this.type, this.path, this.isDirectory);
-}
-
-
-/**
- * File system event for newly created file system objects.
- */
-class FileSystemCreateEvent extends FileSystemEvent {
-  FileSystemCreateEvent._(path, isDirectory)
-      : super._(FileSystemEvent.CREATE, path, isDirectory);
-
-  String toString() => "FileSystemCreateEvent('$path')";
-}
-
-
-/**
- * File system event for modifications of file system objects.
- */
-class FileSystemModifyEvent extends FileSystemEvent {
-  /**
-   * If the content was changed and not only the attributes, [contentChanged]
-   * is `true`.
-   */
-  final bool contentChanged;
-
-  FileSystemModifyEvent._(path, isDirectory, this.contentChanged)
-      : super._(FileSystemEvent.MODIFY, path, isDirectory);
-
-  String toString() =>
-      "FileSystemModifyEvent('$path', contentChanged=$contentChanged)";
-}
-
-
-/**
- * File system event for deletion of file system objects.
- */
-class FileSystemDeleteEvent extends FileSystemEvent {
-  FileSystemDeleteEvent._(path, isDirectory)
-      : super._(FileSystemEvent.DELETE, path, isDirectory);
-
-  String toString() => "FileSystemDeleteEvent('$path')";
-}
-
-
-/**
- * File system event for moving of file system objects.
- */
-class FileSystemMoveEvent extends FileSystemEvent {
-  /**
-   * If the underlaying implementation is able to identify the destination of
-   * the moved file, [destination] will be set. Otherwise, it will be `null`.
-   */
-  final String destination;
-
-  FileSystemMoveEvent._(path, isDirectory, this.destination)
-      : super._(FileSystemEvent.MOVE, path, isDirectory);
-
-  String toString() {
-    var buffer = new StringBuffer();
-    buffer.write("FileSystemMoveEvent('$path'");
-    if (destination != null) buffer.write(", '$destination'");
-    buffer.write(')');
-    return buffer.toString();
-  }
-}
-
-
-class _FileSystemWatcher {
-  external static Stream<FileSystemEvent> _watch(
-      String path, int events, bool recursive);
-  external static bool get isSupported;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart
deleted file mode 100644
index 07257ea..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http.dart
+++ /dev/null
@@ -1,2033 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * HTTP status codes.
- */
-abstract class HttpStatus {
-  static const int CONTINUE = 100;
-  static const int SWITCHING_PROTOCOLS = 101;
-  static const int OK = 200;
-  static const int CREATED = 201;
-  static const int ACCEPTED = 202;
-  static const int NON_AUTHORITATIVE_INFORMATION = 203;
-  static const int NO_CONTENT = 204;
-  static const int RESET_CONTENT = 205;
-  static const int PARTIAL_CONTENT = 206;
-  static const int MULTIPLE_CHOICES = 300;
-  static const int MOVED_PERMANENTLY = 301;
-  static const int FOUND = 302;
-  static const int MOVED_TEMPORARILY = 302; // Common alias for FOUND.
-  static const int SEE_OTHER = 303;
-  static const int NOT_MODIFIED = 304;
-  static const int USE_PROXY = 305;
-  static const int TEMPORARY_REDIRECT = 307;
-  static const int BAD_REQUEST = 400;
-  static const int UNAUTHORIZED = 401;
-  static const int PAYMENT_REQUIRED = 402;
-  static const int FORBIDDEN = 403;
-  static const int NOT_FOUND = 404;
-  static const int METHOD_NOT_ALLOWED = 405;
-  static const int NOT_ACCEPTABLE = 406;
-  static const int PROXY_AUTHENTICATION_REQUIRED = 407;
-  static const int REQUEST_TIMEOUT = 408;
-  static const int CONFLICT = 409;
-  static const int GONE = 410;
-  static const int LENGTH_REQUIRED = 411;
-  static const int PRECONDITION_FAILED = 412;
-  static const int REQUEST_ENTITY_TOO_LARGE = 413;
-  static const int REQUEST_URI_TOO_LONG = 414;
-  static const int UNSUPPORTED_MEDIA_TYPE = 415;
-  static const int REQUESTED_RANGE_NOT_SATISFIABLE = 416;
-  static const int EXPECTATION_FAILED = 417;
-  static const int INTERNAL_SERVER_ERROR = 500;
-  static const int NOT_IMPLEMENTED = 501;
-  static const int BAD_GATEWAY = 502;
-  static const int SERVICE_UNAVAILABLE = 503;
-  static const int GATEWAY_TIMEOUT = 504;
-  static const int HTTP_VERSION_NOT_SUPPORTED = 505;
-  // Client generated status code.
-  static const int NETWORK_CONNECT_TIMEOUT_ERROR = 599;
-}
-
-
-/**
- * A server that delivers content, such as web pages, using the HTTP protocol.
- *
- * The HttpServer is a [Stream] that provides [HttpRequest] objects. Each
- * HttpRequest has an associated [HttpResponse] object.
- * The server responds to a request by writing to that HttpResponse object.
- * The following example shows how to bind an HttpServer to an IPv6
- * [InternetAddress] on port 80 (the standard port for HTTP servers)
- * and how to listen for requests.
- * Port 80 is the default HTTP port. However, on most systems accessing
- * this requires super-user privileges. For local testing consider
- * using a non-reserved port (1024 and above).
- *
- *     import 'dart:io';
- *
- *     main() {
- *       HttpServer
- *           .bind(InternetAddress.ANY_IP_V6, 80)
- *           .then((server) {
- *             server.listen((HttpRequest request) {
- *               request.response.write('Hello, world!');
- *               request.response.close();
- *             });
- *           });
- *     }
- *
- * Incomplete requests, in which all or part of the header is missing, are
- * ignored, and no exceptions or HttpRequest objects are generated for them.
- * Likewise, when writing to an HttpResponse, any [Socket] exceptions are
- * ignored and any future writes are ignored.
- *
- * The HttpRequest exposes the request headers and provides the request body,
- * if it exists, as a Stream of data. If the body is unread, it is drained
- * when the server writes to the HttpResponse or closes it.
- *
- * ## Bind with a secure HTTPS connection
- *
- * Use [bindSecure] to create an HTTPS server.
- *
- * The server presents a certificate to the client. The certificate
- * chain and the private key are set in the [SecurityContext]
- * object that is passed to [bindSecure].
- *
- *     import 'dart:io';
- *     import "dart:isolate";
- *
- *     main() {
- *       SecurityContext context = new SecurityContext();
- *       var chain =
- *           Platform.script.resolve('certificates/server_chain.pem')
- *           .toFilePath();
- *       var key =
- *           Platform.script.resolve('certificates/server_key.pem')
- *           .toFilePath();
- *       context.useCertificateChain(chain);
- *       context.usePrivateKey(key, password: 'dartdart');
- *
- *       HttpServer
- *           .bindSecure(InternetAddress.ANY_IP_V6,
- *                       443,
- *                       context)
- *           .then((server) {
- *             server.listen((HttpRequest request) {
- *               request.response.write('Hello, world!');
- *               request.response.close();
- *             });
- *           });
- *     }
- *
- *  The certificates and keys are PEM files, which can be created and
- *  managed with the tools in OpenSSL.
- *
- * ## Connect to a server socket
- *
- * You can use the [listenOn] constructor to attach an HTTP server to
- * a [ServerSocket].
- *
- *     import 'dart:io';
- *
- *     main() {
- *       ServerSocket.bind(InternetAddress.ANY_IP_V6, 80)
- *         .then((serverSocket) {
- *           HttpServer httpserver = new HttpServer.listenOn(serverSocket);
- *           serverSocket.listen((Socket socket) {
- *             socket.write('Hello, client.');
- *           });
- *         });
- *     }
- *
- * ## Other resources
- *
- * * HttpServer is a Stream. Refer to the [Stream] class for information
- * about the streaming qualities of an HttpServer.
- * Pausing the subscription of the stream, pauses at the OS level.
- *
- * * The [http_server](https://pub.dartlang.org/packages/http_server)
- * package on pub.dartlang.org contains a set of high-level classes that,
- * together with this class, makes it easy to provide content through HTTP
- * servers.
- */
-abstract class HttpServer implements Stream<HttpRequest> {
-  /**
-   * Get and set the default value of the `Server` header for all responses
-   * generated by this [HttpServer].
-   *
-   * If [serverHeader] is `null`, no `Server` header will be added to each
-   * response.
-   *
-   * The default value is `null`.
-   */
-  String serverHeader;
-
-  /**
-   * Default set of headers added to all response objects.
-   *
-   * By default the following headers are in this set:
-   *
-   *     Content-Type: text/plain; charset=utf-8
-   *     X-Frame-Options: SAMEORIGIN
-   *     X-Content-Type-Options: nosniff
-   *     X-XSS-Protection: 1; mode=block
-   *
-   * If the `Server` header is added here and the `serverHeader` is set as
-   * well then the value of `serverHeader` takes precedence.
-   */
-  HttpHeaders get defaultResponseHeaders;
-
-   /**
-   * Whether the [HttpServer] should compress the content, if possible.
-   *
-   * The content can only be compressed when the response is using
-   * chunked Transfer-Encoding and the incoming request has `gzip`
-   * as an accepted encoding in the Accept-Encoding header.
-   *
-   * The default value is `false` (compression disabled).
-   * To enable, set `autoCompress` to `true`.
-   */
-  bool autoCompress;
-
-  /**
-   * Get or set the timeout used for idle keep-alive connections. If no further
-   * request is seen within [idleTimeout] after the previous request was
-   * completed, the connection is dropped.
-   *
-   * Default is 120 seconds.
-   *
-   * Note that it may take up to `2 * idleTimeout` before a idle connection is
-   * aborted.
-   *
-   * To disable, set [idleTimeout] to `null`.
-   */
-  Duration idleTimeout;
-
-
-  /**
-   * Starts listening for HTTP requests on the specified [address] and
-   * [port].
-   *
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If an IP version 6 (IPv6) address is used, both IP version 6
-   * (IPv6) and version 4 (IPv4) connections will be accepted. To
-   * restrict this to version 6 (IPv6) only, use [v6Only] to set
-   * version 6 only.
-   *
-   * If [port] has the value [:0:] an ephemeral port will be chosen by
-   * the system. The actual port used can be retrieved using the
-   * [port] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * The optional argument [shared] specifies whether additional HttpServer
-   * objects can bind to the same combination of `address`, `port` and `v6Only`.
-   * If `shared` is `true` and more `HttpServer`s from this isolate or other
-   * isolates are bound to the port, then the incoming connections will be
-   * distributed among all the bound `HttpServer`s. Connections can be
-   * distributed over multiple isolates this way.
-   */
-  static Future<HttpServer> bind(address,
-                                 int port,
-                                 {int backlog: 0,
-                                  bool v6Only: false,
-                                  bool shared: false})
-      => _HttpServer.bind(address, port, backlog, v6Only, shared);
-
-  /**
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If an IP version 6 (IPv6) address is used, both IP version 6
-   * (IPv6) and version 4 (IPv4) connections will be accepted. To
-   * restrict this to version 6 (IPv6) only, use [v6Only] to set
-   * version 6 only.
-   *
-   * If [port] has the value [:0:] an ephemeral port will be chosen by
-   * the system. The actual port used can be retrieved using the
-   * [port] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * If [requestClientCertificate] is true, the server will
-   * request clients to authenticate with a client certificate.
-   * The server will advertise the names of trusted issuers of client
-   * certificates, getting them from [context], where they have been
-   * set using [SecurityContext.setClientAuthorities].
-   *
-   * The optional argument [shared] specifies whether additional HttpServer
-   * objects can bind to the same combination of `address`, `port` and `v6Only`.
-   * If `shared` is `true` and more `HttpServer`s from this isolate or other
-   * isolates are bound to the port, then the incoming connections will be
-   * distributed among all the bound `HttpServer`s. Connections can be
-   * distributed over multiple isolates this way.
-   */
-
-  static Future<HttpServer> bindSecure(address,
-                                       int port,
-                                       SecurityContext context,
-                                       {int backlog: 0,
-                                        bool v6Only: false,
-                                        bool requestClientCertificate: false,
-                                        bool shared: false})
-      => _HttpServer.bindSecure(address,
-                                port,
-                                context,
-                                backlog,
-                                v6Only,
-                                requestClientCertificate,
-                                shared);
-
-  /**
-   * Attaches the HTTP server to an existing [ServerSocket]. When the
-   * [HttpServer] is closed, the [HttpServer] will just detach itself,
-   * closing current connections but not closing [serverSocket].
-   */
-  factory HttpServer.listenOn(ServerSocket serverSocket)
-      => new _HttpServer.listenOn(serverSocket);
-
-  /**
-   * Permanently stops this [HttpServer] from listening for new
-   * connections.  This closes the [Stream] of [HttpRequest]s with a
-   * done event. The returned future completes when the server is
-   * stopped. For a server started using [bind] or [bindSecure] this
-   * means that the port listened on no longer in use.
-   *
-   * If [force] is `true`, active connections will be closed immediately.
-   */
-  Future close({bool force: false});
-
-  /**
-   * Returns the port that the server is listening on. This can be
-   * used to get the actual port used when a value of 0 for [:port:] is
-   * specified in the [bind] or [bindSecure] call.
-   */
-  int get port;
-
-  /**
-   * Returns the address that the server is listening on. This can be
-   * used to get the actual address used, when the address is fetched by
-   * a lookup from a hostname.
-   */
-  InternetAddress get address;
-
-  /**
-   * Sets the timeout, in seconds, for sessions of this [HttpServer].
-   * The default timeout is 20 minutes.
-   */
-  set sessionTimeout(int timeout);
-
-  /**
-   * Returns an [HttpConnectionsInfo] object summarizing the number of
-   * current connections handled by the server.
-   */
-  HttpConnectionsInfo connectionsInfo();
-}
-
-
-/**
- * Summary statistics about an [HttpServer]s current socket connections.
- */
-class HttpConnectionsInfo {
-  /**
-   * Total number of socket connections.
-   */
-  int total = 0;
-
-  /**
-   * Number of active connections where actual request/response
-   * processing is active.
-   */
-  int active = 0;
-
-  /**
-   * Number of idle connections held by clients as persistent connections.
-   */
-  int idle = 0;
-
-  /**
-   * Number of connections which are preparing to close. Note: These
-   * connections are also part of the [:active:] count as they might
-   * still be sending data to the client before finally closing.
-   */
-  int closing = 0;
-}
-
-
-/**
- * Headers for HTTP requests and responses.
- *
- * In some situations, headers are immutable:
- *
- * * HttpRequest and HttpClientResponse always have immutable headers.
- *
- * * HttpResponse and HttpClientRequest have immutable headers
- *   from the moment the body is written to.
- *
- * In these situations, the mutating methods throw exceptions.
- *
- * For all operations on HTTP headers the header name is
- * case-insensitive.
- *
- * To set the value of a header use the `set()` method:
- *
- *     request.headers.set(HttpHeaders.CACHE_CONTROL,
-                           'max-age=3600, must-revalidate');
- *
- * To retrieve the value of a header use the `value()` method:
- *
- *     print(request.headers.value(HttpHeaders.USER_AGENT));
- *
- * An HttpHeaders object holds a list of values for each name
- * as the standard allows. In most cases a name holds only a single value,
- * The most common mode of operation is to use `set()` for setting a value,
- * and `value()` for retrieving a value.
- */
-abstract class HttpHeaders {
-  static const ACCEPT = "accept";
-  static const ACCEPT_CHARSET = "accept-charset";
-  static const ACCEPT_ENCODING = "accept-encoding";
-  static const ACCEPT_LANGUAGE = "accept-language";
-  static const ACCEPT_RANGES = "accept-ranges";
-  static const AGE = "age";
-  static const ALLOW = "allow";
-  static const AUTHORIZATION = "authorization";
-  static const CACHE_CONTROL = "cache-control";
-  static const CONNECTION = "connection";
-  static const CONTENT_ENCODING = "content-encoding";
-  static const CONTENT_LANGUAGE = "content-language";
-  static const CONTENT_LENGTH = "content-length";
-  static const CONTENT_LOCATION = "content-location";
-  static const CONTENT_MD5 = "content-md5";
-  static const CONTENT_RANGE = "content-range";
-  static const CONTENT_TYPE = "content-type";
-  static const DATE = "date";
-  static const ETAG = "etag";
-  static const EXPECT = "expect";
-  static const EXPIRES = "expires";
-  static const FROM = "from";
-  static const HOST = "host";
-  static const IF_MATCH = "if-match";
-  static const IF_MODIFIED_SINCE = "if-modified-since";
-  static const IF_NONE_MATCH = "if-none-match";
-  static const IF_RANGE = "if-range";
-  static const IF_UNMODIFIED_SINCE = "if-unmodified-since";
-  static const LAST_MODIFIED = "last-modified";
-  static const LOCATION = "location";
-  static const MAX_FORWARDS = "max-forwards";
-  static const PRAGMA = "pragma";
-  static const PROXY_AUTHENTICATE = "proxy-authenticate";
-  static const PROXY_AUTHORIZATION = "proxy-authorization";
-  static const RANGE = "range";
-  static const REFERER = "referer";
-  static const RETRY_AFTER = "retry-after";
-  static const SERVER = "server";
-  static const TE = "te";
-  static const TRAILER = "trailer";
-  static const TRANSFER_ENCODING = "transfer-encoding";
-  static const UPGRADE = "upgrade";
-  static const USER_AGENT = "user-agent";
-  static const VARY = "vary";
-  static const VIA = "via";
-  static const WARNING = "warning";
-  static const WWW_AUTHENTICATE = "www-authenticate";
-
-  // Cookie headers from RFC 6265.
-  static const COOKIE = "cookie";
-  static const SET_COOKIE = "set-cookie";
-
-  static const GENERAL_HEADERS = const [CACHE_CONTROL,
-                                        CONNECTION,
-                                        DATE,
-                                        PRAGMA,
-                                        TRAILER,
-                                        TRANSFER_ENCODING,
-                                        UPGRADE,
-                                        VIA,
-                                        WARNING];
-
-  static const ENTITY_HEADERS = const [ALLOW,
-                                       CONTENT_ENCODING,
-                                       CONTENT_LANGUAGE,
-                                       CONTENT_LENGTH,
-                                       CONTENT_LOCATION,
-                                       CONTENT_MD5,
-                                       CONTENT_RANGE,
-                                       CONTENT_TYPE,
-                                       EXPIRES,
-                                       LAST_MODIFIED];
-
-
-  static const RESPONSE_HEADERS = const [ACCEPT_RANGES,
-                                         AGE,
-                                         ETAG,
-                                         LOCATION,
-                                         PROXY_AUTHENTICATE,
-                                         RETRY_AFTER,
-                                         SERVER,
-                                         VARY,
-                                         WWW_AUTHENTICATE];
-
-  static const REQUEST_HEADERS = const [ACCEPT,
-                                        ACCEPT_CHARSET,
-                                        ACCEPT_ENCODING,
-                                        ACCEPT_LANGUAGE,
-                                        AUTHORIZATION,
-                                        EXPECT,
-                                        FROM,
-                                        HOST,
-                                        IF_MATCH,
-                                        IF_MODIFIED_SINCE,
-                                        IF_NONE_MATCH,
-                                        IF_RANGE,
-                                        IF_UNMODIFIED_SINCE,
-                                        MAX_FORWARDS,
-                                        PROXY_AUTHORIZATION,
-                                        RANGE,
-                                        REFERER,
-                                        TE,
-                                        USER_AGENT];
-
-  /**
-   * Gets and sets the date. The value of this property will
-   * reflect the 'date' header.
-   */
-  DateTime date;
-
-  /**
-   * Gets and sets the expiry date. The value of this property will
-   * reflect the 'expires' header.
-   */
-  DateTime expires;
-
-  /**
-   * Gets and sets the "if-modified-since" date. The value of this property will
-   * reflect the "if-modified-since" header.
-   */
-  DateTime ifModifiedSince;
-
-  /**
-   * Gets and sets the host part of the 'host' header for the
-   * connection.
-   */
-  String host;
-
-  /**
-   * Gets and sets the port part of the 'host' header for the
-   * connection.
-   */
-  int port;
-
-  /**
-   * Gets and sets the content type. Note that the content type in the
-   * header will only be updated if this field is set
-   * directly. Mutating the returned current value will have no
-   * effect.
-   */
-  ContentType contentType;
-
-  /**
-   * Gets and sets the content length header value.
-   */
-  int contentLength;
-
-  /**
-   * Gets and sets the persistent connection header value.
-   */
-  bool persistentConnection;
-
-  /**
-   * Gets and sets the chunked transfer encoding header value.
-   */
-  bool chunkedTransferEncoding;
-
-  /**
-   * Returns the list of values for the header named [name]. If there
-   * is no header with the provided name, [:null:] will be returned.
-   */
-  List<String> operator[](String name);
-
-  /**
-   * Convenience method for the value for a single valued header. If
-   * there is no header with the provided name, [:null:] will be
-   * returned. If the header has more than one value an exception is
-   * thrown.
-   */
-  String value(String name);
-
-  /**
-   * Adds a header value. The header named [name] will have the value
-   * [value] added to its list of values. Some headers are single
-   * valued, and for these adding a value will replace the previous
-   * value. If the value is of type DateTime a HTTP date format will be
-   * applied. If the value is a [:List:] each element of the list will
-   * be added separately. For all other types the default [:toString:]
-   * method will be used.
-   */
-  void add(String name, Object value);
-
-  /**
-   * Sets a header. The header named [name] will have all its values
-   * cleared before the value [value] is added as its value.
-   */
-  void set(String name, Object value);
-
-  /**
-   * Removes a specific value for a header name. Some headers have
-   * system supplied values and for these the system supplied values
-   * will still be added to the collection of values for the header.
-   */
-  void remove(String name, Object value);
-
-  /**
-   * Removes all values for the specified header name. Some headers
-   * have system supplied values and for these the system supplied
-   * values will still be added to the collection of values for the
-   * header.
-   */
-  void removeAll(String name);
-
-  /**
-   * Enumerates the headers, applying the function [f] to each
-   * header. The header name passed in [:name:] will be all lower
-   * case.
-   */
-  void forEach(void f(String name, List<String> values));
-
-  /**
-   * Disables folding for the header named [name] when sending the HTTP
-   * header. By default, multiple header values are folded into a
-   * single header line by separating the values with commas. The
-   * 'set-cookie' header has folding disabled by default.
-   */
-  void noFolding(String name);
-
-  /**
-   * Remove all headers. Some headers have system supplied values and
-   * for these the system supplied values will still be added to the
-   * collection of values for the header.
-   */
-  void clear();
-}
-
-
-/**
- * Representation of a header value in the form:
- *
- *   [:value; parameter1=value1; parameter2=value2:]
- *
- * [HeaderValue] can be used to conveniently build and parse header
- * values on this form.
- *
- * To build an [:accepts:] header with the value
- *
- *     text/plain; q=0.3, text/html
- *
- * use code like this:
- *
- *     HttpClientRequest request = ...;
- *     var v = new HeaderValue("text/plain", {"q": "0.3"});
- *     request.headers.add(HttpHeaders.ACCEPT, v);
- *     request.headers.add(HttpHeaders.ACCEPT, "text/html");
- *
- * To parse the header values use the [:parse:] static method.
- *
- *     HttpRequest request = ...;
- *     List<String> values = request.headers[HttpHeaders.ACCEPT];
- *     values.forEach((value) {
- *       HeaderValue v = HeaderValue.parse(value);
- *       // Use v.value and v.parameters
- *     });
- *
- * An instance of [HeaderValue] is immutable.
- */
-abstract class HeaderValue {
-  /**
-   * Creates a new header value object setting the value and parameters.
-   */
-  factory HeaderValue([String value = "", Map<String, String> parameters]) {
-    return new _HeaderValue(value, parameters);
-  }
-
-  /**
-   * Creates a new header value object from parsing a header value
-   * string with both value and optional parameters.
-   */
-  static HeaderValue parse(String value,
-                           {String parameterSeparator: ";",
-                            String valueSeparator: null,
-                            bool preserveBackslash: false}) {
-    return _HeaderValue.parse(value,
-                              parameterSeparator: parameterSeparator,
-                              valueSeparator: valueSeparator,
-                              preserveBackslash: preserveBackslash);
-  }
-
-  /**
-   * Gets the header value.
-   */
-  String get value;
-
-  /**
-   * Gets the map of parameters.
-   *
-   * This map cannot be modified. invoking any operation which would
-   * modify the map will throw [UnsupportedError].
-   */
-  Map<String, String> get parameters;
-
-  /**
-   * Returns the formatted string representation in the form:
-   *
-   *     value; parameter1=value1; parameter2=value2
-   */
-  String toString();
-}
-
-abstract class HttpSession implements Map {
-  /**
-   * Gets the id for the current session.
-   */
-  String get id;
-
-  /**
-   * Destroys the session. This will terminate the session and any further
-   * connections with this id will be given a new id and session.
-   */
-  void destroy();
-
-  /**
-   * Sets a callback that will be called when the session is timed out.
-   */
-  void set onTimeout(void callback());
-
-  /**
-   * Is true if the session has not been sent to the client yet.
-   */
-  bool get isNew;
-}
-
-
-/**
- * Representation of a content type. An instance of [ContentType] is
- * immutable.
- */
-abstract class ContentType implements HeaderValue {
-  /**
-   * Content type for plain text using UTF-8 encoding.
-   *
-   *     text/plain; charset=utf-8
-   */
-  static final TEXT = new ContentType("text", "plain", charset: "utf-8");
-
-  /**
-   *  Content type for HTML using UTF-8 encoding.
-   *
-   *     text/html; charset=utf-8
-   */
-  static final HTML = new ContentType("text", "html", charset: "utf-8");
-
-  /**
-   *  Content type for JSON using UTF-8 encoding.
-   *
-   *     application/json; charset=utf-8
-   */
-  static final JSON = new ContentType("application", "json", charset: "utf-8");
-
-  /**
-   *  Content type for binary data.
-   *
-   *     application/octet-stream
-   */
-  static final BINARY = new ContentType("application", "octet-stream");
-
-  /**
-   * Creates a new content type object setting the primary type and
-   * sub type. The charset and additional parameters can also be set
-   * using [charset] and [parameters]. If charset is passed and
-   * [parameters] contains charset as well the passed [charset] will
-   * override the value in parameters. Keys passed in parameters will be
-   * converted to lower case. The `charset` entry, whether passed as `charset`
-   * or in `parameters`, will have its value converted to lower-case.
-   */
-  factory ContentType(String primaryType,
-                      String subType,
-                      {String charset, Map<String, String> parameters}) {
-    return new _ContentType(primaryType, subType, charset, parameters);
-  }
-
-  /**
-   * Creates a new content type object from parsing a Content-Type
-   * header value. As primary type, sub type and parameter names and
-   * values are not case sensitive all these values will be converted
-   * to lower case. Parsing this string
-   *
-   *     text/html; charset=utf-8
-   *
-   * will create a content type object with primary type [:text:], sub
-   * type [:html:] and parameter [:charset:] with value [:utf-8:].
-   */
-  static ContentType parse(String value) {
-    return _ContentType.parse(value);
-  }
-
-  /**
-   * Gets the mime-type, without any parameters.
-   */
-  String get mimeType;
-
-  /**
-   * Gets the primary type.
-   */
-  String get primaryType;
-
-  /**
-   * Gets the sub type.
-   */
-  String get subType;
-
-  /**
-   * Gets the character set.
-   */
-  String get charset;
-}
-
-
-/**
- * Representation of a cookie. For cookies received by the server as
- * Cookie header values only [:name:] and [:value:] fields will be
- * set. When building a cookie for the 'set-cookie' header in the server
- * and when receiving cookies in the client as 'set-cookie' headers all
- * fields can be used.
- */
-abstract class Cookie {
-  /**
-   * Gets and sets the name.
-   */
-  String name;
-
-  /**
-   * Gets and sets the value.
-   */
-  String value;
-
-  /**
-   * Gets and sets the expiry date.
-   */
-  DateTime expires;
-
-  /**
-   * Gets and sets the max age. A value of [:0:] means delete cookie
-   * now.
-   */
-  int maxAge;
-
-  /**
-   * Gets and sets the domain.
-   */
-  String domain;
-
-  /**
-   * Gets and sets the path.
-   */
-  String path;
-
-  /**
-   * Gets and sets whether this cookie is secure.
-   */
-  bool secure;
-
-  /**
-   * Gets and sets whether this cookie is HTTP only.
-   */
-  bool httpOnly;
-
-  /**
-   * Creates a new cookie optionally setting the name and value.
-   *
-   * By default the value of `httpOnly` will be set to `true`.
-   */
-  factory Cookie([String name, String value]) => new _Cookie(name, value);
-
-  /**
-   * Creates a new cookie by parsing a header value from a 'set-cookie'
-   * header.
-   */
-  factory Cookie.fromSetCookieValue(String value) {
-    return new _Cookie.fromSetCookieValue(value);
-  }
-
-  /**
-   * Returns the formatted string representation of the cookie. The
-   * string representation can be used for for setting the Cookie or
-   * 'set-cookie' headers
-   */
-  String toString();
-}
-
-
-/**
- * A server-side object
- * that contains the content of and information about an HTTP request.
- *
- * __Note__: Check out the
- * [http_server](http://pub.dartlang.org/packages/http_server)
- * package, which makes working with the low-level
- * dart:io HTTP server subsystem easier.
- *
- * `HttpRequest` objects are generated by an [HttpServer],
- * which listens for HTTP requests on a specific host and port.
- * For each request received, the HttpServer, which is a [Stream],
- * generates an `HttpRequest` object and adds it to the stream.
- *
- * An `HttpRequest` object delivers the body content of the request
- * as a stream of byte lists.
- * The object also contains information about the request,
- * such as the method, URI, and headers.
- *
- * In the following code, an HttpServer listens
- * for HTTP requests. When the server receives a request,
- * it uses the HttpRequest object's `method` property to dispatch requests.
- *
- *     final HOST = InternetAddress.LOOPBACK_IP_V4;
- *     final PORT = 80;
- *
- *     HttpServer.bind(HOST, PORT).then((_server) {
- *       _server.listen((HttpRequest request) {
- *         switch (request.method) {
- *           case 'GET':
- *             handleGetRequest(request);
- *             break;
- *           case 'POST':
- *             ...
- *         }
- *       },
- *       onError: handleError);    // listen() failed.
- *     }).catchError(handleError);
- *
- * An HttpRequest object provides access to the associated [HttpResponse]
- * object through the response property.
- * The server writes its response to the body of the HttpResponse object.
- * For example, here's a function that responds to a request:
- *
- *     void handleGetRequest(HttpRequest req) {
- *       HttpResponse res = req.response;
- *       res.write('Received request ${req.method}: ${req.uri.path}');
- *       res.close();
- *     }
- */
-abstract class HttpRequest implements Stream<List<int>> {
-  /**
-   * The content length of the request body.
-   *
-   * If the size of the request body is not known in advance,
-   * this value is -1.
-   */
-  int get contentLength;
-
-  /**
-   * The method, such as 'GET' or 'POST', for the request.
-   */
-  String get method;
-
-  /**
-   * The URI for the request.
-   *
-   * This provides access to the
-   * path and query string for the request.
-   */
-  Uri get uri;
-
-  /**
-   * The requested URI for the request.
-   *
-   * The returend URI is reconstructed by using http-header fields, to access
-   * otherwise lost information, e.g. host and scheme.
-   *
-   * To reconstruct the scheme, first 'X-Forwarded-Proto' is checked, and then
-   * falling back to server type.
-   *
-   * To reconstruct the host, fisrt 'X-Forwarded-Host' is checked, then 'Host'
-   * and finally calling back to server.
-   */
-  Uri get requestedUri;
-
-  /**
-   * The request headers.
-   *
-   * The returned [HttpHeaders] are immutable.
-   */
-  HttpHeaders get headers;
-
-  /**
-   * The cookies in the request, from the Cookie headers.
-   */
-  List<Cookie> get cookies;
-
-  /**
-   * The persistent connection state signaled by the client.
-   */
-  bool get persistentConnection;
-
-  /**
-   * The client certificate of the client making the request.
-   *
-   * This value is null if the connection is not a secure TLS or SSL connection,
-   * or if the server does not request a client certificate, or if the client
-   * does not provide one.
-   */
-  X509Certificate get certificate;
-
-  /**
-   * The session for the given request.
-   *
-   * If the session is
-   * being initialized by this call, [:isNew:] is true for the returned
-   * session.
-   * See [HttpServer.sessionTimeout] on how to change default timeout.
-   */
-  HttpSession get session;
-
-  /**
-   * The HTTP protocol version used in the request,
-   * either "1.0" or "1.1".
-   */
-  String get protocolVersion;
-
-  /**
-   * Information about the client connection.
-   *
-   * Returns [:null:] if the socket is not available.
-   */
-  HttpConnectionInfo get connectionInfo;
-
-  /**
-   * The [HttpResponse] object, used for sending back the response to the
-   * client.
-   *
-   * If the [contentLength] of the body isn't 0, and the body isn't being read,
-   * any write calls on the [HttpResponse] automatically drain the request
-   * body.
-   */
-  HttpResponse get response;
-}
-
-
-/**
- * An HTTP response, which returns the headers and data
- * from the server to the client in response to an HTTP request.
- *
- * Every HttpRequest object provides access to the associated [HttpResponse]
- * object through the `response` property.
- * The server sends its response to the client by writing to the
- * HttpResponse object.
- *
- * ## Writing the response
- *
- * This class implements [IOSink].
- * After the header has been set up, the methods
- * from IOSink, such as `writeln()`, can be used to write
- * the body of the HTTP response.
- * Use the `close()` method to close the response and send it to the client.
- *
- *     server.listen((HttpRequest request) {
- *       request.response.write('Hello, world!');
- *       request.response.close();
- *     });
- *
- * When one of the IOSink methods is used for the
- * first time, the request header is sent. Calling any methods that
- * change the header after it is sent throws an exception.
- *
- * ## Setting the headers
- *
- * The HttpResponse object has a number of properties for setting up
- * the HTTP headers of the response.
- * When writing string data through the IOSink, the encoding used
- * is determined from the "charset" parameter of the
- * "Content-Type" header.
- *
- *     HttpResponse response = ...
- *     response.headers.contentType
- *         = new ContentType("application", "json", charset: "utf-8");
- *     response.write(...);  // Strings written will be UTF-8 encoded.
- *
- * If no charset is provided the default of ISO-8859-1 (Latin 1) will
- * be used.
- *
- *     HttpResponse response = ...
- *     response.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
- *     response.write(...);  // Strings written will be ISO-8859-1 encoded.
- *
- * An exception is thrown if you use the `write()` method
- * while an unsupported content-type is set.
- */
-abstract class HttpResponse implements IOSink {
-  // TODO(ajohnsen): Add documentation of how to pipe a file to the response.
-  /**
-   * Gets and sets the content length of the response. If the size of
-   * the response is not known in advance set the content length to
-   * -1 - which is also the default if not set.
-   */
-  int contentLength;
-
-  /**
-   * Gets and sets the status code. Any integer value is accepted. For
-   * the official HTTP status codes use the fields from
-   * [HttpStatus]. If no status code is explicitly set the default
-   * value [HttpStatus.OK] is used.
-   *
-   * The status code must be set before the body is written
-   * to. Setting the status code after writing to the response body or
-   * closing the response will throw a `StateError`.
-   */
-  int statusCode;
-
-  /**
-   * Gets and sets the reason phrase. If no reason phrase is explicitly
-   * set a default reason phrase is provided.
-   *
-   * The reason phrase must be set before the body is written
-   * to. Setting the reason phrase after writing to the response body
-   * or closing the response will throw a `StateError`.
-   */
-  String reasonPhrase;
-
-  /**
-   * Gets and sets the persistent connection state. The initial value
-   * of this property is the persistent connection state from the
-   * request.
-   */
-  bool persistentConnection;
-
-  /**
-   * Set and get the [deadline] for the response. The deadline is timed from the
-   * time it's set. Setting a new deadline will override any previous deadline.
-   * When a deadline is exceeded, the response will be closed and any further
-   * data ignored.
-   *
-   * To disable a deadline, set the [deadline] to `null`.
-   *
-   * The [deadline] is `null` by default.
-   */
-  Duration deadline;
-
-  /**
-   * Get or set if the [HttpResponse] should buffer output.
-   *
-   * Default value is `true`.
-   *
-   * __Note__: Disabling buffering of the output can result in very poor
-   * performance, when writing many small chunks.
-   */
-  bool bufferOutput;
-
-  /**
-   * Returns the response headers.
-   *
-   * The response headers can be modified until the response body is
-   * written to or closed. After that they become immutable.
-   */
-  HttpHeaders get headers;
-
-  /**
-   * Cookies to set in the client (in the 'set-cookie' header).
-   */
-  List<Cookie> get cookies;
-
-  /**
-   * Respond with a redirect to [location].
-   *
-   * The URI in [location] should be absolute, but there are no checks
-   * to enforce that.
-   *
-   * By default the HTTP status code `HttpStatus.MOVED_TEMPORARILY`
-   * (`302`) is used for the redirect, but an alternative one can be
-   * specified using the [status] argument.
-   *
-   * This method will also call `close`, and the returned future is
-   * the furure returned by `close`.
-   */
-  Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY});
-
-  /**
-   * Detaches the underlying socket from the HTTP server. When the
-   * socket is detached the HTTP server will no longer perform any
-   * operations on it.
-   *
-   * This is normally used when a HTTP upgrade request is received
-   * and the communication should continue with a different protocol.
-   *
-   * If [writeHeaders] is `true`, the status line and [headers] will be written
-   * to the socket before it's detached. If `false`, the socket is detached
-   * immediately, without any data written to the socket. Default is `true`.
-   */
-  Future<Socket> detachSocket({bool writeHeaders: true});
-
-  /**
-   * Gets information about the client connection. Returns [:null:] if the
-   * socket is not available.
-   */
-  HttpConnectionInfo get connectionInfo;
-}
-
-
-/**
- * A client that receives content, such as web pages, from
- * a server using the HTTP protocol.
- *
- * HttpClient contains a number of methods to send an [HttpClientRequest]
- * to an Http server and receive an [HttpClientResponse] back.
- * For example, you can use the [get], [getUrl], [post], and [postUrl] methods
- * for GET and POST requests, respectively.
- *
- * ## Making a simple GET request: an example
- *
- * A `getUrl` request is a two-step process, triggered by two [Future]s.
- * When the first future completes with a [HttpClientRequest], the underlying
- * network connection has been established, but no data has been sent.
- * In the callback function for the first future, the HTTP headers and body
- * can be set on the request. Either the first write to the request object
- * or a call to [close] sends the request to the server.
- *
- * When the HTTP response is received from the server,
- * the second future, which is returned by close,
- * completes with an [HttpClientResponse] object.
- * This object provides access to the headers and body of the response.
- * The body is available as a stream implemented by HttpClientResponse.
- * If a body is present, it must be read. Otherwise, it leads to resource
- * leaks. Consider using [HttpClientResponse.drain] if the body is unused.
- *
- *     HttpClient client = new HttpClient();
- *     client.getUrl(Uri.parse("http://www.example.com/"))
- *         .then((HttpClientRequest request) {
- *           // Optionally set up headers...
- *           // Optionally write to the request object...
- *           // Then call close.
- *           ...
- *           return request.close();
- *         })
- *         .then((HttpClientResponse response) {
- *           // Process the response.
- *           ...
- *         });
- *
- * The future for [HttpClientRequest] is created by methods such as
- * [getUrl] and [open].
- *
- * ## HTTPS connections
- *
- * An HttpClient can make HTTPS requests, connecting to a server using
- * the TLS (SSL) secure networking protocol. Calling [getUrl] with an
- * https: scheme will work automatically, if the server's certificate is
- * signed by a root CA (certificate authority) on the default list of
- * well-known trusted CAs, compiled by Mozilla.
- *
- * To add a custom trusted certificate authority, or to send a client
- * certificate to servers that request one, pass a [SecurityContext] object
- * as the optional [context] argument to the `HttpClient` constructor.
- * The desired security options can be set on the [SecurityContext] object.
- *
- * ## Headers
- *
- * All HttpClient requests set the following header by default:
- *
- *     Accept-Encoding: gzip
- *
- * This allows the HTTP server to use gzip compression for the body if
- * possible. If this behavior is not desired set the
- * `Accept-Encoding` header to something else.
- * To turn off gzip compression of the response, clear this header:
- *
- *      request.headers.removeAll(HttpHeaders.ACCEPT_ENCODING)
- *
- * ## Closing the HttpClient
- *
- * The HttpClient supports persistent connections and caches network
- * connections to reuse them for multiple requests whenever
- * possible. This means that network connections can be kept open for
- * some time after a request has completed. Use HttpClient.close
- * to force the HttpClient object to shut down and to close the idle
- * network connections.
- *
- * ## Turning proxies on and off
- *
- * By default the HttpClient uses the proxy configuration available
- * from the environment, see [findProxyFromEnvironment]. To turn off
- * the use of proxies set the [findProxy] property to
- * [:null:].
- *
- *     HttpClient client = new HttpClient();
- *     client.findProxy = null;
- */
-abstract class HttpClient {
-  static const int DEFAULT_HTTP_PORT = 80;
-  static const int DEFAULT_HTTPS_PORT = 443;
-
-  /**
-   * Get and set the idle timeout of non-active persistent (keep-alive)
-   * connections. The default value is 15 seconds.
-   */
-  Duration idleTimeout;
-
-  /**
-   * Get and set the maximum number of live connections, to a single host.
-   *
-   * Increasing this number may lower performance and take up unwanted
-   * system resources.
-   *
-   * To disable, set to `null`.
-   *
-   * Default is `null`.
-   */
-  int maxConnectionsPerHost;
-
-  /**
-   * Get and set whether the body of a response will be automatically
-   * uncompressed.
-   *
-   * The body of an HTTP response can be compressed. In most
-   * situations providing the un-compressed body is most
-   * convenient. Therefore the default behavior is to un-compress the
-   * body. However in some situations (e.g. implementing a transparent
-   * proxy) keeping the uncompressed stream is required.
-   *
-   * NOTE: Headers in from the response is never modified. This means
-   * that when automatic un-compression is turned on the value of the
-   * header `Content-Length` will reflect the length of the original
-   * compressed body. Likewise the header `Content-Encoding` will also
-   * have the original value indicating compression.
-   *
-   * NOTE: Automatic un-compression is only performed if the
-   * `Content-Encoding` header value is `gzip`.
-   *
-   * This value affects all responses produced by this client after the
-   * value is changed.
-   *
-   * To disable, set to `false`.
-   *
-   * Default is `true`.
-   */
-  bool autoUncompress;
-
-  /**
-   * Set and get the default value of the `User-Agent` header for all requests
-   * generated by this [HttpClient]. The default value is
-   * `Dart/<version> (dart:io)`.
-   *
-   * If the userAgent is set to `null`, no default `User-Agent` header will be
-   * added to each request.
-   */
-  String userAgent;
-
-  factory HttpClient({SecurityContext context}) => new _HttpClient(context);
-
-  /**
-   * Opens a HTTP connection.
-   *
-   * The HTTP method to use is specified in [method], the server is
-   * specified using [host] and [port], and the path (including
-   * a possible query) is specified using [path].
-   * The path may also contain a URI fragment, which will be ignored.
-   *
-   * The `Host` header for the request will be set to the value
-   * [host]:[port]. This can be overridden through the
-   * [HttpClientRequest] interface before the request is sent.  NOTE
-   * if [host] is an IP address this will still be set in the `Host`
-   * header.
-   *
-   * For additional information on the sequence of events during an
-   * HTTP transaction, and the objects returned by the futures, see
-   * the overall documentation for the class [HttpClient].
-   */
-  Future<HttpClientRequest> open(String method,
-                                 String host,
-                                 int port,
-                                 String path);
-
-  /**
-   * Opens a HTTP connection.
-   *
-   * The HTTP method is specified in [method] and the URL to use in
-   * [url].
-   *
-   * The `Host` header for the request will be set to the value
-   * [host]:[port]. This can be overridden through the
-   * [HttpClientRequest] interface before the request is sent.  NOTE
-   * if [host] is an IP address this will still be set in the `Host`
-   * header.
-   *
-   * For additional information on the sequence of events during an
-   * HTTP transaction, and the objects returned by the futures, see
-   * the overall documentation for the class [HttpClient].
-   */
-  Future<HttpClientRequest> openUrl(String method, Uri url);
-
-  /**
-   * Opens a HTTP connection using the GET method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including a possible query) is specified using
-   * [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> get(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the GET method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> getUrl(Uri url);
-
-  /**
-   * Opens a HTTP connection using the POST method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including a possible query) is specified using
-   * [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> post(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the POST method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> postUrl(Uri url);
-
-  /**
-   * Opens a HTTP connection using the PUT method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including a possible query) is specified using [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> put(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the PUT method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> putUrl(Uri url);
-
-  /**
-   * Opens a HTTP connection using the DELETE method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including s possible query) is specified using [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> delete(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the DELETE method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> deleteUrl(Uri url);
-
-  /**
-   * Opens a HTTP connection using the PATCH method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including a possible query) is specified using [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> patch(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the PATCH method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> patchUrl(Uri url);
-
-  /**
-   * Opens a HTTP connection using the HEAD method.
-   *
-   * The server is specified using [host] and [port], and the path
-   * (including a possible query) is specified using [path].
-   *
-   * See [open] for details.
-   */
-  Future<HttpClientRequest> head(String host, int port, String path);
-
-  /**
-   * Opens a HTTP connection using the HEAD method.
-   *
-   * The URL to use is specified in [url].
-   *
-   * See [openUrl] for details.
-   */
-  Future<HttpClientRequest> headUrl(Uri url);
-
-  /**
-   * Sets the function to be called when a site is requesting
-   * authentication. The URL requested and the security realm from the
-   * server are passed in the arguments [url] and [realm].
-   *
-   * The function returns a [Future] which should complete when the
-   * authentication has been resolved. If credentials cannot be
-   * provided the [Future] should complete with [:false:]. If
-   * credentials are available the function should add these using
-   * [addCredentials] before completing the [Future] with the value
-   * [:true:].
-   *
-   * If the [Future] completes with true the request will be retried
-   * using the updated credentials. Otherwise response processing will
-   * continue normally.
-   */
-  set authenticate(Future<bool> f(Uri url, String scheme, String realm));
-
-  /**
-   * Add credentials to be used for authorizing HTTP requests.
-   */
-  void addCredentials(Uri url, String realm, HttpClientCredentials credentials);
-
-  /**
-   * Sets the function used to resolve the proxy server to be used for
-   * opening a HTTP connection to the specified [url]. If this
-   * function is not set, direct connections will always be used.
-   *
-   * The string returned by [f] must be in the format used by browser
-   * PAC (proxy auto-config) scripts. That is either
-   *
-   *     "DIRECT"
-   *
-   * for using a direct connection or
-   *
-   *     "PROXY host:port"
-   *
-   * for using the proxy server [:host:] on port [:port:].
-   *
-   * A configuration can contain several configuration elements
-   * separated by semicolons, e.g.
-   *
-   *     "PROXY host:port; PROXY host2:port2; DIRECT"
-   *
-   * The static function [findProxyFromEnvironment] on this class can
-   * be used to implement proxy server resolving based on environment
-   * variables.
-   */
-  set findProxy(String f(Uri url));
-
-  /**
-   * Function for resolving the proxy server to be used for a HTTP
-   * connection from the proxy configuration specified through
-   * environment variables.
-   *
-   * The following environment variables are taken into account:
-   *
-   *     http_proxy
-   *     https_proxy
-   *     no_proxy
-   *     HTTP_PROXY
-   *     HTTPS_PROXY
-   *     NO_PROXY
-   *
-   * [:http_proxy:] and [:HTTP_PROXY:] specify the proxy server to use for
-   * http:// urls. Use the format [:hostname:port:]. If no port is used a
-   * default of 1080 will be used. If both are set the lower case one takes
-   * precedence.
-   *
-   * [:https_proxy:] and [:HTTPS_PROXY:] specify the proxy server to use for
-   * https:// urls. Use the format [:hostname:port:]. If no port is used a
-   * default of 1080 will be used. If both are set the lower case one takes
-   * precedence.
-   *
-   * [:no_proxy:] and [:NO_PROXY:] specify a comma separated list of
-   * postfixes of hostnames for which not to use the proxy
-   * server. E.g. the value "localhost,127.0.0.1" will make requests
-   * to both "localhost" and "127.0.0.1" not use a proxy. If both are set
-   * the lower case one takes precedence.
-   *
-   * To activate this way of resolving proxies assign this function to
-   * the [findProxy] property on the [HttpClient].
-   *
-   *     HttpClient client = new HttpClient();
-   *     client.findProxy = HttpClient.findProxyFromEnvironment;
-   *
-   * If you don't want to use the system environment you can use a
-   * different one by wrapping the function.
-   *
-   *     HttpClient client = new HttpClient();
-   *     client.findProxy = (url) {
-   *       return HttpClient.findProxyFromEnvironment(
-   *           url, {"http_proxy": ..., "no_proxy": ...});
-   *     }
-   *
-   * If a proxy requires authentication it is possible to configure
-   * the username and password as well. Use the format
-   * [:username:password@hostname:port:] to include the username and
-   * password. Alternatively the API [addProxyCredentials] can be used
-   * to set credentials for proxies which require authentication.
-   */
-  static String findProxyFromEnvironment(Uri url,
-                                         {Map<String, String> environment}) {
-    return _HttpClient._findProxyFromEnvironment(url, environment);
-  }
-
-  /**
-   * Sets the function to be called when a proxy is requesting
-   * authentication. Information on the proxy in use and the security
-   * realm for the authentication are passed in the arguments [host],
-   * [port] and [realm].
-   *
-   * The function returns a [Future] which should complete when the
-   * authentication has been resolved. If credentials cannot be
-   * provided the [Future] should complete with [:false:]. If
-   * credentials are available the function should add these using
-   * [addProxyCredentials] before completing the [Future] with the value
-   * [:true:].
-   *
-   * If the [Future] completes with [:true:] the request will be retried
-   * using the updated credentials. Otherwise response processing will
-   * continue normally.
-   */
-  set authenticateProxy(
-      Future<bool> f(String host, int port, String scheme, String realm));
-
-  /**
-   * Add credentials to be used for authorizing HTTP proxies.
-   */
-  void addProxyCredentials(String host,
-                           int port,
-                           String realm,
-                           HttpClientCredentials credentials);
-
-  /**
-   * Sets a callback that will decide whether to accept a secure connection
-   * with a server certificate that cannot be authenticated by any of our
-   * trusted root certificates.
-   *
-   * When an secure HTTP request if made, using this HttpClient, and the
-   * server returns a server certificate that cannot be authenticated, the
-   * callback is called asynchronously with the [X509Certificate] object and
-   * the server's hostname and port.  If the value of [badCertificateCallback]
-   * is [:null:], the bad certificate is rejected, as if the callback
-   * returned [:false:]
-   *
-   * If the callback returns true, the secure connection is accepted and the
-   * [:Future<HttpClientRequest>:] that was returned from the call making the
-   * request completes with a valid HttpRequest object. If the callback returns
-   * false, the [:Future<HttpClientRequest>:] completes with an exception.
-   *
-   * If a bad certificate is received on a connection attempt, the library calls
-   * the function that was the value of badCertificateCallback at the time
-   * the request is made, even if the value of badCertificateCallback
-   * has changed since then.
-   */
-  set badCertificateCallback(bool callback(X509Certificate cert,
-                                           String host,
-                                           int port));
-
-  /**
-   * Shutdown the HTTP client. If [force] is [:false:] (the default)
-   * the [:HttpClient:] will be kept alive until all active
-   * connections are done. If [force] is [:true:] any active
-   * connections will be closed to immediately release all
-   * resources. These closed connections will receive an [:onError:]
-   * callback to indicate that the client was shutdown. In both cases
-   * trying to establish a new connection after calling [shutdown]
-   * will throw an exception.
-   */
-  void close({bool force: false});
-}
-
-
-/**
- * HTTP request for a client connection.
- *
- * To set up a request, set the headers using the headers property
- * provided in this class and write the data to the body of the request.
- * HttpClientRequest is an [IOSink]. Use the methods from IOSink,
- * such as writeCharCode(), to write the body of the HTTP
- * request. When one of the IOSink methods is used for the first
- * time, the request header is sent. Calling any methods that
- * change the header after it is sent throws an exception.
- *
- * When writing string data through the [IOSink] the
- * encoding used is determined from the "charset" parameter of
- * the "Content-Type" header.
- *
- *     HttpClientRequest request = ...
- *     request.headers.contentType
- *         = new ContentType("application", "json", charset: "utf-8");
- *     request.write(...);  // Strings written will be UTF-8 encoded.
- *
- * If no charset is provided the default of ISO-8859-1 (Latin 1) is
- * be used.
- *
- *     HttpClientRequest request = ...
- *     request.headers.add(HttpHeaders.CONTENT_TYPE, "text/plain");
- *     request.write(...);  // Strings written will be ISO-8859-1 encoded.
- *
- * An exception is thrown if you use an unsupported encoding and the
- * `write()` method being used takes a string parameter.
- */
-abstract class HttpClientRequest implements IOSink {
-  /**
-   * Gets and sets the requested persistent connection state.
-   *
-   * The default value is [:true:].
-   */
-  bool persistentConnection;
-
-  /**
-   * Set this property to [:true:] if this request should
-   * automatically follow redirects. The default is [:true:].
-   *
-   * Automatic redirect will only happen for "GET" and "HEAD" requests
-   * and only for the status codes [:HttpHeaders.MOVED_PERMANENTLY:]
-   * (301), [:HttpStatus.FOUND:] (302),
-   * [:HttpStatus.MOVED_TEMPORARILY:] (302, alias for
-   * [:HttpStatus.FOUND:]), [:HttpStatus.SEE_OTHER:] (303) and
-   * [:HttpStatus.TEMPORARY_REDIRECT:] (307). For
-   * [:HttpStatus.SEE_OTHER:] (303) autmatic redirect will also happen
-   * for "POST" requests with the method changed to "GET" when
-   * following the redirect.
-   *
-   * All headers added to the request will be added to the redirection
-   * request(s). However, any body send with the request will not be
-   * part of the redirection request(s).
-   */
-  bool followRedirects;
-
-  /**
-   * Set this property to the maximum number of redirects to follow
-   * when [followRedirects] is [:true:]. If this number is exceeded the
-   * [onError] callback will be called with a [RedirectException].
-   *
-   * The default value is 5.
-   */
-  int maxRedirects;
-
-  /**
-   * The method of the request.
-   */
-  String get method;
-
-  /**
-   * The uri of the request.
-   */
-  Uri get uri;
-
-  /**
-   * Gets and sets the content length of the request. If the size of
-   * the request is not known in advance set content length to -1,
-   * which is also the default.
-   */
-  int contentLength;
-
-  /**
-   * Get or set if the [HttpClientRequest] should buffer output.
-   *
-   * Default value is `true`.
-   *
-   * __Note__: Disabling buffering of the output can result in very poor
-   * performance, when writing many small chunks.
-   */
-  bool bufferOutput;
-
-  /**
-   * Returns the client request headers.
-   *
-   * The client request headers can be modified until the client
-   * request body is written to or closed. After that they become
-   * immutable.
-   */
-  HttpHeaders get headers;
-
-  /**
-   * Cookies to present to the server (in the 'cookie' header).
-   */
-  List<Cookie> get cookies;
-
-  /**
-   * A [HttpClientResponse] future that will complete once the response is
-   * available. If an error occurs before the response is available, this
-   * future will complete with an error.
-   */
-  Future<HttpClientResponse> get done;
-
-  /**
-   * Close the request for input. Returns the value of [done].
-   */
-  Future<HttpClientResponse> close();
-
-  /**
-   * Get information about the client connection. Returns [:null:] if the socket
-   * is not available.
-   */
-  HttpConnectionInfo get connectionInfo;
-}
-
-
-/**
- * HTTP response for a client connection.
- *
- * The body of a [HttpClientResponse] object is a
- * [Stream] of data from the server. Listen to the body to handle
- * the data and be notified when the entire body is received.
- *
- *     new HttpClient().get('localhost', 80, '/file.txt')
- *          .then((HttpClientRequest request) => request.close())
- *          .then((HttpClientResponse response) {
- *            response.transform(UTF8.decoder).listen((contents) {
- *              // handle data
- *            });
- *          });
- */
-abstract class HttpClientResponse implements Stream<List<int>> {
-  /**
-   * Returns the status code.
-   *
-   * The status code must be set before the body is written
-   * to. Setting the status code after writing to the body will throw
-   * a `StateError`.
-   */
-  int get statusCode;
-
-  /**
-   * Returns the reason phrase associated with the status code.
-   *
-   * The reason phrase must be set before the body is written
-   * to. Setting the reason phrase after writing to the body will throw
-   * a `StateError`.
-   */
-  String get reasonPhrase;
-
-  /**
-   * Returns the content length of the response body. Returns -1 if the size of
-   * the response body is not known in advance.
-   *
-   * If the content length needs to be set, it must be set before the
-   * body is written to. Setting the reason phrase after writing to
-   * the body will throw a `StateError`.
-   */
-  int get contentLength;
-
-  /**
-   * Gets the persistent connection state returned by the server.
-   *
-   * if the persistent connection state needs to be set, it must be
-   * set before the body is written to. Setting the reason phrase
-   * after writing to the body will throw a `StateError`.
-   */
-  bool get persistentConnection;
-
-  /**
-   * Returns whether the status code is one of the normal redirect
-   * codes [HttpStatus.MOVED_PERMANENTLY], [HttpStatus.FOUND],
-   * [HttpStatus.MOVED_TEMPORARILY], [HttpStatus.SEE_OTHER] and
-   * [HttpStatus.TEMPORARY_REDIRECT].
-   */
-  bool get isRedirect;
-
-  /**
-   * Returns the series of redirects this connection has been through. The
-   * list will be empty if no redirects were followed. [redirects] will be
-   * updated both in the case of an automatic and a manual redirect.
-   */
-  List<RedirectInfo> get redirects;
-
-  /**
-   * Redirects this connection to a new URL. The default value for
-   * [method] is the method for the current request. The default value
-   * for [url] is the value of the [HttpHeaders.LOCATION] header of
-   * the current response. All body data must have been read from the
-   * current response before calling [redirect].
-   *
-   * All headers added to the request will be added to the redirection
-   * request. However, any body sent with the request will not be
-   * part of the redirection request.
-   *
-   * If [followLoops] is set to [:true:], redirect will follow the redirect,
-   * even if the URL was already visited. The default value is [:false:].
-   *
-   * [redirect] will ignore [maxRedirects] and will always perform the redirect.
-   */
-  Future<HttpClientResponse> redirect([String method,
-                                       Uri url,
-                                       bool followLoops]);
-
-
-  /**
-   * Returns the client response headers.
-   *
-   * The client response headers are immutable.
-   */
-  HttpHeaders get headers;
-
-  /**
-   * Detach the underlying socket from the HTTP client. When the
-   * socket is detached the HTTP client will no longer perform any
-   * operations on it.
-   *
-   * This is normally used when a HTTP upgrade is negotiated and the
-   * communication should continue with a different protocol.
-   */
-  Future<Socket> detachSocket();
-
-  /**
-   * Cookies set by the server (from the 'set-cookie' header).
-   */
-  List<Cookie> get cookies;
-
-  /**
-   * Returns the certificate of the HTTPS server providing the response.
-   * Returns null if the connection is not a secure TLS or SSL connection.
-   */
-  X509Certificate get certificate;
-
-  /**
-   * Gets information about the client connection. Returns [:null:] if the socket
-   * is not available.
-   */
-  HttpConnectionInfo get connectionInfo;
-}
-
-
-abstract class HttpClientCredentials { }
-
-
-/**
- * Represents credentials for basic authentication.
- */
-abstract class HttpClientBasicCredentials extends HttpClientCredentials {
-  factory HttpClientBasicCredentials(String username, String password) =>
-      new _HttpClientBasicCredentials(username, password);
-}
-
-
-/**
- * Represents credentials for digest authentication. Digest
- * authentication is only supported for servers using the MD5
- * algorithm and quality of protection (qop) of either "none" or
- * "auth".
- */
-abstract class HttpClientDigestCredentials extends HttpClientCredentials {
-  factory HttpClientDigestCredentials(String username, String password) =>
-      new _HttpClientDigestCredentials(username, password);
-}
-
-
-/**
- * Information about an [HttpRequest], [HttpResponse], [HttpClientRequest], or
- * [HttpClientResponse] connection.
- */
-abstract class HttpConnectionInfo {
-  InternetAddress get remoteAddress;
-  int get remotePort;
-  int get localPort;
-}
-
-
-/**
- * Redirect information.
- */
-abstract class RedirectInfo {
-  /**
-   * Returns the status code used for the redirect.
-   */
-  int get statusCode;
-
-  /**
-   * Returns the method used for the redirect.
-   */
-  String get method;
-
-  /**
-   * Returns the location for the redirect.
-   */
-  Uri get location;
-}
-
-
-/**
- * When detaching a socket from either the [:HttpServer:] or the
- * [:HttpClient:] due to a HTTP connection upgrade there might be
- * unparsed data already read from the socket. This unparsed data
- * together with the detached socket is returned in an instance of
- * this class.
- */
-abstract class DetachedSocket {
-  Socket get socket;
-  List<int> get unparsedData;
-}
-
-
-class HttpException implements IOException {
-  final String message;
-  final Uri uri;
-
-  const HttpException(String this.message, {Uri this.uri});
-
-  String toString() {
-    var b = new StringBuffer()
-        ..write('HttpException: ')
-        ..write(message);
-    if (uri != null) {
-      b.write(', uri = $uri');
-    }
-    return b.toString();
-  }
-}
-
-
-class RedirectException implements HttpException {
-  final String message;
-  final List<RedirectInfo> redirects;
-
-  const RedirectException(this.message, this.redirects);
-
-  String toString() => "RedirectException: $message";
-
-  Uri get uri => redirects.last.location;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http_date.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http_date.dart
deleted file mode 100644
index 7f69613..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http_date.dart
+++ /dev/null
@@ -1,315 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-/**
- * Utility functions for working with dates with HTTP specific date
- * formats.
- */
-class HttpDate {
-  // From RFC-2616 section "3.3.1 Full Date",
-  // http://tools.ietf.org/html/rfc2616#section-3.3.1
-  //
-  // HTTP-date    = rfc1123-date | rfc850-date | asctime-date
-  // rfc1123-date = wkday "," SP date1 SP time SP "GMT"
-  // rfc850-date  = weekday "," SP date2 SP time SP "GMT"
-  // asctime-date = wkday SP date3 SP time SP 4DIGIT
-  // date1        = 2DIGIT SP month SP 4DIGIT
-  //                ; day month year (e.g., 02 Jun 1982)
-  // date2        = 2DIGIT "-" month "-" 2DIGIT
-  //                ; day-month-year (e.g., 02-Jun-82)
-  // date3        = month SP ( 2DIGIT | ( SP 1DIGIT ))
-  //                ; month day (e.g., Jun  2)
-  // time         = 2DIGIT ":" 2DIGIT ":" 2DIGIT
-  //                ; 00:00:00 - 23:59:59
-  // wkday        = "Mon" | "Tue" | "Wed"
-  //              | "Thu" | "Fri" | "Sat" | "Sun"
-  // weekday      = "Monday" | "Tuesday" | "Wednesday"
-  //              | "Thursday" | "Friday" | "Saturday" | "Sunday"
-  // month        = "Jan" | "Feb" | "Mar" | "Apr"
-  //              | "May" | "Jun" | "Jul" | "Aug"
-  //              | "Sep" | "Oct" | "Nov" | "Dec"
-
-  /**
-   * Format a date according to
-   * [RFC-1123](http://tools.ietf.org/html/rfc1123 "RFC-1123"),
-   * e.g. `Thu, 1 Jan 1970 00:00:00 GMT`.
-   */
-  static String format(DateTime date) {
-    const List wkday = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
-    const List month = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
-                              "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
-
-    DateTime d = date.toUtc();
-    StringBuffer sb = new StringBuffer()
-        ..write(wkday[d.weekday - 1])
-        ..write(", ")
-        ..write(d.day <= 9 ? "0" : "")
-        ..write(d.day.toString())
-        ..write(" ")
-        ..write(month[d.month - 1])
-        ..write(" ")
-        ..write(d.year.toString())
-        ..write(d.hour <= 9 ? " 0" : " ")
-        ..write(d.hour.toString())
-        ..write(d.minute <= 9 ? ":0" : ":")
-        ..write(d.minute.toString())
-        ..write(d.second <= 9 ? ":0" : ":")
-        ..write(d.second.toString())
-        ..write(" GMT");
-    return sb.toString();
-  }
-
-  /**
-   * Parse a date string in either of the formats
-   * [RFC-1123](http://tools.ietf.org/html/rfc1123 "RFC-1123"),
-   * [RFC-850](http://tools.ietf.org/html/rfc850 "RFC-850") or
-   * ANSI C's asctime() format. These formats are listed here.
-   *
-   *     Thu, 1 Jan 1970 00:00:00 GMT
-   *     Thursday, 1-Jan-1970 00:00:00 GMT
-   *     Thu Jan  1 00:00:00 1970
-   *
-   * For more information see [RFC-2616 section
-   * 3.1.1](http://tools.ietf.org/html/rfc2616#section-3.3.1
-   * "RFC-2616 section 3.1.1").
-   */
-  static DateTime parse(String date) {
-    final int SP = 32;
-    const List wkdays = const ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
-    const List weekdays = const ["Monday", "Tuesday", "Wednesday", "Thursday",
-                           "Friday", "Saturday", "Sunday"];
-    const List months = const ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
-                         "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
-    const List wkdaysLowerCase =
-        const ["mon", "tue", "wed", "thu", "fri", "sat", "sun"];
-    const List weekdaysLowerCase = const ["monday", "tuesday", "wednesday",
-                                          "thursday", "friday", "saturday",
-                                          "sunday"];
-    const List monthsLowerCase = const ["jan", "feb", "mar", "apr", "may",
-                                        "jun", "jul", "aug", "sep", "oct",
-                                        "nov", "dec"];
-
-    final int formatRfc1123 = 0;
-    final int formatRfc850 = 1;
-    final int formatAsctime = 2;
-
-    int index = 0;
-    String tmp;
-    int format;
-
-    void expect(String s) {
-      if (date.length - index < s.length) {
-        throw new HttpException("Invalid HTTP date $date");
-      }
-      String tmp = date.substring(index, index + s.length);
-      if (tmp != s) {
-        throw new HttpException("Invalid HTTP date $date");
-      }
-      index += s.length;
-    }
-
-    int expectWeekday() {
-      int weekday;
-      // The formatting of the weekday signals the format of the date string.
-      int pos = date.indexOf(",", index);
-      if (pos == -1) {
-        int pos = date.indexOf(" ", index);
-        if (pos == -1) throw new HttpException("Invalid HTTP date $date");
-        tmp = date.substring(index, pos);
-        index = pos + 1;
-        weekday = wkdays.indexOf(tmp);
-        if (weekday != -1) {
-          format = formatAsctime;
-          return weekday;
-        }
-      } else {
-        tmp = date.substring(index, pos);
-        index = pos + 1;
-        weekday = wkdays.indexOf(tmp);
-        if (weekday != -1) {
-          format = formatRfc1123;
-          return weekday;
-        }
-        weekday = weekdays.indexOf(tmp);
-        if (weekday != -1) {
-          format = formatRfc850;
-          return weekday;
-        }
-      }
-      throw new HttpException("Invalid HTTP date $date");
-    }
-
-    int expectMonth(String separator) {
-      int pos = date.indexOf(separator, index);
-      if (pos - index != 3) throw new HttpException("Invalid HTTP date $date");
-      tmp = date.substring(index, pos);
-      index = pos + 1;
-      int month = months.indexOf(tmp);
-      if (month != -1) return month;
-      throw new HttpException("Invalid HTTP date $date");
-    }
-
-    int expectNum(String separator) {
-      int pos;
-      if (separator.length > 0) {
-        pos = date.indexOf(separator, index);
-      } else {
-        pos = date.length;
-      }
-      String tmp = date.substring(index, pos);
-      index = pos + separator.length;
-      try {
-        int value = int.parse(tmp);
-        return value;
-      } on FormatException catch (e) {
-        throw new HttpException("Invalid HTTP date $date");
-      }
-    }
-
-    void expectEnd() {
-      if (index != date.length) {
-        throw new HttpException("Invalid HTTP date $date");
-      }
-    }
-
-    int weekday = expectWeekday();
-    int day;
-    int month;
-    int year;
-    int hours;
-    int minutes;
-    int seconds;
-    if (format == formatAsctime) {
-      month = expectMonth(" ");
-      if (date.codeUnitAt(index) == SP) index++;
-      day = expectNum(" ");
-      hours = expectNum(":");
-      minutes = expectNum(":");
-      seconds = expectNum(" ");
-      year = expectNum("");
-    } else {
-      expect(" ");
-      day = expectNum(format == formatRfc1123 ? " " : "-");
-      month = expectMonth(format == formatRfc1123 ? " " : "-");
-      year = expectNum(" ");
-      hours = expectNum(":");
-      minutes = expectNum(":");
-      seconds = expectNum(" ");
-      expect("GMT");
-    }
-    expectEnd();
-    return new DateTime.utc(year, month + 1, day, hours, minutes, seconds, 0);
-  }
-
-  // Parse a cookie date string.
-  static DateTime _parseCookieDate(String date) {
-    const List monthsLowerCase = const ["jan", "feb", "mar", "apr", "may",
-                                        "jun", "jul", "aug", "sep", "oct",
-                                        "nov", "dec"];
-
-    int position = 0;
-
-    void error() {
-      throw new HttpException("Invalid cookie date $date");
-    }
-
-    bool isEnd() => position == date.length;
-
-    bool isDelimiter(String s) {
-      int char = s.codeUnitAt(0);
-      if (char == 0x09) return true;
-      if (char >= 0x20 && char <= 0x2F) return true;
-      if (char >= 0x3B && char <= 0x40) return true;
-      if (char >= 0x5B && char <= 0x60) return true;
-      if (char >= 0x7B && char <= 0x7E) return true;
-      return false;
-    }
-
-    bool isNonDelimiter(String s) {
-      int char = s.codeUnitAt(0);
-      if (char >= 0x00 && char <= 0x08) return true;
-      if (char >= 0x0A && char <= 0x1F) return true;
-      if (char >= 0x30 && char <= 0x39) return true;  // Digit
-      if (char == 0x3A) return true;  // ':'
-      if (char >= 0x41 && char <= 0x5A) return true;  // Alpha
-      if (char >= 0x61 && char <= 0x7A) return true;  // Alpha
-      if (char >= 0x7F && char <= 0xFF) return true;  // Alpha
-      return false;
-    }
-
-    bool isDigit(String s) {
-      int char = s.codeUnitAt(0);
-      if (char > 0x2F && char < 0x3A) return true;
-      return false;
-    }
-
-    int getMonth(String month) {
-      if (month.length < 3) return -1;
-      return monthsLowerCase.indexOf(month.substring(0, 3));
-    }
-
-    int toInt(String s) {
-      int index = 0;
-      for (; index < s.length && isDigit(s[index]); index++);
-      return int.parse(s.substring(0, index));
-    }
-
-    var tokens = [];
-    while (!isEnd()) {
-      while (!isEnd() && isDelimiter(date[position])) position++;
-      int start = position;
-      while (!isEnd() && isNonDelimiter(date[position])) position++;
-      tokens.add(date.substring(start, position).toLowerCase());
-      while (!isEnd() && isDelimiter(date[position])) position++;
-    }
-
-    String timeStr;
-    String dayOfMonthStr;
-    String monthStr;
-    String yearStr;
-
-    for (var token in tokens) {
-      if (token.length < 1) continue;
-      if (timeStr == null && token.length >= 5 && isDigit(token[0]) &&
-          (token[1] == ":" || (isDigit(token[1]) && token[2] == ":"))) {
-        timeStr = token;
-      } else if (dayOfMonthStr == null && isDigit(token[0])) {
-        dayOfMonthStr = token;
-      } else if (monthStr == null && getMonth(token) >= 0) {
-        monthStr = token;
-      } else if (yearStr == null && token.length >= 2 &&
-                 isDigit(token[0]) && isDigit(token[1])) {
-        yearStr = token;
-      }
-    }
-
-    if (timeStr == null || dayOfMonthStr == null ||
-        monthStr == null || yearStr == null) {
-      error();
-    }
-
-    int year = toInt(yearStr);
-    if (year >= 70 && year <= 99) year += 1900;
-    else if (year >= 0 && year <= 69) year += 2000;
-    if (year < 1601) error();
-
-    int dayOfMonth = toInt(dayOfMonthStr);
-    if (dayOfMonth < 1 || dayOfMonth > 31) error();
-
-    int month = getMonth(monthStr) + 1;
-
-    var timeList = timeStr.split(":");
-    if (timeList.length != 3) error();
-    int hour = toInt(timeList[0]);
-    int minute = toInt(timeList[1]);
-    int second = toInt(timeList[2]);
-    if (hour > 23) error();
-    if (minute > 59) error();
-    if (second > 59) error();
-
-    return new DateTime.utc(year, month, dayOfMonth, hour, minute, second, 0);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http_headers.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http_headers.dart
deleted file mode 100644
index 6b14ae2..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http_headers.dart
+++ /dev/null
@@ -1,999 +0,0 @@
-// 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.
-
-part of dart.io;
-
-class _HttpHeaders implements HttpHeaders {
-  final Map<String, List<String>> _headers;
-  final String protocolVersion;
-
-  bool _mutable = true;  // Are the headers currently mutable?
-  List<String> _noFoldingHeaders;
-
-  int _contentLength = -1;
-  bool _persistentConnection = true;
-  bool _chunkedTransferEncoding = false;
-  String _host;
-  int _port;
-
-  final int _defaultPortForScheme;
-
-  _HttpHeaders(this.protocolVersion,
-               {int defaultPortForScheme: HttpClient.DEFAULT_HTTP_PORT,
-                _HttpHeaders initialHeaders})
-      : _headers = new HashMap<String, List<String>>(),
-        _defaultPortForScheme = defaultPortForScheme {
-    if (initialHeaders != null) {
-      initialHeaders._headers.forEach((name, value) => _headers[name] = value);
-      _contentLength = initialHeaders._contentLength;
-      _persistentConnection = initialHeaders._persistentConnection;
-      _chunkedTransferEncoding = initialHeaders._chunkedTransferEncoding;
-      _host = initialHeaders._host;
-      _port = initialHeaders._port;
-    }
-    if (protocolVersion == "1.0") {
-      _persistentConnection = false;
-      _chunkedTransferEncoding = false;
-    }
-  }
-
-  List<String> operator[](String name) => _headers[name.toLowerCase()];
-
-  String value(String name) {
-    name = name.toLowerCase();
-    List<String> values = _headers[name];
-    if (values == null) return null;
-    if (values.length > 1) {
-      throw new HttpException("More than one value for header $name");
-    }
-    return values[0];
-  }
-
-  void add(String name, value) {
-    _checkMutable();
-    _addAll(_validateField(name), value);
-  }
-
-  void _addAll(String name, value) {
-    assert(name == _validateField(name));
-    if (value is Iterable) {
-      for (var v in value) {
-        _add(name, _validateValue(v));
-      }
-    } else {
-      _add(name, _validateValue(value));
-    }
-  }
-
-  void set(String name, Object value) {
-    _checkMutable();
-    name = _validateField(name);
-    _headers.remove(name);
-    if (name == HttpHeaders.TRANSFER_ENCODING) {
-      _chunkedTransferEncoding = false;
-    }
-    _addAll(name, value);
-  }
-
-  void remove(String name, Object value) {
-    _checkMutable();
-    name = _validateField(name);
-    value = _validateValue(value);
-    List<String> values = _headers[name];
-    if (values != null) {
-      int index = values.indexOf(value);
-      if (index != -1) {
-        values.removeRange(index, index + 1);
-      }
-      if (values.length == 0) _headers.remove(name);
-    }
-    if (name == HttpHeaders.TRANSFER_ENCODING && value == "chunked") {
-      _chunkedTransferEncoding = false;
-    }
-  }
-
-  void removeAll(String name) {
-    _checkMutable();
-    name = _validateField(name);
-    _headers.remove(name);
-  }
-
-  void forEach(void f(String name, List<String> values)) {
-    _headers.forEach(f);
-  }
-
-  void noFolding(String name) {
-    if (_noFoldingHeaders == null) _noFoldingHeaders = new List<String>();
-    _noFoldingHeaders.add(name);
-  }
-
-  bool get persistentConnection => _persistentConnection;
-
-  void set persistentConnection(bool persistentConnection) {
-    _checkMutable();
-    if (persistentConnection == _persistentConnection) return;
-    if (persistentConnection) {
-      if (protocolVersion == "1.1") {
-        remove(HttpHeaders.CONNECTION, "close");
-      } else {
-        if (_contentLength == -1) {
-          throw new HttpException(
-              "Trying to set 'Connection: Keep-Alive' on HTTP 1.0 headers with "
-              "no ContentLength");
-        }
-        add(HttpHeaders.CONNECTION, "keep-alive");
-      }
-    } else {
-      if (protocolVersion == "1.1") {
-        add(HttpHeaders.CONNECTION, "close");
-      } else {
-        remove(HttpHeaders.CONNECTION, "keep-alive");
-      }
-    }
-    _persistentConnection = persistentConnection;
-  }
-
-  int get contentLength => _contentLength;
-
-  void set contentLength(int contentLength) {
-    _checkMutable();
-    if (protocolVersion == "1.0" &&
-        persistentConnection &&
-        contentLength == -1) {
-      throw new HttpException(
-          "Trying to clear ContentLength on HTTP 1.0 headers with "
-          "'Connection: Keep-Alive' set");
-    }
-    if (_contentLength == contentLength) return;
-    _contentLength = contentLength;
-    if (_contentLength >= 0) {
-      if (chunkedTransferEncoding) chunkedTransferEncoding = false;
-      _set(HttpHeaders.CONTENT_LENGTH, contentLength.toString());
-    } else {
-      removeAll(HttpHeaders.CONTENT_LENGTH);
-      if (protocolVersion == "1.1") {
-        chunkedTransferEncoding = true;
-      }
-    }
-  }
-
-  bool get chunkedTransferEncoding => _chunkedTransferEncoding;
-
-  void set chunkedTransferEncoding(bool chunkedTransferEncoding) {
-    _checkMutable();
-    if (chunkedTransferEncoding && protocolVersion == "1.0") {
-      throw new HttpException(
-          "Trying to set 'Transfer-Encoding: Chunked' on HTTP 1.0 headers");
-    }
-    if (chunkedTransferEncoding == _chunkedTransferEncoding) return;
-    if (chunkedTransferEncoding) {
-      List<String> values = _headers[HttpHeaders.TRANSFER_ENCODING];
-      if ((values == null || values.last != "chunked")) {
-        // Headers does not specify chunked encoding - add it if set.
-        _addValue(HttpHeaders.TRANSFER_ENCODING, "chunked");
-      }
-      contentLength = -1;
-    } else {
-      // Headers does specify chunked encoding - remove it if not set.
-      remove(HttpHeaders.TRANSFER_ENCODING, "chunked");
-    }
-    _chunkedTransferEncoding = chunkedTransferEncoding;
-  }
-
-  String get host => _host;
-
-  void set host(String host) {
-    _checkMutable();
-    _host = host;
-    _updateHostHeader();
-  }
-
-  int get port => _port;
-
-  void set port(int port) {
-    _checkMutable();
-    _port = port;
-    _updateHostHeader();
-  }
-
-  DateTime get ifModifiedSince {
-    List<String> values = _headers[HttpHeaders.IF_MODIFIED_SINCE];
-    if (values != null) {
-      try {
-        return HttpDate.parse(values[0]);
-      } on Exception catch (e) {
-        return null;
-      }
-    }
-    return null;
-  }
-
-  void set ifModifiedSince(DateTime ifModifiedSince) {
-    _checkMutable();
-    // Format "ifModifiedSince" header with date in Greenwich Mean Time (GMT).
-    String formatted = HttpDate.format(ifModifiedSince.toUtc());
-    _set(HttpHeaders.IF_MODIFIED_SINCE, formatted);
-  }
-
-  DateTime get date {
-    List<String> values = _headers[HttpHeaders.DATE];
-    if (values != null) {
-      try {
-        return HttpDate.parse(values[0]);
-      } on Exception catch (e) {
-        return null;
-      }
-    }
-    return null;
-  }
-
-  void set date(DateTime date) {
-    _checkMutable();
-    // Format "DateTime" header with date in Greenwich Mean Time (GMT).
-    String formatted = HttpDate.format(date.toUtc());
-    _set("date", formatted);
-  }
-
-  DateTime get expires {
-    List<String> values = _headers[HttpHeaders.EXPIRES];
-    if (values != null) {
-      try {
-        return HttpDate.parse(values[0]);
-      } on Exception catch (e) {
-        return null;
-      }
-    }
-    return null;
-  }
-
-  void set expires(DateTime expires) {
-    _checkMutable();
-    // Format "Expires" header with date in Greenwich Mean Time (GMT).
-    String formatted = HttpDate.format(expires.toUtc());
-    _set(HttpHeaders.EXPIRES, formatted);
-  }
-
-  ContentType get contentType {
-    var values = _headers["content-type"];
-    if (values != null) {
-      return ContentType.parse(values[0]);
-    } else {
-      return null;
-    }
-  }
-
-  void set contentType(ContentType contentType) {
-    _checkMutable();
-    _set(HttpHeaders.CONTENT_TYPE, contentType.toString());
-  }
-
-  void clear() {
-    _checkMutable();
-    _headers.clear();
-    _contentLength = -1;
-    _persistentConnection = true;
-    _chunkedTransferEncoding = false;
-    _host = null;
-    _port = null;
-  }
-
-  // [name] must be a lower-case version of the name.
-  void _add(String name, value) {
-    assert(name == _validateField(name));
-    // Use the length as index on what method to call. This is notable
-    // faster than computing hash and looking up in a hash-map.
-    switch (name.length) {
-      case 4:
-        if (HttpHeaders.DATE == name) {
-          _addDate(name, value);
-          return;
-        }
-        if (HttpHeaders.HOST == name) {
-          _addHost(name, value);
-          return;
-        }
-        break;
-      case 7:
-        if (HttpHeaders.EXPIRES == name) {
-          _addExpires(name, value);
-          return;
-        }
-        break;
-      case 10:
-        if (HttpHeaders.CONNECTION == name) {
-          _addConnection(name, value);
-          return;
-        }
-        break;
-      case 12:
-        if (HttpHeaders.CONTENT_TYPE == name) {
-          _addContentType(name, value);
-          return;
-        }
-        break;
-      case 14:
-        if (HttpHeaders.CONTENT_LENGTH == name) {
-          _addContentLength(name, value);
-          return;
-        }
-        break;
-      case 17:
-        if (HttpHeaders.TRANSFER_ENCODING == name) {
-          _addTransferEncoding(name, value);
-          return;
-        }
-        if (HttpHeaders.IF_MODIFIED_SINCE == name) {
-          _addIfModifiedSince(name, value);
-          return;
-        }
-    }
-    _addValue(name, value);
-  }
-
-  void _addContentLength(String name, value) {
-    if (value is int) {
-      contentLength = value;
-    } else if (value is String) {
-      contentLength = int.parse(value);
-    } else {
-      throw new HttpException("Unexpected type for header named $name");
-    }
-  }
-
-  void _addTransferEncoding(String name, value) {
-    if (value == "chunked") {
-      chunkedTransferEncoding = true;
-    } else {
-      _addValue(HttpHeaders.TRANSFER_ENCODING, value);
-    }
-  }
-
-  void _addDate(String name, value) {
-    if (value is DateTime) {
-      date = value;
-    } else if (value is String) {
-      _set(HttpHeaders.DATE, value);
-    } else {
-      throw new HttpException("Unexpected type for header named $name");
-    }
-  }
-
-  void _addExpires(String name, value) {
-    if (value is DateTime) {
-      expires = value;
-    } else if (value is String) {
-      _set(HttpHeaders.EXPIRES, value);
-    } else {
-      throw new HttpException("Unexpected type for header named $name");
-    }
-  }
-
-  void _addIfModifiedSince(String name, value) {
-    if (value is DateTime) {
-      ifModifiedSince = value;
-    } else if (value is String) {
-      _set(HttpHeaders.IF_MODIFIED_SINCE, value);
-    } else {
-      throw new HttpException("Unexpected type for header named $name");
-    }
-  }
-
-  void _addHost(String name, value) {
-    if (value is String) {
-      int pos = value.indexOf(":");
-      if (pos == -1) {
-        _host = value;
-        _port = HttpClient.DEFAULT_HTTP_PORT;
-      } else {
-        if (pos > 0) {
-          _host = value.substring(0, pos);
-        } else {
-          _host = null;
-        }
-        if (pos + 1 == value.length) {
-          _port = HttpClient.DEFAULT_HTTP_PORT;
-        } else {
-          try {
-            _port = int.parse(value.substring(pos + 1));
-          } on FormatException catch (e) {
-            _port = null;
-          }
-        }
-      }
-      _set(HttpHeaders.HOST, value);
-    } else {
-      throw new HttpException("Unexpected type for header named $name");
-    }
-  }
-
-  void _addConnection(String name, value) {
-    var lowerCaseValue = value.toLowerCase();
-    if (lowerCaseValue == 'close') {
-      _persistentConnection = false;
-    } else if (lowerCaseValue == 'keep-alive') {
-      _persistentConnection = true;
-    }
-    _addValue(name, value);
-  }
-
-  void _addContentType(String name, value) {
-    _set(HttpHeaders.CONTENT_TYPE, value);
-  }
-
-  void _addValue(String name, Object value) {
-    List<String> values = _headers[name];
-    if (values == null) {
-      values = new List<String>();
-      _headers[name] = values;
-    }
-    if (value is DateTime) {
-      values.add(HttpDate.format(value));
-    } else if (value is String) {
-      values.add(value);
-    } else {
-      values.add(_validateValue(value.toString()));
-    }
-  }
-
-  void _set(String name, String value) {
-    assert(name == _validateField(name));
-    List<String> values = new List<String>();
-    _headers[name] = values;
-    values.add(value);
-  }
-
-  _checkMutable() {
-    if (!_mutable) throw new HttpException("HTTP headers are not mutable");
-  }
-
-  _updateHostHeader() {
-    bool defaultPort = _port == null || _port == _defaultPortForScheme;
-    _set("host", defaultPort ? host : "$host:$_port");
-  }
-
-  _foldHeader(String name) {
-    if (name == HttpHeaders.SET_COOKIE ||
-        (_noFoldingHeaders != null &&
-         _noFoldingHeaders.indexOf(name) != -1)) {
-      return false;
-    }
-    return true;
-  }
-
-  void _finalize() {
-    _mutable = false;
-  }
-
-  int _write(Uint8List buffer, int offset) {
-    void write(List<int> bytes) {
-      int len = bytes.length;
-      for (int i = 0; i < len; i++) {
-        buffer[offset + i] = bytes[i];
-      }
-      offset += len;
-    }
-
-    // Format headers.
-    for (String name in _headers.keys) {
-      List<String> values = _headers[name];
-      bool fold = _foldHeader(name);
-      var nameData = name.codeUnits;
-      write(nameData);
-      buffer[offset++] = _CharCode.COLON;
-      buffer[offset++] = _CharCode.SP;
-      for (int i = 0; i < values.length; i++) {
-        if (i > 0) {
-          if (fold) {
-            buffer[offset++] = _CharCode.COMMA;
-            buffer[offset++] = _CharCode.SP;
-          } else {
-            buffer[offset++] = _CharCode.CR;
-            buffer[offset++] = _CharCode.LF;
-            write(nameData);
-            buffer[offset++] = _CharCode.COLON;
-            buffer[offset++] = _CharCode.SP;
-          }
-        }
-        write(values[i].codeUnits);
-      }
-      buffer[offset++] = _CharCode.CR;
-      buffer[offset++] = _CharCode.LF;
-    }
-    return offset;
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    _headers.forEach((String name, List<String> values) {
-      sb..write(name)..write(": ");
-      bool fold = _foldHeader(name);
-      for (int i = 0; i < values.length; i++) {
-        if (i > 0) {
-          if (fold) {
-            sb.write(", ");
-          } else {
-            sb..write("\n")..write(name)..write(": ");
-          }
-        }
-        sb.write(values[i]);
-      }
-      sb.write("\n");
-    });
-    return sb.toString();
-  }
-
-  List<Cookie> _parseCookies() {
-    // Parse a Cookie header value according to the rules in RFC 6265.
-    var cookies = new List<Cookie>();
-    void parseCookieString(String s) {
-      int index = 0;
-
-      bool done() => index == -1 || index == s.length;
-
-      void skipWS() {
-        while (!done()) {
-         if (s[index] != " " && s[index] != "\t") return;
-         index++;
-        }
-      }
-
-      String parseName() {
-        int start = index;
-        while (!done()) {
-          if (s[index] == " " || s[index] == "\t" || s[index] == "=") break;
-          index++;
-        }
-        return s.substring(start, index);
-      }
-
-      String parseValue() {
-        int start = index;
-        while (!done()) {
-          if (s[index] == " " || s[index] == "\t" || s[index] == ";") break;
-          index++;
-        }
-        return s.substring(start, index);
-      }
-
-      bool expect(String expected) {
-        if (done()) return false;
-        if (s[index] != expected) return false;
-        index++;
-        return true;
-      }
-
-      while (!done()) {
-        skipWS();
-        if (done()) return;
-        String name = parseName();
-        skipWS();
-        if (!expect("=")) {
-          index = s.indexOf(';', index);
-          continue;
-        }
-        skipWS();
-        String value = parseValue();
-        try {
-          cookies.add(new _Cookie(name, value));
-        } catch (_) {
-          // Skip it, invalid cookie data.
-        }
-        skipWS();
-        if (done()) return;
-        if (!expect(";")) {
-          index = s.indexOf(';', index);
-          continue;
-        }
-      }
-    }
-    List<String> values = _headers[HttpHeaders.COOKIE];
-    if (values != null) {
-      values.forEach((headerValue) => parseCookieString(headerValue));
-    }
-    return cookies;
-  }
-
-  static String _validateField(String field) {
-    for (var i = 0; i < field.length; i++) {
-      if (!_HttpParser._isTokenChar(field.codeUnitAt(i))) {
-        throw new FormatException(
-            "Invalid HTTP header field name: ${JSON.encode(field)}");
-      }
-    }
-    return field.toLowerCase();
-  }
-
-  static _validateValue(value) {
-    if (value is! String) return value;
-    for (var i = 0; i < value.length; i++) {
-      if (!_HttpParser._isValueChar(value.codeUnitAt(i))) {
-        throw new FormatException(
-            "Invalid HTTP header field value: ${JSON.encode(value)}");
-      }
-    }
-    return value;
-  }
-}
-
-
-class _HeaderValue implements HeaderValue {
-  String _value;
-  Map<String, String> _parameters;
-  Map<String, String> _unmodifiableParameters;
-
-  _HeaderValue([String this._value = "", Map<String, String> parameters]) {
-    if (parameters != null) {
-      _parameters = new HashMap<String, String>.from(parameters);
-    }
-  }
-
-  static _HeaderValue parse(String value,
-                            {parameterSeparator: ";",
-                             valueSeparator: null,
-                             preserveBackslash: false}) {
-    // Parse the string.
-    var result = new _HeaderValue();
-    result._parse(value, parameterSeparator, valueSeparator, preserveBackslash);
-    return result;
-  }
-
-  String get value => _value;
-
-  void _ensureParameters() {
-    if (_parameters == null) {
-      _parameters = new HashMap<String, String>();
-    }
-  }
-
-  Map<String, String> get parameters {
-    _ensureParameters();
-    if (_unmodifiableParameters == null) {
-      _unmodifiableParameters = new UnmodifiableMapView(_parameters);
-    }
-    return _unmodifiableParameters;
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write(_value);
-    if (parameters != null && parameters.length > 0) {
-      _parameters.forEach((String name, String value) {
-        sb..write("; ")..write(name)..write("=")..write(value);
-      });
-    }
-    return sb.toString();
-  }
-
-  void _parse(String s,
-        String parameterSeparator,
-        String valueSeparator,
-        bool preserveBackslash) {
-    int index = 0;
-
-    bool done() => index == s.length;
-
-    void skipWS() {
-      while (!done()) {
-        if (s[index] != " " && s[index] != "\t") return;
-        index++;
-      }
-    }
-
-    String parseValue() {
-      int start = index;
-      while (!done()) {
-        if (s[index] == " " ||
-            s[index] == "\t" ||
-            s[index] == valueSeparator ||
-            s[index] == parameterSeparator) break;
-        index++;
-      }
-      return s.substring(start, index);
-    }
-
-    void expect(String expected) {
-      if (done() || s[index] != expected) {
-        throw new HttpException("Failed to parse header value");
-      }
-      index++;
-    }
-
-    void maybeExpect(String expected) {
-      if (s[index] == expected) index++;
-    }
-
-    void parseParameters() {
-      var parameters = new HashMap<String, String>();
-      _parameters = new UnmodifiableMapView(parameters);
-
-      String parseParameterName() {
-        int start = index;
-        while (!done()) {
-          if (s[index] == " " ||
-              s[index] == "\t" ||
-              s[index] == "=" ||
-              s[index] == parameterSeparator ||
-              s[index] == valueSeparator) break;
-          index++;
-        }
-        return s.substring(start, index).toLowerCase();
-      }
-
-      String parseParameterValue() {
-        if (!done() && s[index] == "\"") {
-          // Parse quoted value.
-          StringBuffer sb = new StringBuffer();
-          index++;
-          while (!done()) {
-            if (s[index] == "\\") {
-              if (index + 1 == s.length) {
-                throw new HttpException("Failed to parse header value");
-              }
-              if (preserveBackslash && s[index + 1] != "\"") {
-                sb.write(s[index]);
-              }
-              index++;
-            } else if (s[index] == "\"") {
-              index++;
-              break;
-            }
-            sb.write(s[index]);
-            index++;
-          }
-          return sb.toString();
-        } else {
-          // Parse non-quoted value.
-          var val = parseValue();
-          return val == "" ? null : val;
-        }
-      }
-
-      while (!done()) {
-        skipWS();
-        if (done()) return;
-        String name = parseParameterName();
-        skipWS();
-        if (done()) {
-          parameters[name] = null;
-          return;
-        }
-        maybeExpect("=");
-        skipWS();
-        if(done()) {
-          parameters[name] = null;
-          return;
-        }
-        String value = parseParameterValue();
-        if (name == 'charset' && this is _ContentType) {
-          // Charset parameter of ContentTypes are always lower-case.
-          value = value.toLowerCase();
-        }
-        parameters[name] = value;
-        skipWS();
-        if (done()) return;
-        // TODO: Implement support for multi-valued parameters.
-        if(s[index] == valueSeparator) return;
-        expect(parameterSeparator);
-      }
-    }
-
-    skipWS();
-    _value = parseValue();
-    skipWS();
-    if (done()) return;
-    maybeExpect(parameterSeparator);
-    parseParameters();
-  }
-}
-
-
-class _ContentType extends _HeaderValue implements ContentType {
-  String _primaryType = "";
-  String _subType = "";
-
-  _ContentType(String primaryType,
-               String subType,
-               String charset,
-               Map<String, String> parameters)
-      : _primaryType = primaryType, _subType = subType, super("") {
-    if (_primaryType == null) _primaryType = "";
-    if (_subType == null) _subType = "";
-    _value = "$_primaryType/$_subType";
-    if (parameters != null) {
-      _ensureParameters();
-      parameters.forEach((String key, String value) {
-        String lowerCaseKey = key.toLowerCase();
-        if (lowerCaseKey == "charset") {
-          value = value.toLowerCase();
-        }
-        this._parameters[lowerCaseKey] = value;
-      });
-    }
-    if (charset != null) {
-      _ensureParameters();
-      this._parameters["charset"] = charset.toLowerCase();
-    }
-  }
-
-  _ContentType._();
-
-  static _ContentType parse(String value) {
-    var result = new _ContentType._();
-    result._parse(value, ";", null, false);
-    int index = result._value.indexOf("/");
-    if (index == -1 || index == (result._value.length - 1)) {
-      result._primaryType = result._value.trim().toLowerCase();
-      result._subType = "";
-    } else {
-      result._primaryType =
-          result._value.substring(0, index).trim().toLowerCase();
-      result._subType = result._value.substring(index + 1).trim().toLowerCase();
-    }
-    return result;
-  }
-
-  String get mimeType => '$primaryType/$subType';
-
-  String get primaryType => _primaryType;
-
-  String get subType => _subType;
-
-  String get charset => parameters["charset"];
-}
-
-
-class _Cookie implements Cookie {
-  String name;
-  String value;
-  DateTime expires;
-  int maxAge;
-  String domain;
-  String path;
-  bool httpOnly = false;
-  bool secure = false;
-
-  _Cookie([this.name, this.value]) {
-    // Default value of httponly is true.
-    httpOnly = true;
-    _validate();
-  }
-
-  _Cookie.fromSetCookieValue(String value) {
-    // Parse the 'set-cookie' header value.
-    _parseSetCookieValue(value);
-  }
-
-  // Parse a 'set-cookie' header value according to the rules in RFC 6265.
-  void _parseSetCookieValue(String s) {
-    int index = 0;
-
-    bool done() => index == s.length;
-
-    String parseName() {
-      int start = index;
-      while (!done()) {
-        if (s[index] == "=") break;
-        index++;
-      }
-      return s.substring(start, index).trim();
-    }
-
-    String parseValue() {
-      int start = index;
-      while (!done()) {
-        if (s[index] == ";") break;
-        index++;
-      }
-      return s.substring(start, index).trim();
-    }
-
-    void expect(String expected) {
-      if (done()) throw new HttpException("Failed to parse header value [$s]");
-      if (s[index] != expected) {
-        throw new HttpException("Failed to parse header value [$s]");
-      }
-      index++;
-    }
-
-    void parseAttributes() {
-      String parseAttributeName() {
-        int start = index;
-        while (!done()) {
-          if (s[index] == "=" || s[index] == ";") break;
-          index++;
-        }
-        return s.substring(start, index).trim().toLowerCase();
-      }
-
-      String parseAttributeValue() {
-        int start = index;
-        while (!done()) {
-          if (s[index] == ";") break;
-          index++;
-        }
-        return s.substring(start, index).trim().toLowerCase();
-      }
-
-      while (!done()) {
-        String name = parseAttributeName();
-        String value = "";
-        if (!done() && s[index] == "=") {
-          index++;  // Skip the = character.
-          value = parseAttributeValue();
-        }
-        if (name == "expires") {
-          expires = HttpDate._parseCookieDate(value);
-        } else if (name == "max-age") {
-          maxAge = int.parse(value);
-        } else if (name == "domain") {
-          domain = value;
-        } else if (name == "path") {
-          path = value;
-        } else if (name == "httponly") {
-          httpOnly = true;
-        } else if (name == "secure") {
-          secure = true;
-        }
-        if (!done()) index++;  // Skip the ; character
-      }
-    }
-
-    name = parseName();
-    if (done() || name.length == 0) {
-      throw new HttpException("Failed to parse header value [$s]");
-    }
-    index++;  // Skip the = character.
-    value = parseValue();
-    _validate();
-    if (done()) return;
-    index++;  // Skip the ; character.
-    parseAttributes();
-  }
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb..write(name)..write("=")..write(value);
-    if (expires != null) {
-      sb..write("; Expires=")..write(HttpDate.format(expires));
-    }
-    if (maxAge != null) {
-      sb..write("; Max-Age=")..write(maxAge);
-    }
-    if (domain != null) {
-      sb..write("; Domain=")..write(domain);
-    }
-    if (path != null) {
-      sb..write("; Path=")..write(path);
-    }
-    if (secure) sb.write("; Secure");
-    if (httpOnly) sb.write("; HttpOnly");
-    return sb.toString();
-  }
-
-  void _validate() {
-    const SEPERATORS = const [
-        "(", ")", "<", ">", "@", ",", ";", ":", "\\",
-        '"', "/", "[", "]", "?", "=", "{", "}"];
-    for (int i = 0; i < name.length; i++) {
-      int codeUnit = name.codeUnits[i];
-      if (codeUnit <= 32 ||
-          codeUnit >= 127 ||
-          SEPERATORS.indexOf(name[i]) >= 0) {
-        throw new FormatException(
-            "Invalid character in cookie name, code unit: '$codeUnit'");
-      }
-    }
-    for (int i = 0; i < value.length; i++) {
-      int codeUnit = value.codeUnits[i];
-      if (!(codeUnit == 0x21 ||
-            (codeUnit >= 0x23 && codeUnit <= 0x2B) ||
-            (codeUnit >= 0x2D && codeUnit <= 0x3A) ||
-            (codeUnit >= 0x3C && codeUnit <= 0x5B) ||
-            (codeUnit >= 0x5D && codeUnit <= 0x7E))) {
-        throw new FormatException(
-            "Invalid character in cookie value, code unit: '$codeUnit'");
-      }
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http_impl.dart
deleted file mode 100644
index dff98f0..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http_impl.dart
+++ /dev/null
@@ -1,2890 +0,0 @@
-// 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.
-
-part of dart.io;
-
-const int _OUTGOING_BUFFER_SIZE = 8 * 1024;
-
-class _HttpIncoming extends Stream<List<int>> {
-  final int _transferLength;
-  final Completer _dataCompleter = new Completer();
-  Stream<List<int>> _stream;
-
-  bool fullBodyRead = false;
-
-  // Common properties.
-  final _HttpHeaders headers;
-  bool upgraded = false;
-
-  // ClientResponse properties.
-  int statusCode;
-  String reasonPhrase;
-
-  // Request properties.
-  String method;
-  Uri uri;
-
-  bool hasSubscriber = false;
-
-  // The transfer length if the length of the message body as it
-  // appears in the message (RFC 2616 section 4.4). This can be -1 if
-  // the length of the massage body is not known due to transfer
-  // codings.
-  int get transferLength => _transferLength;
-
-  _HttpIncoming(this.headers, this._transferLength, this._stream);
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    hasSubscriber = true;
-    return _stream
-        .handleError((error) {
-          throw new HttpException(error.message, uri: uri);
-        })
-        .listen(onData,
-                onError: onError,
-                onDone: onDone,
-                cancelOnError: cancelOnError);
-  }
-
-  // Is completed once all data have been received.
-  Future get dataDone => _dataCompleter.future;
-
-  void close(bool closing) {
-    fullBodyRead = true;
-    hasSubscriber = true;
-    _dataCompleter.complete(closing);
-  }
-}
-
-abstract class _HttpInboundMessage extends Stream<List<int>> {
-  final _HttpIncoming _incoming;
-  List<Cookie> _cookies;
-
-  _HttpInboundMessage(this._incoming);
-
-  List<Cookie> get cookies {
-    if (_cookies != null) return _cookies;
-    return _cookies = headers._parseCookies();
-  }
-
-  _HttpHeaders get headers => _incoming.headers;
-  String get protocolVersion => headers.protocolVersion;
-  int get contentLength => headers.contentLength;
-  bool get persistentConnection => headers.persistentConnection;
-}
-
-
-class _HttpRequest extends _HttpInboundMessage implements HttpRequest {
-  final HttpResponse response;
-
-  final _HttpServer _httpServer;
-
-  final _HttpConnection _httpConnection;
-
-  _HttpSession _session;
-
-  Uri _requestedUri;
-
-  _HttpRequest(this.response, _HttpIncoming _incoming, this._httpServer,
-               this._httpConnection) : super(_incoming) {
-    if (headers.protocolVersion == "1.1") {
-      response.headers
-          ..chunkedTransferEncoding = true
-          ..persistentConnection = headers.persistentConnection;
-    }
-
-    if (_httpServer._sessionManagerInstance != null) {
-      // Map to session if exists.
-      var sessionIds = cookies
-          .where((cookie) => cookie.name.toUpperCase() == _DART_SESSION_ID)
-          .map((cookie) => cookie.value);
-      for (var sessionId in sessionIds) {
-        _session = _httpServer._sessionManager.getSession(sessionId);
-        if (_session != null) {
-          _session._markSeen();
-          break;
-        }
-      }
-    }
-  }
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    return _incoming.listen(onData,
-                            onError: onError,
-                            onDone: onDone,
-                            cancelOnError: cancelOnError);
-  }
-
-  Uri get uri => _incoming.uri;
-
-  Uri get requestedUri {
-    if (_requestedUri == null) {
-      var proto = headers['x-forwarded-proto'];
-      var scheme = proto != null ? proto.first :
-          _httpConnection._socket is SecureSocket ? "https" : "http";
-      var hostList = headers['x-forwarded-host'];
-      String host;
-      if (hostList != null) {
-        host = hostList.first;
-      } else {
-        hostList = headers['host'];
-        if (hostList != null) {
-          host = hostList.first;
-        } else {
-          host = "${_httpServer.address.host}:${_httpServer.port}";
-        }
-      }
-      _requestedUri = Uri.parse("$scheme://$host$uri");
-    }
-    return _requestedUri;
-  }
-
-  String get method => _incoming.method;
-
-  HttpSession get session {
-    if (_session != null) {
-      if (_session._destroyed) {
-        // It's destroyed, clear it.
-        _session = null;
-        // Create new session object by calling recursive.
-        return session;
-      }
-      // It's already mapped, use it.
-      return _session;
-    }
-    // Create session, store it in connection, and return.
-    return _session = _httpServer._sessionManager.createSession();
-  }
-
-  HttpConnectionInfo get connectionInfo => _httpConnection.connectionInfo;
-
-  X509Certificate get certificate {
-    var socket = _httpConnection._socket;
-    if (socket is SecureSocket) return socket.peerCertificate;
-    return null;
-  }
-}
-
-
-class _HttpClientResponse
-    extends _HttpInboundMessage implements HttpClientResponse {
-  List<RedirectInfo> get redirects => _httpRequest._responseRedirects;
-
-  // The HttpClient this response belongs to.
-  final _HttpClient _httpClient;
-
-  // The HttpClientRequest of this response.
-  final _HttpClientRequest _httpRequest;
-
-  _HttpClientResponse(_HttpIncoming _incoming, this._httpRequest,
-                      this._httpClient) : super(_incoming) {
-    // Set uri for potential exceptions.
-    _incoming.uri = _httpRequest.uri;
-  }
-
-  int get statusCode => _incoming.statusCode;
-  String get reasonPhrase => _incoming.reasonPhrase;
-
-  X509Certificate get certificate {
-    var socket = _httpRequest._httpClientConnection._socket;
-    if (socket is SecureSocket) return socket.peerCertificate;
-    throw new UnsupportedError("Socket is not a SecureSocket");
-  }
-
-  List<Cookie> get cookies {
-    if (_cookies != null) return _cookies;
-    _cookies = new List<Cookie>();
-    List<String> values = headers[HttpHeaders.SET_COOKIE];
-    if (values != null) {
-      values.forEach((value) {
-        _cookies.add(new Cookie.fromSetCookieValue(value));
-      });
-    }
-    return _cookies;
-  }
-
-  bool get isRedirect {
-    if (_httpRequest.method == "GET" || _httpRequest.method == "HEAD") {
-      return statusCode == HttpStatus.MOVED_PERMANENTLY ||
-             statusCode == HttpStatus.FOUND ||
-             statusCode == HttpStatus.SEE_OTHER ||
-             statusCode == HttpStatus.TEMPORARY_REDIRECT;
-    } else if (_httpRequest.method == "POST") {
-      return statusCode == HttpStatus.SEE_OTHER;
-    }
-    return false;
-  }
-
-  Future<HttpClientResponse> redirect([String method,
-                                       Uri url,
-                                       bool followLoops]) {
-    if (method == null) {
-      // Set method as defined by RFC 2616 section 10.3.4.
-      if (statusCode == HttpStatus.SEE_OTHER && _httpRequest.method == "POST") {
-        method = "GET";
-      } else {
-        method = _httpRequest.method;
-      }
-    }
-    if (url == null) {
-      String location = headers.value(HttpHeaders.LOCATION);
-      if (location == null) {
-        throw new StateError("Response has no Location header for redirect");
-      }
-      url = Uri.parse(location);
-    }
-    if (followLoops != true) {
-      for (var redirect in redirects) {
-        if (redirect.location == url) {
-          return new Future.error(
-              new RedirectException("Redirect loop detected", redirects));
-        }
-      }
-    }
-    return _httpClient._openUrlFromRequest(method, url, _httpRequest)
-        .then((request) {
-          request._responseRedirects
-              ..addAll(this.redirects)
-              ..add(new _RedirectInfo(statusCode, method, url));
-          return request.close();
-        });
-  }
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    if (_incoming.upgraded) {
-      // If upgraded, the connection is already 'removed' form the client.
-      // Since listening to upgraded data is 'bogus', simply close and
-      // return empty stream subscription.
-      _httpRequest._httpClientConnection.destroy();
-      return new Stream.fromIterable([]).listen(null, onDone: onDone);
-    }
-    var stream = _incoming;
-    if (_httpClient.autoUncompress &&
-        headers.value(HttpHeaders.CONTENT_ENCODING) == "gzip") {
-      stream = stream.transform(GZIP.decoder);
-    }
-    return stream.listen(onData,
-                         onError: onError,
-                         onDone: onDone,
-                         cancelOnError: cancelOnError);
-  }
-
-  Future<Socket> detachSocket() {
-    _httpClient._connectionClosed(_httpRequest._httpClientConnection);
-    return _httpRequest._httpClientConnection.detachSocket();
-  }
-
-  HttpConnectionInfo get connectionInfo => _httpRequest.connectionInfo;
-
-  bool get _shouldAuthenticateProxy {
-    // Only try to authenticate if there is a challenge in the response.
-    List<String> challenge = headers[HttpHeaders.PROXY_AUTHENTICATE];
-    return statusCode == HttpStatus.PROXY_AUTHENTICATION_REQUIRED &&
-        challenge != null && challenge.length == 1;
-  }
-
-  bool get _shouldAuthenticate {
-    // Only try to authenticate if there is a challenge in the response.
-    List<String> challenge = headers[HttpHeaders.WWW_AUTHENTICATE];
-    return statusCode == HttpStatus.UNAUTHORIZED &&
-        challenge != null && challenge.length == 1;
-  }
-
-  Future<HttpClientResponse> _authenticate(bool proxyAuth) {
-    Future<HttpClientResponse> retry() {
-      // Drain body and retry.
-      return drain().then((_) {
-          return _httpClient._openUrlFromRequest(_httpRequest.method,
-                                                 _httpRequest.uri,
-                                                 _httpRequest)
-              .then((request) => request.close());
-          });
-    }
-
-    List<String> authChallenge() {
-      return proxyAuth ? headers[HttpHeaders.PROXY_AUTHENTICATE]
-                       : headers[HttpHeaders.WWW_AUTHENTICATE];
-    }
-
-    _Credentials findCredentials(_AuthenticationScheme scheme) {
-      return proxyAuth ? _httpClient._findProxyCredentials(_httpRequest._proxy,
-                                                           scheme)
-                       : _httpClient._findCredentials(_httpRequest.uri, scheme);
-    }
-
-    void removeCredentials(_Credentials cr) {
-      if (proxyAuth) {
-        _httpClient._removeProxyCredentials(cr);
-      } else {
-        _httpClient._removeCredentials(cr);
-      }
-    }
-
-    Future requestAuthentication(_AuthenticationScheme scheme, String realm) {
-      if (proxyAuth) {
-        if (_httpClient._authenticateProxy == null) {
-          return new Future.value(false);
-        }
-        var proxy = _httpRequest._proxy;
-        return _httpClient._authenticateProxy(proxy.host,
-                                              proxy.port,
-                                              scheme.toString(),
-                                              realm);
-      } else {
-        if (_httpClient._authenticate == null) {
-          return new Future.value(false);
-        }
-        return _httpClient._authenticate(_httpRequest.uri,
-                                         scheme.toString(),
-                                         realm);
-      }
-    }
-
-    List<String> challenge = authChallenge();
-    assert(challenge != null || challenge.length == 1);
-    _HeaderValue header =
-        _HeaderValue.parse(challenge[0], parameterSeparator: ",");
-    _AuthenticationScheme scheme =
-        new _AuthenticationScheme.fromString(header.value);
-    String realm = header.parameters["realm"];
-
-    // See if any matching credentials are available.
-    _Credentials cr = findCredentials(scheme);
-    if (cr != null) {
-      // For basic authentication don't retry already used credentials
-      // as they must have already been added to the request causing
-      // this authenticate response.
-      if (cr.scheme == _AuthenticationScheme.BASIC && !cr.used) {
-        // Credentials where found, prepare for retrying the request.
-        return retry();
-      }
-
-      // Digest authentication only supports the MD5 algorithm.
-      if (cr.scheme == _AuthenticationScheme.DIGEST &&
-          (header.parameters["algorithm"] == null ||
-           header.parameters["algorithm"].toLowerCase() == "md5")) {
-        if (cr.nonce == null || cr.nonce == header.parameters["nonce"]) {
-          // If the nonce is not set then this is the first authenticate
-          // response for these credentials. Set up authentication state.
-          if (cr.nonce == null) {
-            cr..nonce = header.parameters["nonce"]
-              ..algorithm = "MD5"
-              ..qop = header.parameters["qop"]
-              ..nonceCount = 0;
-          }
-          // Credentials where found, prepare for retrying the request.
-          return retry();
-        } else if (header.parameters["stale"] != null &&
-                   header.parameters["stale"].toLowerCase() == "true") {
-          // If stale is true retry with new nonce.
-          cr.nonce = header.parameters["nonce"];
-          // Credentials where found, prepare for retrying the request.
-          return retry();
-        }
-      }
-    }
-
-    // Ask for more credentials if none found or the one found has
-    // already been used. If it has already been used it must now be
-    // invalid and is removed.
-    if (cr != null) {
-      removeCredentials(cr);
-      cr = null;
-    }
-    return requestAuthentication(scheme, realm).then((credsAvailable) {
-      if (credsAvailable) {
-        cr = _httpClient._findCredentials(_httpRequest.uri, scheme);
-        return retry();
-      } else {
-        // No credentials available, complete with original response.
-        return this;
-      }
-    });
-  }
-}
-
-
-abstract class _HttpOutboundMessage<T> extends _IOSinkImpl {
-  // Used to mark when the body should be written. This is used for HEAD
-  // requests and in error handling.
-  bool _encodingSet = false;
-
-  bool _bufferOutput = true;
-
-  final Uri _uri;
-  final _HttpOutgoing _outgoing;
-
-  final _HttpHeaders headers;
-
-  _HttpOutboundMessage(Uri uri,
-                       String protocolVersion,
-                       _HttpOutgoing outgoing,
-                       {_HttpHeaders initialHeaders})
-      : _uri = uri,
-        headers = new _HttpHeaders(
-            protocolVersion,
-            defaultPortForScheme: uri.scheme == 'https' ?
-                HttpClient.DEFAULT_HTTPS_PORT :
-                HttpClient.DEFAULT_HTTP_PORT,
-            initialHeaders: initialHeaders),
-        _outgoing = outgoing,
-        super(outgoing, null) {
-    _outgoing.outbound = this;
-    _encodingMutable = false;
-  }
-
-  int get contentLength => headers.contentLength;
-  void set contentLength(int contentLength) {
-    headers.contentLength = contentLength;
-  }
-
-  bool get persistentConnection => headers.persistentConnection;
-  void set persistentConnection(bool p) {
-    headers.persistentConnection = p;
-  }
-
-  bool get bufferOutput => _bufferOutput;
-  void set bufferOutput(bool bufferOutput) {
-    if (_outgoing.headersWritten) throw new StateError("Header already sent");
-    _bufferOutput = bufferOutput;
-  }
-
-
-  Encoding get encoding {
-    if (_encodingSet && _outgoing.headersWritten) {
-      return _encoding;
-    }
-    var charset;
-    if (headers.contentType != null && headers.contentType.charset != null) {
-      charset = headers.contentType.charset;
-    } else {
-      charset = "iso-8859-1";
-    }
-    return Encoding.getByName(charset);
-  }
-
-  void add(List<int> data) {
-    if (data.length == 0) return;
-    super.add(data);
-  }
-
-  void write(Object obj) {
-    if (!_encodingSet) {
-      _encoding = encoding;
-      _encodingSet = true;
-    }
-    super.write(obj);
-  }
-
-  void _writeHeader();
-
-  bool get _isConnectionClosed => false;
-}
-
-
-class _HttpResponse extends _HttpOutboundMessage<HttpResponse>
-    implements HttpResponse {
-  int _statusCode = 200;
-  String _reasonPhrase;
-  List<Cookie> _cookies;
-  _HttpRequest _httpRequest;
-  Duration _deadline;
-  Timer _deadlineTimer;
-
-  _HttpResponse(Uri uri,
-                String protocolVersion,
-                _HttpOutgoing outgoing,
-                HttpHeaders defaultHeaders,
-                String serverHeader)
-      : super(uri, protocolVersion, outgoing, initialHeaders: defaultHeaders) {
-    if (serverHeader != null) headers.set('server', serverHeader);
-  }
-
-  bool get _isConnectionClosed => _httpRequest._httpConnection._isClosing;
-
-  List<Cookie> get cookies {
-    if (_cookies == null) _cookies = new List<Cookie>();
-    return _cookies;
-  }
-
-  int get statusCode => _statusCode;
-  void set statusCode(int statusCode) {
-    if (_outgoing.headersWritten) throw new StateError("Header already sent");
-    _statusCode = statusCode;
-  }
-
-  String get reasonPhrase => _findReasonPhrase(statusCode);
-  void set reasonPhrase(String reasonPhrase) {
-    if (_outgoing.headersWritten) throw new StateError("Header already sent");
-    _reasonPhrase = reasonPhrase;
-  }
-
-  Future redirect(Uri location, {int status: HttpStatus.MOVED_TEMPORARILY}) {
-    if (_outgoing.headersWritten) throw new StateError("Header already sent");
-    statusCode = status;
-    headers.set("location", location.toString());
-    return close();
-  }
-
-  Future<Socket> detachSocket({bool writeHeaders: true}) {
-    if (_outgoing.headersWritten) throw new StateError("Headers already sent");
-    deadline = null;  // Be sure to stop any deadline.
-    var future = _httpRequest._httpConnection.detachSocket();
-    if (writeHeaders) {
-      var headersFuture = _outgoing.writeHeaders(drainRequest: false,
-                                                 setOutgoing: false);
-      assert(headersFuture == null);
-    } else {
-      // Imitate having written the headers.
-      _outgoing.headersWritten = true;
-    }
-    // Close connection so the socket is 'free'.
-    close();
-    done.catchError((_) {
-      // Catch any error on done, as they automatically will be
-      // propagated to the websocket.
-    });
-    return future;
-  }
-
-  HttpConnectionInfo get connectionInfo => _httpRequest.connectionInfo;
-
-  Duration get deadline => _deadline;
-
-  void set deadline(Duration d) {
-    if (_deadlineTimer != null) _deadlineTimer.cancel();
-    _deadline = d;
-
-    if (_deadline == null) return;
-    _deadlineTimer = new Timer(_deadline, () {
-      _httpRequest._httpConnection.destroy();
-    });
-  }
-
-  void _writeHeader() {
-    Uint8List buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
-    int offset = 0;
-
-    void write(List<int> bytes) {
-      int len = bytes.length;
-      for (int i = 0; i < len; i++) {
-        buffer[offset + i] = bytes[i];
-      }
-      offset += len;
-    }
-
-    // Write status line.
-    if (headers.protocolVersion == "1.1") {
-      write(_Const.HTTP11);
-    } else {
-      write(_Const.HTTP10);
-    }
-    buffer[offset++] = _CharCode.SP;
-    write(statusCode.toString().codeUnits);
-    buffer[offset++] = _CharCode.SP;
-    write(reasonPhrase.codeUnits);
-    buffer[offset++] = _CharCode.CR;
-    buffer[offset++] = _CharCode.LF;
-
-    var session = _httpRequest._session;
-    if (session != null && !session._destroyed) {
-      // Mark as not new.
-      session._isNew = false;
-      // Make sure we only send the current session id.
-      bool found = false;
-      for (int i = 0; i < cookies.length; i++) {
-        if (cookies[i].name.toUpperCase() == _DART_SESSION_ID) {
-          cookies[i]
-              ..value = session.id
-              ..httpOnly = true
-              ..path = "/";
-          found = true;
-        }
-      }
-      if (!found) {
-        var cookie = new Cookie(_DART_SESSION_ID, session.id);
-        cookies.add(cookie
-            ..httpOnly = true
-            ..path = "/");
-      }
-    }
-    // Add all the cookies set to the headers.
-    if (_cookies != null) {
-      _cookies.forEach((cookie) {
-        headers.add(HttpHeaders.SET_COOKIE, cookie);
-      });
-    }
-
-    headers._finalize();
-
-    // Write headers.
-    offset = headers._write(buffer, offset);
-    buffer[offset++] = _CharCode.CR;
-    buffer[offset++] = _CharCode.LF;
-    _outgoing.setHeader(buffer, offset);
-  }
-
-  String _findReasonPhrase(int statusCode) {
-    if (_reasonPhrase != null) {
-      return _reasonPhrase;
-    }
-
-    switch (statusCode) {
-      case HttpStatus.CONTINUE: return "Continue";
-      case HttpStatus.SWITCHING_PROTOCOLS: return "Switching Protocols";
-      case HttpStatus.OK: return "OK";
-      case HttpStatus.CREATED: return "Created";
-      case HttpStatus.ACCEPTED: return "Accepted";
-      case HttpStatus.NON_AUTHORITATIVE_INFORMATION:
-        return "Non-Authoritative Information";
-      case HttpStatus.NO_CONTENT: return "No Content";
-      case HttpStatus.RESET_CONTENT: return "Reset Content";
-      case HttpStatus.PARTIAL_CONTENT: return "Partial Content";
-      case HttpStatus.MULTIPLE_CHOICES: return "Multiple Choices";
-      case HttpStatus.MOVED_PERMANENTLY: return "Moved Permanently";
-      case HttpStatus.FOUND: return "Found";
-      case HttpStatus.SEE_OTHER: return "See Other";
-      case HttpStatus.NOT_MODIFIED: return "Not Modified";
-      case HttpStatus.USE_PROXY: return "Use Proxy";
-      case HttpStatus.TEMPORARY_REDIRECT: return "Temporary Redirect";
-      case HttpStatus.BAD_REQUEST: return "Bad Request";
-      case HttpStatus.UNAUTHORIZED: return "Unauthorized";
-      case HttpStatus.PAYMENT_REQUIRED: return "Payment Required";
-      case HttpStatus.FORBIDDEN: return "Forbidden";
-      case HttpStatus.NOT_FOUND: return "Not Found";
-      case HttpStatus.METHOD_NOT_ALLOWED: return "Method Not Allowed";
-      case HttpStatus.NOT_ACCEPTABLE: return "Not Acceptable";
-      case HttpStatus.PROXY_AUTHENTICATION_REQUIRED:
-        return "Proxy Authentication Required";
-      case HttpStatus.REQUEST_TIMEOUT: return "Request Time-out";
-      case HttpStatus.CONFLICT: return "Conflict";
-      case HttpStatus.GONE: return "Gone";
-      case HttpStatus.LENGTH_REQUIRED: return "Length Required";
-      case HttpStatus.PRECONDITION_FAILED: return "Precondition Failed";
-      case HttpStatus.REQUEST_ENTITY_TOO_LARGE:
-        return "Request Entity Too Large";
-      case HttpStatus.REQUEST_URI_TOO_LONG: return "Request-URI Too Large";
-      case HttpStatus.UNSUPPORTED_MEDIA_TYPE: return "Unsupported Media Type";
-      case HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE:
-        return "Requested range not satisfiable";
-      case HttpStatus.EXPECTATION_FAILED: return "Expectation Failed";
-      case HttpStatus.INTERNAL_SERVER_ERROR: return "Internal Server Error";
-      case HttpStatus.NOT_IMPLEMENTED: return "Not Implemented";
-      case HttpStatus.BAD_GATEWAY: return "Bad Gateway";
-      case HttpStatus.SERVICE_UNAVAILABLE: return "Service Unavailable";
-      case HttpStatus.GATEWAY_TIMEOUT: return "Gateway Time-out";
-      case HttpStatus.HTTP_VERSION_NOT_SUPPORTED:
-        return "Http Version not supported";
-      default: return "Status $statusCode";
-    }
-  }
-}
-
-
-class _HttpClientRequest extends _HttpOutboundMessage<HttpClientResponse>
-    implements HttpClientRequest {
-  final String method;
-  final Uri uri;
-  final List<Cookie> cookies = new List<Cookie>();
-
-  // The HttpClient this request belongs to.
-  final _HttpClient _httpClient;
-  final _HttpClientConnection _httpClientConnection;
-
-  final Completer<HttpClientResponse> _responseCompleter
-      = new Completer<HttpClientResponse>();
-
-  final _Proxy _proxy;
-
-  Future<HttpClientResponse> _response;
-
-  // TODO(ajohnsen): Get default value from client?
-  bool _followRedirects = true;
-
-  int _maxRedirects = 5;
-
-  List<RedirectInfo> _responseRedirects = [];
-
-  _HttpClientRequest(_HttpOutgoing outgoing, Uri uri, this.method, this._proxy,
-                     this._httpClient, this._httpClientConnection)
-      : uri = uri,
-        super(uri, "1.1", outgoing) {
-    // GET and HEAD have 'content-length: 0' by default.
-    if (method == "GET" || method == "HEAD") {
-      contentLength = 0;
-    } else {
-      headers.chunkedTransferEncoding = true;
-    }
-  }
-
-  Future<HttpClientResponse> get done {
-    if (_response == null) {
-      _response = Future.wait([_responseCompleter.future, super.done],
-                              eagerError: true)
-        .then((list) => list[0]);
-    }
-    return _response;
-  }
-
-  Future<HttpClientResponse> close() {
-    super.close();
-    return done;
-  }
-
-  int get maxRedirects => _maxRedirects;
-  void set maxRedirects(int maxRedirects) {
-    if (_outgoing.headersWritten) throw new StateError("Request already sent");
-    _maxRedirects = maxRedirects;
-  }
-
-  bool get followRedirects => _followRedirects;
-  void set followRedirects(bool followRedirects) {
-    if (_outgoing.headersWritten) throw new StateError("Request already sent");
-    _followRedirects = followRedirects;
-  }
-
-  HttpConnectionInfo get connectionInfo => _httpClientConnection.connectionInfo;
-
-  void _onIncoming(_HttpIncoming incoming) {
-    var response = new _HttpClientResponse(incoming, this, _httpClient);
-    Future<HttpClientResponse> future;
-    if (followRedirects && response.isRedirect) {
-      if (response.redirects.length < maxRedirects) {
-        // Redirect and drain response.
-        future = response.drain().then((_) => response.redirect());
-      } else {
-        // End with exception, too many redirects.
-        future = response.drain()
-            .then((_) => new Future.error(
-                new RedirectException("Redirect limit exceeded",
-                                      response.redirects)));
-      }
-    } else if (response._shouldAuthenticateProxy) {
-      future = response._authenticate(true);
-    } else if (response._shouldAuthenticate) {
-      future = response._authenticate(false);
-    } else {
-      future = new Future<HttpClientResponse>.value(response);
-    }
-    future.then(
-        (v) => _responseCompleter.complete(v),
-        onError: _responseCompleter.completeError);
-  }
-
-  void _onError(error, StackTrace stackTrace) {
-    _responseCompleter.completeError(error, stackTrace);
-  }
-
-  // Generate the request URI based on the method and proxy.
-  String _requestUri() {
-    // Generate the request URI starting from the path component.
-    String uriStartingFromPath() {
-      String result = uri.path;
-      if (result.isEmpty) result = "/";
-      if (uri.hasQuery) {
-        result = "${result}?${uri.query}";
-      }
-      return result;
-    }
-
-    if (_proxy.isDirect) {
-      return uriStartingFromPath();
-    } else {
-      if (method == "CONNECT") {
-        // For the connect method the request URI is the host:port of
-        // the requested destination of the tunnel (see RFC 2817
-        // section 5.2)
-        return "${uri.host}:${uri.port}";
-      } else {
-        if (_httpClientConnection._proxyTunnel) {
-          return uriStartingFromPath();
-        } else {
-          return uri.removeFragment().toString();
-        }
-      }
-    }
-  }
-
-  void _writeHeader() {
-    Uint8List buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
-    int offset = 0;
-
-    void write(List<int> bytes) {
-      int len = bytes.length;
-      for (int i = 0; i < len; i++) {
-        buffer[offset + i] = bytes[i];
-      }
-      offset += len;
-    }
-
-    // Write the request method.
-    write(method.codeUnits);
-    buffer[offset++] = _CharCode.SP;
-    // Write the request URI.
-    write(_requestUri().codeUnits);
-    buffer[offset++] = _CharCode.SP;
-    // Write HTTP/1.1.
-    write(_Const.HTTP11);
-    buffer[offset++] = _CharCode.CR;
-    buffer[offset++] = _CharCode.LF;
-
-    // Add the cookies to the headers.
-    if (!cookies.isEmpty) {
-      StringBuffer sb = new StringBuffer();
-      for (int i = 0; i < cookies.length; i++) {
-        if (i > 0) sb.write("; ");
-        sb..write(cookies[i].name)..write("=")..write(cookies[i].value);
-      }
-      headers.add(HttpHeaders.COOKIE, sb.toString());
-    }
-
-    headers._finalize();
-
-    // Write headers.
-    offset = headers._write(buffer, offset);
-    buffer[offset++] = _CharCode.CR;
-    buffer[offset++] = _CharCode.LF;
-    _outgoing.setHeader(buffer, offset);
-  }
-}
-
-// Used by _HttpOutgoing as a target of a chunked converter for gzip
-// compression.
-class _HttpGZipSink extends ByteConversionSink {
-  final Function _consume;
-  _HttpGZipSink(this._consume);
-
-  void add(List<int> chunk) {
-    _consume(chunk);
-  }
-
-  void addSlice(List<int> chunk, int start, int end, bool isLast) {
-    if (chunk is Uint8List) {
-      _consume(new Uint8List.view(chunk.buffer, start, end - start));
-    } else {
-      _consume(chunk.sublist(start, end - start));
-    }
-  }
-
-  void close() {}
-}
-
-
-// The _HttpOutgoing handles all of the following:
-//  - Buffering
-//  - GZip compressionm
-//  - Content-Length validation.
-//  - Errors.
-//
-// Most notable is the GZip compression, that uses a double-buffering system,
-// one before gzip (_gzipBuffer) and one after (_buffer).
-class _HttpOutgoing implements StreamConsumer<List<int>> {
-  static const List<int> _footerAndChunk0Length =
-      const [_CharCode.CR, _CharCode.LF, 0x30, _CharCode.CR, _CharCode.LF,
-             _CharCode.CR, _CharCode.LF];
-
-  static const List<int> _chunk0Length =
-      const [0x30, _CharCode.CR, _CharCode.LF, _CharCode.CR, _CharCode.LF];
-
-  final Completer _doneCompleter = new Completer();
-  final Socket socket;
-
-  bool ignoreBody = false;
-  bool headersWritten = false;
-
-  Uint8List _buffer;
-  int _length = 0;
-
-  Future _closeFuture;
-
-  bool chunked = false;
-  int _pendingChunkedFooter = 0;
-
-  int contentLength;
-  int _bytesWritten = 0;
-
-  bool _gzip = false;
-  ByteConversionSink _gzipSink;
-  // _gzipAdd is set iff the sink is being added to. It's used to specify where
-  // gzipped data should be taken (sometimes a controller, sometimes a socket).
-  Function _gzipAdd;
-  Uint8List _gzipBuffer;
-  int _gzipBufferLength = 0;
-
-  bool _socketError = false;
-
-  _HttpOutboundMessage outbound;
-
-  _HttpOutgoing(this.socket);
-
-  // Returns either a future or 'null', if it was able to write headers
-  // immediately.
-  Future writeHeaders({bool drainRequest: true, bool setOutgoing: true}) {
-    Future write() {
-      try {
-        outbound._writeHeader();
-      } catch (_) {
-        // Headers too large.
-        return new Future.error(new HttpException(
-            "Headers size exceeded the of '$_OUTGOING_BUFFER_SIZE'"
-            " bytes"));
-      }
-      return null;
-    }
-
-    if (headersWritten) return null;
-    headersWritten = true;
-    Future drainFuture;
-    bool gzip = false;
-    if (outbound is _HttpResponse) {
-      // Server side.
-      _HttpResponse response = outbound;
-      if (response._httpRequest._httpServer.autoCompress &&
-          outbound.bufferOutput &&
-          outbound.headers.chunkedTransferEncoding) {
-        List acceptEncodings =
-            response._httpRequest.headers[HttpHeaders.ACCEPT_ENCODING];
-        List contentEncoding = outbound.headers[HttpHeaders.CONTENT_ENCODING];
-        if (acceptEncodings != null &&
-            acceptEncodings
-                .expand((list) => list.split(","))
-                .any((encoding) => encoding.trim().toLowerCase() == "gzip") &&
-            contentEncoding == null) {
-          outbound.headers.set(HttpHeaders.CONTENT_ENCODING, "gzip");
-          gzip = true;
-        }
-      }
-      if (drainRequest && !response._httpRequest._incoming.hasSubscriber) {
-        drainFuture = response._httpRequest.drain().catchError((_) {});
-      }
-    } else {
-      drainRequest = false;
-    }
-    if (ignoreBody) {
-      return write();
-    }
-    if (setOutgoing) {
-      int contentLength = outbound.headers.contentLength;
-      if (outbound.headers.chunkedTransferEncoding) {
-        chunked = true;
-        if (gzip) this.gzip = true;
-      } else if (contentLength >= 0) {
-        this.contentLength = contentLength;
-      }
-    }
-    if (drainFuture != null) {
-      return drainFuture.then((_) => write());
-    }
-    return write();
-  }
-
-
-  Future addStream(Stream<List<int>> stream) {
-    if (_socketError) {
-      stream.listen(null).cancel();
-      return new Future.value(outbound);
-    }
-    if (ignoreBody) {
-      stream.drain().catchError((_) {});
-      var future = writeHeaders();
-      if (future != null) {
-        return future.then((_) => close());
-      }
-      return close();
-    }
-    var sub;
-    // Use new stream so we are able to pause (see below listen). The
-    // alternative is to use stream.extand, but that won't give us a way of
-    // pausing.
-    var controller = new StreamController(
-        onPause: () => sub.pause(),
-        onResume: () => sub.resume(),
-        sync: true);
-
-    void onData(data) {
-      if (_socketError) return;
-      if (data.length == 0) return;
-      if (chunked) {
-        if (_gzip) {
-          _gzipAdd = controller.add;
-          _addGZipChunk(data, _gzipSink.add);
-          _gzipAdd = null;
-          return;
-        }
-        _addChunk(_chunkHeader(data.length), controller.add);
-        _pendingChunkedFooter = 2;
-      } else {
-        if (contentLength != null) {
-          _bytesWritten += data.length;
-          if (_bytesWritten > contentLength) {
-            controller.addError(new HttpException(
-                "Content size exceeds specified contentLength. "
-                "$_bytesWritten bytes written while expected "
-                "$contentLength. "
-                "[${new String.fromCharCodes(data)}]"));
-            return;
-          }
-        }
-      }
-      _addChunk(data, controller.add);
-    }
-
-    sub = stream.listen(
-        onData,
-        onError: controller.addError,
-        onDone: controller.close,
-        cancelOnError: true);
-    // Write headers now that we are listening to the stream.
-    if (!headersWritten) {
-      var future = writeHeaders();
-      if (future != null) {
-        // While incoming is being drained, the pauseFuture is non-null. Pause
-        // output until it's drained.
-        sub.pause(future);
-      }
-    }
-    return socket.addStream(controller.stream)
-        .then((_) {
-          return outbound;
-        }, onError: (error, stackTrace) {
-          // Be sure to close it in case of an error.
-          if (_gzip) _gzipSink.close();
-          _socketError = true;
-          _doneCompleter.completeError(error, stackTrace);
-          if (_ignoreError(error)) {
-            return outbound;
-          } else {
-            throw error;
-          }
-        });
-  }
-
-  Future close() {
-    // If we are already closed, return that future.
-    if (_closeFuture != null) return _closeFuture;
-    // If we earlier saw an error, return immediate. The notification to
-    // _Http*Connection is already done.
-    if (_socketError) return new Future.value(outbound);
-    if (outbound._isConnectionClosed) return new Future.value(outbound);
-    if (!headersWritten && !ignoreBody) {
-      if (outbound.headers.contentLength == -1) {
-        // If no body was written, ignoreBody is false (it's not a HEAD
-        // request) and the content-length is unspecified, set contentLength to
-        // 0.
-        outbound.headers.chunkedTransferEncoding = false;
-        outbound.headers.contentLength = 0;
-      } else if (outbound.headers.contentLength > 0) {
-        var error = new HttpException(
-              "No content even though contentLength was specified to be "
-              "greater than 0: ${outbound.headers.contentLength}.",
-              uri: outbound._uri);
-        _doneCompleter.completeError(error);
-        return _closeFuture = new Future.error(error);
-      }
-    }
-    // If contentLength was specified, validate it.
-    if (contentLength != null) {
-      if (_bytesWritten < contentLength) {
-        var error = new HttpException(
-            "Content size below specified contentLength. "
-            " $_bytesWritten bytes written but expected "
-            "$contentLength.",
-            uri: outbound._uri);
-        _doneCompleter.completeError(error);
-        return _closeFuture = new Future.error(error);
-      }
-    }
-
-    Future finalize() {
-      // In case of chunked encoding (and gzip), handle remaining gzip data and
-      // append the 'footer' for chunked encoding.
-      if (chunked) {
-        if (_gzip) {
-          _gzipAdd = socket.add;
-          if (_gzipBufferLength > 0) {
-            _gzipSink.add(new Uint8List.view(
-                _gzipBuffer.buffer, 0, _gzipBufferLength));
-          }
-          _gzipBuffer = null;
-          _gzipSink.close();
-          _gzipAdd = null;
-        }
-        _addChunk(_chunkHeader(0), socket.add);
-      }
-      // Add any remaining data in the buffer.
-      if (_length > 0) {
-        socket.add(new Uint8List.view(_buffer.buffer, 0, _length));
-      }
-      // Clear references, for better GC.
-      _buffer = null;
-      // And finally flush it. As we support keep-alive, never close it from
-      // here. Once the socket is flushed, we'll be able to reuse it (signaled
-      // by the 'done' future).
-      return socket.flush()
-        .then((_) {
-          _doneCompleter.complete(socket);
-          return outbound;
-        }, onError: (error, stackTrace) {
-          _doneCompleter.completeError(error, stackTrace);
-          if (_ignoreError(error)) {
-            return outbound;
-          } else {
-            throw error;
-          }
-        });
-    }
-
-    var future = writeHeaders();
-    if (future != null) {
-      return _closeFuture = future.whenComplete(finalize);
-    }
-    return _closeFuture = finalize();
-  }
-
-  Future get done => _doneCompleter.future;
-
-  void setHeader(List<int> data, int length) {
-    assert(_length == 0);
-    assert(data.length == _OUTGOING_BUFFER_SIZE);
-    _buffer = data;
-    _length = length;
-  }
-
-  void set gzip(bool value) {
-    _gzip = value;
-    if (_gzip) {
-      _gzipBuffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
-      assert(_gzipSink == null);
-      _gzipSink = new ZLibEncoder(gzip: true)
-          .startChunkedConversion(
-              new _HttpGZipSink((data) {
-                // We are closing down prematurely, due to an error. Discard.
-                if (_gzipAdd == null) return;
-                _addChunk(_chunkHeader(data.length), _gzipAdd);
-                _pendingChunkedFooter = 2;
-                _addChunk(data, _gzipAdd);
-              }));
-    }
-  }
-
-  bool _ignoreError(error)
-    => (error is SocketException || error is TlsException) &&
-       outbound is HttpResponse;
-
-  void _addGZipChunk(chunk, void add(List<int> data)) {
-    if (!outbound.bufferOutput) {
-      add(chunk);
-      return;
-    }
-    if (chunk.length > _gzipBuffer.length - _gzipBufferLength) {
-      add(new Uint8List.view(
-          _gzipBuffer.buffer, 0, _gzipBufferLength));
-      _gzipBuffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
-      _gzipBufferLength = 0;
-    }
-    if (chunk.length > _OUTGOING_BUFFER_SIZE) {
-      add(chunk);
-    } else {
-      _gzipBuffer.setRange(_gzipBufferLength,
-                           _gzipBufferLength + chunk.length,
-                           chunk);
-      _gzipBufferLength += chunk.length;
-    }
-  }
-
-  void _addChunk(chunk, void add(List<int> data)) {
-    if (!outbound.bufferOutput) {
-      if (_buffer != null) {
-        // If _buffer is not null, we have not written the header yet. Write
-        // it now.
-        add(new Uint8List.view(_buffer.buffer, 0, _length));
-        _buffer = null;
-        _length = 0;
-      }
-      add(chunk);
-      return;
-    }
-    if (chunk.length > _buffer.length - _length) {
-      add(new Uint8List.view(_buffer.buffer, 0, _length));
-      _buffer = new Uint8List(_OUTGOING_BUFFER_SIZE);
-      _length = 0;
-    }
-    if (chunk.length > _OUTGOING_BUFFER_SIZE) {
-      add(chunk);
-    } else {
-      _buffer.setRange(_length, _length + chunk.length, chunk);
-      _length += chunk.length;
-    }
-  }
-
-  List<int> _chunkHeader(int length) {
-    const hexDigits = const [0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-                             0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46];
-    if (length == 0) {
-      if (_pendingChunkedFooter == 2) return _footerAndChunk0Length;
-      return _chunk0Length;
-    }
-    int size = _pendingChunkedFooter;
-    int len = length;
-    // Compute a fast integer version of (log(length + 1) / log(16)).ceil().
-    while (len > 0) {
-      size++;
-      len >>= 4;
-    }
-    var footerAndHeader = new Uint8List(size + 2);
-    if (_pendingChunkedFooter == 2) {
-      footerAndHeader[0] = _CharCode.CR;
-      footerAndHeader[1] = _CharCode.LF;
-    }
-    int index = size;
-    while (index > _pendingChunkedFooter) {
-      footerAndHeader[--index] = hexDigits[length & 15];
-      length = length >> 4;
-    }
-    footerAndHeader[size + 0] = _CharCode.CR;
-    footerAndHeader[size + 1] = _CharCode.LF;
-    return footerAndHeader;
-  }
-}
-
-class _HttpClientConnection {
-  final String key;
-  final Socket _socket;
-  final bool _proxyTunnel;
-  final SecurityContext _context;
-  final _HttpParser _httpParser;
-  StreamSubscription _subscription;
-  final _HttpClient _httpClient;
-  bool _dispose = false;
-  Timer _idleTimer;
-  bool closed = false;
-  Uri _currentUri;
-
-  Completer<_HttpIncoming> _nextResponseCompleter;
-  Future _streamFuture;
-
-  _HttpClientConnection(this.key, this._socket, this._httpClient,
-                        [this._proxyTunnel = false, this._context])
-      : _httpParser = new _HttpParser.responseParser() {
-    _httpParser.listenToStream(_socket);
-
-    // Set up handlers on the parser here, so we are sure to get 'onDone' from
-    // the parser.
-    _subscription = _httpParser.listen(
-        (incoming) {
-          // Only handle one incoming response at the time. Keep the
-          // stream paused until the response have been processed.
-          _subscription.pause();
-          // We assume the response is not here, until we have send the request.
-          if (_nextResponseCompleter == null) {
-            throw new HttpException(
-                "Unexpected response (unsolicited response without request).",
-                uri: _currentUri);
-          }
-
-          // Check for status code '100 Continue'. In that case just
-          // consume that response as the final response will follow
-          // it. There is currently no API for the client to wait for
-          // the '100 Continue' response.
-          if (incoming.statusCode == 100) {
-            incoming.drain().then((_) {
-              _subscription.resume();
-            }).catchError((error, [StackTrace stackTrace]) {
-              _nextResponseCompleter.completeError(
-                  new HttpException(error.message, uri: _currentUri),
-                  stackTrace);
-              _nextResponseCompleter = null;
-            });
-          } else {
-            _nextResponseCompleter.complete(incoming);
-            _nextResponseCompleter = null;
-          }
-        },
-        onError: (error, [StackTrace stackTrace]) {
-          if (_nextResponseCompleter != null) {
-            _nextResponseCompleter.completeError(
-                new HttpException(error.message, uri: _currentUri),
-                stackTrace);
-            _nextResponseCompleter = null;
-          }
-        },
-        onDone: () {
-          if (_nextResponseCompleter != null) {
-            _nextResponseCompleter.completeError(new HttpException(
-                "Connection closed before response was received",
-                uri: _currentUri));
-            _nextResponseCompleter = null;
-          }
-          close();
-        });
-  }
-
-  _HttpClientRequest send(Uri uri, int port, String method, _Proxy proxy) {
-    if (closed) {
-      throw new HttpException(
-          "Socket closed before request was sent", uri: uri);
-    }
-    _currentUri = uri;
-    // Start with pausing the parser.
-    _subscription.pause();
-    _ProxyCredentials proxyCreds;  // Credentials used to authorize proxy.
-    _SiteCredentials creds;  // Credentials used to authorize this request.
-    var outgoing = new _HttpOutgoing(_socket);
-    // Create new request object, wrapping the outgoing connection.
-    var request = new _HttpClientRequest(outgoing,
-                                         uri,
-                                         method,
-                                         proxy,
-                                         _httpClient,
-                                         this);
-    // For the Host header an IPv6 address must be enclosed in []'s.
-    var host = uri.host;
-    if (host.contains(':')) host = "[$host]";
-    request.headers
-        ..host = host
-        ..port = port
-        .._add(HttpHeaders.ACCEPT_ENCODING, "gzip");
-    if (_httpClient.userAgent != null) {
-      request.headers._add('user-agent', _httpClient.userAgent);
-    }
-    if (proxy.isAuthenticated) {
-      // If the proxy configuration contains user information use that
-      // for proxy basic authorization.
-      String auth = _CryptoUtils.bytesToBase64(
-          UTF8.encode("${proxy.username}:${proxy.password}"));
-      request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic $auth");
-    } else if (!proxy.isDirect && _httpClient._proxyCredentials.length > 0) {
-      proxyCreds = _httpClient._findProxyCredentials(proxy);
-      if (proxyCreds != null) {
-        proxyCreds.authorize(request);
-      }
-    }
-    if (uri.userInfo != null && !uri.userInfo.isEmpty) {
-      // If the URL contains user information use that for basic
-      // authorization.
-      String auth =
-          _CryptoUtils.bytesToBase64(UTF8.encode(uri.userInfo));
-      request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
-    } else {
-      // Look for credentials.
-      creds = _httpClient._findCredentials(uri);
-      if (creds != null) {
-        creds.authorize(request);
-      }
-    }
-    // Start sending the request (lazy, delayed until the user provides
-    // data).
-    _httpParser.isHead = method == "HEAD";
-    _streamFuture = outgoing.done
-        .then((s) {
-          // Request sent, set up response completer.
-          _nextResponseCompleter = new Completer();
-
-          // Listen for response.
-          _nextResponseCompleter.future
-              .then((incoming) {
-                _currentUri = null;
-                incoming.dataDone.then((closing) {
-                  if (incoming.upgraded) {
-                    _httpClient._connectionClosed(this);
-                    startTimer();
-                    return;
-                  }
-                  if (closed) return;
-                  if (!closing &&
-                      !_dispose &&
-                      incoming.headers.persistentConnection &&
-                      request.persistentConnection) {
-                    // Return connection, now we are done.
-                    _httpClient._returnConnection(this);
-                    _subscription.resume();
-                  } else {
-                    destroy();
-                  }
-                });
-                // For digest authentication if proxy check if the proxy
-                // requests the client to start using a new nonce for proxy
-                // authentication.
-                if (proxyCreds != null &&
-                    proxyCreds.scheme == _AuthenticationScheme.DIGEST) {
-                  var authInfo = incoming.headers["proxy-authentication-info"];
-                  if (authInfo != null && authInfo.length == 1) {
-                    var header =
-                        _HeaderValue.parse(
-                            authInfo[0], parameterSeparator: ',');
-                    var nextnonce = header.parameters["nextnonce"];
-                    if (nextnonce != null) proxyCreds.nonce = nextnonce;
-                  }
-                }
-                // For digest authentication check if the server requests the
-                // client to start using a new nonce.
-                if (creds != null &&
-                    creds.scheme == _AuthenticationScheme.DIGEST) {
-                  var authInfo = incoming.headers["authentication-info"];
-                  if (authInfo != null && authInfo.length == 1) {
-                    var header =
-                        _HeaderValue.parse(
-                            authInfo[0], parameterSeparator: ',');
-                    var nextnonce = header.parameters["nextnonce"];
-                    if (nextnonce != null) creds.nonce = nextnonce;
-                  }
-                }
-                request._onIncoming(incoming);
-              })
-              // If we see a state error, we failed to get the 'first'
-              // element.
-              .catchError((error) {
-                throw new HttpException(
-                    "Connection closed before data was received", uri: uri);
-              }, test: (error) => error is StateError)
-              .catchError((error, stackTrace) {
-                // We are done with the socket.
-                destroy();
-                request._onError(error, stackTrace);
-              });
-
-          // Resume the parser now we have a handler.
-          _subscription.resume();
-          return s;
-        }, onError: (e) {
-          destroy();
-        });
-    return request;
-  }
-
-  Future<Socket> detachSocket() {
-    return _streamFuture.then(
-        (_) => new _DetachedSocket(_socket, _httpParser.detachIncoming()));
-  }
-
-  void destroy() {
-    closed = true;
-    _httpClient._connectionClosed(this);
-    _socket.destroy();
-  }
-
-  void close() {
-    closed = true;
-    _httpClient._connectionClosed(this);
-    _streamFuture
-          // TODO(ajohnsen): Add timeout.
-        .then((_) => _socket.destroy());
-  }
-
-  Future<_HttpClientConnection> createProxyTunnel(host, port, proxy, callback) {
-    _HttpClientRequest request =
-        send(new Uri(host: host, port: port),
-             port,
-             "CONNECT",
-             proxy);
-    if (proxy.isAuthenticated) {
-      // If the proxy configuration contains user information use that
-      // for proxy basic authorization.
-      String auth = _CryptoUtils.bytesToBase64(
-          UTF8.encode("${proxy.username}:${proxy.password}"));
-      request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, "Basic $auth");
-    }
-    return request.close()
-        .then((response) {
-          if (response.statusCode != HttpStatus.OK) {
-            throw "Proxy failed to establish tunnel "
-                  "(${response.statusCode} ${response.reasonPhrase})";
-          }
-          var socket = (response as _HttpClientResponse)._httpRequest
-              ._httpClientConnection._socket;
-          return SecureSocket.secure(
-              socket,
-              host: host,
-              context: _context,
-              onBadCertificate: callback);
-        })
-        .then((secureSocket) {
-          String key = _HttpClientConnection.makeKey(true, host, port);
-          return new _HttpClientConnection(
-              key, secureSocket, request._httpClient, true);
-        });
-  }
-
-  HttpConnectionInfo get connectionInfo => _HttpConnectionInfo.create(_socket);
-
-  static makeKey(bool isSecure, String host, int port) {
-    return isSecure ? "ssh:$host:$port" : "$host:$port";
-  }
-
-  void stopTimer() {
-    if (_idleTimer != null) {
-      _idleTimer.cancel();
-      _idleTimer = null;
-    }
-  }
-
-  void startTimer() {
-    assert(_idleTimer == null);
-    _idleTimer = new Timer(
-        _httpClient.idleTimeout,
-        () {
-          _idleTimer = null;
-          close();
-        });
-  }
-}
-
-class _ConnectionInfo {
-  final _HttpClientConnection connection;
-  final _Proxy proxy;
-
-  _ConnectionInfo(this.connection, this.proxy);
-}
-
-
-class _ConnectionTarget {
-  // Unique key for this connection target.
-  final String key;
-  final String host;
-  final int port;
-  final bool isSecure;
-  final SecurityContext context;
-  final Set<_HttpClientConnection> _idle = new HashSet();
-  final Set<_HttpClientConnection> _active = new HashSet();
-  final Queue _pending = new ListQueue();
-  int _connecting = 0;
-
-  _ConnectionTarget(this.key,
-                    this.host,
-                    this.port,
-                    this.isSecure,
-                    this.context);
-
-  bool get isEmpty => _idle.isEmpty && _active.isEmpty && _connecting == 0;
-
-  bool get hasIdle => _idle.isNotEmpty;
-
-  bool get hasActive => _active.isNotEmpty || _connecting > 0;
-
-  _HttpClientConnection takeIdle() {
-    assert(hasIdle);
-    _HttpClientConnection connection = _idle.first;
-    _idle.remove(connection);
-    connection.stopTimer();
-    _active.add(connection);
-    return connection;
-  }
-
-  _checkPending() {
-    if (_pending.isNotEmpty) {
-      _pending.removeFirst()();
-    }
-  }
-
-  void addNewActive(_HttpClientConnection connection) {
-    _active.add(connection);
-  }
-
-  void returnConnection(_HttpClientConnection connection) {
-    assert(_active.contains(connection));
-    _active.remove(connection);
-    _idle.add(connection);
-    connection.startTimer();
-    _checkPending();
-  }
-
-  void connectionClosed(_HttpClientConnection connection) {
-    assert(!_active.contains(connection) || !_idle.contains(connection));
-    _active.remove(connection);
-    _idle.remove(connection);
-    _checkPending();
-  }
-
-  void close(bool force) {
-    for (var c in _idle.toList()) {
-      c.close();
-    }
-    if (force) {
-      for (var c in _active.toList()) {
-        c.destroy();
-      }
-    }
-  }
-
-  Future<_ConnectionInfo> connect(String uriHost,
-                                  int uriPort,
-                                  _Proxy proxy,
-                                  _HttpClient client) {
-    if (hasIdle) {
-      var connection = takeIdle();
-      client._connectionsChanged();
-      return new Future.value(new _ConnectionInfo(connection, proxy));
-    }
-    if (client.maxConnectionsPerHost != null &&
-        _active.length + _connecting >= client.maxConnectionsPerHost) {
-      var completer = new Completer();
-      _pending.add(() {
-        connect(uriHost, uriPort, proxy, client)
-            .then(completer.complete, onError: completer.completeError);
-      });
-      return completer.future;
-    }
-    var currentBadCertificateCallback = client._badCertificateCallback;
-
-    bool callback(X509Certificate certificate) {
-      if (currentBadCertificateCallback == null) return false;
-      return currentBadCertificateCallback(certificate, uriHost, uriPort);
-    }
-
-    Future socketFuture = (isSecure && proxy.isDirect
-        ? SecureSocket.connect(host,
-                               port,
-                               context: context,
-                               onBadCertificate: callback)
-        : Socket.connect(host, port));
-    _connecting++;
-    return socketFuture.then((socket) {
-        _connecting--;
-        socket.setOption(SocketOption.TCP_NODELAY, true);
-        var connection =
-            new _HttpClientConnection(key, socket, client, false, context);
-        if (isSecure && !proxy.isDirect) {
-          connection._dispose = true;
-          return connection.createProxyTunnel(uriHost, uriPort, proxy, callback)
-              .then((tunnel) {
-                client._getConnectionTarget(uriHost, uriPort, true)
-                    .addNewActive(tunnel);
-                return new _ConnectionInfo(tunnel, proxy);
-              });
-        } else {
-          addNewActive(connection);
-          return new _ConnectionInfo(connection, proxy);
-        }
-      }, onError: (error) {
-        _connecting--;
-        _checkPending();
-        throw error;
-      });
-  }
-}
-
-typedef bool BadCertificateCallback(X509Certificate cr, String host, int port);
-
-class _HttpClient implements HttpClient {
-  bool _closing = false;
-  bool _closingForcefully = false;
-  final Map<String, _ConnectionTarget> _connectionTargets
-      = new HashMap<String, _ConnectionTarget>();
-  final List<_Credentials> _credentials = [];
-  final List<_ProxyCredentials> _proxyCredentials = [];
-  final SecurityContext _context;
-  Function _authenticate;
-  Function _authenticateProxy;
-  Function _findProxy = HttpClient.findProxyFromEnvironment;
-  Duration _idleTimeout = const Duration(seconds: 15);
-  BadCertificateCallback _badCertificateCallback;
-
-  Duration get idleTimeout => _idleTimeout;
-
-  int maxConnectionsPerHost;
-
-  bool autoUncompress = true;
-
-  String userAgent = _getHttpVersion();
-
-  _HttpClient(SecurityContext this._context);
-
-  void set idleTimeout(Duration timeout) {
-    _idleTimeout = timeout;
-    for (var c in _connectionTargets.values) {
-      for (var idle in c._idle) {
-        // Reset timer. This is fine, as it's not happening often.
-        idle.stopTimer();
-        idle.startTimer();
-      }
-    }
-  }
-
-  set badCertificateCallback(bool callback(X509Certificate cert,
-                                           String host,
-                                           int port)) {
-    _badCertificateCallback = callback;
-  }
-
-
-  Future<HttpClientRequest> open(String method,
-                                 String host,
-                                 int port,
-                                 String path) {
-    const int hashMark = 0x23;
-    const int questionMark = 0x3f;
-    int fragmentStart = path.length;
-    int queryStart = path.length;
-    for (int i = path.length - 1; i >= 0; i--) {
-      var char = path.codeUnitAt(i);
-      if (char == hashMark) {
-        fragmentStart = i;
-        queryStart = i;
-      } else if (char == questionMark) {
-        queryStart = i;
-      }
-    }
-    String query = null;
-    if (queryStart < fragmentStart) {
-      query = path.substring(queryStart + 1, fragmentStart);
-      path = path.substring(0, queryStart);
-    }
-    Uri uri = new Uri(scheme: "http", host: host, port: port,
-                      path: path, query: query);
-    return _openUrl(method, uri);
-  }
-
-  Future<HttpClientRequest> openUrl(String method, Uri url)
-      => _openUrl(method, url);
-
-  Future<HttpClientRequest> get(String host, int port, String path)
-      => open("get", host, port, path);
-
-  Future<HttpClientRequest> getUrl(Uri url) => _openUrl("get", url);
-
-  Future<HttpClientRequest> post(String host, int port, String path)
-      => open("post", host, port, path);
-
-  Future<HttpClientRequest> postUrl(Uri url) => _openUrl("post", url);
-
-  Future<HttpClientRequest> put(String host, int port, String path)
-      => open("put", host, port, path);
-
-  Future<HttpClientRequest> putUrl(Uri url) => _openUrl("put", url);
-
-  Future<HttpClientRequest> delete(String host, int port, String path)
-      => open("delete", host, port, path);
-
-  Future<HttpClientRequest> deleteUrl(Uri url) => _openUrl("delete", url);
-
-  Future<HttpClientRequest> head(String host, int port, String path)
-      => open("head", host, port, path);
-
-  Future<HttpClientRequest> headUrl(Uri url) => _openUrl("head", url);
-
-  Future<HttpClientRequest> patch(String host, int port, String path)
-      => open("patch", host, port, path);
-
-  Future<HttpClientRequest> patchUrl(Uri url) => _openUrl("patch", url);
-
-  void close({bool force: false}) {
-    _closing = true;
-    _closingForcefully = force;
-    _closeConnections(_closingForcefully);
-    assert(!_connectionTargets.values.any((s) => s.hasIdle));
-    assert(!force ||
-        !_connectionTargets.values.any((s) => s._active.isNotEmpty));
-  }
-
-  set authenticate(Future<bool> f(Uri url, String scheme, String realm)) {
-    _authenticate = f;
-  }
-
-  void addCredentials(Uri url, String realm, HttpClientCredentials cr) {
-    _credentials.add(new _SiteCredentials(url, realm, cr));
-  }
-
-  set authenticateProxy(
-      Future<bool> f(String host, int port, String scheme, String realm)) {
-    _authenticateProxy = f;
-  }
-
-  void addProxyCredentials(String host,
-                           int port,
-                           String realm,
-                           HttpClientCredentials cr) {
-    _proxyCredentials.add(new _ProxyCredentials(host, port, realm, cr));
-  }
-
-  set findProxy(String f(Uri uri)) => _findProxy = f;
-
-  Future<_HttpClientRequest> _openUrl(String method, Uri uri) {
-    // Ignore any fragments on the request URI.
-    uri = uri.removeFragment();
-
-    if (method == null) {
-      throw new ArgumentError(method);
-    }
-    if (method != "CONNECT") {
-      if (uri.host.isEmpty) {
-        throw new ArgumentError("No host specified in URI $uri");
-      } else if (uri.scheme != "http" && uri.scheme != "https") {
-        throw new ArgumentError(
-            "Unsupported scheme '${uri.scheme}' in URI $uri");
-      }
-    }
-
-    bool isSecure = (uri.scheme == "https");
-    int port = uri.port;
-    if (port == 0) {
-      port = isSecure ?
-          HttpClient.DEFAULT_HTTPS_PORT :
-          HttpClient.DEFAULT_HTTP_PORT;
-    }
-    // Check to see if a proxy server should be used for this connection.
-    var proxyConf = const _ProxyConfiguration.direct();
-    if (_findProxy != null) {
-      // TODO(sgjesse): Keep a map of these as normally only a few
-      // configuration strings will be used.
-      try {
-        proxyConf = new _ProxyConfiguration(_findProxy(uri));
-      } catch (error, stackTrace) {
-        return new Future.error(error, stackTrace);
-      }
-    }
-    return _getConnection(uri.host, port, proxyConf, isSecure)
-        .then((_ConnectionInfo info) {
-
-          _HttpClientRequest send(_ConnectionInfo info) {
-            return info.connection.send(uri,
-                                        port,
-                                        method.toUpperCase(),
-                                        info.proxy);
-          }
-
-          // If the connection was closed before the request was sent, create
-          // and use another connection.
-          if (info.connection.closed) {
-            return _getConnection(uri.host, port, proxyConf, isSecure)
-                .then(send);
-          }
-          return send(info);
-        });
-  }
-
-  Future<_HttpClientRequest> _openUrlFromRequest(String method,
-                                                Uri uri,
-                                                _HttpClientRequest previous) {
-    // If the new URI is relative (to either '/' or some sub-path),
-    // construct a full URI from the previous one.
-    Uri resolved = previous.uri.resolveUri(uri);
-    return _openUrl(method, resolved).then((_HttpClientRequest request) {
-
-          request
-              // Only follow redirects if initial request did.
-              ..followRedirects = previous.followRedirects
-              // Allow same number of redirects.
-              ..maxRedirects = previous.maxRedirects;
-          // Copy headers.
-          for (var header in previous.headers._headers.keys) {
-            if (request.headers[header] == null) {
-              request.headers.set(header, previous.headers[header]);
-            }
-          }
-          return request
-              ..headers.chunkedTransferEncoding = false
-              ..contentLength = 0;
-        });
-  }
-
-  // Return a live connection to the idle pool.
-  void _returnConnection(_HttpClientConnection connection) {
-    _connectionTargets[connection.key].returnConnection(connection);
-    _connectionsChanged();
-  }
-
-  // Remove a closed connnection from the active set.
-  void _connectionClosed(_HttpClientConnection connection) {
-    connection.stopTimer();
-    var connectionTarget = _connectionTargets[connection.key];
-    if (connectionTarget != null) {
-      connectionTarget.connectionClosed(connection);
-      if (connectionTarget.isEmpty) {
-        _connectionTargets.remove(connection.key);
-      }
-      _connectionsChanged();
-    }
-  }
-
-  void _connectionsChanged() {
-    if (_closing) {
-      _closeConnections(_closingForcefully);
-    }
-  }
-
-  void _closeConnections(bool force) {
-    for (var connectionTarget in _connectionTargets.values.toList()) {
-      connectionTarget.close(force);
-    }
-  }
-
-  _ConnectionTarget _getConnectionTarget(String host, int port, bool isSecure) {
-    String key = _HttpClientConnection.makeKey(isSecure, host, port);
-    return _connectionTargets.putIfAbsent(key, () {
-      return new _ConnectionTarget(key, host, port, isSecure, _context);
-    });
-  }
-
-  // Get a new _HttpClientConnection, from the matching _ConnectionTarget.
-  Future<_ConnectionInfo> _getConnection(String uriHost,
-                                          int uriPort,
-                                          _ProxyConfiguration proxyConf,
-                                          bool isSecure) {
-    Iterator<_Proxy> proxies = proxyConf.proxies.iterator;
-
-    Future<_ConnectionInfo> connect(error) {
-      if (!proxies.moveNext()) return new Future.error(error);
-      _Proxy proxy = proxies.current;
-      String host = proxy.isDirect ? uriHost: proxy.host;
-      int port = proxy.isDirect ? uriPort: proxy.port;
-      return _getConnectionTarget(host, port, isSecure)
-          .connect(uriHost, uriPort, proxy, this)
-          // On error, continue with next proxy.
-          .catchError(connect);
-    }
-    // Make sure we go through the event loop before taking a
-    // connection from the pool. For long-running synchronous code the
-    // server might have closed the connection, so this lowers the
-    // probability of getting a connection that was already closed.
-    return new Future(() => connect(new HttpException("No proxies given")));
-  }
-
-  _SiteCredentials _findCredentials(Uri url, [_AuthenticationScheme scheme]) {
-    // Look for credentials.
-    _SiteCredentials cr =
-        _credentials.fold(null, (_SiteCredentials prev, value) {
-          var siteCredentials = value as _SiteCredentials;
-          if (siteCredentials.applies(url, scheme)) {
-            if (prev == null) return value;
-            return siteCredentials.uri.path.length > prev.uri.path.length
-                ? siteCredentials
-                : prev;
-          } else {
-            return prev;
-          }
-        });
-    return cr;
-  }
-
-  _ProxyCredentials _findProxyCredentials(_Proxy proxy,
-                                          [_AuthenticationScheme scheme]) {
-    // Look for credentials.
-    var it = _proxyCredentials.iterator;
-    while (it.moveNext()) {
-      if (it.current.applies(proxy, scheme)) {
-        return it.current;
-      }
-    }
-    return null;
-  }
-
-  void _removeCredentials(_Credentials cr) {
-    int index = _credentials.indexOf(cr);
-    if (index != -1) {
-      _credentials.removeAt(index);
-    }
-  }
-
-  void _removeProxyCredentials(_Credentials cr) {
-    int index = _proxyCredentials.indexOf(cr);
-    if (index != -1) {
-      _proxyCredentials.removeAt(index);
-    }
-  }
-
-  static String _findProxyFromEnvironment(Uri url,
-                                          Map<String, String> environment) {
-    checkNoProxy(String option) {
-      if (option == null) return null;
-      Iterator<String> names = option.split(",").map((s) => s.trim()).iterator;
-      while (names.moveNext()) {
-        var name = names.current;
-        if ((name.startsWith("[") &&
-             name.endsWith("]") &&
-             "[${url.host}]" == name) ||
-            (name.isNotEmpty &&
-             url.host.endsWith(name))) {
-          return "DIRECT";
-        }
-      }
-      return null;
-    }
-
-    checkProxy(String option) {
-      if (option == null) return null;
-      option = option.trim();
-      if (option.isEmpty) return null;
-      int pos = option.indexOf("://");
-      if (pos >= 0) {
-        option = option.substring(pos + 3);
-      }
-      pos = option.indexOf("/");
-      if (pos >= 0) {
-        option = option.substring(0, pos);
-      }
-      // Add default port if no port configured.
-      if (option.indexOf("[") == 0) {
-        var pos = option.lastIndexOf(":");
-        if (option.indexOf("]") > pos) option = "$option:1080";
-      } else {
-        if (option.indexOf(":") == -1) option = "$option:1080";
-      }
-      return "PROXY $option";
-    }
-
-    // Default to using the process current environment.
-    if (environment == null) environment = _platformEnvironmentCache;
-
-    String proxyCfg;
-
-    String noProxy = environment["no_proxy"];
-    if (noProxy == null) noProxy = environment["NO_PROXY"];
-    if ((proxyCfg = checkNoProxy(noProxy)) != null) {
-      return proxyCfg;
-    }
-
-    if (url.scheme == "http") {
-      String proxy = environment["http_proxy"];
-      if (proxy == null) proxy = environment["HTTP_PROXY"];
-      if ((proxyCfg = checkProxy(proxy)) != null) {
-        return proxyCfg;
-      }
-    } else if (url.scheme == "https") {
-      String proxy = environment["https_proxy"];
-      if (proxy == null) proxy = environment["HTTPS_PROXY"];
-      if ((proxyCfg = checkProxy(proxy)) != null) {
-        return proxyCfg;
-      }
-    }
-    return "DIRECT";
-  }
-
-  static Map<String, String> _platformEnvironmentCache = Platform.environment;
-}
-
-
-class _HttpConnection
-    extends LinkedListEntry<_HttpConnection> with _ServiceObject {
-  static const _ACTIVE = 0;
-  static const _IDLE = 1;
-  static const _CLOSING = 2;
-  static const _DETACHED = 3;
-
-  // Use HashMap, as we don't need to keep order.
-  static Map<int, _HttpConnection> _connections =
-      new HashMap<int, _HttpConnection>();
-
-  final _socket;
-  final _HttpServer _httpServer;
-  final _HttpParser _httpParser;
-  int _state = _IDLE;
-  StreamSubscription _subscription;
-  bool _idleMark = false;
-  Future _streamFuture;
-
-  _HttpConnection(this._socket, this._httpServer)
-      : _httpParser = new _HttpParser.requestParser() {
-    try { _socket._owner = this; } catch (_) { print(_); }
-    _connections[_serviceId] = this;
-    _httpParser.listenToStream(_socket);
-    _subscription = _httpParser.listen(
-        (incoming) {
-          _httpServer._markActive(this);
-          // If the incoming was closed, close the connection.
-          incoming.dataDone.then((closing) {
-            if (closing) destroy();
-          });
-          // Only handle one incoming request at the time. Keep the
-          // stream paused until the request has been send.
-          _subscription.pause();
-          _state = _ACTIVE;
-          var outgoing = new _HttpOutgoing(_socket);
-          var response = new _HttpResponse(incoming.uri,
-                                           incoming.headers.protocolVersion,
-                                           outgoing,
-                                           _httpServer.defaultResponseHeaders,
-                                           _httpServer.serverHeader);
-          var request = new _HttpRequest(response, incoming, _httpServer, this);
-          _streamFuture = outgoing.done
-              .then((_) {
-                response.deadline = null;
-                if (_state == _DETACHED) return;
-                if (response.persistentConnection &&
-                    request.persistentConnection &&
-                    incoming.fullBodyRead &&
-                    !_httpParser.upgrade &&
-                    !_httpServer.closed) {
-                  _state = _IDLE;
-                  _idleMark = false;
-                  _httpServer._markIdle(this);
-                  // Resume the subscription for incoming requests as the
-                  // request is now processed.
-                  _subscription.resume();
-                } else {
-                  // Close socket, keep-alive not used or body sent before
-                  // received data was handled.
-                  destroy();
-                }
-              }, onError: (_) {
-                destroy();
-              });
-          outgoing.ignoreBody = request.method == "HEAD";
-          response._httpRequest = request;
-          _httpServer._handleRequest(request);
-        },
-        onDone: () {
-          destroy();
-        },
-        onError: (error) {
-          // Ignore failed requests that was closed before headers was received.
-          destroy();
-        });
-  }
-
-  void markIdle() {
-    _idleMark = true;
-  }
-
-  bool get isMarkedIdle => _idleMark;
-
-  void destroy() {
-    if (_state == _CLOSING || _state == _DETACHED) return;
-    _state = _CLOSING;
-    _socket.destroy();
-    _httpServer._connectionClosed(this);
-    _connections.remove(_serviceId);
-  }
-
-  Future<Socket> detachSocket() {
-    _state = _DETACHED;
-    // Remove connection from server.
-    _httpServer._connectionClosed(this);
-
-    _HttpDetachedIncoming detachedIncoming = _httpParser.detachIncoming();
-
-    return _streamFuture.then((_) {
-      _connections.remove(_serviceId);
-      return new _DetachedSocket(_socket, detachedIncoming);
-    });
-  }
-
-  HttpConnectionInfo get connectionInfo => _HttpConnectionInfo.create(_socket);
-
-  bool get _isActive => _state == _ACTIVE;
-  bool get _isIdle => _state == _IDLE;
-  bool get _isClosing => _state == _CLOSING;
-  bool get _isDetached => _state == _DETACHED;
-
-  String get _serviceTypePath => 'io/http/serverconnections';
-  String get _serviceTypeName => 'HttpServerConnection';
-
-  Map _toJSON(bool ref) {
-    var name = "${_socket.address.host}:${_socket.port} <-> "
-        "${_socket.remoteAddress.host}:${_socket.remotePort}";
-    var r = <String, dynamic>{
-      'id': _servicePath,
-      'type': _serviceType(ref),
-      'name': name,
-      'user_name': name,
-    };
-    if (ref) {
-      return r;
-    }
-    r['server'] = _httpServer._toJSON(true);
-    try {
-      r['socket'] = _socket._toJSON(true);
-    } catch (_) {
-      r['socket'] = {
-        'id': _servicePath,
-        'type': '@Socket',
-        'name': 'UserSocket',
-        'user_name': 'UserSocket',
-      };
-    }
-    switch (_state) {
-      case _ACTIVE: r['state'] = "Active"; break;
-      case _IDLE: r['state'] = "Idle"; break;
-      case _CLOSING: r['state'] = "Closing"; break;
-      case _DETACHED: r['state'] = "Detached"; break;
-      default: r['state'] = 'Unknown'; break;
-    }
-    return r;
-  }
-}
-
-
-// HTTP server waiting for socket connections.
-class _HttpServer
-    extends Stream<HttpRequest> with _ServiceObject
-    implements HttpServer {
-  // Use default Map so we keep order.
-  static Map<int, _HttpServer> _servers = new Map<int, _HttpServer>();
-
-  String serverHeader;
-  final HttpHeaders defaultResponseHeaders = _initDefaultResponseHeaders();
-  bool autoCompress = false;
-
-  Duration _idleTimeout;
-  Timer _idleTimer;
-
-  static Future<HttpServer> bind(
-      address, int port, int backlog, bool v6Only, bool shared) {
-    return ServerSocket.bind(
-        address, port, backlog: backlog, v6Only: v6Only, shared: shared)
-            .then((socket) {
-              return new _HttpServer._(socket, true);
-            });
-  }
-
-  static Future<HttpServer> bindSecure(address,
-                                       int port,
-                                       SecurityContext context,
-                                       int backlog,
-                                       bool v6Only,
-                                       bool requestClientCertificate,
-                                       bool shared) {
-    return SecureServerSocket.bind(
-        address,
-        port,
-        context,
-        backlog: backlog,
-        v6Only: v6Only,
-        requestClientCertificate: requestClientCertificate,
-        shared: shared)
-            .then((socket) {
-              return new _HttpServer._(socket, true);
-            });
-  }
-
-  _HttpServer._(this._serverSocket, this._closeServer) {
-    _controller = new StreamController<HttpRequest>(sync: true,
-                                                    onCancel: close);
-    idleTimeout = const Duration(seconds: 120);
-    _servers[_serviceId] = this;
-    _serverSocket._owner = this;
-  }
-
-  _HttpServer.listenOn(this._serverSocket) : _closeServer = false {
-    _controller = new StreamController<HttpRequest>(sync: true,
-                                                    onCancel: close);
-    idleTimeout = const Duration(seconds: 120);
-    _servers[_serviceId] = this;
-    try { _serverSocket._owner = this; } catch (_) {}
-  }
-
-  static HttpHeaders _initDefaultResponseHeaders() {
-    var defaultResponseHeaders = new _HttpHeaders('1.1');
-    defaultResponseHeaders.contentType = ContentType.TEXT;
-    defaultResponseHeaders.set('X-Frame-Options', 'SAMEORIGIN');
-    defaultResponseHeaders.set('X-Content-Type-Options', 'nosniff');
-    defaultResponseHeaders.set('X-XSS-Protection', '1; mode=block');
-    return defaultResponseHeaders;
-  }
-
-  Duration get idleTimeout => _idleTimeout;
-
-  void set idleTimeout(Duration duration) {
-    if (_idleTimer != null) {
-      _idleTimer.cancel();
-      _idleTimer = null;
-    }
-    _idleTimeout = duration;
-    if (_idleTimeout != null) {
-      _idleTimer = new Timer.periodic(_idleTimeout, (_) {
-        for (var idle in _idleConnections.toList()) {
-          if (idle.isMarkedIdle) {
-            idle.destroy();
-          } else {
-            idle.markIdle();
-          }
-        }
-      });
-    }
-  }
-
-  StreamSubscription<HttpRequest> listen(void onData(HttpRequest event),
-                                         {Function onError,
-                                         void onDone(),
-                                         bool cancelOnError}) {
-    _serverSocket.listen(
-        (Socket socket) {
-          socket.setOption(SocketOption.TCP_NODELAY, true);
-          // Accept the client connection.
-          _HttpConnection connection = new _HttpConnection(socket, this);
-          _idleConnections.add(connection);
-        },
-        onError: (error, stackTrace) {
-          // Ignore HandshakeExceptions as they are bound to a single request,
-          // and are not fatal for the server.
-          if (error is! HandshakeException) {
-            _controller.addError(error, stackTrace);
-          }
-        },
-        onDone: _controller.close);
-    return _controller.stream.listen(onData,
-                                     onError: onError,
-                                     onDone: onDone,
-                                     cancelOnError: cancelOnError);
-  }
-
-  Future close({bool force: false}) {
-    closed = true;
-    Future result;
-    if (_serverSocket != null && _closeServer) {
-      result = _serverSocket.close();
-    } else {
-      result = new Future.value();
-    }
-    idleTimeout = null;
-    if (force) {
-      for (var c in _activeConnections.toList()) {
-        c.destroy();
-      }
-      assert(_activeConnections.isEmpty);
-    }
-    for (var c in _idleConnections.toList()) {
-      c.destroy();
-    }
-    _maybePerformCleanup();
-    return result;
-  }
-
-  void _maybePerformCleanup() {
-    if (closed &&
-        _idleConnections.isEmpty &&
-        _activeConnections.isEmpty &&
-        _sessionManagerInstance != null) {
-      _sessionManagerInstance.close();
-      _sessionManagerInstance = null;
-      _servers.remove(_serviceId);
-    }
-  }
-
-  int get port {
-    if (closed) throw new HttpException("HttpServer is not bound to a socket");
-    return _serverSocket.port;
-  }
-
-  InternetAddress get address {
-    if (closed) throw new HttpException("HttpServer is not bound to a socket");
-    return _serverSocket.address;
-  }
-
-  set sessionTimeout(int timeout) {
-    _sessionManager.sessionTimeout = timeout;
-  }
-
-  void _handleRequest(_HttpRequest request) {
-    if (!closed) {
-      _controller.add(request);
-    } else {
-      request._httpConnection.destroy();
-    }
-  }
-
-  void _connectionClosed(_HttpConnection connection) {
-    // Remove itself from either idle or active connections.
-    connection.unlink();
-    _maybePerformCleanup();
-  }
-
-  void _markIdle(_HttpConnection connection) {
-    _activeConnections.remove(connection);
-    _idleConnections.add(connection);
-  }
-
-  void _markActive(_HttpConnection connection) {
-    _idleConnections.remove(connection);
-    _activeConnections.add(connection);
-  }
-
-  _HttpSessionManager get _sessionManager {
-    // Lazy init.
-    if (_sessionManagerInstance == null) {
-      _sessionManagerInstance = new _HttpSessionManager();
-    }
-    return _sessionManagerInstance;
-  }
-
-  HttpConnectionsInfo connectionsInfo() {
-    HttpConnectionsInfo result = new HttpConnectionsInfo();
-    result.total = _activeConnections.length + _idleConnections.length;
-    _activeConnections.forEach((_HttpConnection conn) {
-      if (conn._isActive) {
-        result.active++;
-      } else {
-        assert(conn._isClosing);
-        result.closing++;
-      }
-    });
-    _idleConnections.forEach((_HttpConnection conn) {
-      result.idle++;
-      assert(conn._isIdle);
-    });
-    return result;
-  }
-
-  String get _serviceTypePath => 'io/http/servers';
-  String get _serviceTypeName => 'HttpServer';
-
-  Map<String, dynamic> _toJSON(bool ref) {
-    var r = <String, dynamic>{
-      'id': _servicePath,
-      'type': _serviceType(ref),
-      'name': '${address.host}:$port',
-      'user_name': '${address.host}:$port',
-    };
-    if (ref) {
-      return r;
-    }
-    try {
-      r['socket'] = _serverSocket._toJSON(true);
-    } catch (_) {
-      r['socket'] = {
-        'id': _servicePath,
-        'type': '@Socket',
-        'name': 'UserSocket',
-        'user_name': 'UserSocket',
-      };
-    }
-    r['port'] = port;
-    r['address'] = address.host;
-    r['active'] = _activeConnections.map((c) => c._toJSON(true)).toList();
-    r['idle'] = _idleConnections.map((c) => c._toJSON(true)).toList();
-    r['closed'] = closed;
-    return r;
-  }
-
-  _HttpSessionManager _sessionManagerInstance;
-
-  // Indicated if the http server has been closed.
-  bool closed = false;
-
-  // The server listen socket. Untyped as it can be both ServerSocket and
-  // SecureServerSocket.
-  final _serverSocket;
-  final bool _closeServer;
-
-  // Set of currently connected clients.
-  final LinkedList<_HttpConnection> _activeConnections
-      = new LinkedList<_HttpConnection>();
-  final LinkedList<_HttpConnection> _idleConnections
-      = new LinkedList<_HttpConnection>();
-  StreamController<HttpRequest> _controller;
-}
-
-
-class _ProxyConfiguration {
-  static const String PROXY_PREFIX = "PROXY ";
-  static const String DIRECT_PREFIX = "DIRECT";
-
-  _ProxyConfiguration(String configuration) : proxies = new List<_Proxy>() {
-    if (configuration == null) {
-      throw new HttpException("Invalid proxy configuration $configuration");
-    }
-    List<String> list = configuration.split(";");
-    list.forEach((String proxy) {
-      proxy = proxy.trim();
-      if (!proxy.isEmpty) {
-        if (proxy.startsWith(PROXY_PREFIX)) {
-          String username;
-          String password;
-          // Skip the "PROXY " prefix.
-          proxy = proxy.substring(PROXY_PREFIX.length).trim();
-          // Look for proxy authentication.
-          int at = proxy.indexOf("@");
-          if (at != -1) {
-            String userinfo = proxy.substring(0, at).trim();
-            proxy = proxy.substring(at + 1).trim();
-            int colon = userinfo.indexOf(":");
-            if (colon == -1 || colon == 0 || colon == proxy.length - 1) {
-              throw new HttpException(
-                  "Invalid proxy configuration $configuration");
-            }
-            username = userinfo.substring(0, colon).trim();
-            password = userinfo.substring(colon + 1).trim();
-          }
-          // Look for proxy host and port.
-          int colon = proxy.lastIndexOf(":");
-          if (colon == -1 || colon == 0 || colon == proxy.length - 1) {
-            throw new HttpException(
-                "Invalid proxy configuration $configuration");
-          }
-          String host = proxy.substring(0, colon).trim();
-          if (host.startsWith("[") && host.endsWith("]")) {
-            host = host.substring(1, host.length - 1);
-          }
-          String portString = proxy.substring(colon + 1).trim();
-          int port;
-          try {
-            port = int.parse(portString);
-          } on FormatException catch (e) {
-            throw new HttpException(
-                "Invalid proxy configuration $configuration, "
-                "invalid port '$portString'");
-          }
-          proxies.add(new _Proxy(host, port, username, password));
-        } else if (proxy.trim() == DIRECT_PREFIX) {
-          proxies.add(new _Proxy.direct());
-        } else {
-          throw new HttpException("Invalid proxy configuration $configuration");
-        }
-      }
-    });
-  }
-
-  const _ProxyConfiguration.direct()
-      : proxies = const [const _Proxy.direct()];
-
-  final List<_Proxy> proxies;
-}
-
-
-class _Proxy {
-  final String host;
-  final int port;
-  final String username;
-  final String password;
-  final bool isDirect;
-
-  const _Proxy(this.host, this.port, this.username, this.password)
-      : isDirect = false;
-  const _Proxy.direct() : host = null, port = null,
-                          username = null, password = null, isDirect = true;
-
-  bool get isAuthenticated => username != null;
-}
-
-
-class _HttpConnectionInfo implements HttpConnectionInfo {
-  InternetAddress remoteAddress;
-  int remotePort;
-  int localPort;
-
-  static _HttpConnectionInfo create(Socket socket) {
-    if (socket == null) return null;
-    try {
-      _HttpConnectionInfo info = new _HttpConnectionInfo();
-      return info
-          ..remoteAddress = socket.remoteAddress
-          ..remotePort = socket.remotePort
-          ..localPort = socket.port;
-    } catch (e) { }
-    return null;
-  }
-}
-
-
-class _DetachedSocket extends Stream<List<int>> implements Socket {
-  final Stream<List<int>> _incoming;
-  final _socket;
-
-  _DetachedSocket(this._socket, this._incoming);
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    return _incoming.listen(onData,
-                            onError: onError,
-                            onDone: onDone,
-                            cancelOnError: cancelOnError);
-  }
-
-  Encoding get encoding => _socket.encoding;
-
-  void set encoding(Encoding value) {
-    _socket.encoding = value;
-  }
-
-  void write(Object obj) { _socket.write(obj); }
-
-  void writeln([Object obj = ""]) { _socket.writeln(obj); }
-
-  void writeCharCode(int charCode) { _socket.writeCharCode(charCode); }
-
-  void writeAll(Iterable objects, [String separator = ""]) {
-    _socket.writeAll(objects, separator);
-  }
-
-  void add(List<int> bytes) { _socket.add(bytes); }
-
-  void addError(error, [StackTrace stackTrace]) =>
-      _socket.addError(error, stackTrace);
-
-  Future<Socket> addStream(Stream<List<int>> stream) {
-    return _socket.addStream(stream);
-  }
-
-  void destroy() { _socket.destroy(); }
-
-  Future flush() => _socket.flush();
-
-  Future close() => _socket.close();
-
-  Future<Socket> get done => _socket.done;
-
-  int get port => _socket.port;
-
-  InternetAddress get address => _socket.address;
-
-  InternetAddress get remoteAddress => _socket.remoteAddress;
-
-  int get remotePort => _socket.remotePort;
-
-  bool setOption(SocketOption option, bool enabled) {
-    return _socket.setOption(option, enabled);
-  }
-
-  Map _toJSON(bool ref) => _socket._toJSON(ref);
-  void set _owner(owner) { _socket._owner = owner; }
-}
-
-
-class _AuthenticationScheme {
-  final int _scheme;
-
-  static const UNKNOWN = const _AuthenticationScheme(-1);
-  static const BASIC = const _AuthenticationScheme(0);
-  static const DIGEST = const _AuthenticationScheme(1);
-
-  const _AuthenticationScheme(this._scheme);
-
-  factory _AuthenticationScheme.fromString(String scheme) {
-    if (scheme.toLowerCase() == "basic") return BASIC;
-    if (scheme.toLowerCase() == "digest") return DIGEST;
-    return UNKNOWN;
-  }
-
-  String toString() {
-    if (this == BASIC) return "Basic";
-    if (this == DIGEST) return "Digest";
-    return "Unknown";
-  }
-}
-
-
-abstract class _Credentials {
-  _HttpClientCredentials credentials;
-  String realm;
-  bool used = false;
-
-  // Digest specific fields.
-  String ha1;
-  String nonce;
-  String algorithm;
-  String qop;
-  int nonceCount;
-
-  _Credentials(this.credentials, this.realm) {
-    if (credentials.scheme == _AuthenticationScheme.DIGEST) {
-      // Calculate the H(A1) value once. There is no mentioning of
-      // username/password encoding in RFC 2617. However there is an
-      // open draft for adding an additional accept-charset parameter to
-      // the WWW-Authenticate and Proxy-Authenticate headers, see
-      // http://tools.ietf.org/html/draft-reschke-basicauth-enc-06. For
-      // now always use UTF-8 encoding.
-      _HttpClientDigestCredentials creds = credentials;
-      var hasher = new _MD5()
-          ..add(UTF8.encode(creds.username))
-          ..add([_CharCode.COLON])
-          ..add(realm.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(UTF8.encode(creds.password));
-      ha1 = _CryptoUtils.bytesToHex(hasher.close());
-    }
-  }
-
-  _AuthenticationScheme get scheme => credentials.scheme;
-
-  void authorize(HttpClientRequest request);
-}
-
-class _SiteCredentials extends _Credentials {
-  Uri uri;
-
-  _SiteCredentials(this.uri, realm, _HttpClientCredentials creds)
-      : super(creds, realm);
-
-  bool applies(Uri uri, _AuthenticationScheme scheme) {
-    if (scheme != null && credentials.scheme != scheme) return false;
-    if (uri.host != this.uri.host) return false;
-    int thisPort =
-        this.uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : this.uri.port;
-    int otherPort = uri.port == 0 ? HttpClient.DEFAULT_HTTP_PORT : uri.port;
-    if (otherPort != thisPort) return false;
-    return uri.path.startsWith(this.uri.path);
-  }
-
-  void authorize(HttpClientRequest request) {
-    // Digest credentials cannot be used without a nonce from the
-    // server.
-    if (credentials.scheme == _AuthenticationScheme.DIGEST &&
-        nonce == null) {
-      return;
-    }
-    credentials.authorize(this, request);
-    used = true;
-  }
-}
-
-
-class _ProxyCredentials extends _Credentials {
-  String host;
-  int port;
-
-  _ProxyCredentials(this.host,
-                    this.port,
-                    realm,
-                    _HttpClientCredentials creds)
-      : super(creds, realm);
-
-  bool applies(_Proxy proxy, _AuthenticationScheme scheme) {
-    if (scheme != null && credentials.scheme != scheme) return false;
-    return proxy.host == host && proxy.port == port;
-  }
-
-  void authorize(HttpClientRequest request) {
-    // Digest credentials cannot be used without a nonce from the
-    // server.
-    if (credentials.scheme == _AuthenticationScheme.DIGEST &&
-        nonce == null) {
-      return;
-    }
-    credentials.authorizeProxy(this, request);
-  }
-}
-
-
-abstract class _HttpClientCredentials implements HttpClientCredentials {
-  _AuthenticationScheme get scheme;
-  void authorize(_Credentials credentials, HttpClientRequest request);
-  void authorizeProxy(_ProxyCredentials credentials, HttpClientRequest request);
-}
-
-
-class _HttpClientBasicCredentials
-    extends _HttpClientCredentials
-    implements HttpClientBasicCredentials {
-  String username;
-  String password;
-
-  _HttpClientBasicCredentials(this.username, this.password);
-
-  _AuthenticationScheme get scheme => _AuthenticationScheme.BASIC;
-
-  String authorization() {
-    // There is no mentioning of username/password encoding in RFC
-    // 2617. However there is an open draft for adding an additional
-    // accept-charset parameter to the WWW-Authenticate and
-    // Proxy-Authenticate headers, see
-    // http://tools.ietf.org/html/draft-reschke-basicauth-enc-06. For
-    // now always use UTF-8 encoding.
-    String auth =
-        _CryptoUtils.bytesToBase64(UTF8.encode("$username:$password"));
-    return "Basic $auth";
-  }
-
-  void authorize(_Credentials _, HttpClientRequest request) {
-    request.headers.set(HttpHeaders.AUTHORIZATION, authorization());
-  }
-
-  void authorizeProxy(_ProxyCredentials _, HttpClientRequest request) {
-    request.headers.set(HttpHeaders.PROXY_AUTHORIZATION, authorization());
-  }
-}
-
-
-class _HttpClientDigestCredentials
-    extends _HttpClientCredentials
-    implements HttpClientDigestCredentials {
-  String username;
-  String password;
-
-  _HttpClientDigestCredentials(this.username, this.password);
-
-  _AuthenticationScheme get scheme => _AuthenticationScheme.DIGEST;
-
-  String authorization(_Credentials credentials, _HttpClientRequest request) {
-    String requestUri = request._requestUri();
-    _MD5 hasher = new _MD5()
-        ..add(request.method.codeUnits)
-        ..add([_CharCode.COLON])
-        ..add(requestUri.codeUnits);
-    var ha2 = _CryptoUtils.bytesToHex(hasher.close());
-
-    String qop;
-    String cnonce;
-    String nc;
-    var x;
-    hasher = new _MD5()
-        ..add(credentials.ha1.codeUnits)
-        ..add([_CharCode.COLON]);
-    if (credentials.qop == "auth") {
-      qop = credentials.qop;
-      cnonce = _CryptoUtils.bytesToHex(_IOCrypto.getRandomBytes(4));
-      ++credentials.nonceCount;
-      nc = credentials.nonceCount.toRadixString(16);
-      nc = "00000000".substring(0, 8 - nc.length + 1) + nc;
-      hasher
-          ..add(credentials.nonce.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(nc.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(cnonce.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(credentials.qop.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(ha2.codeUnits);
-    } else {
-      hasher
-          ..add(credentials.nonce.codeUnits)
-          ..add([_CharCode.COLON])
-          ..add(ha2.codeUnits);
-    }
-    var response = _CryptoUtils.bytesToHex(hasher.close());
-
-    StringBuffer buffer = new StringBuffer()
-        ..write('Digest ')
-        ..write('username="$username"')
-        ..write(', realm="${credentials.realm}"')
-        ..write(', nonce="${credentials.nonce}"')
-        ..write(', uri="$requestUri"')
-        ..write(', algorithm="${credentials.algorithm}"');
-    if (qop == "auth") {
-      buffer
-          ..write(', qop="$qop"')
-          ..write(', cnonce="$cnonce"')
-          ..write(', nc="$nc"');
-    }
-    buffer.write(', response="$response"');
-    return buffer.toString();
-  }
-
-  void authorize(_Credentials credentials, HttpClientRequest request) {
-    request.headers.set(HttpHeaders.AUTHORIZATION,
-                        authorization(credentials, request));
-  }
-
-  void authorizeProxy(_ProxyCredentials credentials,
-                      HttpClientRequest request) {
-    request.headers.set(HttpHeaders.PROXY_AUTHORIZATION,
-                        authorization(credentials, request));
-  }
-}
-
-
-class _RedirectInfo implements RedirectInfo {
-  final int statusCode;
-  final String method;
-  final Uri location;
-  const _RedirectInfo(this.statusCode, this.method, this.location);
-}
-
-String _getHttpVersion() {
-  var version = Platform.version;
-  // Only include major and minor version numbers.
-  int index = version.indexOf('.', version.indexOf('.') + 1);
-  version = version.substring(0, index);
-  return 'Dart/$version (dart:io)';
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http_parser.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http_parser.dart
deleted file mode 100644
index adef61f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http_parser.dart
+++ /dev/null
@@ -1,1072 +0,0 @@
-// 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.
-
-part of dart.io;
-
-// Global constants.
-class _Const {
-  // Bytes for "HTTP".
-  static const HTTP = const [72, 84, 84, 80];
-  // Bytes for "HTTP/1.".
-  static const HTTP1DOT = const [72, 84, 84, 80, 47, 49, 46];
-  // Bytes for "HTTP/1.0".
-  static const HTTP10 = const [72, 84, 84, 80, 47, 49, 46, 48];
-  // Bytes for "HTTP/1.1".
-  static const HTTP11 = const [72, 84, 84, 80, 47, 49, 46, 49];
-
-  static const bool T = true;
-  static const bool F = false;
-  // Loopup-map for the following characters: '()<>@,;:\\"/[]?={} \t'.
-  static const SEPARATOR_MAP = const [
-      F,F,F,F,F,F,F,F,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,F,T,F,F,
-      F,F,F,T,T,F,F,T,F,F,T,F,F,F,F,F,F,F,F,F,F,T,T,T,T,T,T,T,F,F,F,F,F,F,F,F,F,
-      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,T,T,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
-      F,F,F,F,F,F,F,F,F,F,F,F,T,F,T,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
-      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
-      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,
-      F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F,F];
-}
-
-
-// Frequently used character codes.
-class _CharCode {
-  static const int HT = 9;
-  static const int LF = 10;
-  static const int CR = 13;
-  static const int SP = 32;
-  static const int AMPERSAND = 38;
-  static const int COMMA = 44;
-  static const int DASH = 45;
-  static const int SLASH = 47;
-  static const int ZERO = 48;
-  static const int ONE = 49;
-  static const int COLON = 58;
-  static const int SEMI_COLON = 59;
-  static const int EQUAL = 61;
-}
-
-
-// States of the HTTP parser state machine.
-class _State {
-  static const int START = 0;
-  static const int METHOD_OR_RESPONSE_HTTP_VERSION = 1;
-  static const int RESPONSE_HTTP_VERSION = 2;
-  static const int REQUEST_LINE_METHOD = 3;
-  static const int REQUEST_LINE_URI = 4;
-  static const int REQUEST_LINE_HTTP_VERSION = 5;
-  static const int REQUEST_LINE_ENDING = 6;
-  static const int RESPONSE_LINE_STATUS_CODE = 7;
-  static const int RESPONSE_LINE_REASON_PHRASE = 8;
-  static const int RESPONSE_LINE_ENDING = 9;
-  static const int HEADER_START = 10;
-  static const int HEADER_FIELD = 11;
-  static const int HEADER_VALUE_START = 12;
-  static const int HEADER_VALUE = 13;
-  static const int HEADER_VALUE_FOLDING_OR_ENDING = 14;
-  static const int HEADER_VALUE_FOLD_OR_END = 15;
-  static const int HEADER_ENDING = 16;
-
-  static const int CHUNK_SIZE_STARTING_CR = 17;
-  static const int CHUNK_SIZE_STARTING_LF = 18;
-  static const int CHUNK_SIZE = 19;
-  static const int CHUNK_SIZE_EXTENSION = 20;
-  static const int CHUNK_SIZE_ENDING = 21;
-  static const int CHUNKED_BODY_DONE_CR = 22;
-  static const int CHUNKED_BODY_DONE_LF = 23;
-  static const int BODY = 24;
-  static const int CLOSED = 25;
-  static const int UPGRADED = 26;
-  static const int FAILURE = 27;
-
-  static const int FIRST_BODY_STATE = CHUNK_SIZE_STARTING_CR;
-}
-
-// HTTP version of the request or response being parsed.
-class _HttpVersion {
-  static const int UNDETERMINED = 0;
-  static const int HTTP10 = 1;
-  static const int HTTP11 = 2;
-}
-
-// States of the HTTP parser state machine.
-class _MessageType {
-  static const int UNDETERMINED = 0;
-  static const int REQUEST = 1;
-  static const int RESPONSE = 0;
-}
-
-
-/**
- * The _HttpDetachedStreamSubscription takes a subscription and some extra data,
- * and makes it possible to "inject" the data in from of other data events
- * from the subscription.
- *
- * It does so by overriding pause/resume, so that once the
- * _HttpDetachedStreamSubscription is resumed, it'll deliver the data before
- * resuming the underlaying subscription.
- */
-class _HttpDetachedStreamSubscription implements StreamSubscription<List<int>> {
-  StreamSubscription<List<int>> _subscription;
-  List<int> _injectData;
-  bool _isCanceled = false;
-  int _pauseCount = 1;
-  Function _userOnData;
-  bool _scheduled = false;
-
-  _HttpDetachedStreamSubscription(this._subscription,
-                                  this._injectData,
-                                  this._userOnData);
-
-  bool get isPaused => _subscription.isPaused;
-
-  Future/*<T>*/ asFuture/*<T>*/([/*=T*/ futureValue]) =>
-      _subscription.asFuture/*<T>*/(futureValue);
-
-  Future cancel() {
-    _isCanceled = true;
-    _injectData = null;
-    return _subscription.cancel();
-  }
-
-  void onData(void handleData(List<int> data)) {
-    _userOnData = handleData;
-    _subscription.onData(handleData);
-  }
-
-  void onDone(void handleDone()) {
-    _subscription.onDone(handleDone);
-  }
-
-  void onError(Function handleError) {
-    _subscription.onError(handleError);
-  }
-
-  void pause([Future resumeSignal]) {
-    if (_injectData == null) {
-      _subscription.pause(resumeSignal);
-    } else {
-      _pauseCount++;
-      if (resumeSignal != null) {
-        resumeSignal.whenComplete(resume);
-      }
-    }
-  }
-
-  void resume() {
-    if (_injectData == null) {
-      _subscription.resume();
-    } else {
-      _pauseCount--;
-      _maybeScheduleData();
-    }
-  }
-
-  void _maybeScheduleData() {
-    if (_scheduled) return;
-    if (_pauseCount != 0) return;
-    _scheduled = true;
-    scheduleMicrotask(() {
-      _scheduled = false;
-      if (_pauseCount > 0 || _isCanceled) return;
-      var data = _injectData;
-      _injectData = null;
-      // To ensure that 'subscription.isPaused' is false, we resume the
-      // subscription here. This is fine as potential events are delayed.
-      _subscription.resume();
-      if (_userOnData != null) {
-        _userOnData(data);
-      }
-    });
-  }
-}
-
-
-class _HttpDetachedIncoming extends Stream<List<int>> {
-  final StreamSubscription subscription;
-  final List<int> bufferedData;
-
-  _HttpDetachedIncoming(this.subscription, this.bufferedData);
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    if (subscription != null) {
-      subscription
-        ..onData(onData)
-        ..onError(onError)
-        ..onDone(onDone);
-      if (bufferedData == null) {
-        return subscription..resume();
-      }
-      return new _HttpDetachedStreamSubscription(subscription,
-                                                 bufferedData,
-                                                 onData)
-        ..resume();
-    } else {
-      return new Stream.fromIterable(bufferedData)
-          .listen(onData,
-                  onError: onError,
-                  onDone: onDone,
-                  cancelOnError: cancelOnError);
-    }
-  }
-}
-
-
-/**
- * HTTP parser which parses the data stream given to [consume].
- *
- * If an HTTP parser error occours, the parser will signal an error to either
- * the current _HttpIncoming or the _parser itself.
- *
- * The connection upgrades (e.g. switching from HTTP/1.1 to the
- * WebSocket protocol) is handled in a special way. If connection
- * upgrade is specified in the headers, then on the callback to
- * [:responseStart:] the [:upgrade:] property on the [:HttpParser:]
- * object will be [:true:] indicating that from now on the protocol is
- * not HTTP anymore and no more callbacks will happen, that is
- * [:dataReceived:] and [:dataEnd:] are not called in this case as
- * there is no more HTTP data. After the upgrade the method
- * [:readUnparsedData:] can be used to read any remaining bytes in the
- * HTTP parser which are part of the protocol the connection is
- * upgrading to. These bytes cannot be processed by the HTTP parser
- * and should be handled according to whatever protocol is being
- * upgraded to.
- */
-class _HttpParser extends Stream<_HttpIncoming> {
-  // State.
-  bool _parserCalled = false;
-
-  // The data that is currently being parsed.
-  Uint8List _buffer;
-  int _index;
-
-  final bool _requestParser;
-  int _state;
-  int _httpVersionIndex;
-  int _messageType;
-  int _statusCode = 0;
-  int _statusCodeLength = 0;
-  final List<int> _method = [];
-  final List<int> _uri_or_reason_phrase = [];
-  final List<int> _headerField = [];
-  final List<int> _headerValue = [];
-
-  int _httpVersion;
-  int _transferLength = -1;
-  bool _persistentConnection;
-  bool _connectionUpgrade;
-  bool _chunked;
-
-  bool _noMessageBody = false;
-  int _remainingContent = -1;
-
-  _HttpHeaders _headers;
-
-  // The current incoming connection.
-  _HttpIncoming _incoming;
-  StreamSubscription _socketSubscription;
-  bool _paused = true;
-  bool _bodyPaused = false;
-  StreamController<_HttpIncoming> _controller;
-  StreamController<List<int>> _bodyController;
-
-  factory _HttpParser.requestParser() {
-    return new _HttpParser._(true);
-  }
-
-  factory _HttpParser.responseParser() {
-    return new _HttpParser._(false);
-  }
-
-  _HttpParser._(this._requestParser) {
-    _controller = new StreamController<_HttpIncoming>(
-        sync: true,
-        onListen: () {
-          _paused = false;
-        },
-        onPause: () {
-          _paused = true;
-          _pauseStateChanged();
-        },
-        onResume: () {
-          _paused = false;
-          _pauseStateChanged();
-        },
-        onCancel: () {
-          if (_socketSubscription != null) {
-            _socketSubscription.cancel();
-          }
-        });
-    _reset();
-  }
-
-
-  StreamSubscription<_HttpIncoming> listen(void onData(_HttpIncoming event),
-                                           {Function onError,
-                                            void onDone(),
-                                            bool cancelOnError}) {
-    return _controller.stream.listen(onData,
-                                     onError: onError,
-                                     onDone: onDone,
-                                     cancelOnError: cancelOnError);
-  }
-
-  void listenToStream(Stream<List<int>> stream) {
-    // Listen to the stream and handle data accordingly. When a
-    // _HttpIncoming is created, _dataPause, _dataResume, _dataDone is
-    // given to provide a way of controlling the parser.
-    // TODO(ajohnsen): Remove _dataPause, _dataResume and _dataDone and clean up
-    // how the _HttpIncoming signals the parser.
-    _socketSubscription = stream.listen(
-        _onData,
-        onError: _controller.addError,
-        onDone: _onDone);
-  }
-
-  void _parse() {
-    try {
-      _doParse();
-    } catch (e, s) {
-      _state = _State.FAILURE;
-      _reportError(e, s);
-    }
-  }
-
-  // Process end of headers. Returns true if the parser should stop
-  // parsing and return. This will be in case of either an upgrade
-  // request or a request or response with an empty body.
-  bool _headersEnd() {
-    _headers._mutable = false;
-
-    _transferLength = _headers.contentLength;
-    // Ignore the Content-Length header if Transfer-Encoding
-    // is chunked (RFC 2616 section 4.4)
-    if (_chunked) _transferLength = -1;
-
-    // If a request message has neither Content-Length nor
-    // Transfer-Encoding the message must not have a body (RFC
-    // 2616 section 4.3).
-    if (_messageType == _MessageType.REQUEST &&
-        _transferLength < 0 &&
-       _chunked == false) {
-       _transferLength = 0;
-    }
-    if (_connectionUpgrade) {
-      _state = _State.UPGRADED;
-      _transferLength = 0;
-    }
-    _createIncoming(_transferLength);
-    if (_requestParser) {
-      _incoming.method =
-          new String.fromCharCodes(_method);
-      _incoming.uri =
-          Uri.parse(
-              new String.fromCharCodes(_uri_or_reason_phrase));
-    } else {
-      _incoming.statusCode = _statusCode;
-      _incoming.reasonPhrase =
-          new String.fromCharCodes(_uri_or_reason_phrase);
-    }
-    _method.clear();
-    _uri_or_reason_phrase.clear();
-    if (_connectionUpgrade) {
-      _incoming.upgraded = true;
-      _parserCalled = false;
-      var tmp = _incoming;
-      _closeIncoming();
-      _controller.add(tmp);
-      return true;
-    }
-    if (_transferLength == 0 ||
-        (_messageType == _MessageType.RESPONSE && _noMessageBody)) {
-      _reset();
-      var tmp = _incoming;
-      _closeIncoming();
-      _controller.add(tmp);
-      return false;
-    } else if (_chunked) {
-      _state = _State.CHUNK_SIZE;
-      _remainingContent = 0;
-    } else if (_transferLength > 0) {
-      _remainingContent = _transferLength;
-      _state = _State.BODY;
-    } else {
-      // Neither chunked nor content length. End of body
-      // indicated by close.
-      _state = _State.BODY;
-    }
-    _parserCalled = false;
-    _controller.add(_incoming);
-    return true;
-  }
-
-  // From RFC 2616.
-  // generic-message = start-line
-  //                   *(message-header CRLF)
-  //                   CRLF
-  //                   [ message-body ]
-  // start-line      = Request-Line | Status-Line
-  // Request-Line    = Method SP Request-URI SP HTTP-Version CRLF
-  // Status-Line     = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
-  // message-header  = field-name ":" [ field-value ]
-  void _doParse() {
-    assert(!_parserCalled);
-    _parserCalled = true;
-    if (_state == _State.CLOSED) {
-      throw new HttpException("Data on closed connection");
-    }
-    if (_state == _State.FAILURE) {
-      throw new HttpException("Data on failed connection");
-    }
-    while (_buffer != null &&
-           _index < _buffer.length &&
-           _state != _State.FAILURE &&
-           _state != _State.UPGRADED) {
-      // Depending on _incoming, we either break on _bodyPaused or _paused.
-      if ((_incoming != null && _bodyPaused) ||
-          (_incoming == null && _paused)) {
-        _parserCalled = false;
-        return;
-      }
-      int byte = _buffer[_index++];
-      switch (_state) {
-        case _State.START:
-          if (byte == _Const.HTTP[0]) {
-            // Start parsing method or HTTP version.
-            _httpVersionIndex = 1;
-            _state = _State.METHOD_OR_RESPONSE_HTTP_VERSION;
-          } else {
-            // Start parsing method.
-            if (!_isTokenChar(byte)) {
-              throw new HttpException("Invalid request method");
-            }
-            _method.add(byte);
-            if (!_requestParser) {
-              throw new HttpException("Invalid response line");
-            }
-            _state = _State.REQUEST_LINE_METHOD;
-          }
-          break;
-
-        case _State.METHOD_OR_RESPONSE_HTTP_VERSION:
-          if (_httpVersionIndex < _Const.HTTP.length &&
-              byte == _Const.HTTP[_httpVersionIndex]) {
-            // Continue parsing HTTP version.
-            _httpVersionIndex++;
-          } else if (_httpVersionIndex == _Const.HTTP.length &&
-                     byte == _CharCode.SLASH) {
-            // HTTP/ parsed. As method is a token this cannot be a
-            // method anymore.
-            _httpVersionIndex++;
-            if (_requestParser) {
-              throw new HttpException("Invalid request line");
-            }
-            _state = _State.RESPONSE_HTTP_VERSION;
-          } else {
-            // Did not parse HTTP version. Expect method instead.
-            for (int i = 0; i < _httpVersionIndex; i++) {
-              _method.add(_Const.HTTP[i]);
-            }
-            if (byte == _CharCode.SP) {
-              _state = _State.REQUEST_LINE_URI;
-            } else {
-              _method.add(byte);
-              _httpVersion = _HttpVersion.UNDETERMINED;
-              if (!_requestParser) {
-                throw new HttpException("Invalid response line");
-              }
-              _state = _State.REQUEST_LINE_METHOD;
-            }
-          }
-          break;
-
-        case _State.RESPONSE_HTTP_VERSION:
-          if (_httpVersionIndex < _Const.HTTP1DOT.length) {
-            // Continue parsing HTTP version.
-            _expect(byte, _Const.HTTP1DOT[_httpVersionIndex]);
-            _httpVersionIndex++;
-          } else if (_httpVersionIndex == _Const.HTTP1DOT.length &&
-                     byte == _CharCode.ONE) {
-            // HTTP/1.1 parsed.
-            _httpVersion = _HttpVersion.HTTP11;
-            _persistentConnection = true;
-            _httpVersionIndex++;
-          } else if (_httpVersionIndex == _Const.HTTP1DOT.length &&
-                     byte == _CharCode.ZERO) {
-            // HTTP/1.0 parsed.
-            _httpVersion = _HttpVersion.HTTP10;
-            _persistentConnection = false;
-            _httpVersionIndex++;
-          } else if (_httpVersionIndex == _Const.HTTP1DOT.length + 1) {
-            _expect(byte, _CharCode.SP);
-            // HTTP version parsed.
-            _state = _State.RESPONSE_LINE_STATUS_CODE;
-          } else {
-            throw new HttpException("Invalid response line");
-          }
-          break;
-
-        case _State.REQUEST_LINE_METHOD:
-          if (byte == _CharCode.SP) {
-            _state = _State.REQUEST_LINE_URI;
-          } else {
-            if (_Const.SEPARATOR_MAP[byte] ||
-                byte == _CharCode.CR ||
-                byte == _CharCode.LF) {
-              throw new HttpException("Invalid request method");
-            }
-            _method.add(byte);
-          }
-          break;
-
-        case _State.REQUEST_LINE_URI:
-          if (byte == _CharCode.SP) {
-            if (_uri_or_reason_phrase.length == 0) {
-              throw new HttpException("Invalid request URI");
-            }
-            _state = _State.REQUEST_LINE_HTTP_VERSION;
-            _httpVersionIndex = 0;
-          } else {
-            if (byte == _CharCode.CR || byte == _CharCode.LF) {
-              throw new HttpException("Invalid request URI");
-            }
-            _uri_or_reason_phrase.add(byte);
-          }
-          break;
-
-        case _State.REQUEST_LINE_HTTP_VERSION:
-          if (_httpVersionIndex < _Const.HTTP1DOT.length) {
-            _expect(byte, _Const.HTTP11[_httpVersionIndex]);
-            _httpVersionIndex++;
-          } else if (_httpVersionIndex == _Const.HTTP1DOT.length) {
-            if (byte == _CharCode.ONE) {
-              // HTTP/1.1 parsed.
-              _httpVersion = _HttpVersion.HTTP11;
-              _persistentConnection = true;
-              _httpVersionIndex++;
-            } else if (byte == _CharCode.ZERO) {
-              // HTTP/1.0 parsed.
-              _httpVersion = _HttpVersion.HTTP10;
-              _persistentConnection = false;
-              _httpVersionIndex++;
-            } else {
-              throw new HttpException("Invalid response line");
-            }
-          } else {
-            if (byte == _CharCode.CR) {
-              _state = _State.REQUEST_LINE_ENDING;
-            } else {
-              _expect(byte, _CharCode.LF);
-              _messageType = _MessageType.REQUEST;
-              _state = _State.HEADER_START;
-            }
-          }
-          break;
-
-        case _State.REQUEST_LINE_ENDING:
-          _expect(byte, _CharCode.LF);
-          _messageType = _MessageType.REQUEST;
-          _state = _State.HEADER_START;
-          break;
-
-        case _State.RESPONSE_LINE_STATUS_CODE:
-          if (byte == _CharCode.SP) {
-            _state = _State.RESPONSE_LINE_REASON_PHRASE;
-          } else if (byte == _CharCode.CR) {
-            // Some HTTP servers does not follow the spec. and send
-            // \r\n right after the status code.
-            _state = _State.RESPONSE_LINE_ENDING;
-          } else {
-            _statusCodeLength++;
-            if ((byte < 0x30 && 0x39 < byte) || _statusCodeLength > 3) {
-              throw new HttpException("Invalid response status code");
-            } else {
-              _statusCode = _statusCode * 10 + byte - 0x30;
-            }
-          }
-          break;
-
-        case _State.RESPONSE_LINE_REASON_PHRASE:
-          if (byte == _CharCode.CR) {
-            _state = _State.RESPONSE_LINE_ENDING;
-          } else {
-            if (byte == _CharCode.CR || byte == _CharCode.LF) {
-              throw new HttpException("Invalid response reason phrase");
-            }
-            _uri_or_reason_phrase.add(byte);
-          }
-          break;
-
-        case _State.RESPONSE_LINE_ENDING:
-          _expect(byte, _CharCode.LF);
-          _messageType == _MessageType.RESPONSE;
-          if (_statusCode < 100 || _statusCode > 599) {
-            throw new HttpException("Invalid response status code");
-          } else {
-            // Check whether this response will never have a body.
-            if (_statusCode <= 199 || _statusCode == 204 ||
-                _statusCode == 304) {
-              _noMessageBody = true;
-            }
-          }
-          _state = _State.HEADER_START;
-          break;
-
-        case _State.HEADER_START:
-          _headers = new _HttpHeaders(version);
-          if (byte == _CharCode.CR) {
-            _state = _State.HEADER_ENDING;
-          } else if (byte == _CharCode.LF) {
-            _state = _State.HEADER_ENDING;
-            _index--;  // Make the new state see the LF again.
-          } else {
-            // Start of new header field.
-            _headerField.add(_toLowerCaseByte(byte));
-            _state = _State.HEADER_FIELD;
-          }
-          break;
-
-        case _State.HEADER_FIELD:
-          if (byte == _CharCode.COLON) {
-            _state = _State.HEADER_VALUE_START;
-          } else {
-            if (!_isTokenChar(byte)) {
-              throw new HttpException("Invalid header field name");
-            }
-            _headerField.add(_toLowerCaseByte(byte));
-          }
-          break;
-
-        case _State.HEADER_VALUE_START:
-          if (byte == _CharCode.CR) {
-            _state = _State.HEADER_VALUE_FOLDING_OR_ENDING;
-          } else if (byte == _CharCode.LF) {
-            _state = _State.HEADER_VALUE_FOLD_OR_END;
-          } else if (byte != _CharCode.SP && byte != _CharCode.HT) {
-            // Start of new header value.
-            _headerValue.add(byte);
-            _state = _State.HEADER_VALUE;
-          }
-          break;
-
-        case _State.HEADER_VALUE:
-          if (byte == _CharCode.CR) {
-            _state = _State.HEADER_VALUE_FOLDING_OR_ENDING;
-          } else if (byte == _CharCode.LF) {
-            _state = _State.HEADER_VALUE_FOLD_OR_END;
-          } else {
-            _headerValue.add(byte);
-          }
-          break;
-
-        case _State.HEADER_VALUE_FOLDING_OR_ENDING:
-          _expect(byte, _CharCode.LF);
-          _state = _State.HEADER_VALUE_FOLD_OR_END;
-          break;
-
-        case _State.HEADER_VALUE_FOLD_OR_END:
-          if (byte == _CharCode.SP || byte == _CharCode.HT) {
-            _state = _State.HEADER_VALUE_START;
-          } else {
-            String headerField = new String.fromCharCodes(_headerField);
-            String headerValue = new String.fromCharCodes(_headerValue);
-            if (headerField == "transfer-encoding" &&
-                _caseInsensitiveCompare("chunked".codeUnits, _headerValue)) {
-              _chunked = true;
-            }
-            if (headerField == "connection") {
-              List<String> tokens = _tokenizeFieldValue(headerValue);
-              for (int i = 0; i < tokens.length; i++) {
-                if (_caseInsensitiveCompare("upgrade".codeUnits,
-                                            tokens[i].codeUnits)) {
-                  _connectionUpgrade = true;
-                }
-                _headers._add(headerField, tokens[i]);
-              }
-            } else {
-              _headers._add(headerField, headerValue);
-            }
-            _headerField.clear();
-            _headerValue.clear();
-
-            if (byte == _CharCode.CR) {
-              _state = _State.HEADER_ENDING;
-            } else if (byte == _CharCode.LF) {
-              _state = _State.HEADER_ENDING;
-              _index--;  // Make the new state see the LF again.
-            } else {
-              // Start of new header field.
-              _headerField.add(_toLowerCaseByte(byte));
-              _state = _State.HEADER_FIELD;
-            }
-          }
-          break;
-
-        case _State.HEADER_ENDING:
-          _expect(byte, _CharCode.LF);
-          if (_headersEnd()) {
-            return;
-          } else {
-            break;
-          }
-          return;
-
-        case _State.CHUNK_SIZE_STARTING_CR:
-          _expect(byte, _CharCode.CR);
-          _state = _State.CHUNK_SIZE_STARTING_LF;
-          break;
-
-        case _State.CHUNK_SIZE_STARTING_LF:
-          _expect(byte, _CharCode.LF);
-          _state = _State.CHUNK_SIZE;
-          break;
-
-        case _State.CHUNK_SIZE:
-          if (byte == _CharCode.CR) {
-            _state = _State.CHUNK_SIZE_ENDING;
-          } else if (byte == _CharCode.SEMI_COLON) {
-            _state = _State.CHUNK_SIZE_EXTENSION;
-          } else {
-            int value = _expectHexDigit(byte);
-            _remainingContent = _remainingContent * 16 + value;
-          }
-          break;
-
-        case _State.CHUNK_SIZE_EXTENSION:
-          if (byte == _CharCode.CR) {
-            _state = _State.CHUNK_SIZE_ENDING;
-          }
-          break;
-
-        case _State.CHUNK_SIZE_ENDING:
-          _expect(byte, _CharCode.LF);
-          if (_remainingContent > 0) {
-            _state = _State.BODY;
-          } else {
-            _state = _State.CHUNKED_BODY_DONE_CR;
-          }
-          break;
-
-        case _State.CHUNKED_BODY_DONE_CR:
-          _expect(byte, _CharCode.CR);
-          _state = _State.CHUNKED_BODY_DONE_LF;
-          break;
-
-        case _State.CHUNKED_BODY_DONE_LF:
-          _expect(byte, _CharCode.LF);
-          _reset();
-          _closeIncoming();
-          break;
-
-        case _State.BODY:
-          // The body is not handled one byte at a time but in blocks.
-          _index--;
-          int dataAvailable = _buffer.length - _index;
-          if (_remainingContent >= 0 && dataAvailable > _remainingContent) {
-            dataAvailable = _remainingContent;
-          }
-          // Always present the data as a view. This way we can handle all
-          // cases like this, and the user will not experince different data
-          // typed (which could lead to polymorphic user code).
-          List<int> data = new Uint8List.view(_buffer.buffer,
-                                              _buffer.offsetInBytes + _index,
-                                              dataAvailable);
-          _bodyController.add(data);
-          if (_remainingContent != -1) {
-            _remainingContent -= data.length;
-          }
-          _index += data.length;
-          if (_remainingContent == 0) {
-            if (!_chunked) {
-              _reset();
-              _closeIncoming();
-            } else {
-              _state = _State.CHUNK_SIZE_STARTING_CR;
-            }
-          }
-          break;
-
-        case _State.FAILURE:
-          // Should be unreachable.
-          assert(false);
-          break;
-
-        default:
-          // Should be unreachable.
-          assert(false);
-          break;
-      }
-    }
-
-    _parserCalled = false;
-    if (_buffer != null && _index == _buffer.length) {
-      // If all data is parsed release the buffer and resume receiving
-      // data.
-      _releaseBuffer();
-      if (_state != _State.UPGRADED && _state != _State.FAILURE) {
-        _socketSubscription.resume();
-      }
-    }
-  }
-
-  void _onData(List<int> buffer) {
-    _socketSubscription.pause();
-    assert(_buffer == null);
-    _buffer = buffer;
-    _index = 0;
-    _parse();
-  }
-
-  void _onDone() {
-    // onDone cancles the subscription.
-    _socketSubscription = null;
-    if (_state == _State.CLOSED || _state == _State.FAILURE) return;
-
-    if (_incoming != null) {
-      if (_state != _State.UPGRADED &&
-          !(_state == _State.START && !_requestParser) &&
-          !(_state == _State.BODY && !_chunked && _transferLength == -1)) {
-        _bodyController.addError(
-              new HttpException("Connection closed while receiving data"));
-      }
-      _closeIncoming(true);
-      _controller.close();
-      return;
-    }
-    // If the connection is idle the HTTP stream is closed.
-    if (_state == _State.START) {
-      if (!_requestParser) {
-        _reportError(new HttpException(
-                    "Connection closed before full header was received"));
-      }
-      _controller.close();
-      return;
-    }
-
-    if (_state == _State.UPGRADED) {
-      _controller.close();
-      return;
-    }
-
-    if (_state < _State.FIRST_BODY_STATE) {
-      _state = _State.FAILURE;
-      // Report the error through the error callback if any. Otherwise
-      // throw the error.
-      _reportError(new HttpException(
-                  "Connection closed before full header was received"));
-      _controller.close();
-      return;
-    }
-
-    if (!_chunked && _transferLength == -1) {
-      _state = _State.CLOSED;
-    } else {
-      _state = _State.FAILURE;
-      // Report the error through the error callback if any. Otherwise
-      // throw the error.
-      _reportError(new HttpException(
-                  "Connection closed before full body was received"));
-    }
-    _controller.close();
-  }
-
-  String get version {
-    switch (_httpVersion) {
-      case _HttpVersion.HTTP10:
-        return "1.0";
-      case _HttpVersion.HTTP11:
-        return "1.1";
-    }
-    return null;
-  }
-
-  int get messageType => _messageType;
-  int get transferLength => _transferLength;
-  bool get upgrade => _connectionUpgrade && _state == _State.UPGRADED;
-  bool get persistentConnection => _persistentConnection;
-
-  void set isHead(bool value) {
-    if (value) _noMessageBody = true;
-  }
-
-  _HttpDetachedIncoming detachIncoming() {
-    // Simulate detached by marking as upgraded.
-    _state = _State.UPGRADED;
-    return new _HttpDetachedIncoming(_socketSubscription,
-                                     readUnparsedData());
-  }
-
-  List<int> readUnparsedData() {
-    if (_buffer == null) return null;
-    if (_index == _buffer.length) return null;
-    var result = _buffer.sublist(_index);
-    _releaseBuffer();
-    return result;
-  }
-
-  void _reset() {
-    if (_state == _State.UPGRADED) return;
-    _state = _State.START;
-    _messageType = _MessageType.UNDETERMINED;
-    _headerField.clear();
-    _headerValue.clear();
-    _method.clear();
-    _uri_or_reason_phrase.clear();
-
-    _statusCode = 0;
-    _statusCodeLength = 0;
-
-    _httpVersion = _HttpVersion.UNDETERMINED;
-    _transferLength = -1;
-    _persistentConnection = false;
-    _connectionUpgrade = false;
-    _chunked = false;
-
-    _noMessageBody = false;
-    _remainingContent = -1;
-
-    _headers = null;
-  }
-
-  void _releaseBuffer() {
-    _buffer = null;
-    _index = null;
-  }
-
-  static bool _isTokenChar(int byte) {
-    return byte > 31 && byte < 128 && !_Const.SEPARATOR_MAP[byte];
-  }
-
-  static bool _isValueChar(int byte) {
-    return (byte > 31 && byte < 128) || (byte == _CharCode.SP) ||
-        (byte == _CharCode.HT);
-  }
-
-  static List<String> _tokenizeFieldValue(String headerValue) {
-    List<String> tokens = new List<String>();
-    int start = 0;
-    int index = 0;
-    while (index < headerValue.length) {
-      if (headerValue[index] == ",") {
-        tokens.add(headerValue.substring(start, index));
-        start = index + 1;
-      } else if (headerValue[index] == " " || headerValue[index] == "\t") {
-        start++;
-      }
-      index++;
-    }
-    tokens.add(headerValue.substring(start, index));
-    return tokens;
-  }
-
-  static int _toLowerCaseByte(int x) {
-    // Optimized version:
-    //  -  0x41 is 'A'
-    //  -  0x7f is ASCII mask
-    //  -  26 is the number of alpha characters.
-    //  -  0x20 is the delta between lower and upper chars.
-    return (((x - 0x41) & 0x7f) < 26) ? (x | 0x20) : x;
-  }
-
-  // expected should already be lowercase.
-  bool _caseInsensitiveCompare(List<int> expected, List<int> value) {
-    if (expected.length != value.length) return false;
-    for (int i = 0; i < expected.length; i++) {
-      if (expected[i] != _toLowerCaseByte(value[i])) return false;
-    }
-    return true;
-  }
-
-  int _expect(int val1, int val2) {
-    if (val1 != val2) {
-      throw new HttpException("Failed to parse HTTP");
-    }
-  }
-
-  int _expectHexDigit(int byte) {
-    if (0x30 <= byte && byte <= 0x39) {
-      return byte - 0x30;  // 0 - 9
-    } else if (0x41 <= byte && byte <= 0x46) {
-      return byte - 0x41 + 10;  // A - F
-    } else if (0x61 <= byte && byte <= 0x66) {
-      return byte - 0x61 + 10;  // a - f
-    } else {
-      throw new HttpException("Failed to parse HTTP");
-    }
-  }
-
-  void _createIncoming(int transferLength) {
-    assert(_incoming == null);
-    assert(_bodyController == null);
-    assert(!_bodyPaused);
-    var incoming;
-    _bodyController = new StreamController<List<int>>(
-        sync: true,
-        onListen: () {
-          if (incoming != _incoming) return;
-          assert(_bodyPaused);
-          _bodyPaused = false;
-          _pauseStateChanged();
-        },
-        onPause: () {
-          if (incoming != _incoming) return;
-          assert(!_bodyPaused);
-          _bodyPaused = true;
-          _pauseStateChanged();
-        },
-        onResume: () {
-          if (incoming != _incoming) return;
-          assert(_bodyPaused);
-          _bodyPaused = false;
-          _pauseStateChanged();
-        },
-        onCancel: () {
-          if (incoming != _incoming) return;
-          if (_socketSubscription != null) {
-            _socketSubscription.cancel();
-          }
-          _closeIncoming(true);
-          _controller.close();
-        });
-    incoming = _incoming = new _HttpIncoming(
-        _headers, transferLength, _bodyController.stream);
-    _bodyPaused = true;
-    _pauseStateChanged();
-  }
-
-  void _closeIncoming([bool closing = false]) {
-    // Ignore multiple close (can happen in re-entrance).
-    if (_incoming == null) return;
-    var tmp = _incoming;
-    tmp.close(closing);
-    _incoming = null;
-    if (_bodyController != null) {
-      _bodyController.close();
-      _bodyController = null;
-    }
-    _bodyPaused = false;
-    _pauseStateChanged();
-  }
-
-  void _pauseStateChanged() {
-    if (_incoming != null) {
-      if (!_bodyPaused && !_parserCalled) {
-        _parse();
-      }
-    } else {
-      if (!_paused && !_parserCalled) {
-        _parse();
-      }
-    }
-  }
-
-  void _reportError(error, [stackTrace]) {
-    if (_socketSubscription != null) _socketSubscription.cancel();
-    _state = _State.FAILURE;
-    _controller.addError(error, stackTrace);
-    _controller.close();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/http_session.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/http_session.dart
deleted file mode 100644
index 90075a5..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/http_session.dart
+++ /dev/null
@@ -1,174 +0,0 @@
-// 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.
-
-part of dart.io;
-
-const String _DART_SESSION_ID = "DARTSESSID";
-
-// A _HttpSession is a node in a double-linked list, with _next and _prev being
-// the previous and next pointers.
-class _HttpSession implements HttpSession {
-  // Destroyed marked. Used by the http connection to see if a session is valid.
-  bool _destroyed = false;
-  bool _isNew = true;
-  DateTime _lastSeen;
-  Function _timeoutCallback;
-  _HttpSessionManager _sessionManager;
-  // Pointers in timeout queue.
-  _HttpSession _prev;
-  _HttpSession _next;
-  final String id;
-
-  final Map _data = new HashMap();
-
-  _HttpSession(this._sessionManager, this.id) : _lastSeen = new DateTime.now();
-
-  void destroy() {
-    _destroyed = true;
-    _sessionManager._removeFromTimeoutQueue(this);
-    _sessionManager._sessions.remove(id);
-  }
-
-  // Mark the session as seen. This will reset the timeout and move the node to
-  // the end of the timeout queue.
-  void _markSeen() {
-    _lastSeen = new DateTime.now();
-    _sessionManager._bumpToEnd(this);
-  }
-
-  DateTime get lastSeen => _lastSeen;
-
-  bool get isNew => _isNew;
-
-  void set onTimeout(void callback()) {
-    _timeoutCallback = callback;
-  }
-
-  // Map implementation:
-  bool containsValue(value) => _data.containsValue(value);
-  bool containsKey(key) => _data.containsKey(key);
-  operator [](key) => _data[key];
-  void operator []=(key, value) { _data[key] = value; }
-  putIfAbsent(key, ifAbsent) => _data.putIfAbsent(key, ifAbsent);
-  addAll(Map other) => _data.addAll(other);
-  remove(key) => _data.remove(key);
-  void clear() { _data.clear(); }
-  void forEach(void f(key, value)) { _data.forEach(f); }
-  Iterable get keys => _data.keys;
-  Iterable get values => _data.values;
-  int get length => _data.length;
-  bool get isEmpty => _data.isEmpty;
-  bool get isNotEmpty => _data.isNotEmpty;
-
-  String toString() => 'HttpSession id:$id $_data';
-}
-
-// Private class used to manage all the active sessions. The sessions are stored
-// in two ways:
-//
-//  * In a map, mapping from ID to HttpSession.
-//  * In a linked list, used as a timeout queue.
-class _HttpSessionManager {
-  Map<String, _HttpSession> _sessions;
-  int _sessionTimeout = 20 * 60;  // 20 mins.
-  _HttpSession _head;
-  _HttpSession _tail;
-  Timer _timer;
-
-  _HttpSessionManager() : _sessions = {};
-
-  String createSessionId() {
-    const int _KEY_LENGTH = 16;  // 128 bits.
-    var data = _IOCrypto.getRandomBytes(_KEY_LENGTH);
-    return _CryptoUtils.bytesToHex(data);
-  }
-
-  _HttpSession getSession(String id) => _sessions[id];
-
-  _HttpSession createSession() {
-    var id = createSessionId();
-    // TODO(ajohnsen): Consider adding a limit and throwing an exception.
-    // Should be very unlikely however.
-    while (_sessions.containsKey(id)) {
-      id = createSessionId();
-    }
-    var session = _sessions[id] = new _HttpSession(this, id);
-    _addToTimeoutQueue(session);
-    return session;
-  }
-
-  void set sessionTimeout(int timeout) {
-    _sessionTimeout = timeout;
-    _stopTimer();
-    _startTimer();
-  }
-
-  void close() { _stopTimer(); }
-
-  void _bumpToEnd(_HttpSession session) {
-    _removeFromTimeoutQueue(session);
-    _addToTimeoutQueue(session);
-  }
-
-  void _addToTimeoutQueue(_HttpSession session) {
-    if (_head == null) {
-      assert(_tail == null);
-      _tail = _head = session;
-      _startTimer();
-    } else {
-      assert(_timer != null);
-      assert(_tail != null);
-      // Add to end.
-      _tail._next = session;
-      session._prev = _tail;
-      _tail = session;
-    }
-  }
-
-  void _removeFromTimeoutQueue(_HttpSession session) {
-    if (session._next != null) {
-      session._next._prev = session._prev;
-    }
-    if (session._prev != null) {
-      session._prev._next = session._next;
-    }
-    if (_head == session) {
-      // We removed the head element, start new timer.
-      _head = session._next;
-      _stopTimer();
-      _startTimer();
-    }
-    if (_tail == session) {
-      _tail = session._prev;
-    }
-    session._next = session._prev = null;
-  }
-
-  void _timerTimeout() {
-    _stopTimer();  // Clear timer.
-    assert(_head != null);
-    var session = _head;
-    session.destroy();  // Will remove the session from timeout queue and map.
-    if (session._timeoutCallback != null) {
-      session._timeoutCallback();
-    }
-  }
-
-  void _startTimer() {
-    assert(_timer == null);
-    if (_head != null) {
-      int seconds = new DateTime.now().difference(_head.lastSeen).inSeconds;
-      _timer = new Timer(new Duration(seconds: _sessionTimeout - seconds),
-                         _timerTimeout);
-    }
-  }
-
-  void _stopTimer() {
-    if (_timer != null) {
-      _timer.cancel();
-      _timer = null;
-    }
-  }
-}
-
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/io.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/io.dart
deleted file mode 100644
index 66250ee..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/io.dart
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * File, socket, HTTP, and other I/O support for server applications.
- *
- * The I/O library is used for Dart server applications,
- * which run on a stand-alone Dart VM from the command line.
- * *This library does not work in browser-based applications.*
- *
- * This library allows you to work with files, directories,
- * sockets, processes, HTTP servers and clients, and more.
- *
- * To use this library in your code:
- *
- *     import 'dart:io';
- *
- * *Note:* Many operations related to input and output are asynchronous
- * and are handled using [Future]s or [Stream]s, both of which
- * are defined in the `dart:async` library.
- *
- * ## File, Directory, and Link
- *
- * An instance of [File], [Directory], or [Link] represents a file,
- * directory, or link, respectively, in the native file system.
- *
- * You can manipulate the file system through objects of these types.
- * For example, you can rename a file or directory:
- *
- *     File myFile = new File('myFile.txt');
- *     myFile.rename('yourFile.txt').then((_) => print('file renamed'));
- *
- * Many methods provided by the File, Directory, and Link classes
- * run asynchronously and return a Future.
- *
- * ## FileSystemEntity
- *
- * File, Directory, and Link all extend [FileSystemEntity].
- * In addition to being the superclass for these classes,
- * FileSystemEntity has a number of static methods for working with paths.
- *
- * To get information about a path,
- * you can use the FileSystemEntity static methods
- * such as 'isDirectory', 'isFile', and 'exists'.
- * Because file system access involves I/O, these methods
- * are asynchronous and return a Future.
- *
- *     FileSystemEntity.isDirectory(myPath).then((isDir) {
- *       if (isDir) {
- *         print('$myPath is a directory');
- *       } else {
- *         print('$myPath is not a directory');
- *       }
- *     });
- *
- * ## HttpServer and HttpClient
- *
- * The classes [HttpServer] and [HttpClient]
- * provide HTTP server and HTTP client functionality.
- *
- * The [HttpServer] class provides the basic functionality for
- * implementing an HTTP server.
- * For some higher-level building-blocks, we recommend that you try
- * the [http_server](https://pub.dartlang.org/packages/http_server)
- * pub package, which contains
- * a set of high-level classes that, together with the [HttpServer] class
- * in this library, make it easier to implement HTTP servers.
- *
- * ## Process
- *
- * The [Process] class provides a way to run a process on
- * the native machine.
- * For example, the following code spawns a process that recursively lists
- * the files under `web`.
- *
- *     Process.start('ls', ['-R', 'web']).then((process) {
- *       stdout.addStream(process.stdout);
- *       stderr.addStream(process.stderr);
- *       process.exitCode.then(print);
- *     });
- *
- * Using `start()` returns a Future, which completes with a [Process] object
- * when the process has started. This [Process] object allows you to interact
- * with the process while it is running. Using `run()` returns a Future, which
- * completes with a [ProcessResult] object when the spawned process has
- * terminated. This [ProcessResult] object collects the output and exit code
- * from the process.
- *
- * When using `start()`,
- * you need to read all data coming on the stdout and stderr streams otherwise
- * the system resources will not be freed.
- *
- * ## WebSocket
- *
- * The [WebSocket] class provides support for the web socket protocol. This
- * allows full-duplex communications between client and server applications.
- * Use the WebSocket class in the `dart:html` library for web clients.
- *
- * A web socket server uses a normal HTTP server for accepting web socket
- * connections. The initial handshake is a HTTP request which is then upgraded to a
- * web socket connection.
- * The server upgrades the request using [WebSocketTransformer]
- * and listens for the data on the returned web socket.
- * For example, here's a mini server that listens for 'ws' data
- * on a WebSocket:
- *
- *     runZoned(() {
- *       HttpServer.bind('127.0.0.1', 4040).then((server) {
- *         server.listen((HttpRequest req) {
- *           if (req.uri.path == '/ws') {
- *             WebSocketTransformer.upgrade(req).then((socket) {
- *               socket.listen(handleMsg);
- *             });
- *           }
- *         });
- *       });
- *     },
- *     onError: (e) => print("An error occurred."));
- *
- * The client connects to the WebSocket using the `connect()` method
- * and a URI that uses the Web Socket protocol.
- * The client can write to the WebSocket with the `add()` method.
- * For example,
- *
- *     WebSocket.connect('ws://127.0.0.1:4040/ws').then((socket) {
- *       socket.add('Hello, World!');
- *     });
- *
- * Check out the
- * [dartiverse_search](https://github.com/dart-lang/sample-dartiverse-search)
- * sample for a client/server pair that uses
- * WebSockets to communicate.
- *
- * ## Socket and ServerSocket
- *
- * Clients and servers use [Socket]s to communicate using the TCP protocol.
- * Use [ServerSocket] on the server side and [Socket] on the client.
- * The server creates a listening socket using the `bind()` method and
- * then listens for incoming connections on the socket. For example:
- *
- *     ServerSocket.bind('127.0.0.1', 4041)
- *       .then((serverSocket) {
- *         serverSocket.listen((socket) {
- *           socket.transform(UTF8.decoder).listen(print);
- *         });
- *       });
- *
- * A client connects a Socket using the `connect()` method,
- * which returns a Future.
- * Using `write()`, `writeln()`, or `writeAll()` are the easiest ways to
- * send data over the socket.
- * For example:
- *
- *     Socket.connect('127.0.0.1', 4041).then((socket) {
- *       socket.write('Hello, World!');
- *     });
- *
- * Besides [Socket] and [ServerSocket], the [RawSocket] and
- * [RawServerSocket] classes are available for lower-level access
- * to async socket IO.
- *
- * ## Standard output, error, and input streams
- *
- * This library provides the standard output, error, and input
- * streams, named 'stdout', 'stderr', and 'stdin', respectively.
- *
- * The stdout and stderr streams are both [IOSink]s and have the same set
- * of methods and properties.
- *
- * To write a string to 'stdout':
- *
- *     stdout.writeln('Hello, World!');
- *
- * To write a list of objects to 'stderr':
- *
- *     stderr.writeAll([ 'That ', 'is ', 'an ', 'error.', '\n']);
- *
- * The standard input stream is a true [Stream], so it inherits
- * properties and methods from the Stream class.
- *
- * To read text synchronously from the command line
- * (the program blocks waiting for user to type information):
- *
- *      String inputText = stdin.readLineSync();
- *
- * ## Other resources
- *
- * For an introduction to I/O in Dart, see the [dart:io section of the library
- * tour](https://www.dartlang.org/docs/dart-up-and-running/ch03.html#dartio---io-for-command-line-apps).
- *
- * To learn more about I/O in Dart, refer to the [tutorial about writing
- * command-line apps](https://www.dartlang.org/docs/tutorials/cmdline/).
- */
-library dart.io;
-
-import 'dart:async';
-import 'dart:_internal';
-import 'dart:collection' show HashMap,
-                              HashSet,
-                              Queue,
-                              ListQueue,
-                              LinkedList,
-                              LinkedListEntry,
-                              UnmodifiableMapView;
-import 'dart:convert';
-import 'dart:developer';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-part 'bytes_builder.dart';
-part 'common.dart';
-part 'crypto.dart';
-part 'data_transformer.dart';
-part 'directory.dart';
-part 'directory_impl.dart';
-part 'eventhandler.dart';
-part 'file.dart';
-part 'file_impl.dart';
-part 'file_system_entity.dart';
-part 'http.dart';
-part 'http_date.dart';
-part 'http_headers.dart';
-part 'http_impl.dart';
-part 'http_parser.dart';
-part 'http_session.dart';
-part 'io_resource_info.dart';
-part 'io_sink.dart';
-part 'io_service.dart';
-part 'link.dart';
-part 'platform.dart';
-part 'platform_impl.dart';
-part 'process.dart';
-part 'secure_server_socket.dart';
-part 'secure_socket.dart';
-part 'security_context.dart';
-part 'service_object.dart';
-part 'socket.dart';
-part 'stdio.dart';
-part 'string_transformer.dart';
-part 'websocket.dart';
-part 'websocket_impl.dart';
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/io_resource_info.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/io_resource_info.dart
deleted file mode 100644
index 7cea231..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/io_resource_info.dart
+++ /dev/null
@@ -1,283 +0,0 @@
-// 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.
-
-part of dart.io;
-
-abstract class _IOResourceInfo {
-  final String type;
-  final int id;
-  String get name;
-  static int _count = 0;
-
-  static final Stopwatch _sw = new Stopwatch()..start();
-  static final _startTime = new DateTime.now().millisecondsSinceEpoch;
-
-  static double get timestamp => _startTime + _sw.elapsedMicroseconds/1000;
-
-  _IOResourceInfo(this.type) : id = _IOResourceInfo.getNextID();
-
-  /// Get the full set of values for a specific implementation. This is normally
-  /// looked up based on an id from a referenceValueMap.
-  Map<String, String> get fullValueMap;
-
-  /// The reference map, used to return a list of values, e.g., getting
-  /// all open sockets. The structure of this is shared among all subclasses.
-  Map<String, String> get referenceValueMap =>
-      {
-        // The type for a reference object is prefixed with @ in observatory.
-        'type': '@$type',
-        'id': id,
-        'name': name,
-      };
-
-  static int getNextID() => _count++;
-}
-
-abstract class _ReadWriteResourceInfo extends _IOResourceInfo {
-  int totalRead;
-  int totalWritten;
-  int readCount;
-  int writeCount;
-  double lastRead;
-  double lastWrite;
-
-  // Not all call sites use this. In some cases, e.g., a socket, a read does
-  // not always mean that we actually read some bytes (we may do a read to see
-  // if there are some bytes available).
-  void addRead(int bytes) {
-    totalRead += bytes;
-    readCount++;
-    lastRead = _IOResourceInfo.timestamp;
-  }
-
-  // In cases where we read but did not neccesarily get any bytes, use this to
-  // update the readCount and timestamp. Manually update totalRead if any bytes
-  // where acutally read.
-  void didRead() { addRead(0); }
-
-  void addWrite(int bytes) {
-    totalWritten += bytes;
-    writeCount++;
-    lastWrite = _IOResourceInfo.timestamp;
-  }
-
-  _ReadWriteResourceInfo(String type) :
-    totalRead = 0,
-    totalWritten = 0,
-    readCount = 0,
-    writeCount = 0,
-    lastRead = 0.0,
-    lastWrite = 0.0,
-    super(type);
-
-  Map<String, String> get fullValueMap =>
-    {
-      'type': type,
-      'id': id,
-      'name': name,
-      'totalRead': totalRead,
-      'totalWritten': totalWritten,
-      'readCount': readCount,
-      'writeCount': writeCount,
-      'lastRead': lastRead,
-      'lastWrite': lastWrite
-    };
-}
-
-class _FileResourceInfo extends _ReadWriteResourceInfo {
-  static const String TYPE = '_file';
-
-  final file;
-
-  static Map<int, _FileResourceInfo> openFiles =
-      new Map<int, _FileResourceInfo>();
-
-  _FileResourceInfo(this.file) : super(TYPE) {
-    FileOpened(this);
-  }
-
-  static FileOpened(_FileResourceInfo info) {
-    assert(!openFiles.containsKey(info.id));
-    openFiles[info.id] = info;
-  }
-
-  static FileClosed(_FileResourceInfo info) {
-    assert(openFiles.containsKey(info.id));
-    openFiles.remove(info.id);
-  }
-
-  static Iterable<Map<String, String>> getOpenFilesList() {
-    return new List.from(openFiles.values.map((e) => e.referenceValueMap));
-  }
-
-  static Future<ServiceExtensionResponse> getOpenFiles(function, params) {
-    assert(function == 'ext.dart.io.getOpenFiles');
-    var data = {'type': '_openfiles', 'data': getOpenFilesList()};
-    var json = JSON.encode(data);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-
-  Map<String, String> getFileInfoMap() {
-    var result = fullValueMap;
-    return result;
-  }
-
-  static Future<ServiceExtensionResponse> getFileInfoMapByID(function, params) {
-    assert(params.containsKey('id'));
-    var id = int.parse(params['id']);
-    var result =
-      openFiles.containsKey(id) ? openFiles[id].getFileInfoMap() : {};
-    var json = JSON.encode(result);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-
-  String get name {
-    return '${file.path}';
-  }
-}
-
-class _ProcessResourceInfo extends _IOResourceInfo{
-  static const String TYPE = '_process';
-  final process;
-  final double startedAt;
-
-  static Map<int, _ProcessResourceInfo> startedProcesses =
-      new Map<int, _ProcessResourceInfo>();
-
-  _ProcessResourceInfo(this.process) :
-      startedAt = _IOResourceInfo.timestamp,
-      super(TYPE) {
-    ProcessStarted(this);
-  }
-
-  String get name => process._path;
-
-  void stopped() { ProcessStopped(this); }
-
-  Map<String, String> get fullValueMap =>
-    {
-      'type': type,
-      'id': id,
-      'name': name,
-      'pid': process.pid,
-      'startedAt': startedAt,
-      'arguments': process._arguments,
-      'workingDirectory':
-          process._workingDirectory == null ? '.' : process._workingDirectory,
-    };
-
-  static ProcessStarted(_ProcessResourceInfo info) {
-    assert(!startedProcesses.containsKey(info.id));
-    startedProcesses[info.id] = info;
-  }
-
-  static ProcessStopped(_ProcessResourceInfo info) {
-    assert(startedProcesses.containsKey(info.id));
-    startedProcesses.remove(info.id);
-  }
-
-  static Iterable<Map<String, String>> getStartedProcessesList() =>
-      new List.from(startedProcesses.values.map((e) => e.referenceValueMap));
-
-  static Future<ServiceExtensionResponse> getStartedProcesses(
-      String function, Map<String, String> params) {
-    assert(function == 'ext.dart.io.getProcesses');
-    var data = {'type': '_startedprocesses', 'data': getStartedProcessesList()};
-    var json = JSON.encode(data);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-
-  static Future<ServiceExtensionResponse> getProcessInfoMapById(
-      String function, Map<String, String> params) {
-    var id = int.parse(params['id']);
-    var result = startedProcesses.containsKey(id)
-        ? startedProcesses[id].fullValueMap
-        : {};
-    var json = JSON.encode(result);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-}
-
-class _SocketResourceInfo extends _ReadWriteResourceInfo {
-  static const String TCP_STRING = 'TCP';
-  static const String UDP_STRING = 'UDP';
-  static const String TYPE = '_socket';
-
-  final socket;
-
-  static Map<int, _SocketResourceInfo> openSockets =
-      new Map<int, _SocketResourceInfo>();
-
-  _SocketResourceInfo(this.socket) : super(TYPE) {
-    SocketOpened(this);
-  }
-
-  String get name {
-    if (socket.isListening) {
-      return 'listening:${socket.address.host}:${socket.port}';
-    }
-    var remote = '';
-    try {
-      var remoteHost = socket.remoteAddress.host;
-      var remotePort = socket.remotePort;
-      remote = ' -> $remoteHost:$remotePort';
-    } catch (e) { } // ignored if we can't get the information
-    return '${socket.address.host}:${socket.port}$remote';
-  }
-
-  static Iterable<Map<String, String>> getOpenSocketsList() {
-    return new List.from(openSockets.values.map((e) => e.referenceValueMap));
-  }
-
-  Map<String, String> getSocketInfoMap() {
-    var result = fullValueMap;
-    result['socketType'] = socket.isTcp ? TCP_STRING : UDP_STRING;
-    result['listening'] = socket.isListening;
-    result['host'] = socket.address.host;
-    result['port'] = socket.port;
-    if (!socket.isListening) {
-      try {
-        result['remoteHost'] = socket.remoteAddress.host;
-        result['remotePort'] = socket.remotePort;
-      } catch (e) {
-        // UDP.
-        result['remotePort'] = 'NA';
-        result['remoteHost'] = 'NA';
-      }
-    } else {
-      result['remotePort'] = 'NA';
-      result['remoteHost'] = 'NA';
-    }
-    result['addressType'] = socket.address.type.name;
-    return result;
-  }
-
-  static Future<ServiceExtensionResponse> getSocketInfoMapByID(
-      String function, Map<String, String> params) {
-    assert(params.containsKey('id'));
-    var id = int.parse(params['id']);
-    var result =
-      openSockets.containsKey(id) ? openSockets[id].getSocketInfoMap() : {};
-    var json = JSON.encode(result);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-
-  static Future<ServiceExtensionResponse> getOpenSockets(function, params) {
-    assert(function == 'ext.dart.io.getOpenSockets');
-    var data = {'type': '_opensockets', 'data': getOpenSocketsList()};
-    var json = JSON.encode(data);
-    return new Future.value(new ServiceExtensionResponse.result(json));
-  }
-
-  static SocketOpened(_SocketResourceInfo info) {
-    assert(!openSockets.containsKey(info.id));
-    openSockets[info.id] = info;
-  }
-
-  static SocketClosed(_SocketResourceInfo info) {
-    assert(openSockets.containsKey(info.id));
-    openSockets.remove(info.id);
-  }
-
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/io_service.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/io_service.dart
deleted file mode 100644
index cabba54..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/io_service.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// 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.
-
-part of dart.io;
-
-// This list must be kept in sync with the list in runtime/bin/io_service.h
-const int _FILE_EXISTS = 0;
-const int _FILE_CREATE = 1;
-const int _FILE_DELETE = 2;
-const int _FILE_RENAME = 3;
-const int _FILE_COPY = 4;
-const int _FILE_OPEN = 5;
-const int _FILE_RESOLVE_SYMBOLIC_LINKS = 6;
-const int _FILE_CLOSE = 7;
-const int _FILE_POSITION = 8;
-const int _FILE_SET_POSITION = 9;
-const int _FILE_TRUNCATE = 10;
-const int _FILE_LENGTH = 11;
-const int _FILE_LENGTH_FROM_PATH = 12;
-const int _FILE_LAST_MODIFIED = 13;
-const int _FILE_FLUSH = 14;
-const int _FILE_READ_BYTE = 15;
-const int _FILE_WRITE_BYTE = 16;
-const int _FILE_READ = 17;
-const int _FILE_READ_INTO = 18;
-const int _FILE_WRITE_FROM = 19;
-const int _FILE_CREATE_LINK = 20;
-const int _FILE_DELETE_LINK = 21;
-const int _FILE_RENAME_LINK = 22;
-const int _FILE_LINK_TARGET = 23;
-const int _FILE_TYPE = 24;
-const int _FILE_IDENTICAL = 25;
-const int _FILE_STAT = 26;
-const int _FILE_LOCK = 27;
-const int _SOCKET_LOOKUP = 28;
-const int _SOCKET_LIST_INTERFACES = 29;
-const int _SOCKET_REVERSE_LOOKUP = 30;
-const int _DIRECTORY_CREATE = 31;
-const int _DIRECTORY_DELETE = 32;
-const int _DIRECTORY_EXISTS = 33;
-const int _DIRECTORY_CREATE_TEMP = 34;
-const int _DIRECTORY_LIST_START = 35;
-const int _DIRECTORY_LIST_NEXT = 36;
-const int _DIRECTORY_LIST_STOP = 37;
-const int _DIRECTORY_RENAME = 38;
-const int _SSL_PROCESS_FILTER = 39;
-
-class _IOService {
-  external static Future _dispatch(int request, List data);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/io_sink.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/io_sink.dart
deleted file mode 100644
index b1c05a0..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/io_sink.dart
+++ /dev/null
@@ -1,309 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * A combined byte and text output.
- *
- * An [IOSink] combines a [StreamSink] of bytes with a [StringSink],
- * and allows easy output of both bytes and text.
- *
- * Writing text ([write]) and adding bytes ([add]) may be interleaved freely.
- *
- * While a stream is being added using [addStream], any further attempts
- * to add or write to the [IOSink] will fail until the [addStream] completes.
- *
- * If data is added to the [IOSink] after the sink is closed, the data will be
- * ignored. Use the [done] future to be notified when the [IOSink] is closed.
- */
-abstract class IOSink implements StreamSink<List<int>>, StringSink {
-
-  /**
-   * Create an [IOSink] that outputs to a [target] [StreamConsumer] of bytes.
-   *
-   * Text written to [StreamSink] methods is encoded to bytes using [encoding]
-   * before being output on [target].
-   */
-  factory IOSink(StreamConsumer<List<int>> target,
-                 {Encoding encoding: UTF8})
-      => new _IOSinkImpl(target, encoding);
-
-  /**
-   * The [Encoding] used when writing strings. Depending on the
-   * underlying consumer this property might be mutable.
-   */
-  Encoding encoding;
-
-  /**
-   * Adds byte [data] to the target consumer, ignoring [encoding].
-   *
-   * The [encoding] does not apply to this method, and the `data` list is passed
-   * directly to the target consumer as a stream event.
-   *
-   * This function must not be called when a stream is currently being added
-   * using [addStream].
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   *
-   * The data list should not be modified after it has been passed to `add`.
-   */
-  void add(List<int> data);
-
-  /**
-   * Converts [obj] to a String by invoking [Object.toString] and
-   * [add]s the encoding of the result to the target consumer.
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   */
-  void write(Object obj);
-
-  /**
-   * Iterates over the given [objects] and [write]s them in sequence.
-   *
-   * If [separator] is provided, a `write` with the `separator` is performed
-   * between any two elements of objects`.
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   */
-  void writeAll(Iterable objects, [String separator = ""]);
-
-  /**
-   * Converts [obj] to a String by invoking [Object.toString] and
-   * writes the result to `this`, followed by a newline.
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   */
-  void writeln([Object obj = ""]);
-
-  /**
-   * Writes the character of [charCode].
-   *
-   * This method is equivalent to `write(new String.fromCharCode(charCode))`.
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   */
-  void writeCharCode(int charCode);
-
-  /**
-   * Passes the error to the target consumer as an error event.
-   *
-   * This function must not be called when a stream is currently being added
-   * using [addStream].
-   *
-   * This operation is non-blocking. See [flush] or [done] for how to get any
-   * errors generated by this call.
-   */
-  void addError(error, [StackTrace stackTrace]);
-
-  /**
-   * Adds all elements of the given [stream] to `this`.
-   *
-   * Returns a [Future] that completes when
-   * all elements of the given [stream] are added to `this`.
-   */
-  Future addStream(Stream<List<int>> stream);
-
-  /**
-   * Returns a [Future] that completes once all buffered data is accepted by the
-   * to underlying [StreamConsumer].
-   *
-   * This method must not be called while an [addStream] is incomplete.
-   *
-   * NOTE: This is not necessarily the same as the data being flushed by the
-   * operating system.
-   */
-  Future flush();
-
-  /**
-   * Close the target consumer.
-   */
-  Future close();
-
-  /**
-   * Get a future that will complete when the consumer closes, or when an
-   * error occurs. This future is identical to the future returned by
-   * [close].
-   */
-  Future get done;
-}
-
-class _StreamSinkImpl<T> implements StreamSink<T> {
-  final StreamConsumer<T> _target;
-  final Completer _doneCompleter = new Completer();
-  StreamController<T> _controllerInstance;
-  Completer _controllerCompleter;
-  bool _isClosed = false;
-  bool _isBound = false;
-  bool _hasError = false;
-
-  _StreamSinkImpl(this._target);
-
-  void add(T data) {
-    if (_isClosed) return;
-    _controller.add(data);
-  }
-
-  void addError(error, [StackTrace stackTrace]) {
-    _controller.addError(error, stackTrace);
-  }
-
-  Future addStream(Stream<T> stream) {
-    if (_isBound) {
-      throw new StateError("StreamSink is already bound to a stream");
-    }
-    _isBound = true;
-    if (_hasError) return done;
-    // Wait for any sync operations to complete.
-    Future targetAddStream() {
-      return _target.addStream(stream)
-          .whenComplete(() {
-            _isBound = false;
-          });
-    }
-    if (_controllerInstance == null) return targetAddStream();
-    var future = _controllerCompleter.future;
-    _controllerInstance.close();
-    return future.then((_) => targetAddStream());
-  }
-
-  Future flush() {
-    if (_isBound) {
-      throw new StateError("StreamSink is bound to a stream");
-    }
-    if (_controllerInstance == null) return new Future.value(this);
-    // Adding an empty stream-controller will return a future that will complete
-    // when all data is done.
-    _isBound = true;
-    var future = _controllerCompleter.future;
-    _controllerInstance.close();
-    return future.whenComplete(() {
-      _isBound = false;
-    });
-  }
-
-  Future close() {
-    if (_isBound) {
-      throw new StateError("StreamSink is bound to a stream");
-    }
-    if (!_isClosed) {
-      _isClosed = true;
-      if (_controllerInstance != null) {
-        _controllerInstance.close();
-      } else {
-        _closeTarget();
-      }
-    }
-    return done;
-  }
-
-  void _closeTarget() {
-    _target.close().then(_completeDoneValue, onError: _completeDoneError);
-  }
-
-  Future get done => _doneCompleter.future;
-
-  void _completeDoneValue(value) {
-    if (!_doneCompleter.isCompleted) {
-      _doneCompleter.complete(value);
-    }
-  }
-
-  void _completeDoneError(error, StackTrace stackTrace) {
-    if (!_doneCompleter.isCompleted) {
-      _hasError = true;
-      _doneCompleter.completeError(error, stackTrace);
-    }
-  }
-
-  StreamController<T> get _controller {
-    if (_isBound) {
-      throw new StateError("StreamSink is bound to a stream");
-    }
-    if (_isClosed) {
-      throw new StateError("StreamSink is closed");
-    }
-    if (_controllerInstance == null) {
-      _controllerInstance = new StreamController<T>(sync: true);
-      _controllerCompleter = new Completer();
-      _target.addStream(_controller.stream).then((_) {
-        if (_isBound) {
-          // A new stream takes over - forward values to that stream.
-          _controllerCompleter.complete(this);
-          _controllerCompleter = null;
-          _controllerInstance = null;
-        } else {
-          // No new stream, .close was called. Close _target.
-          _closeTarget();
-        }
-      }, onError: (error, stackTrace) {
-        if (_isBound) {
-          // A new stream takes over - forward errors to that stream.
-          _controllerCompleter.completeError(error, stackTrace);
-          _controllerCompleter = null;
-          _controllerInstance = null;
-        } else {
-          // No new stream. No need to close target, as it has already
-          // failed.
-          _completeDoneError(error, stackTrace);
-        }
-      });
-   }
-    return _controllerInstance;
-  }
-}
-
-
-class _IOSinkImpl extends _StreamSinkImpl<List<int>> implements IOSink {
-  Encoding _encoding;
-  bool _encodingMutable = true;
-
-  _IOSinkImpl(StreamConsumer<List<int>> target, this._encoding)
-      : super(target);
-
-  Encoding get encoding => _encoding;
-
-  void set encoding(Encoding value) {
-    if (!_encodingMutable) {
-      throw new StateError("IOSink encoding is not mutable");
-    }
-    _encoding = value;
-  }
-
-  void write(Object obj) {
-    String string = '$obj';
-    if (string.isEmpty) return;
-    add(_encoding.encode(string));
-  }
-
-  void writeAll(Iterable objects, [String separator = ""]) {
-    Iterator iterator = objects.iterator;
-    if (!iterator.moveNext()) return;
-    if (separator.isEmpty) {
-      do {
-        write(iterator.current);
-      } while (iterator.moveNext());
-    } else {
-      write(iterator.current);
-      while (iterator.moveNext()) {
-        write(separator);
-        write(iterator.current);
-      }
-    }
-  }
-
-  void writeln([Object object = ""]) {
-    write(object);
-    write("\n");
-  }
-
-  void writeCharCode(int charCode) {
-    write(new String.fromCharCode(charCode));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/io_sources.gypi b/pkg/dev_compiler/tool/input_sdk/lib/io/io_sources.gypi
deleted file mode 100644
index 10a6bf4..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/io_sources.gypi
+++ /dev/null
@@ -1,42 +0,0 @@
-# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-{
-  'sources': [
-    'io.dart',
-    # The above file needs to be first if additional parts are added to the lib.
-    'bytes_builder.dart',
-    'common.dart',
-    'crypto.dart',
-    'data_transformer.dart',
-    'directory.dart',
-    'directory_impl.dart',
-    'eventhandler.dart',
-    'file.dart',
-    'file_impl.dart',
-    'file_system_entity.dart',
-    'http.dart',
-    'http_date.dart',
-    'http_headers.dart',
-    'http_impl.dart',
-    'http_parser.dart',
-    'http_session.dart',
-    'io_resource_info.dart',
-    'io_sink.dart',
-    'io_service.dart',
-    'link.dart',
-    'platform.dart',
-    'platform_impl.dart',
-    'process.dart',
-    'service_object.dart',
-    'secure_server_socket.dart',
-    'secure_socket.dart',
-    'security_context.dart',
-    'socket.dart',
-    'stdio.dart',
-    'string_transformer.dart',
-    'websocket.dart',
-    'websocket_impl.dart',
-  ],
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/link.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/link.dart
deleted file mode 100644
index 25be38c..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/link.dart
+++ /dev/null
@@ -1,305 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * [Link] objects are references to filesystem links.
- *
- */
-abstract class Link implements FileSystemEntity {
-  /**
-   * Creates a Link object.
-   */
-  factory Link(String path) => new _Link(path);
-
-  /**
-   * Creates a [Link] object.
-   *
-   * If [path] is a relative path, it will be interpreted relative to the
-   * current working directory (see [Directory.current]), when used.
-   *
-   * If [path] is an absolute path, it will be immune to changes to the
-   * current working directory.
-   */
-  factory Link.fromUri(Uri uri) => new Link(uri.toFilePath());
-
-  /**
-   * Creates a symbolic link. Returns a [:Future<Link>:] that completes with
-   * the link when it has been created. If the link exists,
-   * the future will complete with an error.
-   *
-   * If [recursive] is false, the default, the link is created
-   * only if all directories in its path exist.
-   * If [recursive] is true, all non-existing path
-   * components are created. The directories in the path of [target] are
-   * not affected, unless they are also in [path].
-   *
-   * On the Windows platform, this will only work with directories, and the
-   * target directory must exist. The link will be created as a Junction.
-   * Only absolute links will be created, and relative paths to the target
-   * will be converted to absolute paths by joining them with the path of the
-   * directory the link is contained in.
-   *
-   * On other platforms, the posix symlink() call is used to make a symbolic
-   * link containing the string [target].  If [target] is a relative path,
-   * it will be interpreted relative to the directory containing the link.
-   */
-  Future<Link> create(String target, {bool recursive: false});
-
-  /**
-   * Synchronously create the link. Calling [createSync] on an existing link
-   * will throw an exception.
-   *
-   * If [recursive] is false, the default, the link is created only if all
-   * directories in its path exist. If [recursive] is true, all
-   * non-existing path components are created. The directories in
-   * the path of [target] are not affected, unless they are also in [path].
-   *
-   * On the Windows platform, this will only work with directories, and the
-   * target directory must exist. The link will be created as a Junction.
-   * Only absolute links will be created, and relative paths to the target
-   * will be converted to absolute paths.
-   *
-   * On other platforms, the posix symlink() call is used to make a symbolic
-   * link containing the string [target].  If [target] is a relative path,
-   * it will be interpreted relative to the directory containing the link.
-   */
-  void createSync(String target, {bool recursive: false});
-
-  /**
-   * Synchronously updates the link. Calling [updateSync] on a non-existing link
-   * will throw an exception.
-   *
-   * On the Windows platform, this will only work with directories, and the
-   * target directory must exist.
-   */
-  void updateSync(String target);
-
-  /**
-   * Updates the link. Returns a [:Future<Link>:] that completes with the
-   * link when it has been updated.  Calling [update] on a non-existing link
-   * will complete its returned future with an exception.
-   *
-   * On the Windows platform, this will only work with directories, and the
-   * target directory must exist.
-   */
-  Future<Link> update(String target);
-
-  Future<String> resolveSymbolicLinks();
-
-  String resolveSymbolicLinksSync();
-
-  /**
-   * Renames this link. Returns a `Future<Link>` that completes
-   * with a [Link] instance for the renamed link.
-   *
-   * If [newPath] identifies an existing link, that link is
-   * replaced. If [newPath] identifies an existing file or directory,
-   * the operation fails and the future completes with an exception.
-   */
-  Future<Link> rename(String newPath);
-
-   /**
-   * Synchronously renames this link. Returns a [Link]
-   * instance for the renamed link.
-   *
-   * If [newPath] identifies an existing link, that link is
-   * replaced. If [newPath] identifies an existing file or directory
-   * the operation fails and an exception is thrown.
-   */
-  Link renameSync(String newPath);
-
-  /**
-   * Returns a [Link] instance whose path is the absolute path to [this].
-   *
-   * The absolute path is computed by prefixing
-   * a relative path with the current working directory, and returning
-   * an absolute path unchanged.
-   */
-  Link get absolute;
-
-  /**
-   * Gets the target of the link. Returns a future that completes with
-   * the path to the target.
-   *
-   * If the returned target is a relative path, it is relative to the
-   * directory containing the link.
-   *
-   * If the link does not exist, or is not a link, the future completes with
-   * a FileSystemException.
-   */
-  Future<String> target();
-
-  /**
-   * Synchronously gets the target of the link. Returns the path to the target.
-   *
-   * If the returned target is a relative path, it is relative to the
-   * directory containing the link.
-   *
-   * If the link does not exist, or is not a link, throws a FileSystemException.
-   */
-  String targetSync();
-}
-
-
-class _Link extends FileSystemEntity implements Link {
-  final String path;
-
-  _Link(this.path) {
-    if (path is! String) {
-      throw new ArgumentError('${Error.safeToString(path)} '
-                              'is not a String');
-    }
-  }
-
-  String toString() => "Link: '$path'";
-
-  Future<bool> exists() => FileSystemEntity.isLink(path);
-
-  bool existsSync() => FileSystemEntity.isLinkSync(path);
-
-  Link get absolute => new Link(_absolutePath);
-
-  Future<FileStat> stat() => FileStat.stat(path);
-
-  FileStat statSync() => FileStat.statSync(path);
-
-  Future<Link> create(String target, {bool recursive: false}) {
-    if (Platform.isWindows) {
-      target = _makeWindowsLinkTarget(target);
-    }
-    var result = recursive ? parent.create(recursive: true)
-                           : new Future.value(null);
-    return result
-      .then((_) => _IOService._dispatch(_FILE_CREATE_LINK, [path, target]))
-      .then((response) {
-        if (_isErrorResponse(response)) {
-          throw _exceptionFromResponse(
-              response, "Cannot create link to target '$target'", path);
-        }
-        return this;
-      });
-  }
-
-  void createSync(String target, {bool recursive: false}) {
-    if (recursive) {
-      parent.createSync(recursive: true);
-    }
-    if (Platform.isWindows) {
-      target = _makeWindowsLinkTarget(target);
-    }
-    var result = _File._createLink(path, target);
-    throwIfError(result, "Cannot create link", path);
-  }
-
-  // Put target into the form "\??\C:\my\target\dir".
-  String _makeWindowsLinkTarget(String target) {
-    Uri base = new Uri.file('${Directory.current.path}\\');
-    Uri link = new Uri.file(path);
-    Uri destination = new Uri.file(target);
-    String result = base.resolveUri(link).resolveUri(destination).toFilePath();
-    if (result.length > 3 && result[1] == ':' && result[2] == '\\') {
-      return '\\??\\$result';
-    } else {
-      throw new FileSystemException(
-          'Target $result of Link.create on Windows cannot be converted' +
-          ' to start with a drive letter.  Unexpected error.');
-    }
-  }
-
-  void updateSync(String target) {
-    // TODO(12414): Replace with atomic update, where supported by platform.
-    // Atomically changing a link can be done by creating the new link, with
-    // a different name, and using the rename() posix call to move it to
-    // the old name atomically.
-    deleteSync();
-    createSync(target);
-  }
-
-  Future<Link> update(String target) {
-    // TODO(12414): Replace with atomic update, where supported by platform.
-    // Atomically changing a link can be done by creating the new link, with
-    // a different name, and using the rename() posix call to move it to
-    // the old name atomically.
-    return delete().then((_) => create(target));
-  }
-
-  Future<Link> _delete({bool recursive: false}) {
-    if (recursive) {
-      return new Directory(path).delete(recursive: true).then((_) => this);
-    }
-    return _IOService._dispatch(_FILE_DELETE_LINK, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(response, "Cannot delete link", path);
-      }
-      return this;
-    });
-  }
-
-  void _deleteSync({bool recursive: false}) {
-    if (recursive) {
-      return new Directory(path).deleteSync(recursive: true);
-    }
-    var result = _File._deleteLinkNative(path);
-    throwIfError(result, "Cannot delete link", path);
-  }
-
-  Future<Link> rename(String newPath) {
-    return _IOService._dispatch(_FILE_RENAME_LINK, [path, newPath])
-        .then((response) {
-          if (_isErrorResponse(response)) {
-            throw _exceptionFromResponse(
-                response, "Cannot rename link to '$newPath'", path);
-          }
-          return new Link(newPath);
-        });
-  }
-
-  Link renameSync(String newPath) {
-    var result = _File._renameLink(path, newPath);
-    throwIfError(result, "Cannot rename link '$path' to '$newPath'");
-    return new Link(newPath);
-  }
-
-  Future<String> target() {
-    return _IOService._dispatch(_FILE_LINK_TARGET, [path]).then((response) {
-      if (_isErrorResponse(response)) {
-        throw _exceptionFromResponse(
-            response, "Cannot get target of link", path);
-      }
-      return response;
-    });
-  }
-
-  String targetSync() {
-    var result = _File._linkTarget(path);
-    throwIfError(result, "Cannot read link", path);
-    return result;
-  }
-
-  static throwIfError(Object result, String msg, [String path = ""]) {
-    if (result is OSError) {
-      throw new FileSystemException(msg, path, result);
-    }
-  }
-
-  bool _isErrorResponse(response) {
-    return response is List && response[0] != _SUCCESS_RESPONSE;
-  }
-
-  _exceptionFromResponse(response, String message, String path) {
-    assert(_isErrorResponse(response));
-    switch (response[_ERROR_RESPONSE_ERROR_TYPE]) {
-      case _ILLEGAL_ARGUMENT_RESPONSE:
-        return new ArgumentError();
-      case _OSERROR_RESPONSE:
-        var err = new OSError(response[_OSERROR_RESPONSE_MESSAGE],
-                              response[_OSERROR_RESPONSE_ERROR_CODE]);
-        return new FileSystemException(message, path, err);
-      default:
-        return new Exception("Unknown error");
-    }
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/platform.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/platform.dart
deleted file mode 100644
index d881ce5..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/platform.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-/**
- * Information about the environment in which the current program is running.
- *
- * Platform provides information such as the operating system,
- * the hostname of the computer, the value of environment variables,
- * the path to the running program,
- * and so on.
- *
- * ## Get the URI to the current Dart script
- *
- * Use the [script] getter to get the URI to the currently running
- * Dart script.
- *
- *     import 'dart:io' show Platform;
- *
- *     void main() {
- *       // Get the URI of the script being run.
- *       var uri = Platform.script;
- *       // Convert the URI to a path.
- *       var path = uri.toFilePath();
- *     }
- *
- * ## Get the value of an environment variable
- *
- * The [environment] getter returns a the names and values of environment
- * variables in a [Map] that contains key-value pairs of strings. The Map is
- * unmodifiable. This sample shows how to get the value of the `PATH`
- * environment variable.
- *
- *     import 'dart:io' show Platform;
- *
- *     void main() {
- *       Map<String, String> envVars = Platform.environment;
- *       print(envVars['PATH']);
- *     }
- *
- * ## Determine the OS
- *
- * You can get the name of the operating system as a string with the
- * [operatingSystem] getter. You can also use one of the static boolean
- * getters: [isMacOS], [isLinux], and [isWindows].
- *
- *     import 'dart:io' show Platform, stdout;
- *
- *     void main() {
- *       // Get the operating system as a string.
- *       String os = Platform.operatingSystem;
- *       // Or, use a predicate getter.
- *       if (Platform.isMacOS) {
- *         print('is a Mac');
- *       } else {
- *         print('is not a Mac');
- *       }
- *     }
- *
- * ## Other resources
- *
- * [Dart by Example](https://www.dartlang.org/dart-by-example/#dart-io-and-command-line-apps)
- * provides additional task-oriented code samples that show how to use
- * various API from the [dart:io] library.
- */
-class Platform {
-  static final _numberOfProcessors = _Platform.numberOfProcessors;
-  static final _pathSeparator = _Platform.pathSeparator;
-  static final _operatingSystem = _Platform.operatingSystem;
-  static final _localHostname = _Platform.localHostname;
-  static final _version = _Platform.version;
-
-  /**
-   * Get the number of processors of the machine.
-   */
-  static int get numberOfProcessors => _numberOfProcessors;
-
-  /**
-   * Get the path separator used by the operating system to separate
-   * components in file paths.
-   */
-  static String get pathSeparator => _pathSeparator;
-
-  /**
-   * Get a string (`linux`, `macos`, `windows`, `android`, or `ios`)
-   * representing the operating system.
-   */
-  static String get operatingSystem => _operatingSystem;
-
-  /**
-   * Get the local hostname for the system.
-   */
-  static String get localHostname => _localHostname;
-
-  /**
-   * Returns true if the operating system is Linux.
-   */
-  static final bool isLinux = (_operatingSystem == "linux");
-
-  /**
-   * Returns true if the operating system is OS X.
-   */
-  static final bool isMacOS = (_operatingSystem == "macos");
-
-  /**
-   * Returns true if the operating system is Windows.
-   */
-  static final bool isWindows = (_operatingSystem == "windows");
-
-  /**
-   * Returns true if the operating system is Android.
-   */
-  static final bool isAndroid = (_operatingSystem == "android");
-
-  /**
-   * Returns true if the operating system is iOS.
-   */
-  static final bool isIOS = (_operatingSystem == "ios");
-
-  /**
-   * Get the environment for this process.
-   *
-   * The returned environment is an unmodifiable map which content is
-   * retrieved from the operating system on its first use.
-   *
-   * Environment variables on Windows are case-insensitive. The map
-   * returned on Windows is therefore case-insensitive and will convert
-   * all keys to upper case. On other platforms the returned map is
-   * a standard case-sensitive map.
-   */
-  static Map<String, String> get environment => _Platform.environment;
-
-  /**
-   * Returns the path of the executable used to run the script in this
-   * isolate.
-   *
-   * The path returned is the literal path used to run the script. This
-   * path might be relative or just be a name from which the executable
-   * was found by searching the `PATH`.
-   *
-   * To get the absolute path to the resolved executable use
-   * [resolvedExecutable].
-   */
-  static String get executable => _Platform.executable;
-
-  /**
-   * Returns the path of the executable used to run the script in this
-   * isolate after it has been resolved by the OS.
-   *
-   * This is the absolute path, with all symlinks resolved, to the
-   * executable used to run the script.
-   */
-  static String get resolvedExecutable => _Platform.resolvedExecutable;
-
-  /**
-   * Returns the absolute URI of the script being run in this
-   * isolate.
-   *
-   * If the script argument on the command line is relative,
-   * it is resolved to an absolute URI before fetching the script, and
-   * this absolute URI is returned.
-   *
-   * URI resolution only does string manipulation on the script path, and this
-   * may be different from the file system's path resolution behavior. For
-   * example, a symbolic link immediately followed by '..' will not be
-   * looked up.
-   *
-   * If the executable environment does not support [script] an empty
-   * [Uri] is returned.
-   */
-  static Uri get script => _Platform.script;
-
-  /**
-   * Returns the flags passed to the executable used to run the script in this
-   * isolate. These are the command-line flags between the executable name
-   * and the script name. Each fetch of executableArguments returns a new
-   * List, containing the flags passed to the executable.
-   */
-  static List<String> get executableArguments => _Platform.executableArguments;
-
-  /**
-   * Returns the value of the `--package-root` flag passed to the executable
-   * used to run the script in this isolate.  This is the directory in which
-   * Dart packages are looked up.
-   *
-   * If there is no `--package-root` flag, `null` is returned.
-   */
-  static String get packageRoot => _Platform.packageRoot;
-
-/**
- * Returns the value of the `--packages` flag passed to the executable
- * used to run the script in this isolate. This is the configuration which
- * specifies how Dart packages are looked up.
- *
- * If there is no `--packages` flag, `null` is returned.
- */
-  static String get packageConfig => _Platform.packageConfig;
-
-  /**
-   * Returns the version of the current Dart runtime.
-   *
-   * The returned `String` is formatted as the
-   * [semver](http://semver.org) version string of the current dart
-   * runtime, possibly followed by whitespace and other version and
-   * build details.
-   */
-  static String get version => _version;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/platform_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/platform_impl.dart
deleted file mode 100644
index 4ce43ea..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/platform_impl.dart
+++ /dev/null
@@ -1,121 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-class _Platform {
-  external static int _numberOfProcessors();
-  external static String _pathSeparator();
-  external static String _operatingSystem();
-  external static _localHostname();
-  external static _executable();
-  external static _resolvedExecutable();
-  /**
-   * Retrieve the entries of the process environment.
-   *
-   * The result is an [Iterable] of strings, where each string represents
-   * an environment entry.
-   *
-   * Environment entries should be strings containing
-   * a non-empty name and a value separated by a '=' character.
-   * The name does not contain a '=' character,
-   * so the name is everything up to the first '=' character.
-   * Values are everything after the first '=' charcacter.
-   * A value may contain further '=' characters, and it may be empty.
-   *
-   * Returns an [OSError] if retrieving the environment fails.
-   */
-  external static _environment();
-  external static List<String> _executableArguments();
-  external static String _packageRoot();
-  external static String _packageConfig();
-  external static String _version();
-
-  static String executable = _executable();
-  static String resolvedExecutable = _resolvedExecutable();
-  static String packageRoot = _packageRoot();
-  static String packageConfig = _packageConfig();
-
-  // Cache the OS environemnt. This can be an OSError instance if
-  // retrieving the environment failed.
-  static var _environmentCache;
-
-  static int get numberOfProcessors => _numberOfProcessors();
-  static String get pathSeparator => _pathSeparator();
-  static String get operatingSystem => _operatingSystem();
-  static Uri script;
-
-  static String get localHostname {
-    var result = _localHostname();
-    if (result is OSError) {
-      throw result;
-    } else {
-      return result;
-    }
-  }
-
-  static List<String> get executableArguments => _executableArguments();
-
-  static Map<String, String> get environment {
-    if (_environmentCache == null) {
-      var env = _environment();
-      if (env is !OSError) {
-        var isWindows = operatingSystem == 'windows';
-        var result = isWindows ? new _CaseInsensitiveStringMap() : new Map();
-        for (var str in env) {
-          // The Strings returned by [_environment()] are expected to be
-          // valid environment entries, but exceptions have been seen
-          // (e.g., an entry of just '=' has been seen on OS/X).
-          // Invalid entries (lines without a '=' or with an empty name)
-          // are discarded.
-          var equalsIndex = str.indexOf('=');
-          if (equalsIndex > 0) {
-            result[str.substring(0, equalsIndex)] =
-                str.substring(equalsIndex + 1);
-          }
-        }
-        _environmentCache = new UnmodifiableMapView<String, String>(result);
-      } else {
-        _environmentCache = env;
-      }
-    }
-
-    if (_environmentCache is OSError) {
-      throw _environmentCache;
-    } else {
-      return _environmentCache;
-    }
-  }
-
-  static String get version => _version();
-}
-
-// Environment variables are case-insensitive on Windows. In order
-// to reflect that we use a case-insensitive string map on Windows.
-class _CaseInsensitiveStringMap<V> implements Map<String, V> {
-  final Map<String, V> _map = new Map<String, V>();
-
-  bool containsKey(Object key) =>
-      key is String && _map.containsKey(key.toUpperCase());
-  bool containsValue(Object value) => _map.containsValue(value);
-  V operator [](Object key) => key is String ? _map[key.toUpperCase()] : null;
-  void operator []=(String key, V value) {
-    _map[key.toUpperCase()] = value;
-  }
-  V putIfAbsent(String key, V ifAbsent()) {
-    return _map.putIfAbsent(key.toUpperCase(), ifAbsent);
-  }
-  void addAll(Map other) {
-    other.forEach((key, value) => this[key.toUpperCase()] = value);
-  }
-  V remove(Object key) => key is String ? _map.remove(key.toUpperCase()) : null;
-  void clear() { _map.clear(); }
-  void forEach(void f(String key, V value)) { _map.forEach(f); }
-  Iterable<String> get keys => _map.keys;
-  Iterable<V> get values => _map.values;
-  int get length => _map.length;
-  bool get isEmpty => _map.isEmpty;
-  bool get isNotEmpty => _map.isNotEmpty;
-  String toString() => _map.toString();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/process.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/process.dart
deleted file mode 100644
index 93aa63e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/process.dart
+++ /dev/null
@@ -1,581 +0,0 @@
-// 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.
-
-part of dart.io;
-
-// TODO(ager): The only reason for this class is that we
-// cannot patch a top-level at this point.
-class _ProcessUtils {
-  external static void _exit(int status);
-  external static void _setExitCode(int status);
-  external static int _getExitCode();
-  external static void _sleep(int millis);
-  external static int _pid(Process process);
-  external static Stream<ProcessSignal> _watchSignal(ProcessSignal signal);
-}
-
-/**
- * Exit the Dart VM process immediately with the given exit code.
- *
- * This does not wait for any asynchronous operations to terminate. Using
- * [exit] is therefore very likely to lose data.
- *
- * The handling of exit codes is platform specific.
- *
- * On Linux and OS X an exit code for normal termination will always
- * be in the range [0..255]. If an exit code outside this range is
- * set the actual exit code will be the lower 8 bits masked off and
- * treated as an unsigned value. E.g. using an exit code of -1 will
- * result in an actual exit code of 255 being reported.
- *
- * On Windows the exit code can be set to any 32-bit value. However
- * some of these values are reserved for reporting system errors like
- * crashes.
- *
- * Besides this the Dart executable itself uses an exit code of `254`
- * for reporting compile time errors and an exit code of `255` for
- * reporting runtime error (unhandled exception).
- *
- * Due to these facts it is recommended to only use exit codes in the
- * range [0..127] for communicating the result of running a Dart
- * program to the surrounding environment. This will avoid any
- * cross-platform issues.
- */
-void exit(int code) {
-  if (code is !int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
-  _ProcessUtils._exit(code);
-}
-
-/**
- * Set the global exit code for the Dart VM.
- *
- * The exit code is global for the Dart VM and the last assignment to
- * exitCode from any isolate determines the exit code of the Dart VM
- * on normal termination.
- *
- * Default value is `0`.
- *
- * See [exit] for more information on how to chose a value for the
- * exit code.
- */
-void set exitCode(int code) {
-  if (code is !int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
-  _ProcessUtils._setExitCode(code);
-}
-
-/**
- * Get the global exit code for the Dart VM.
- *
- * The exit code is global for the Dart VM and the last assignment to
- * exitCode from any isolate determines the exit code of the Dart VM
- * on normal termination.
- *
- * See [exit] for more information on how to chose a value for the
- * exit code.
- */
-int get exitCode => _ProcessUtils._getExitCode();
-
-/**
- * Sleep for the duration specified in [duration].
- *
- * Use this with care, as no asynchronous operations can be processed
- * in a isolate while it is blocked in a [sleep] call.
- */
-void sleep(Duration duration) {
-  int milliseconds = duration.inMilliseconds;
-  if (milliseconds < 0) {
-    throw new ArgumentError("sleep: duration cannot be negative");
-  }
-  _ProcessUtils._sleep(milliseconds);
-}
-
-/**
- * Returns the PID of the current process.
- */
-int get pid => _ProcessUtils._pid(null);
-
-/**
- * Modes for running a new process.
- */
-enum ProcessStartMode {
-  /// Normal child process.
-  NORMAL,
-  /// Detached child process with no open communication channel.
-  DETACHED,
-  /// Detached child process with stdin, stdout and stderr still open
-  /// for communication with the child.
-  DETACHED_WITH_STDIO
-}
-
-/**
- * The means to execute a program.
- *
- * Use the static [start] and [run] methods to start a new process.
- * The run method executes the process non-interactively to completion.
- * In contrast, the start method allows your code to interact with the
- * running process.
- *
- * ## Start a process with the run method
- *
- * The following code sample uses the run method to create a process
- * that runs the UNIX command `ls`, which lists the contents of a directory.
- * The run method completes with a [ProcessResult] object when the process
- * terminates. This provides access to the output and exit code from the
- * process. The run method does not return a Process object; this prevents your
- * code from interacting with the running process.
- *
- *     import 'dart:io';
- *
- *     main() {
- *       // List all files in the current directory in UNIX-like systems.
- *       Process.run('ls', ['-l']).then((ProcessResult results) {
- *         print(results.stdout);
- *       });
- *     }
- *
- * ## Start a process with the start method
- *
- * The following example uses start to create the process.
- * The start method returns a [Future] for a Process object.
- * When the future completes the process is started and
- * your code can interact with the
- * Process: writing to stdin, listening to stdout, and so on.
- *
- * The following sample starts the UNIX `cat` utility, which when given no
- * command-line arguments, echos its input.
- * The program writes to the process's standard input stream
- * and prints data from its standard output stream.
- *
- *     import 'dart:io';
- *     import 'dart:convert';
- *
- *     main() {
- *       Process.start('cat', []).then((Process process) {
- *         process.stdout
- *             .transform(UTF8.decoder)
- *             .listen((data) { print(data); });
- *         process.stdin.writeln('Hello, world!');
- *         process.stdin.writeln('Hello, galaxy!');
- *         process.stdin.writeln('Hello, universe!');
- *       });
- *     }
- *
- * ## Standard I/O streams
- *
- * As seen in the previous code sample, you can interact with the Process's
- * standard output stream through the getter [stdout],
- * and you can interact with the Process's standard input stream through
- * the getter [stdin].
- * In addition, Process provides a getter [stderr] for using the Process's
- * standard error stream.
- *
- * A Process's streams are distinct from the top-level streams
- * for the current program.
- *
- * ## Exit codes
- *
- * Call the [exitCode] method to get the exit code of the process.
- * The exit code indicates whether the program terminated successfully
- * (usually indicated with an exit code of 0) or with an error.
- *
- * If the start method is used, the exitCode is available through a future
- * on the Process object (as shown in the example below).
- * If the run method is used, the exitCode is available
- * through a getter on the ProcessResult instance.
- *
- *     import 'dart:io';
- *
- *     main() {
- *       Process.start('ls', ['-l']).then((process) {
- *         // Get the exit code from the new process.
- *         process.exitCode.then((exitCode) {
- *           print('exit code: $exitCode');
- *         });
- *       });
- *     }
- *
- * ## Other resources
- *
- * [Dart by Example](https://www.dartlang.org/dart-by-example/#dart-io-and-command-line-apps)
- * provides additional task-oriented code samples that show how to use
- * various API from the [dart:io] library.
- */
-abstract class Process {
-  /**
-   * Returns a [:Future:] which completes with the exit code of the process
-   * when the process completes.
-   *
-   * The handling of exit codes is platform specific.
-   *
-   * On Linux and OS X a normal exit code will be a positive value in
-   * the range [0..255]. If the process was terminated due to a signal
-   * the exit code will be a negative value in the range [-255..-1],
-   * where the absolute value of the exit code is the signal
-   * number. For example, if a process crashes due to a segmentation
-   * violation the exit code will be -11, as the signal SIGSEGV has the
-   * number 11.
-   *
-   * On Windows a process can report any 32-bit value as an exit
-   * code. When returning the exit code this exit code is turned into
-   * a signed value. Some special values are used to report
-   * termination due to some system event. E.g. if a process crashes
-   * due to an access violation the 32-bit exit code is `0xc0000005`,
-   * which will be returned as the negative number `-1073741819`. To
-   * get the original 32-bit value use `(0x100000000 + exitCode) &
-   * 0xffffffff`.
-   */
-  Future<int> exitCode;
-
-  /**
-   * Starts a process running the [executable] with the specified
-   * [arguments]. Returns a [:Future<Process>:] that completes with a
-   * Process instance when the process has been successfully
-   * started. That [Process] object can be used to interact with the
-   * process. If the process cannot be started the returned [Future]
-   * completes with an exception.
-   *
-   * Use [workingDirectory] to set the working directory for the process. Note
-   * that the change of directory occurs before executing the process on some
-   * platforms, which may have impact when using relative paths for the
-   * executable and the arguments.
-   *
-   * Use [environment] to set the environment variables for the process. If not
-   * set the environment of the parent process is inherited. Currently, only
-   * US-ASCII environment variables are supported and errors are likely to occur
-   * if an environment variable with code-points outside the US-ASCII range is
-   * passed in.
-   *
-   * If [includeParentEnvironment] is `true`, the process's environment will
-   * include the parent process's environment, with [environment] taking
-   * precedence. Default is `true`.
-   *
-   * If [runInShell] is `true`, the process will be spawned through a system
-   * shell. On Linux and OS X, [:/bin/sh:] is used, while
-   * [:%WINDIR%\system32\cmd.exe:] is used on Windows.
-   *
-   * Users must read all data coming on the [stdout] and [stderr]
-   * streams of processes started with [:Process.start:]. If the user
-   * does not read all data on the streams the underlying system
-   * resources will not be released since there is still pending data.
-   *
-   * The following code uses `Process.start` to grep for `main` in the
-   * file `test.dart` on Linux.
-   *
-   *     Process.start('grep', ['-i', 'main', 'test.dart']).then((process) {
-   *       stdout.addStream(process.stdout);
-   *       stderr.addStream(process.stderr);
-   *     });
-   *
-   * If [mode] is [ProcessStartMode.NORMAL] (the default) a child
-   * process will be started with `stdin`, `stdout` and `stderr`
-   * connected.
-   *
-   * If `mode` is [ProcessStartMode.DETACHED] a detached process will
-   * be created. A detached process has no connection to its parent,
-   * and can keep running on its own when the parent dies. The only
-   * information available from a detached process is its `pid`. There
-   * is no connection to its `stdin`, `stdout` or `stderr`, nor will
-   * the process' exit code become available when it terminates.
-   *
-   * If `mode` is [ProcessStartMode.DETACHED_WITH_STDIO] a detached
-   * process will be created where the `stdin`, `stdout` and `stderr`
-   * are connected. The creator can communicate with the child through
-   * these. The detached process will keep running even if these
-   * communication channels are closed. The process' exit code will
-   * not become available when it terminated.
-   *
-   * The default value for `mode` is `ProcessStartMode.NORMAL`.
-   */
-  external 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});
-
-  /**
-   * Starts a process and runs it non-interactively to completion. The
-   * process run is [executable] with the specified [arguments].
-   *
-   * Use [workingDirectory] to set the working directory for the process. Note
-   * that the change of directory occurs before executing the process on some
-   * platforms, which may have impact when using relative paths for the
-   * executable and the arguments.
-   *
-   * Use [environment] to set the environment variables for the process. If not
-   * set the environment of the parent process is inherited. Currently, only
-   * US-ASCII environment variables are supported and errors are likely to occur
-   * if an environment variable with code-points outside the US-ASCII range is
-   * passed in.
-   *
-   * If [includeParentEnvironment] is `true`, the process's environment will
-   * include the parent process's environment, with [environment] taking
-   * precedence. Default is `true`.
-   *
-   * If [runInShell] is true, the process will be spawned through a system
-   * shell. On Linux and OS X, `/bin/sh` is used, while
-   * `%WINDIR%\system32\cmd.exe` is used on Windows.
-   *
-   * The encoding used for decoding `stdout` and `stderr` into text is
-   * controlled through [stdoutEncoding] and [stderrEncoding]. The
-   * default encoding is [SYSTEM_ENCODING]. If `null` is used no
-   * decoding will happen and the [ProcessResult] will hold binary
-   * data.
-   *
-   * Returns a `Future<ProcessResult>` that completes with the
-   * result of running the process, i.e., exit code, standard out and
-   * standard in.
-   *
-   * The following code uses `Process.run` to grep for `main` in the
-   * file `test.dart` on Linux.
-   *
-   *     Process.run('grep', ['-i', 'main', 'test.dart']).then((result) {
-   *       stdout.write(result.stdout);
-   *       stderr.write(result.stderr);
-   *     });
-   */
-  external 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});
-
-
-  /**
-   * Starts a process and runs it to completion. This is a synchronous
-   * call and will block until the child process terminates.
-   *
-   * The arguments are the same as for `Process.run`.
-   *
-   * Returns a `ProcessResult` with the result of running the process,
-   * i.e., exit code, standard out and standard in.
-   */
-  external 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});
-
-  /**
-   * Kills the process with id [pid].
-   *
-   * Where possible, sends the [signal] to the process with id
-   * `pid`. This includes Linux and OS X. The default signal is
-   * [ProcessSignal.SIGTERM] which will normally terminate the
-   * process.
-   *
-   * On platforms without signal support, including Windows, the call
-   * just terminates the process with id `pid` in a platform specific
-   * way, and the `signal` parameter is ignored.
-   *
-   * Returns `true` if the signal is successfully delivered to the
-   * process. Otherwise the signal could not be sent, usually meaning
-   * that the process is already dead.
-   */
-  external static bool killPid(
-      int pid, [ProcessSignal signal = ProcessSignal.SIGTERM]);
-
-  /**
-   * Returns the standard output stream of the process as a [:Stream:].
-   */
-  Stream<List<int>> get stdout;
-
-  /**
-   * Returns the standard error stream of the process as a [:Stream:].
-   */
-  Stream<List<int>> get stderr;
-
-  /**
-   * Returns the standard input stream of the process as an [IOSink].
-   */
-  IOSink get stdin;
-
-  /**
-   * Returns the process id of the process.
-   */
-  int get pid;
-
-  /**
-   * Kills the process.
-   *
-   * Where possible, sends the [signal] to the process. This includes
-   * Linux and OS X. The default signal is [ProcessSignal.SIGTERM]
-   * which will normally terminate the process.
-   *
-   * On platforms without signal support, including Windows, the call
-   * just terminates the process in a platform specific way, and the
-   * `signal` parameter is ignored.
-   *
-   * Returns `true` if the signal is successfully delivered to the
-   * process. Otherwise the signal could not be sent, usually meaning
-   * that the process is already dead.
-   */
-  bool kill([ProcessSignal signal = ProcessSignal.SIGTERM]);
-}
-
-
-/**
- * [ProcessResult] represents the result of running a non-interactive
- * process started with [Process.run] or [Process.runSync].
- */
-class ProcessResult {
-  /**
-   * Exit code for the process.
-   *
-   * See [Process.exitCode] for more information in the exit code
-   * value.
-   */
-  final int exitCode;
-
-  /**
-   * Standard output from the process. The value used for the
-   * `stdoutEncoding` argument to `Process.run` determines the type. If
-   * `null` was used this value is of type `List<int> otherwise it is
-   * of type `String`.
-   */
-  final stdout;
-
-  /**
-   * Standard error from the process. The value used for the
-   * `stderrEncoding` argument to `Process.run` determines the type. If
-   * `null` was used this value is of type `List<int>
-   * otherwise it is of type `String`.
-   */
-  final stderr;
-
-  /**
-   * Process id of the process.
-   */
-  final int pid;
-
-  ProcessResult(this.pid, this.exitCode, this.stdout, this.stderr);
-}
-
-
-/**
- * On Posix systems, [ProcessSignal] is used to send a specific signal
- * to a child process, see [:Process.kill:].
- *
- * Some [ProcessSignal]s can also be watched, as a way to intercept the default
- * signal handler and implement another. See [ProcessSignal.watch] for more
- * information.
- */
-class ProcessSignal {
-  static const ProcessSignal SIGHUP = const ProcessSignal._(1, "SIGHUP");
-  static const ProcessSignal SIGINT = const ProcessSignal._(2, "SIGINT");
-  static const ProcessSignal SIGQUIT = const ProcessSignal._(3, "SIGQUIT");
-  static const ProcessSignal SIGILL = const ProcessSignal._(4, "SIGILL");
-  static const ProcessSignal SIGTRAP = const ProcessSignal._(5, "SIGTRAP");
-  static const ProcessSignal SIGABRT = const ProcessSignal._(6, "SIGABRT");
-  static const ProcessSignal SIGBUS = const ProcessSignal._(7, "SIGBUS");
-  static const ProcessSignal SIGFPE = const ProcessSignal._(8, "SIGFPE");
-  static const ProcessSignal SIGKILL = const ProcessSignal._(9, "SIGKILL");
-  static const ProcessSignal SIGUSR1 = const ProcessSignal._(10, "SIGUSR1");
-  static const ProcessSignal SIGSEGV = const ProcessSignal._(11, "SIGSEGV");
-  static const ProcessSignal SIGUSR2 = const ProcessSignal._(12, "SIGUSR2");
-  static const ProcessSignal SIGPIPE = const ProcessSignal._(13, "SIGPIPE");
-  static const ProcessSignal SIGALRM = const ProcessSignal._(14, "SIGALRM");
-  static const ProcessSignal SIGTERM = const ProcessSignal._(15, "SIGTERM");
-  static const ProcessSignal SIGCHLD = const ProcessSignal._(17, "SIGCHLD");
-  static const ProcessSignal SIGCONT = const ProcessSignal._(18, "SIGCONT");
-  static const ProcessSignal SIGSTOP = const ProcessSignal._(19, "SIGSTOP");
-  static const ProcessSignal SIGTSTP = const ProcessSignal._(20, "SIGTSTP");
-  static const ProcessSignal SIGTTIN = const ProcessSignal._(21, "SIGTTIN");
-  static const ProcessSignal SIGTTOU = const ProcessSignal._(22, "SIGTTOU");
-  static const ProcessSignal SIGURG = const ProcessSignal._(23, "SIGURG");
-  static const ProcessSignal SIGXCPU = const ProcessSignal._(24, "SIGXCPU");
-  static const ProcessSignal SIGXFSZ = const ProcessSignal._(25, "SIGXFSZ");
-  static const ProcessSignal SIGVTALRM = const ProcessSignal._(26, "SIGVTALRM");
-  static const ProcessSignal SIGPROF = const ProcessSignal._(27, "SIGPROF");
-  static const ProcessSignal SIGWINCH = const ProcessSignal._(28, "SIGWINCH");
-  static const ProcessSignal SIGPOLL = const ProcessSignal._(29, "SIGPOLL");
-  static const ProcessSignal SIGSYS = const ProcessSignal._(31, "SIGSYS");
-
-  final int _signalNumber;
-  final String _name;
-
-  const ProcessSignal._(this._signalNumber, this._name);
-
-  String toString() => _name;
-
-  /**
-   * Watch for process signals.
-   *
-   * The following [ProcessSignal]s can be listened to:
-   *
-   *   * [ProcessSignal.SIGHUP].
-   *   * [ProcessSignal.SIGINT]. Signal sent by e.g. CTRL-C.
-   *   * [ProcessSignal.SIGTERM]. Not available on Windows.
-   *   * [ProcessSignal.SIGUSR1]. Not available on Windows.
-   *   * [ProcessSignal.SIGUSR2]. Not available on Windows.
-   *   * [ProcessSignal.SIGWINCH]. Not available on Windows.
-   *
-   * Other signals are disallowed, as they may be used by the VM.
-   *
-   * A signal can be watched multiple times, from multiple isolates, where all
-   * callbacks are invoked when signaled, in no specific order.
-   */
-  Stream<ProcessSignal> watch() => _ProcessUtils._watchSignal(this);
-}
-
-
-class SignalException implements IOException {
-  final String message;
-  final osError;
-
-  const SignalException(this.message, [this.osError = null]);
-
-  String toString() {
-    var msg = "";
-    if (osError != null) {
-      msg = ", osError: $osError";
-    }
-    return "SignalException: $message$msg";
-  }
-}
-
-
-class ProcessException implements IOException {
-  /**
-   * Contains the executable provided for the process.
-   */
-  final String executable;
-
-  /**
-   * Contains the arguments provided for the process.
-   */
-  final List<String> arguments;
-
-  /**
-   * Contains the system message for the process exception if any.
-   */
-  final String message;
-
-  /**
-   * Contains the OS error code for the process exception if any.
-   */
-  final int errorCode;
-
-  const ProcessException(this.executable, this.arguments, [this.message = "",
-                         this.errorCode = 0]);
-  String toString() {
-    var msg = (message == null) ? 'OS error code: $errorCode' : message;
-    var args = arguments.join(' ');
-    return "ProcessException: $msg\n  Command: $executable $args";
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/secure_server_socket.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/secure_server_socket.dart
deleted file mode 100644
index 2fbc5b1..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/secure_server_socket.dart
+++ /dev/null
@@ -1,295 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.io;
-
-/**
- * The [SecureServerSocket] is a server socket, providing a stream of high-level
- * [Socket]s.
- *
- * See [SecureSocket] for more info.
- */
-class SecureServerSocket extends Stream<SecureSocket> {
-  final RawSecureServerSocket _socket;
-
-  SecureServerSocket._(this._socket);
-
-  /**
-   * Returns a future for a [SecureServerSocket]. When the future
-   * completes the server socket is bound to the given [address] and
-   * [port] and has started listening on it.
-   *
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If [port] has the value [:0:] an ephemeral port will be chosen by
-   * the system. The actual port used can be retrieved using the
-   * [port] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * Incoming client connections are promoted to secure connections, using
-   * the server certificate and key set in [context].
-   *
-   * [address] must be given as a numeric address, not a host name.
-   *
-   * To request or require that clients authenticate by providing an SSL (TLS)
-   * client certificate, set the optional parameter [requestClientCertificate]
-   * or [requireClientCertificate] to true.  Requiring a certificate implies
-   * requesting a certificate, so setting both is redundant.
-   * To check whether a client certificate was received, check
-   * SecureSocket.peerCertificate after connecting.  If no certificate
-   * was received, the result will be null.
-   *
-   * The optional argument [shared] specifies whether additional
-   * SecureServerSocket objects can bind to the same combination of `address`,
-   * `port` and `v6Only`.  If `shared` is `true` and more `SecureServerSocket`s
-   * from this isolate or other isolates are bound to the port, then the
-   * incoming connections will be distributed among all the bound
-   * `SecureServerSocket`s. Connections can be distributed over multiple
-   * isolates this way.
-   */
-  static Future<SecureServerSocket> bind(
-      address,
-      int port,
-      SecurityContext context,
-      {int backlog: 0,
-       bool v6Only: false,
-       bool requestClientCertificate: false,
-       bool requireClientCertificate: false,
-       List<String> supportedProtocols,
-       bool shared: false}) {
-    return RawSecureServerSocket.bind(
-        address,
-        port,
-        context,
-        backlog: backlog,
-        v6Only: v6Only,
-        requestClientCertificate: requestClientCertificate,
-        requireClientCertificate: requireClientCertificate,
-        supportedProtocols: supportedProtocols,
-        shared: shared).then(
-            (serverSocket) => new SecureServerSocket._(serverSocket));
-  }
-
-  StreamSubscription<SecureSocket> listen(void onData(SecureSocket socket),
-                                          {Function onError,
-                                           void onDone(),
-                                           bool cancelOnError}) {
-    return _socket.map((rawSocket) => new SecureSocket._(rawSocket))
-                  .listen(onData,
-                          onError: onError,
-                          onDone: onDone,
-                          cancelOnError: cancelOnError);
-  }
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port => _socket.port;
-
-  /**
-   * Returns the address used by this socket.
-   */
-  InternetAddress get address => _socket.address;
-
-  /**
-   * Closes the socket. The returned future completes when the socket
-   * is fully closed and is no longer bound.
-   */
-  Future<SecureServerSocket> close() => _socket.close().then((_) => this);
-
-  void set _owner(owner) { _socket._owner = owner; }
-}
-
-
-/**
- * The RawSecureServerSocket is a server socket, providing a stream of low-level
- * [RawSecureSocket]s.
- *
- * See [RawSecureSocket] for more info.
- */
-class RawSecureServerSocket extends Stream<RawSecureSocket> {
-  final RawServerSocket _socket;
-  StreamController<RawSecureSocket> _controller;
-  StreamSubscription<RawSocket> _subscription;
-  final SecurityContext _context;
-  final bool requestClientCertificate;
-  final bool requireClientCertificate;
-  final List<String> supportedProtocols;
-  bool _closed = false;
-
-  RawSecureServerSocket._(this._socket,
-                          this._context,
-                          this.requestClientCertificate,
-                          this.requireClientCertificate,
-                          this.supportedProtocols) {
-    _controller = new StreamController<RawSecureSocket>(
-        sync: true,
-        onListen: _onSubscriptionStateChange,
-        onPause: _onPauseStateChange,
-        onResume: _onPauseStateChange,
-        onCancel: _onSubscriptionStateChange);
-  }
-
-  /**
-   * Returns a future for a [RawSecureServerSocket]. When the future
-   * completes the server socket is bound to the given [address] and
-   * [port] and has started listening on it.
-   *
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If [port] has the value [:0:] an ephemeral port will be chosen by
-   * the system. The actual port used can be retrieved using the
-   * [port] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * Incoming client connections are promoted to secure connections,
-   * using the server certificate and key set in [context].
-   *
-   * [address] must be given as a numeric address, not a host name.
-   *
-   * To request or require that clients authenticate by providing an SSL (TLS)
-   * client certificate, set the optional parameters requestClientCertificate or
-   * requireClientCertificate to true.  Require implies request, so one doesn't
-   * need to specify both.  To check whether a client certificate was received,
-   * check SecureSocket.peerCertificate after connecting.  If no certificate
-   * was received, the result will be null.
-   *
-   * The optional argument [shared] specifies whether additional
-   * RawSecureServerSocket objects can bind to the same combination of
-   * `address`, `port` and `v6Only`.  If `shared` is `true` and more
-   * `RawSecureServerSocket`s from this isolate or other isolates are bound to
-   * the port, then the incoming connections will be distributed among all the
-   * bound `RawSecureServerSocket`s. Connections can be distributed over
-   * multiple isolates this way.
-   */
-  static Future<RawSecureServerSocket> bind(
-      address,
-      int port,
-      SecurityContext context,
-      {int backlog: 0,
-       bool v6Only: false,
-       bool requestClientCertificate: false,
-       bool requireClientCertificate: false,
-       List<String> supportedProtocols,
-       bool shared: false}) {
-    return RawServerSocket.bind(
-        address, port, backlog: backlog, v6Only: v6Only, shared: shared)
-        .then((serverSocket) => new RawSecureServerSocket._(
-            serverSocket,
-            context,
-            requestClientCertificate,
-            requireClientCertificate,
-            supportedProtocols));
-  }
-
-  StreamSubscription<RawSecureSocket> listen(void onData(RawSecureSocket s),
-                                             {Function onError,
-                                              void onDone(),
-                                              bool cancelOnError}) {
-    return _controller.stream.listen(onData,
-                                     onError: onError,
-                                     onDone: onDone,
-                                     cancelOnError: cancelOnError);
-  }
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port => _socket.port;
-
-  /**
-   * Returns the address used by this socket.
-   */
-  InternetAddress get address => _socket.address;
-
-  /**
-   * Closes the socket. The returned future completes when the socket
-   * is fully closed and is no longer bound.
-   */
-  Future<RawSecureServerSocket> close() {
-    _closed = true;
-    return _socket.close().then((_) => this);
-  }
-
-  void _onData(RawSocket connection) {
-    var remotePort;
-    try {
-      remotePort = connection.remotePort;
-    } catch (e) {
-      // If connection is already closed, remotePort throws an exception.
-      // Do nothing - connection is closed.
-      return;
-    }
-    _RawSecureSocket.connect(
-        connection.address,
-        remotePort,
-        context: _context,
-        is_server: true,
-        socket: connection,
-        requestClientCertificate: requestClientCertificate,
-        requireClientCertificate: requireClientCertificate,
-        supportedProtocols: supportedProtocols)
-    .then((RawSecureSocket secureConnection) {
-      if (_closed) {
-        secureConnection.close();
-      } else {
-        _controller.add(secureConnection);
-      }
-    }).catchError((e, s) {
-      if (!_closed) {
-        _controller.addError(e, s);
-      }
-    });
-  }
-
-  void _onPauseStateChange() {
-    if (_controller.isPaused) {
-      _subscription.pause();
-    } else {
-      _subscription.resume();
-    }
-  }
-
-  void _onSubscriptionStateChange() {
-    if (_controller.hasListener) {
-      _subscription = _socket.listen(_onData,
-                                     onError: _controller.addError,
-                                     onDone: _controller.close);
-    } else {
-      close();
-    }
-  }
-
-  void set _owner(owner) {
-    (_socket as dynamic)._owner = owner;
-  }
-}
-
-
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/secure_socket.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/secure_socket.dart
deleted file mode 100644
index 380a8c4..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/secure_socket.dart
+++ /dev/null
@@ -1,1263 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * A high-level class for communicating securely over a TCP socket, using
- * TLS and SSL. The [SecureSocket] exposes both a [Stream] and an
- * [IOSink] interface, making it ideal for using together with
- * other [Stream]s.
- */
-abstract class SecureSocket implements Socket {
-  external factory SecureSocket._(RawSecureSocket rawSocket);
-
-  /**
-   * Constructs a new secure client socket and connects it to the given
-   * [host] on port [port]. The returned Future will complete with a
-   * [SecureSocket] that is connected and ready for subscription.
-   *
-   * The certificate provided by the server is checked
-   * using the trusted certificates set in the SecurityContext object.
-   * The default SecurityContext object contains a built-in set of trusted
-   * root certificates for well-known certificate authorities.
-   *
-   * [onBadCertificate] is an optional handler for unverifiable certificates.
-   * The handler receives the [X509Certificate], and can inspect it and
-   * decide (or let the user decide) whether to accept
-   * the connection or not.  The handler should return true
-   * to continue the [SecureSocket] connection.
-   */
-  static Future<SecureSocket> connect(
-      host,
-      int port,
-      {SecurityContext context,
-       bool onBadCertificate(X509Certificate certificate),
-       List<String> supportedProtocols}) {
-    return RawSecureSocket.connect(host,
-                                   port,
-                                   context: context,
-                                   onBadCertificate: onBadCertificate,
-                                   supportedProtocols: supportedProtocols)
-        .then((rawSocket) => new SecureSocket._(rawSocket));
-  }
-
-  /**
-   * Takes an already connected [socket] and starts client side TLS
-   * handshake to make the communication secure. When the returned
-   * future completes the [SecureSocket] has completed the TLS
-   * handshake. Using this function requires that the other end of the
-   * connection is prepared for TLS handshake.
-   *
-   * If the [socket] already has a subscription, this subscription
-   * will no longer receive and events. In most cases calling
-   * `pause` on this subscription before starting TLS handshake is
-   * the right thing to do.
-   *
-   * If the [host] argument is passed it will be used as the host name
-   * for the TLS handshake. If [host] is not passed the host name from
-   * the [socket] will be used. The [host] can be either a [String] or
-   * an [InternetAddress].
-   *
-   * Calling this function will _not_ cause a DNS host lookup. If the
-   * [host] passed is a [String] the [InternetAddress] for the
-   * resulting [SecureSocket] will have the passed in [host] as its
-   * host value and the internet address of the already connected
-   * socket as its address value.
-   *
-   * See [connect] for more information on the arguments.
-   *
-   */
-  static Future<SecureSocket> secure(
-      Socket socket,
-      {host,
-       SecurityContext context,
-       bool onBadCertificate(X509Certificate certificate)}) {
-    var completer = new Completer();
-    (socket as dynamic)._detachRaw()
-        .then((detachedRaw) {
-          return RawSecureSocket.secure(
-            detachedRaw[0],
-            subscription: detachedRaw[1],
-            host: host,
-            context: context,
-            onBadCertificate: onBadCertificate);
-          })
-        .then((raw) {
-          completer.complete(new SecureSocket._(raw));
-        });
-    return completer.future;
-  }
-
-  /**
-   * Takes an already connected [socket] and starts server side TLS
-   * handshake to make the communication secure. When the returned
-   * future completes the [SecureSocket] has completed the TLS
-   * handshake. Using this function requires that the other end of the
-   * connection is going to start the TLS handshake.
-   *
-   * If the [socket] already has a subscription, this subscription
-   * will no longer receive and events. In most cases calling
-   * [:pause:] on this subscription before starting TLS handshake is
-   * the right thing to do.
-   *
-   * If some of the data of the TLS handshake has already been read
-   * from the socket this data can be passed in the [bufferedData]
-   * parameter. This data will be processed before any other data
-   * available on the socket.
-   *
-   * See [SecureServerSocket.bind] for more information on the
-   * arguments.
-   *
-   */
-  static Future<SecureSocket> secureServer(
-      Socket socket,
-      SecurityContext context,
-      {List<int> bufferedData,
-       bool requestClientCertificate: false,
-       bool requireClientCertificate: false,
-       List<String> supportedProtocols}) {
-    var completer = new Completer();
-    (socket as dynamic)._detachRaw()
-        .then((detachedRaw) {
-          return RawSecureSocket.secureServer(
-            detachedRaw[0],
-            context,
-            subscription: detachedRaw[1],
-            bufferedData: bufferedData,
-            requestClientCertificate: requestClientCertificate,
-            requireClientCertificate: requireClientCertificate,
-            supportedProtocols: supportedProtocols);
-          })
-        .then((raw) {
-          completer.complete(new SecureSocket._(raw));
-        });
-    return completer.future;
-  }
-
-  /**
-   * Get the peer certificate for a connected SecureSocket.  If this
-   * SecureSocket is the server end of a secure socket connection,
-   * [peerCertificate] will return the client certificate, or null, if no
-   * client certificate was received.  If it is the client end,
-   * [peerCertificate] will return the server's certificate.
-   */
-  X509Certificate get peerCertificate;
-
-  /**
-   * Get the protocol which was selected during protocol negotiation.
-   */
-  String get selectedProtocol;
-
-  /**
-   * Renegotiate an existing secure connection, renewing the session keys
-   * and possibly changing the connection properties.
-   *
-   * This repeats the SSL or TLS handshake, with options that allow clearing
-   * the session cache and requesting a client certificate.
-   */
-  void renegotiate({bool useSessionCache: true,
-                    bool requestClientCertificate: false,
-                    bool requireClientCertificate: false});
-}
-
-
-/**
- * RawSecureSocket provides a secure (SSL or TLS) network connection.
- * Client connections to a server are provided by calling
- * RawSecureSocket.connect.  A secure server, created with
- * [RawSecureServerSocket], also returns RawSecureSocket objects representing
- * the server end of a secure connection.
- * The certificate provided by the server is checked
- * using the trusted certificates set in the SecurityContext object.
- * The default [SecurityContext] object contains a built-in set of trusted
- * root certificates for well-known certificate authorities.
- */
-abstract class RawSecureSocket implements RawSocket {
-  /**
-   * Constructs a new secure client socket and connect it to the given
-   * host on the given port. The returned [Future] is completed with the
-   * RawSecureSocket when it is connected and ready for subscription.
-   *
-   * The certificate provided by the server is checked using the trusted
-   * certificates set in the SecurityContext object If a certificate and key are
-   * set on the client, using [SecurityContext.useCertificateChain] and
-   * [SecurityContext.usePrivateKey], and the server asks for a client
-   * certificate, then that client certificate is sent to the server.
-   *
-   * [onBadCertificate] is an optional handler for unverifiable certificates.
-   * The handler receives the [X509Certificate], and can inspect it and
-   * decide (or let the user decide) whether to accept
-   * the connection or not.  The handler should return true
-   * to continue the [RawSecureSocket] connection.
-   */
-  static Future<RawSecureSocket> connect(
-      host,
-      int port,
-      {SecurityContext context,
-       bool onBadCertificate(X509Certificate certificate),
-       List<String> supportedProtocols}) {
-    _RawSecureSocket._verifyFields(
-        host,
-        port,
-        false,
-        false,
-        false,
-        onBadCertificate);
-    return RawSocket.connect(host, port)
-        .then((socket) {
-          return secure(socket,
-                        context: context,
-                        onBadCertificate: onBadCertificate,
-                        supportedProtocols: supportedProtocols);
-        });
-  }
-
-  /**
-   * Takes an already connected [socket] and starts client side TLS
-   * handshake to make the communication secure. When the returned
-   * future completes the [RawSecureSocket] has completed the TLS
-   * handshake. Using this function requires that the other end of the
-   * connection is prepared for TLS handshake.
-   *
-   * If the [socket] already has a subscription, pass the existing
-   * subscription in the [subscription] parameter. The [secure]
-   * operation will take over the subscription by replacing the
-   * handlers with it own secure processing. The caller must not touch
-   * this subscription anymore. Passing a paused subscription is an
-   * error.
-   *
-   * If the [host] argument is passed it will be used as the host name
-   * for the TLS handshake. If [host] is not passed the host name from
-   * the [socket] will be used. The [host] can be either a [String] or
-   * an [InternetAddress].
-   *
-   * Calling this function will _not_ cause a DNS host lookup. If the
-   * [host] passed is a [String] the [InternetAddress] for the
-   * resulting [SecureSocket] will have this passed in [host] as its
-   * host value and the internet address of the already connected
-   * socket as its address value.
-   *
-   * See [connect] for more information on the arguments.
-   *
-   */
-  static Future<RawSecureSocket> secure(
-      RawSocket socket,
-      {StreamSubscription subscription,
-       host,
-       SecurityContext context,
-       bool onBadCertificate(X509Certificate certificate),
-       List<String> supportedProtocols}) {
-    socket.readEventsEnabled = false;
-    socket.writeEventsEnabled = false;
-    return  _RawSecureSocket.connect(
-        host != null ? host : socket.address.host,
-        socket.port,
-        is_server: false,
-        socket: socket,
-        subscription: subscription,
-        context: context,
-        onBadCertificate: onBadCertificate,
-        supportedProtocols: supportedProtocols);
-  }
-
-  /**
-   * Takes an already connected [socket] and starts server side TLS
-   * handshake to make the communication secure. When the returned
-   * future completes the [RawSecureSocket] has completed the TLS
-   * handshake. Using this function requires that the other end of the
-   * connection is going to start the TLS handshake.
-   *
-   * If the [socket] already has a subscription, pass the existing
-   * subscription in the [subscription] parameter. The [secureServer]
-   * operation will take over the subscription by replacing the
-   * handlers with it own secure processing. The caller must not touch
-   * this subscription anymore. Passing a paused subscription is an
-   * error.
-   *
-   * If some of the data of the TLS handshake has already been read
-   * from the socket this data can be passed in the [bufferedData]
-   * parameter. This data will be processed before any other data
-   * available on the socket.
-   *
-   * See [RawSecureServerSocket.bind] for more information on the
-   * arguments.
-   *
-   */
-  static Future<RawSecureSocket> secureServer(
-      RawSocket socket,
-      SecurityContext context,
-      {StreamSubscription subscription,
-       List<int> bufferedData,
-       bool requestClientCertificate: false,
-       bool requireClientCertificate: false,
-       List<String> supportedProtocols}) {
-    socket.readEventsEnabled = false;
-    socket.writeEventsEnabled = false;
-    return _RawSecureSocket.connect(
-        socket.address,
-        socket.remotePort,
-        context: context,
-        is_server: true,
-        socket: socket,
-        subscription: subscription,
-        bufferedData: bufferedData,
-        requestClientCertificate: requestClientCertificate,
-        requireClientCertificate: requireClientCertificate,
-        supportedProtocols: supportedProtocols);
-  }
-
-  /**
-   * Renegotiate an existing secure connection, renewing the session keys
-   * and possibly changing the connection properties.
-   *
-   * This repeats the SSL or TLS handshake, with options that allow clearing
-   * the session cache and requesting a client certificate.
-   */
-  void renegotiate({bool useSessionCache: true,
-                    bool requestClientCertificate: false,
-                    bool requireClientCertificate: false});
-
-  /**
-   * Get the peer certificate for a connected RawSecureSocket.  If this
-   * RawSecureSocket is the server end of a secure socket connection,
-   * [peerCertificate] will return the client certificate, or null, if no
-   * client certificate was received.  If it is the client end,
-   * [peerCertificate] will return the server's certificate.
-   */
-  X509Certificate get peerCertificate;
-
-  /**
-   * Get the protocol which was selected during protocol negotiation.
-   */
-  String get selectedProtocol;
-}
-
-
-/**
- * X509Certificate represents an SSL certificate, with accessors to
- * get the fields of the certificate.
- */
-abstract class X509Certificate {
-  external factory X509Certificate._();
-
-  String get subject;
-  String get issuer;
-  DateTime get startValidity;
-  DateTime get endValidity;
-}
-
-
-class _FilterStatus {
-  bool progress = false;  // The filter read or wrote data to the buffers.
-  bool readEmpty = true;  // The read buffers and decryption filter are empty.
-  bool writeEmpty = true;  // The write buffers and encryption filter are empty.
-  // These are set if a buffer changes state from empty or full.
-  bool readPlaintextNoLongerEmpty = false;
-  bool writePlaintextNoLongerFull = false;
-  bool readEncryptedNoLongerFull = false;
-  bool writeEncryptedNoLongerEmpty = false;
-
-  _FilterStatus();
-}
-
-
-class _RawSecureSocket extends Stream<RawSocketEvent>
-                       implements RawSecureSocket {
-  // Status states
-  static final int HANDSHAKE = 201;
-  static final int CONNECTED = 202;
-  static final int CLOSED = 203;
-
-  // Buffer identifiers.
-  // These must agree with those in the native C++ implementation.
-  static final int READ_PLAINTEXT = 0;
-  static final int WRITE_PLAINTEXT = 1;
-  static final int READ_ENCRYPTED = 2;
-  static final int WRITE_ENCRYPTED = 3;
-  static final int NUM_BUFFERS = 4;
-
-  // Is a buffer identifier for an encrypted buffer?
-  static bool _isBufferEncrypted(int identifier) => identifier >= READ_ENCRYPTED;
-
-  RawSocket _socket;
-  final Completer<_RawSecureSocket> _handshakeComplete =
-      new Completer<_RawSecureSocket>();
-  StreamController<RawSocketEvent> _controller;
-  Stream<RawSocketEvent> _stream;
-  StreamSubscription<RawSocketEvent> _socketSubscription;
-  List<int> _bufferedData;
-  int _bufferedDataIndex = 0;
-  final InternetAddress address;
-  final bool is_server;
-  SecurityContext context;
-  final bool requestClientCertificate;
-  final bool requireClientCertificate;
-  final Function onBadCertificate;
-
-  var _status = HANDSHAKE;
-  bool _writeEventsEnabled = true;
-  bool _readEventsEnabled = true;
-  int _pauseCount = 0;
-  bool _pendingReadEvent = false;
-  bool _socketClosedRead = false;  // The network socket is closed for reading.
-  bool _socketClosedWrite = false;  // The network socket is closed for writing.
-  bool _closedRead = false;  // The secure socket has fired an onClosed event.
-  bool _closedWrite = false;  // The secure socket has been closed for writing.
-  Completer _closeCompleter = new Completer();  // The network socket is gone.
-  _FilterStatus _filterStatus = new _FilterStatus();
-  bool _connectPending = true;
-  bool _filterPending = false;
-  bool _filterActive = false;
-
-  _SecureFilter _secureFilter = new _SecureFilter();
-  String _selectedProtocol;
-
-  static Future<_RawSecureSocket> connect(
-      dynamic/*String|InternetAddress*/ host,
-      int requestedPort,
-      {bool is_server,
-       SecurityContext context,
-       RawSocket socket,
-       StreamSubscription subscription,
-       List<int> bufferedData,
-       bool requestClientCertificate: false,
-       bool requireClientCertificate: false,
-       bool onBadCertificate(X509Certificate certificate),
-       List<String> supportedProtocols}) {
-    _verifyFields(host, requestedPort, is_server,
-                 requestClientCertificate, requireClientCertificate,
-                 onBadCertificate);
-    if (host is InternetAddress) host = host.host;
-    InternetAddress address = socket.address;
-    if (host != null) {
-      address = InternetAddress._cloneWithNewHost(address, host);
-    }
-    return new _RawSecureSocket(address,
-                                requestedPort,
-                                is_server,
-                                context,
-                                socket,
-                                subscription,
-                                bufferedData,
-                                requestClientCertificate,
-                                requireClientCertificate,
-                                onBadCertificate,
-                                supportedProtocols)
-        ._handshakeComplete.future;
-  }
-
-  _RawSecureSocket(
-      this.address,
-      int requestedPort,
-      this.is_server,
-      this.context,
-      RawSocket this._socket,
-      this._socketSubscription,
-      this._bufferedData,
-      this.requestClientCertificate,
-      this.requireClientCertificate,
-      this.onBadCertificate(X509Certificate certificate),
-      List<String> supportedProtocols) {
-    if (context == null) {
-      context = SecurityContext.defaultContext;
-    }
-    _controller = new StreamController<RawSocketEvent>(
-        sync: true,
-        onListen: _onSubscriptionStateChange,
-        onPause: _onPauseStateChange,
-        onResume: _onPauseStateChange,
-        onCancel: _onSubscriptionStateChange);
-    _stream = _controller.stream;
-    // Throw an ArgumentError if any field is invalid.  After this, all
-    // errors will be reported through the future or the stream.
-    _secureFilter.init();
-    _secureFilter.registerHandshakeCompleteCallback(
-        _secureHandshakeCompleteHandler);
-    if (onBadCertificate != null) {
-      _secureFilter.registerBadCertificateCallback(_onBadCertificateWrapper);
-    }
-    _socket.readEventsEnabled = true;
-    _socket.writeEventsEnabled = false;
-    if (_socketSubscription == null) {
-      // If a current subscription is provided use this otherwise
-      // create a new one.
-      _socketSubscription = _socket.listen(_eventDispatcher,
-                                           onError: _reportError,
-                                           onDone: _doneHandler);
-    } else {
-      if (_socketSubscription.isPaused) {
-        _socket.close();
-        throw new ArgumentError(
-            "Subscription passed to TLS upgrade is paused");
-      }
-      // If we are upgrading a socket that is already closed for read,
-      // report an error as if we received READ_CLOSED during the handshake.
-      dynamic s = _socket;  // Cast to dynamic to avoid warning.
-      if (s._socket.closedReadEventSent) {
-        _eventDispatcher(RawSocketEvent.READ_CLOSED);
-      }
-      _socketSubscription
-          ..onData(_eventDispatcher)
-          ..onError(_reportError)
-          ..onDone(_doneHandler);
-    }
-    try {
-      var encodedProtocols =
-          SecurityContext._protocolsToLengthEncoding(supportedProtocols);
-      _secureFilter.connect(address.host,
-                            context,
-                            is_server,
-                            requestClientCertificate ||
-                                requireClientCertificate,
-                            requireClientCertificate,
-                            encodedProtocols);
-      _secureHandshake();
-    } catch (e, s) {
-      _reportError(e, s);
-    }
-  }
-
-  StreamSubscription<RawSocketEvent> listen(void onData(RawSocketEvent data),
-                                            {Function onError,
-                                             void onDone(),
-                                             bool cancelOnError}) {
-    _sendWriteEvent();
-    return _stream.listen(onData,
-                          onError: onError,
-                          onDone: onDone,
-                          cancelOnError: cancelOnError);
-  }
-
-  static void _verifyFields(host,
-                            int requestedPort,
-                            bool is_server,
-                            bool requestClientCertificate,
-                            bool requireClientCertificate,
-                            Function onBadCertificate) {
-    if (host is! String && host is! InternetAddress) {
-      throw new ArgumentError("host is not a String or an InternetAddress");
-    }
-    if (requestedPort is! int) {
-      throw new ArgumentError("requestedPort is not an int");
-    }
-    if (requestedPort < 0 || requestedPort > 65535) {
-      throw new ArgumentError("requestedPort is not in the range 0..65535");
-    }
-    if (requestClientCertificate is! bool) {
-      throw new ArgumentError("requestClientCertificate is not a bool");
-    }
-    if (requireClientCertificate is! bool) {
-      throw new ArgumentError("requireClientCertificate is not a bool");
-    }
-    if (onBadCertificate != null && onBadCertificate is! Function) {
-      throw new ArgumentError("onBadCertificate is not null or a Function");
-    }
-   }
-
-  int get port => _socket.port;
-
-  InternetAddress get remoteAddress => _socket.remoteAddress;
-
-  int get remotePort => _socket.remotePort;
-
-  void set _owner(owner) {
-    (_socket as dynamic)._owner = owner;
-  }
-
-  int available() {
-    return _status != CONNECTED ? 0
-                                : _secureFilter.buffers[READ_PLAINTEXT].length;
-  }
-
-  Future<RawSecureSocket> close() {
-    shutdown(SocketDirection.BOTH);
-    return _closeCompleter.future;
-  }
-
-  void _completeCloseCompleter([dummy]) {
-    if (!_closeCompleter.isCompleted) _closeCompleter.complete(this);
-  }
-
-  void _close() {
-    _closedWrite = true;
-    _closedRead = true;
-    if (_socket != null) {
-      _socket.close().then(_completeCloseCompleter);
-    } else {
-      _completeCloseCompleter();
-    }
-    _socketClosedWrite = true;
-    _socketClosedRead = true;
-    if (!_filterActive && _secureFilter != null) {
-      _secureFilter.destroy();
-      _secureFilter = null;
-    }
-    if (_socketSubscription != null) {
-      _socketSubscription.cancel();
-    }
-    _controller.close();
-    _status = CLOSED;
-  }
-
-  void shutdown(SocketDirection direction) {
-    if (direction == SocketDirection.SEND ||
-        direction == SocketDirection.BOTH) {
-      _closedWrite = true;
-      if (_filterStatus.writeEmpty) {
-        _socket.shutdown(SocketDirection.SEND);
-        _socketClosedWrite = true;
-        if (_closedRead) {
-          _close();
-        }
-      }
-    }
-    if (direction == SocketDirection.RECEIVE ||
-        direction == SocketDirection.BOTH) {
-      _closedRead = true;
-      _socketClosedRead = true;
-      _socket.shutdown(SocketDirection.RECEIVE);
-      if (_socketClosedWrite) {
-        _close();
-      }
-    }
-  }
-
-  bool get writeEventsEnabled => _writeEventsEnabled;
-
-  void set writeEventsEnabled(bool value) {
-    _writeEventsEnabled = value;
-    if (value) {
-      Timer.run(() => _sendWriteEvent());
-    }
-  }
-
-  bool get readEventsEnabled => _readEventsEnabled;
-
-  void set readEventsEnabled(bool value) {
-      _readEventsEnabled = value;
-      _scheduleReadEvent();
-  }
-
-  List<int> read([int length]) {
-    if (length != null && (length is! int || length < 0)) {
-        throw new ArgumentError(
-            "Invalid length parameter in SecureSocket.read (length: $length)");
-    }
-    if (_closedRead) {
-      throw new SocketException("Reading from a closed socket");
-    }
-    if (_status != CONNECTED) {
-      return null;
-    }
-    var result = _secureFilter.buffers[READ_PLAINTEXT].read(length);
-    _scheduleFilter();
-    return result;
-  }
-
-  // Write the data to the socket, and schedule the filter to encrypt it.
-  int write(List<int> data, [int offset, int bytes]) {
-    if (bytes != null && (bytes is! int || bytes < 0)) {
-        throw new ArgumentError(
-            "Invalid bytes parameter in SecureSocket.read (bytes: $bytes)");
-    }
-    if (offset != null && (offset is! int || offset < 0)) {
-        throw new ArgumentError(
-            "Invalid offset parameter in SecureSocket.read (offset: $offset)");
-    }
-    if (_closedWrite) {
-      _controller.addError(new SocketException("Writing to a closed socket"));
-      return 0;
-    }
-    if (_status != CONNECTED) return 0;
-    if (offset == null) offset = 0;
-    if (bytes == null) bytes = data.length - offset;
-
-    int written =
-        _secureFilter.buffers[WRITE_PLAINTEXT].write(data, offset, bytes);
-    if (written > 0) {
-      _filterStatus.writeEmpty = false;
-    }
-    _scheduleFilter();
-    return written;
-  }
-
-  X509Certificate get peerCertificate => _secureFilter.peerCertificate;
-
-  String get selectedProtocol => _selectedProtocol;
-
-  bool _onBadCertificateWrapper(X509Certificate certificate) {
-    if (onBadCertificate == null) return false;
-    var result = onBadCertificate(certificate);
-    if (result is bool) return result;
-    throw new HandshakeException(
-        "onBadCertificate callback returned non-boolean $result");
-  }
-
-  bool setOption(SocketOption option, bool enabled) {
-    if (_socket == null) return false;
-    return _socket.setOption(option, enabled);
-  }
-
-  void _eventDispatcher(RawSocketEvent event) {
-    try {
-      if (event == RawSocketEvent.READ) {
-        _readHandler();
-      } else if (event == RawSocketEvent.WRITE) {
-        _writeHandler();
-      } else if (event == RawSocketEvent.READ_CLOSED) {
-        _closeHandler();
-      }
-    } catch (e, stackTrace) {
-      _reportError(e, stackTrace);
-    }
-  }
-
-  void _readHandler() {
-    _readSocket();
-    _scheduleFilter();
-  }
-
-  void _writeHandler() {
-    _writeSocket();
-    _scheduleFilter();
-  }
-
-  void _doneHandler() {
-    if (_filterStatus.readEmpty) {
-      _close();
-    }
-  }
-
-  void _reportError(e, [StackTrace stackTrace]) {
-    if (_status == CLOSED) {
-      return;
-    } else if (_connectPending) {
-      // _connectPending is true until the handshake has completed, and the
-      // _handshakeComplete future returned from SecureSocket.connect has
-      // completed.  Before this point, we must complete it with an error.
-      _handshakeComplete.completeError(e, stackTrace);
-    } else {
-      _controller.addError(e, stackTrace);
-    }
-    _close();
-  }
-
-  void _closeHandler() {
-    if  (_status == CONNECTED) {
-      if (_closedRead) return;
-      _socketClosedRead = true;
-      if (_filterStatus.readEmpty) {
-        _closedRead = true;
-        _controller.add(RawSocketEvent.READ_CLOSED);
-        if (_socketClosedWrite) {
-          _close();
-        }
-      } else {
-        _scheduleFilter();
-      }
-    } else if (_status == HANDSHAKE) {
-      _socketClosedRead = true;
-      if (_filterStatus.readEmpty) {
-      _reportError(
-          new HandshakeException('Connection terminated during handshake'),
-          null);
-      } else {
-        _secureHandshake();
-      }
-    }
-  }
-
-  void _secureHandshake() {
-    try {
-      _secureFilter.handshake();
-      _filterStatus.writeEmpty = false;
-      _readSocket();
-      _writeSocket();
-      _scheduleFilter();
-    } catch (e, stackTrace) {
-      _reportError(e, stackTrace);
-    }
-  }
-
-  void renegotiate({bool useSessionCache: true,
-                    bool requestClientCertificate: false,
-                    bool requireClientCertificate: false}) {
-    if (_status != CONNECTED) {
-      throw new HandshakeException(
-          "Called renegotiate on a non-connected socket");
-    }
-    _secureFilter.renegotiate(useSessionCache,
-                              requestClientCertificate,
-                              requireClientCertificate);
-    _status = HANDSHAKE;
-    _filterStatus.writeEmpty = false;
-    _scheduleFilter();
-  }
-
-  void _secureHandshakeCompleteHandler() {
-    _status = CONNECTED;
-    if (_connectPending) {
-      _connectPending = false;
-      try {
-        _selectedProtocol = _secureFilter.selectedProtocol();
-        // We don't want user code to run synchronously in this callback.
-        Timer.run(() => _handshakeComplete.complete(this));
-      } catch (error, stack) {
-        _handshakeComplete.completeError(error, stack);
-      }
-    }
-  }
-
-  void _onPauseStateChange() {
-    if (_controller.isPaused) {
-      _pauseCount++;
-    } else {
-      _pauseCount--;
-      if (_pauseCount == 0) {
-        _scheduleReadEvent();
-        _sendWriteEvent();  // Can send event synchronously.
-      }
-    }
-
-    if (!_socketClosedRead || !_socketClosedWrite) {
-      if (_controller.isPaused) {
-        _socketSubscription.pause();
-      } else {
-        _socketSubscription.resume();
-      }
-    }
-  }
-
-  void _onSubscriptionStateChange() {
-    if (_controller.hasListener) {
-      // TODO(ajohnsen): Do something here?
-    }
-  }
-
-  void _scheduleFilter() {
-    _filterPending = true;
-    _tryFilter();
-  }
-
-  void _tryFilter() {
-    if (_status == CLOSED) {
-      return;
-    }
-    if (_filterPending && !_filterActive) {
-      _filterActive = true;
-      _filterPending = false;
-      _pushAllFilterStages().then((status) {
-        _filterStatus = status;
-        _filterActive = false;
-        if (_status == CLOSED) {
-          _secureFilter.destroy();
-          _secureFilter = null;
-          return;
-        }
-        _socket.readEventsEnabled = true;
-        if (_filterStatus.writeEmpty && _closedWrite && !_socketClosedWrite) {
-          // Checks for and handles all cases of partially closed sockets.
-          shutdown(SocketDirection.SEND);
-          if (_status == CLOSED) {
-            return;
-          }
-        }
-        if (_filterStatus.readEmpty && _socketClosedRead && !_closedRead) {
-          if (_status == HANDSHAKE) {
-            _secureFilter.handshake();
-            if (_status == HANDSHAKE) {
-              throw new HandshakeException(
-                  'Connection terminated during handshake');
-            }
-          }
-          _closeHandler();
-        }
-        if (_status == CLOSED) {
-          return;
-        }
-        if (_filterStatus.progress) {
-          _filterPending = true;
-          if (_filterStatus.writeEncryptedNoLongerEmpty) {
-            _writeSocket();
-          }
-          if (_filterStatus.writePlaintextNoLongerFull) {
-            _sendWriteEvent();
-          }
-          if (_filterStatus.readEncryptedNoLongerFull) {
-            _readSocket();
-          }
-          if (_filterStatus.readPlaintextNoLongerEmpty) {
-            _scheduleReadEvent();
-          }
-          if (_status == HANDSHAKE) {
-            _secureHandshake();
-          }
-        }
-        _tryFilter();
-      }).catchError(_reportError);
-    }
-  }
-
-  List<int> _readSocketOrBufferedData(int bytes) {
-    if (_bufferedData != null) {
-      if (bytes > _bufferedData.length - _bufferedDataIndex) {
-        bytes = _bufferedData.length - _bufferedDataIndex;
-      }
-      var result = _bufferedData.sublist(_bufferedDataIndex,
-                                          _bufferedDataIndex + bytes);
-      _bufferedDataIndex += bytes;
-      if (_bufferedData.length == _bufferedDataIndex) {
-        _bufferedData = null;
-      }
-      return result;
-    } else if (!_socketClosedRead) {
-      return _socket.read(bytes);
-    } else {
-      return null;
-    }
-  }
-
-  void _readSocket() {
-    if (_status == CLOSED) return;
-    var buffer = _secureFilter.buffers[READ_ENCRYPTED];
-    if (buffer.writeFromSource(_readSocketOrBufferedData) > 0) {
-      _filterStatus.readEmpty = false;
-    } else {
-      _socket.readEventsEnabled = false;
-    }
-  }
-
-  void _writeSocket() {
-    if (_socketClosedWrite) return;
-    var buffer = _secureFilter.buffers[WRITE_ENCRYPTED];
-    if (buffer.readToSocket(_socket)) {  // Returns true if blocked
-      _socket.writeEventsEnabled = true;
-    }
-  }
-
-  // If a read event should be sent, add it to the controller.
-  _scheduleReadEvent() {
-    if (!_pendingReadEvent &&
-        _readEventsEnabled &&
-        _pauseCount == 0 &&
-        _secureFilter != null &&
-        !_secureFilter.buffers[READ_PLAINTEXT].isEmpty) {
-      _pendingReadEvent = true;
-      Timer.run(_sendReadEvent);
-    }
-  }
-
-  _sendReadEvent() {
-    _pendingReadEvent = false;
-    if (_status != CLOSED &&
-        _readEventsEnabled &&
-        _pauseCount == 0 &&
-        _secureFilter != null &&
-        !_secureFilter.buffers[READ_PLAINTEXT].isEmpty) {
-      _controller.add(RawSocketEvent.READ);
-      _scheduleReadEvent();
-    }
-  }
-
-  // If a write event should be sent, add it to the controller.
-  _sendWriteEvent() {
-    if (!_closedWrite &&
-        _writeEventsEnabled &&
-        _pauseCount == 0 &&
-        _secureFilter != null &&
-        _secureFilter.buffers[WRITE_PLAINTEXT].free > 0) {
-      _writeEventsEnabled = false;
-      _controller.add(RawSocketEvent.WRITE);
-    }
-  }
-
-  Future<_FilterStatus> _pushAllFilterStages() {
-    bool wasInHandshake = _status != CONNECTED;
-    List args = new List(2 + NUM_BUFFERS * 2);
-    args[0] = _secureFilter._pointer();
-    args[1] = wasInHandshake;
-    var bufs = _secureFilter.buffers;
-    for (var i = 0; i < NUM_BUFFERS; ++i) {
-      args[2 * i + 2] = bufs[i].start;
-      args[2 * i + 3] = bufs[i].end;
-    }
-
-    return _IOService._dispatch(_SSL_PROCESS_FILTER, args).then((response) {
-      if (response.length == 2) {
-        if (wasInHandshake) {
-          // If we're in handshake, throw a handshake error.
-          _reportError(
-              new HandshakeException('${response[1]} error ${response[0]}'),
-              null);
-        } else {
-          // If we're connected, throw a TLS error.
-          _reportError(new TlsException('${response[1]} error ${response[0]}'),
-                       null);
-        }
-      }
-      int start(int index) => response[2 * index];
-      int end(int index) => response[2 * index + 1];
-
-      _FilterStatus status = new _FilterStatus();
-      // Compute writeEmpty as "write plaintext buffer and write encrypted
-      // buffer were empty when we started and are empty now".
-      status.writeEmpty = bufs[WRITE_PLAINTEXT].isEmpty &&
-          start(WRITE_ENCRYPTED) == end(WRITE_ENCRYPTED);
-      // If we were in handshake when this started, _writeEmpty may be false
-      // because the handshake wrote data after we checked.
-      if (wasInHandshake) status.writeEmpty = false;
-
-      // Compute readEmpty as "both read buffers were empty when we started
-      // and are empty now".
-      status.readEmpty = bufs[READ_ENCRYPTED].isEmpty &&
-          start(READ_PLAINTEXT) == end(READ_PLAINTEXT);
-
-      _ExternalBuffer buffer = bufs[WRITE_PLAINTEXT];
-      int new_start = start(WRITE_PLAINTEXT);
-      if (new_start != buffer.start) {
-        status.progress = true;
-        if (buffer.free == 0) {
-          status.writePlaintextNoLongerFull = true;
-        }
-        buffer.start = new_start;
-      }
-      buffer = bufs[READ_ENCRYPTED];
-      new_start = start(READ_ENCRYPTED);
-      if (new_start != buffer.start) {
-        status.progress = true;
-        if (buffer.free == 0) {
-          status.readEncryptedNoLongerFull = true;
-        }
-        buffer.start = new_start;
-      }
-      buffer = bufs[WRITE_ENCRYPTED];
-      int new_end = end(WRITE_ENCRYPTED);
-      if (new_end != buffer.end) {
-        status.progress = true;
-        if (buffer.length == 0) {
-          status.writeEncryptedNoLongerEmpty = true;
-        }
-        buffer.end = new_end;
-      }
-      buffer = bufs[READ_PLAINTEXT];
-      new_end = end(READ_PLAINTEXT);
-      if (new_end != buffer.end) {
-        status.progress = true;
-        if (buffer.length == 0) {
-          status.readPlaintextNoLongerEmpty = true;
-        }
-        buffer.end = new_end;
-      }
-      return status;
-    });
-  }
-}
-
-
-/**
- * A circular buffer backed by an external byte array.  Accessed from
- * both C++ and Dart code in an unsynchronized way, with one reading
- * and one writing.  All updates to start and end are done by Dart code.
- */
-class _ExternalBuffer {
-  List data;  // This will be a ExternalByteArray, backed by C allocated data.
-  int start;
-  int end;
-  final size;
-
-  _ExternalBuffer(this.size) {
-    start = end = size ~/ 2;
-  }
-
-  void advanceStart(int bytes) {
-    assert(start > end || start + bytes <= end);
-    start += bytes;
-    if (start >= size) {
-      start -= size;
-      assert(start <= end);
-      assert(start < size);
-    }
-  }
-
-  void advanceEnd(int bytes) {
-    assert(start <= end || start > end + bytes);
-    end += bytes;
-    if (end >= size) {
-      end -= size;
-      assert(end < start);
-      assert(end < size);
-    }
-  }
-
-  bool get isEmpty => end == start;
-
-  int get length =>
-      start > end ? size + end - start : end - start;
-
-  int get linearLength =>
-      start > end ? size - start : end - start;
-
-  int get free =>
-      start > end ? start - end - 1 : size + start - end - 1;
-
-  int get linearFree {
-    if (start > end) return start - end - 1;
-    if (start == 0) return size - end - 1;
-    return size - end;
-  }
-
-  List<int> read(int bytes) {
-    if (bytes == null) {
-      bytes = length;
-    } else {
-      bytes = min(bytes, length);
-    }
-    if (bytes == 0) return null;
-    List<int> result = new Uint8List(bytes);
-    int bytesRead = 0;
-    // Loop over zero, one, or two linear data ranges.
-    while (bytesRead < bytes) {
-      int toRead = min(bytes - bytesRead, linearLength);
-      result.setRange(bytesRead,
-                      bytesRead + toRead,
-                      data,
-                      start);
-      advanceStart(toRead);
-      bytesRead += toRead;
-    }
-    return result;
-  }
-
-  int write(List<int> inputData, int offset, int bytes) {
-    if (bytes > free) {
-      bytes = free;
-    }
-    int written = 0;
-    int toWrite = min(bytes, linearFree);
-    // Loop over zero, one, or two linear data ranges.
-    while (toWrite > 0) {
-      data.setRange(end, end + toWrite, inputData, offset);
-      advanceEnd(toWrite);
-      offset += toWrite;
-      written += toWrite;
-      toWrite = min(bytes - written, linearFree);
-    }
-    return written;
-  }
-
-  int writeFromSource(List<int> getData(int requested)) {
-    int written = 0;
-    int toWrite = linearFree;
-    // Loop over zero, one, or two linear data ranges.
-    while (toWrite > 0) {
-      // Source returns at most toWrite bytes, and it returns null when empty.
-      var inputData = getData(toWrite);
-      if (inputData == null || inputData.length == 0) break;
-      var len = inputData.length;
-      data.setRange(end, end + len, inputData);
-      advanceEnd(len);
-      written += len;
-      toWrite = linearFree;
-    }
-    return written;
-  }
-
-  bool readToSocket(RawSocket socket) {
-    // Loop over zero, one, or two linear data ranges.
-    while (true) {
-      var toWrite = linearLength;
-      if (toWrite == 0) return false;
-      int bytes = socket.write(data, start, toWrite);
-      advanceStart(bytes);
-      if (bytes < toWrite) {
-        // The socket has blocked while we have data to write.
-        return true;
-      }
-    }
-  }
-}
-
-
-abstract class _SecureFilter {
-  external factory _SecureFilter();
-
-  void connect(String hostName,
-               SecurityContext context,
-               bool is_server,
-               bool requestClientCertificate,
-               bool requireClientCertificate,
-               Uint8List protocols);
-  void destroy();
-  void handshake();
-  String selectedProtocol();
-  void rehandshake();
-  void renegotiate(bool useSessionCache,
-                   bool requestClientCertificate,
-                   bool requireClientCertificate);
-  void init();
-  X509Certificate get peerCertificate;
-  int processBuffer(int bufferIndex);
-  void registerBadCertificateCallback(Function callback);
-  void registerHandshakeCompleteCallback(Function handshakeCompleteHandler);
-
-  // This call may cause a reference counted pointer in the native
-  // implementation to be retained. It should only be called when the resulting
-  // value is passed to the IO service through a call to dispatch().
-  int _pointer();
-
-  List<_ExternalBuffer> get buffers;
-}
-
-/** A secure networking exception caused by a failure in the
- *  TLS/SSL protocol.
- */
-class TlsException implements IOException {
-  final String type;
-  final String message;
-  final OSError osError;
-
-  const TlsException([String message = "",
-                      OSError osError = null])
-     : this._("TlsException", message, osError);
-
-  const TlsException._(this.type, this.message, this.osError);
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write(type);
-    if (!message.isEmpty) {
-      sb.write(": $message");
-      if (osError != null) {
-        sb.write(" ($osError)");
-      }
-    } else if (osError != null) {
-      sb.write(": $osError");
-    }
-    return sb.toString();
-  }
-}
-
-
-/**
- * An exception that happens in the handshake phase of establishing
- * a secure network connection.
- */
-class HandshakeException extends TlsException {
-  const HandshakeException([String message = "",
-                            OSError osError = null])
-     : super._("HandshakeException", message, osError);
-}
-
-
-/**
- * An exception that happens in the handshake phase of establishing
- * a secure network connection, when looking up or verifying a
- * certificate.
- */
-class CertificateException extends TlsException {
-  const CertificateException([String message = "",
-                            OSError osError = null])
-     : super._("CertificateException", message, osError);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/security_context.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/security_context.dart
deleted file mode 100644
index d99b05b..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/security_context.dart
+++ /dev/null
@@ -1,267 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * The object containing the certificates to trust when making
- * a secure client connection, and the certificate chain and
- * private key to serve from a secure server.
- *
- * The [SecureSocket]  and [SecureServer] classes take a SecurityContext
- * as an argument to their connect and bind methods.
- *
- * Certificates and keys can be added to a SecurityContext from either PEM
- * or PKCS12 containers.
- *
- * iOS note: Some methods to add, remove, and inspect certificates are not yet
- * implemented. However, the platform's built-in trusted certificates can
- * be used, by way of [SecurityContext.defaultContext].
- */
-abstract class SecurityContext {
-  external factory SecurityContext();
-
-  /**
-   * Secure networking classes with an optional `context` parameter
-   * use the [defaultContext] object if the parameter is omitted.
-   * This object can also be accessed, and modified, directly.
-   * Each isolate has a different [defaultContext] object.
-   * The [defaultContext] object uses a list of well-known trusted
-   * certificate authorities as its trusted roots. On Linux and Windows, this
-   * list is taken from Mozilla, who maintains it as part of Firefox. On,
-   * MacOS, iOS, and Android, this list comes from the trusted certificates
-   * stores built in to the platforms.
-   */
-  external static SecurityContext get defaultContext;
-
-  /**
-   * Sets the private key for a server certificate or client certificate.
-   *
-   * A secure connection using this SecurityContext will use this key with
-   * the server or client certificate to sign and decrypt messages.
-   * [file] is the path to a PEM or PKCS12 file containing an encrypted
-   * private key, encrypted with [password]. Assuming it is well-formatted, all
-   * other contents of [file] are ignored. An unencrypted file can be used,
-   * but this is not usual.
-   *
-   * NB: This function calls [ReadFileAsBytesSync], and will block on file IO.
-   * Prefer using [usePrivateKeyBytes].
-   *
-   * iOS note: Only PKCS12 data is supported. It should contain both the private
-   * key and the certificate chain. On iOS one call to [usePrivateKey] with this
-   * data is used instead of two calls to [useCertificateChain] and
-   * [usePrivateKey].
-   */
-  void usePrivateKey(String file, {String password});
-
-  /**
-   * Sets the private key for a server certificate or client certificate.
-   *
-   * Like [usePrivateKey], but takes the contents of the file as a list
-   * of bytes.
-   */
-  void usePrivateKeyBytes(List<int> keyBytes, {String password});
-
-  /**
-   * Sets the set of trusted X509 certificates used by [SecureSocket]
-   * client connections, when connecting to a secure server.
-   *
-   * [file] is the path to a PEM or PKCS12 file containing X509 certificates,
-   * usually root certificates from certificate authorities. For PKCS12 files,
-   * [password] is the password for the file. For PEM files, [password] is
-   * ignored. Assuming it is well-formatted, all other contents of [file] are
-   * ignored.
-   *
-   * NB: This function calls [ReadFileAsBytesSync], and will block on file IO.
-   * Prefer using [setTrustedCertificatesBytes].
-   *
-   * iOS note: On iOS, this call takes only the bytes for a single DER
-   * encoded X509 certificate. It may be called multiple times to add
-   * multiple trusted certificates to the context. A DER encoded certificate
-   * can be obtained from a PEM encoded certificate by using the openssl tool:
-   *
-   *   $ openssl x509 -outform der -in cert.pem -out cert.der
-   */
-  void setTrustedCertificates(String file, {String password});
-
-  /**
-   * Sets the set of trusted X509 certificates used by [SecureSocket]
-   * client connections, when connecting to a secure server.
-   *
-   * Like [setTrustedCertificates] but takes the contents of the file.
-   */
-  void setTrustedCertificatesBytes(List<int> certBytes, {String password});
-
-  /**
-   * Sets the chain of X509 certificates served by [SecureServer]
-   * when making secure connections, including the server certificate.
-   *
-   * [file] is a PEM or PKCS12 file containing X509 certificates, starting with
-   * the root authority and intermediate authorities forming the signed
-   * chain to the server certificate, and ending with the server certificate.
-   * The private key for the server certificate is set by [usePrivateKey]. For
-   * PKCS12 files, [password] is the password for the file. For PEM files,
-   * [password] is ignored. Assuming it is well-formatted, all
-   * other contents of [file] are ignored.
-   *
-   * NB: This function calls [ReadFileAsBytesSync], and will block on file IO.
-   * Prefer using [useCertificateChainBytes].
-   *
-   * iOS note: As noted above, [usePrivateKey] does the job of both
-   * that call and this one. On iOS, this call is a no-op.
-   */
-  void useCertificateChain(String file, {String password});
-
-  /**
-   * Sets the chain of X509 certificates served by [SecureServer]
-   * when making secure connections, including the server certificate.
-   *
-   * Like [useCertificateChain] but takes the contents of the file.
-   */
-  void useCertificateChainBytes(List<int> chainBytes, {String password});
-
-  /**
-   * Sets the list of authority names that a [SecureServer] will advertise
-   * as accepted when requesting a client certificate from a connecting
-   * client.
-   *
-   * [file] is a PEM or PKCS12 file containing the accepted signing
-   * authority certificates - the authority names are extracted from the
-   * certificates. For PKCS12 files, [password] is the password for the file.
-   * For PEM files, [password] is ignored. Assuming it is well-formatted, all
-   * other contents of [file] are ignored.
-   *
-   * NB: This function calls [ReadFileAsBytesSync], and will block on file IO.
-   * Prefer using [setClientAuthoritiesBytes].
-   *
-   * iOS note: This call is not supported.
-   */
-  void setClientAuthorities(String file, {String password});
-
-  /**
-   * Sets the list of authority names that a [SecureServer] will advertise
-   * as accepted, when requesting a client certificate from a connecting
-   * client.
-   *
-   * Like [setClientAuthority] but takes the contents of the file.
-   */
-  void setClientAuthoritiesBytes(List<int> authCertBytes, {String password});
-
-  /**
-   * Whether the platform supports ALPN.
-   */
-  external static bool get alpnSupported;
-
-  /**
-   * Sets the list of application-level protocols supported by a client
-   * connection or server connection. The ALPN (application level protocol
-   * negotiation) extension to TLS allows a client to send a list of
-   * protocols in the TLS client hello message, and the server to pick
-   * one and send the selected one back in its server hello message.
-   *
-   * Separate lists of protocols can be sent for client connections and
-   * for server connections, using the same SecurityContext.  The [isServer]
-   * boolean argument specifies whether to set the list for server connections
-   * or client connections.
-   */
-   void setAlpnProtocols(List<String> protocols, bool isServer);
-
-  /// Encodes a set of supported protocols for ALPN/NPN usage.
-  ///
-  /// The `protocols` list is expected to contain protocols in descending order
-  /// of preference.
-  ///
-  /// See RFC 7301 (https://tools.ietf.org/html/rfc7301) for the encoding of
-  /// `List<String> protocols`:
-  ///     opaque ProtocolName<1..2^8-1>;
-  ///
-  ///     struct {
-  ///         ProtocolName protocol_name_list<2..2^16-1>
-  ///     } ProtocolNameList;
-  ///
-  /// The encoding of the opaque `ProtocolName<lower..upper>` vector is
-  /// described in RFC 2246: 4.3 Vectors.
-  ///
-  /// Note: Even though this encoding scheme would allow a total
-  /// `ProtocolNameList` length of 65535, this limit cannot be reached. Testing
-  /// showed that more than ~ 2^14  bytes will fail to negotiate a protocol.
-  /// We will be conservative and support only messages up to (1<<13)-1 bytes.
-  static Uint8List _protocolsToLengthEncoding(List<String> protocols) {
-    if (protocols == null || protocols.length == 0) {
-      return new Uint8List(0);
-    }
-    int protocolsLength = protocols.length;
-
-    // Calculate the number of bytes we will need if it is ASCII.
-    int expectedLength = protocolsLength;
-    for (int i = 0; i < protocolsLength; i++) {
-      int length = protocols[i].length;
-      if (length > 0 && length <= 255) {
-        expectedLength += length;
-      } else {
-        throw new ArgumentError(
-            'Length of protocol must be between 1 and 255 (was: $length).');
-      }
-    }
-
-    if (expectedLength >= (1 << 13)) {
-      throw new ArgumentError(
-          'The maximum message length supported is 2^13-1.');
-    }
-
-    // Try encoding the `List<String> protocols` array using fast ASCII path.
-    var bytes = new Uint8List(expectedLength);
-    int bytesOffset = 0;
-    for (int i = 0; i < protocolsLength; i++) {
-      String proto = protocols[i];
-
-      // Add length byte.
-      bytes[bytesOffset++] = proto.length;
-      int bits = 0;
-
-      // Add protocol bytes.
-      for (int j = 0; j < proto.length; j++) {
-        var char = proto.codeUnitAt(j);
-        bits |= char;
-        bytes[bytesOffset++] = char & 0xff;
-      }
-
-      // Go slow case if we have encountered anything non-ascii.
-      if (bits > 0x7f) {
-        return _protocolsToLengthEncodingNonAsciiBailout(protocols);
-      }
-    }
-    return bytes;
-  }
-
-  static Uint8List _protocolsToLengthEncodingNonAsciiBailout(
-      List<String> protocols) {
-    void addProtocol(List<int> outBytes, String protocol) {
-      var protocolBytes = UTF8.encode(protocol);
-      var len = protocolBytes.length;
-
-      if (len > 255) {
-        throw new ArgumentError(
-            'Length of protocol must be between 1 and 255 (was: $len)');
-      }
-      // Add length byte.
-      outBytes.add(len);
-
-      // Add protocol bytes.
-      outBytes.addAll(protocolBytes);
-    }
-
-    List<int> bytes = [];
-    for (var i = 0; i < protocols.length; i++) {
-      addProtocol(bytes, protocols[i]);
-    }
-
-    if (bytes.length >= (1 << 13)) {
-      throw new ArgumentError(
-          'The maximum message length supported is 2^13-1.');
-    }
-
-    return new Uint8List.fromList(bytes);
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/service_object.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/service_object.dart
deleted file mode 100644
index 43bd651..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/service_object.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// 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.
-
-part of dart.io;
-
-int _nextServiceId = 1;
-
-// TODO(ajohnsen): Use other way of getting a uniq id.
-abstract class _ServiceObject {
-  int __serviceId = 0;
-  int get _serviceId {
-    if (__serviceId == 0) __serviceId = _nextServiceId++;
-    return __serviceId;
-  }
-
-  Map _toJSON(bool ref);
-
-  String get _servicePath => "$_serviceTypePath/$_serviceId";
-
-  String get _serviceTypePath;
-
-  String get _serviceTypeName;
-
-  String _serviceType(bool ref) {
-    if (ref) return "@$_serviceTypeName";
-    return _serviceTypeName;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/socket.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/socket.dart
deleted file mode 100644
index f85a5bd..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/socket.dart
+++ /dev/null
@@ -1,738 +0,0 @@
-// 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.
-
-part of dart.io;
-
-
-/**
- * [InternetAddressType] is the type an [InternetAddress]. Currently,
- * IP version 4 (IPv4) and IP version 6 (IPv6) are supported.
- */
-class InternetAddressType {
-  static const InternetAddressType IP_V4 = const InternetAddressType._(0);
-  static const InternetAddressType IP_V6 = const InternetAddressType._(1);
-  static const InternetAddressType ANY = const InternetAddressType._(-1);
-
-  final int _value;
-
-  const InternetAddressType._(this._value);
-
-  factory InternetAddressType._from(int value) {
-    if (value == 0) return IP_V4;
-    if (value == 1) return IP_V6;
-    throw new ArgumentError("Invalid type: $value");
-  }
-
-  /**
-   * Get the name of the type, e.g. "IP_V4" or "IP_V6".
-   */
-  String get name {
-    switch (_value) {
-      case -1: return "ANY";
-      case 0: return "IP_V4";
-      case 1: return "IP_V6";
-      default: throw new ArgumentError("Invalid InternetAddress");
-    }
-  }
-
-  String toString() => "InternetAddressType: $name";
-}
-
-
-/**
- * An internet address.
- *
- * This object holds an internet address. If this internet address
- * is the result of a DNS lookup, the address also holds the hostname
- * used to make the lookup.
- * An Internet address combined with a port number represents an
- * endpoint to which a socket can connect or a listening socket can
- * bind.
- */
-abstract class InternetAddress {
-  /**
-   * IP version 4 loopback address. Use this address when listening on
-   * or connecting to the loopback adapter using IP version 4 (IPv4).
-   */
-  external static InternetAddress get LOOPBACK_IP_V4;
-
-  /**
-   * IP version 6 loopback address. Use this address when listening on
-   * or connecting to the loopback adapter using IP version 6 (IPv6).
-   */
-  external static InternetAddress get LOOPBACK_IP_V6;
-
-  /**
-   * IP version 4 any address. Use this address when listening on
-   * all adapters IP addresses using IP version 4 (IPv4).
-   */
-  external static InternetAddress get ANY_IP_V4;
-
-  /**
-   * IP version 6 any address. Use this address when listening on
-   * all adapters IP addresses using IP version 6 (IPv6).
-   */
-  external static InternetAddress get ANY_IP_V6;
-
-  /**
-   * The [type] of the [InternetAddress] specified what IP protocol.
-   */
-  InternetAddressType type;
-
-  /**
-   * The numeric address of the host. For IPv4 addresses this is using
-   * the dotted-decimal notation. For IPv6 it is using the
-   * hexadecimal representation.
-   */
-  String get address;
-
-  /**
-   * The host used to lookup the address. If there is no host
-   * associated with the address this returns the numeric address.
-   */
-  String get host;
-
-  /**
-   * Get the raw address of this [InternetAddress]. The result is either a
-   * 4 or 16 byte long list. The returned list is a copy, making it possible
-   * to change the list without modifying the [InternetAddress].
-   */
-  List<int> get rawAddress;
-
-  /**
-   * Returns true if the [InternetAddress] is a loopback address.
-   */
-  bool get isLoopback;
-
-  /**
-   * Returns true if the [InternetAddress]s scope is a link-local.
-   */
-  bool get isLinkLocal;
-
-  /**
-   * Returns true if the [InternetAddress]s scope is multicast.
-   */
-  bool get isMulticast;
-
-  /**
-   * Creates a new [InternetAddress] from a numeric address.
-   *
-   * If the address in [address] is not a numeric IPv4
-   * (dotted-decimal notation) or IPv6 (hexadecimal representation).
-   * address [ArgumentError] is thrown.
-   */
-  external factory InternetAddress(String address);
-
-  /**
-   * Perform a reverse dns lookup on the [address], creating a new
-   * [InternetAddress] where the host field set to the result.
-   */
-  Future<InternetAddress> reverse();
-
-  /**
-   * Lookup a host, returning a Future of a list of
-   * [InternetAddress]s. If [type] is [InternetAddressType.ANY], it
-   * will lookup both IP version 4 (IPv4) and IP version 6 (IPv6)
-   * addresses. If [type] is either [InternetAddressType.IP_V4] or
-   * [InternetAddressType.IP_V6] it will only lookup addresses of the
-   * specified type. The order of the list can, and most likely will,
-   * change over time.
-   */
-  external static Future<List<InternetAddress>> lookup(
-      String host, {InternetAddressType type: InternetAddressType.ANY});
-
-  /**
-   * Clones the given [address] with the new [host].
-   *
-   * The [address] must be an [InternetAddress] that was created with one
-   * of the static methods of this class.
-   */
-  external static InternetAddress _cloneWithNewHost(
-      InternetAddress address, String host);
-}
-
-
-/**
- * A [NetworkInterface] represents an active network interface on the current
- * system. It contains a list of [InternetAddress]es that are bound to the
- * interface.
- */
-abstract class NetworkInterface {
-  /**
-   * Get the name of the [NetworkInterface].
-   */
-  String get name;
-
-  /**
-   * Get the index of the [NetworkInterface].
-   */
-  String get index;
-
-  /**
-   * Get a list of [InternetAddress]es currently bound to this
-   * [NetworkInterface].
-   */
-  List<InternetAddress> get addresses;
-
-  /**
-   * Whether [list] is supported.
-   *
-   * [list] is currently unsupported on Android.
-   */
-  external static bool get listSupported;
-
-  /**
-   * Query the system for [NetworkInterface]s.
-   *
-   * If [includeLoopback] is `true`, the returned list will include the
-   * loopback device. Default is `false`.
-   *
-   * If [includeLinkLocal] is `true`, the list of addresses of the returned
-   * [NetworkInterface]s, may include link local addresses. Default is `false`.
-   *
-   * If [type] is either [InternetAddressType.IP_V4] or
-   * [InternetAddressType.IP_V6] it will only lookup addresses of the
-   * specified type. Default is [InternetAddressType.ANY].
-   */
-  external static Future<List<NetworkInterface>> list({
-      bool includeLoopback: false,
-      bool includeLinkLocal: false,
-      InternetAddressType type: InternetAddressType.ANY});
-}
-
-
-/**
- * A [RawServerSocket] represents a listening socket, and provides a
- * stream of low-level [RawSocket] objects, one for each connection
- * made to the listening socket.
- *
- * See [RawSocket] for more info.
- */
-abstract class RawServerSocket implements Stream<RawSocket> {
-  /**
-   * Returns a future for a [:RawServerSocket:]. When the future
-   * completes the server socket is bound to the given [address] and
-   * [port] and has started listening on it.
-   *
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If an IP version 6 (IPv6) address is used, both IP version 6
-   * (IPv6) and version 4 (IPv4) connections will be accepted. To
-   * restrict this to version 6 (IPv6) only, use [v6Only] to set
-   * version 6 only.
-   *
-   * If [port] has the value [:0:] an ephemeral port will
-   * be chosen by the system. The actual port used can be retrieved
-   * using the [:port:] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * The optional argument [shared] specifies whether additional RawServerSocket
-   * objects can bind to the same combination of `address`, `port` and `v6Only`.
-   * If `shared` is `true` and more `RawServerSocket`s from this isolate or
-   * other isolates are bound to the port, then the incoming connections will be
-   * distributed among all the bound `RawServerSocket`s. Connections can be
-   * distributed over multiple isolates this way.
-   */
-  external static Future<RawServerSocket> bind(address,
-                                               int port,
-                                               {int backlog: 0,
-                                                bool v6Only: false,
-                                                bool shared: false});
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port;
-
-  /**
-   * Returns the address used by this socket.
-   */
-  InternetAddress get address;
-
-  /**
-   * Closes the socket. The returned future completes when the socket
-   * is fully closed and is no longer bound.
-   */
-  Future<RawServerSocket> close();
-}
-
-
-/**
- * A [ServerSocket] represents a listening socket, and provides a
- * stream of [Socket] objects, one for each connection made to the
- * listening socket.
- *
- * See [Socket] for more info.
- */
-abstract class ServerSocket implements Stream<Socket> {
-  /**
-   * Returns a future for a [:ServerSocket:]. When the future
-   * completes the server socket is bound to the given [address] and
-   * [port] and has started listening on it.
-   *
-   * The [address] can either be a [String] or an
-   * [InternetAddress]. If [address] is a [String], [bind] will
-   * perform a [InternetAddress.lookup] and use the first value in the
-   * list. To listen on the loopback adapter, which will allow only
-   * incoming connections from the local host, use the value
-   * [InternetAddress.LOOPBACK_IP_V4] or
-   * [InternetAddress.LOOPBACK_IP_V6]. To allow for incoming
-   * connection from the network use either one of the values
-   * [InternetAddress.ANY_IP_V4] or [InternetAddress.ANY_IP_V6] to
-   * bind to all interfaces or the IP address of a specific interface.
-   *
-   * If an IP version 6 (IPv6) address is used, both IP version 6
-   * (IPv6) and version 4 (IPv4) connections will be accepted. To
-   * restrict this to version 6 (IPv6) only, use [v6Only] to set
-   * version 6 only.
-   *
-   * If [port] has the value [:0:] an ephemeral port will be chosen by
-   * the system. The actual port used can be retrieved using the
-   * [port] getter.
-   *
-   * The optional argument [backlog] can be used to specify the listen
-   * backlog for the underlying OS listen setup. If [backlog] has the
-   * value of [:0:] (the default) a reasonable value will be chosen by
-   * the system.
-   *
-   * The optional argument [shared] specifies whether additional ServerSocket
-   * objects can bind to the same combination of `address`, `port` and `v6Only`.
-   * If `shared` is `true` and more `ServerSocket`s from this isolate or other
-   * isolates are bound to the port, then the incoming connections will be
-   * distributed among all the bound `ServerSocket`s. Connections can be
-   * distributed over multiple isolates this way.
-   */
-  external static Future<ServerSocket> bind(address,
-                                            int port,
-                                            {int backlog: 0,
-                                             bool v6Only: false,
-                                             bool shared: false});
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port;
-
-  /**
-   * Returns the address used by this socket.
-   */
-  InternetAddress get address;
-
-  /**
-   * Closes the socket. The returned future completes when the socket
-   * is fully closed and is no longer bound.
-   */
-  Future<ServerSocket> close();
-}
-
-
-/**
- * The [SocketDirection] is used as a parameter to [Socket.close] and
- * [RawSocket.close] to close a socket in the specified direction(s).
- */
-class SocketDirection {
-  static const SocketDirection RECEIVE = const SocketDirection._(0);
-  static const SocketDirection SEND = const SocketDirection._(1);
-  static const SocketDirection BOTH = const SocketDirection._(2);
-  final _value;
-
-  const SocketDirection._(this._value);
-}
-
-/**
- * The [SocketOption] is used as a parameter to [Socket.setOption] and
- * [RawSocket.setOption] to set customize the behaviour of the underlying
- * socket.
- */
-class SocketOption {
-  /**
-   * Enable or disable no-delay on the socket. If TCP_NODELAY is enabled, the
-   * socket will not buffer data internally, but instead write each data chunk
-   * as an invidual TCP packet.
-   *
-   * TCP_NODELAY is disabled by default.
-   */
-  static const SocketOption TCP_NODELAY = const SocketOption._(0);
-
-  static const SocketOption _IP_MULTICAST_LOOP = const SocketOption._(1);
-  static const SocketOption _IP_MULTICAST_HOPS = const SocketOption._(2);
-  static const SocketOption _IP_MULTICAST_IF = const SocketOption._(3);
-  static const SocketOption _IP_BROADCAST = const SocketOption._(4);
-  final _value;
-
-  const SocketOption._(this._value);
-}
-
-/**
- * Events for the [RawSocket].
- */
-class RawSocketEvent {
-  static const RawSocketEvent READ = const RawSocketEvent._(0);
-  static const RawSocketEvent WRITE = const RawSocketEvent._(1);
-  static const RawSocketEvent READ_CLOSED = const RawSocketEvent._(2);
-  static const RawSocketEvent CLOSED = const RawSocketEvent._(3);
-  final int _value;
-
-  const RawSocketEvent._(this._value);
-  String toString() {
-    return const ['RawSocketEvent:READ',
-                  'RawSocketEvent:WRITE',
-                  'RawSocketEvent:READ_CLOSED',
-                  'RawSocketEvent:CLOSED'][_value];
-  }
-}
-
-/**
- * The [RawSocket] is a low-level interface to a socket, exposing the raw
- * events signaled by the system. It's a [Stream] of [RawSocketEvent]s.
- */
-abstract class RawSocket implements Stream<RawSocketEvent> {
-  /**
-   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.READ]
-   * events. Default is [:true:].
-   */
-  bool readEventsEnabled;
-
-  /**
-   * Set or get, if the [RawSocket] should listen for [RawSocketEvent.WRITE]
-   * events. Default is [:true:].
-   * This is a one-shot listener, and writeEventsEnabled must be set
-   * to true again to receive another write event.
-   */
-  bool writeEventsEnabled;
-
-  /**
-   * Creates a new socket connection to the host and port and returns a [Future]
-   * that will complete with either a [RawSocket] once connected or an error
-   * if the host-lookup or connection failed.
-   *
-   * [host] can either be a [String] or an [InternetAddress]. If [host] is a
-   * [String], [connect] will perform a [InternetAddress.lookup] and try
-   * all returned [InternetAddress]es, until connected. Unless a
-   * connection was established, the error from the first failing connection is
-   * returned.
-   *
-   * The argument [sourceAddress] can be used to specify the local
-   * address to bind when making the connection. `sourceAddress` can either
-   * be a `String` or an `InternetAddress`. If a `String` is passed it must
-   * hold a numeric IP address.
-   */
-  external static Future<RawSocket> connect(host, int port, {sourceAddress});
-
-  /**
-   * Returns the number of received and non-read bytes in the socket that
-   * can be read.
-   */
-  int available();
-
-  /**
-   * Read up to [len] bytes from the socket. This function is
-   * non-blocking and will only return data if data is available. The
-   * number of bytes read can be less then [len] if fewer bytes are
-   * available for immediate reading. If no data is available [:null:]
-   * is returned.
-   */
-  List<int> read([int len]);
-
-  /**
-   * Writes up to [count] bytes of the buffer from [offset] buffer offset to
-   * the socket. The number of successfully written bytes is returned. This
-   * function is non-blocking and will only write data if buffer space is
-   * available in the socket.
-   *
-   * The default value for [offset] is 0, and the default value for [count] is
-   * [:buffer.length - offset:].
-   */
-  int write(List<int> buffer, [int offset, int count]);
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port;
-
-  /**
-   * Returns the remote port connected to by this socket.
-   */
-  int get remotePort;
-
-  /**
-   * Returns the [InternetAddress] used to connect this socket.
-   */
-  InternetAddress get address;
-
-  /**
-   * Returns the remote [InternetAddress] connected to by this socket.
-   */
-  InternetAddress get remoteAddress;
-
-  /**
-   * Closes the socket. Returns a Future that completes with [this] when the
-   * underlying connection is completely destroyed.
-   *
-   * Calling [close] will never throw an exception
-   * and calling it several times is supported. Calling [close] can result in
-   * a [RawSocketEvent.READ_CLOSED] event.
-   */
-  Future<RawSocket> close();
-
-  /**
-   * Shutdown the socket in the [direction]. Calling [shutdown] will never
-   * throw an exception and calling it several times is supported. Calling
-   * shutdown with either [SocketDirection.BOTH] or [SocketDirection.RECEIVE]
-   * can result in a [RawSocketEvent.READ_CLOSED] event.
-   */
-  void shutdown(SocketDirection direction);
-
-  /**
-   * Use [setOption] to customize the [RawSocket]. See [SocketOption] for
-   * available options.
-   *
-   * Returns [:true:] if the option was set successfully, false otherwise.
-   */
-  bool setOption(SocketOption option, bool enabled);
-}
-
-/**
- * A high-level class for communicating over a TCP socket.
- *
- * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it
- * ideal for using together with other [Stream]s.
- */
-abstract class Socket implements Stream<List<int>>, IOSink {
-  /**
-   * Creates a new socket connection to the host and port and returns a [Future]
-   * that will complete with either a [Socket] once connected or an error
-   * if the host-lookup or connection failed.
-   *
-   * [host] can either be a [String] or an [InternetAddress]. If [host] is a
-   * [String], [connect] will perform a [InternetAddress.lookup] and try
-   * all returned [InternetAddress]es, until connected. Unless a
-   * connection was established, the error from the first failing connection is
-   * returned.
-   *
-   * The argument [sourceAddress] can be used to specify the local
-   * address to bind when making the connection. `sourceAddress` can either
-   * be a `String` or an `InternetAddress`. If a `String` is passed it must
-   * hold a numeric IP address.
-   */
-  external static Future<Socket> connect(host, int port, {sourceAddress});
-
-  /**
-   * Destroy the socket in both directions. Calling [destroy] will make the
-   * send a close event on the stream and will no longer react on data being
-   * piped to it.
-   *
-   * Call [close](inherited from [IOSink]) to only close the [Socket]
-   * for sending data.
-   */
-  void destroy();
-
-  /**
-   * Use [setOption] to customize the [RawSocket]. See [SocketOption] for
-   * available options.
-   *
-   * Returns [:true:] if the option was set successfully, false otherwise.
-   */
-  bool setOption(SocketOption option, bool enabled);
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port;
-
-  /**
-   * Returns the remote port connected to by this socket.
-   */
-  int get remotePort;
-
-  /**
-   * Returns the [InternetAddress] used to connect this socket.
-   */
-  InternetAddress get address;
-
-  /**
-   * Returns the remote [InternetAddress] connected to by this socket.
-   */
-  InternetAddress get remoteAddress;
-}
-
-
-/**
- * Datagram package. Data send to and received from datagram sockets
- * contains the internet address and port of the destination or source
- * togeter with the data.
- */
-class Datagram {
-  List<int> data;
-  InternetAddress address;
-  int port;
-
-  Datagram(this.data, this.address, this.port);
-}
-
-
-/**
- * The [RawDatagramSocket] is a low-level interface to an UDP socket,
- * exposing the raw events signaled by the system. It's a [Stream] of
- * [RawSocketEvent]s.
- *
- * Note that the event [RawSocketEvent.READ_CLOSED] will never be
- * received as an UDP socket cannot be closed by a remote peer.
- */
-abstract class RawDatagramSocket extends Stream<RawSocketEvent> {
-  /**
-   * Set or get, if the [RawDatagramSocket] should listen for
-   * [RawSocketEvent.READ] events. Default is [:true:].
-   */
-  bool readEventsEnabled;
-
-  /**
-   * Set or get, if the [RawDatagramSocket] should listen for
-   * [RawSocketEvent.WRITE] events. Default is [:true:].  This is a
-   * one-shot listener, and writeEventsEnabled must be set to true
-   * again to receive another write event.
-   */
-  bool writeEventsEnabled;
-
-  /**
-   * Set or get, whether multicast traffic is looped back to the host.
-   *
-   * By default multicast loopback is enabled.
-   */
-  bool multicastLoopback;
-
-  /**
-   * Set or get, the maximum network hops for multicast packages
-   * originating from this socket.
-   *
-   * For IPv4 this is referred to as TTL (time to live).
-   *
-   * By default this value is 1 causing multicast traffic to stay on
-   * the local network.
-   */
-  int multicastHops;
-
-  /**
-   * Set or get, the network interface used for outgoing multicast packages.
-   *
-   * A value of `null`indicate that the system chooses the network
-   * interface to use.
-   *
-   * By default this value is `null`
-   */
-  NetworkInterface multicastInterface;
-
-  /**
-   * Set or get, whether IPv4 broadcast is enabled.
-   *
-   * IPv4 broadcast needs to be enabled by the sender for sending IPv4
-   * broadcast packages. By default IPv4 broadcast is disabled.
-   *
-   * For IPv6 there is no general broadcast mechanism. Use multicast
-   * instead.
-   */
-  bool broadcastEnabled;
-
-  /**
-   * Creates a new raw datagram socket binding it to an address and
-   * port.
-   */
-  external static Future<RawDatagramSocket> bind(
-      host, int port, {bool reuseAddress: true});
-
-  /**
-   * Returns the port used by this socket.
-   */
-  int get port;
-
-  /**
-   * Returns the address used by this socket.
-   */
-  InternetAddress get address;
-
-  /**
-   * Close the datagram socket.
-   */
-  void close();
-
-  /**
-   * Send a datagram.
-   *
-   * Returns the number of bytes written. This will always be either
-   * the size of [buffer] or `0`.
-   */
-  int send(List<int> buffer, InternetAddress address, int port);
-
-  /**
-   * Receive a datagram. If there are no datagrams available `null` is
-   * returned.
-   *
-   * The maximum length of the datagram that can be received is 65503 bytes.
-   */
-  Datagram receive();
-
-  /**
-   * Join a multicast group.
-   *
-   * If an error occur when trying to join the multicast group an
-   * exception is thrown.
-   */
-  void joinMulticast(InternetAddress group, {NetworkInterface interface});
-
-  /**
-   * Leave a multicast group.
-   *
-   * If an error occur when trying to join the multicase group an
-   * exception is thrown.
-   */
-  void leaveMulticast(InternetAddress group, {NetworkInterface interface});
-}
-
-
-class SocketException implements IOException {
-  final String message;
-  final OSError osError;
-  final InternetAddress address;
-  final int port;
-
-  const SocketException(this.message, {this.osError, this.address, this.port});
-  const SocketException.closed()
-      : message = 'Socket has been closed',
-        osError = null,
-        address = null,
-        port = null;
-
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write("SocketException");
-    if (!message.isEmpty) {
-      sb.write(": $message");
-      if (osError != null) {
-        sb.write(" ($osError)");
-      }
-    } else if (osError != null) {
-      sb.write(": $osError");
-    }
-    if (address != null) {
-      sb.write(", address = ${address.host}");
-    }
-    if (port != null) {
-      sb.write(", port = $port");
-    }
-    return sb.toString();
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/stdio.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/stdio.dart
deleted file mode 100644
index 03721e9..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/stdio.dart
+++ /dev/null
@@ -1,361 +0,0 @@
-// 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.
-
-part of dart.io;
-
-const int _STDIO_HANDLE_TYPE_TERMINAL = 0;
-const int _STDIO_HANDLE_TYPE_PIPE = 1;
-const int _STDIO_HANDLE_TYPE_FILE = 2;
-const int _STDIO_HANDLE_TYPE_SOCKET = 3;
-const int _STDIO_HANDLE_TYPE_OTHER = 4;
-
-
-class _StdStream extends Stream<List<int>> {
-  final Stream<List<int>> _stream;
-
-  _StdStream(this._stream);
-
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
-                                       {Function onError,
-                                        void onDone(),
-                                        bool cancelOnError}) {
-    return _stream.listen(
-        onData,
-        onError: onError,
-        onDone: onDone,
-        cancelOnError: cancelOnError);
-  }
-}
-
-
-/**
- * [Stdin] allows both synchronous and asynchronous reads from the standard
- * input stream.
- *
- * Mixing synchronous and asynchronous reads is undefined.
- */
-class Stdin extends _StdStream implements Stream<List<int>> {
-  Stdin._(Stream<List<int>> stream) : super(stream);
-
-  /**
-   * Synchronously read a line from stdin. This call will block until a full
-   * line is available.
-   *
-   * The argument [encoding] can be used to changed how the input should be
-   * decoded. Default is [SYSTEM_ENCODING].
-   *
-   * If [retainNewlines] is `false`, the returned String will not contain the
-   * final newline. If `true`, the returned String will contain the line
-   * terminator. Default is `false`.
-   *
-   * If end-of-file is reached after any bytes have been read from stdin,
-   * that data is returned.
-   * Returns `null` if no bytes preceeded the end of input.
-   */
-  String readLineSync({Encoding encoding: SYSTEM_ENCODING,
-                       bool retainNewlines: false}) {
-    const CR = 13;
-    const LF = 10;
-    final List line = [];
-    // On Windows, if lineMode is disabled, only CR is received.
-    bool crIsNewline = Platform.isWindows &&
-        (stdioType(stdin) == StdioType.TERMINAL) &&
-        !lineMode;
-    if (retainNewlines) {
-      int byte;
-      do {
-        byte = readByteSync();
-        if (byte < 0) {
-          break;
-        }
-        line.add(byte);
-      } while (byte != LF && !(byte == CR && crIsNewline));
-      if (line.isEmpty) {
-        return null;
-      }
-    } else if (crIsNewline) {
-      // CR and LF are both line terminators, neither is retained.
-      while (true) {
-        int byte = readByteSync();
-        if (byte < 0) {
-          if (line.isEmpty) return null;
-          break;
-        }
-        if (byte == LF || byte == CR) break;
-        line.add(byte);
-      }
-    } else {
-      // Case having to hande CR LF as a single unretained line terminator.
-      outer: while (true) {
-        int byte = readByteSync();
-        if (byte == LF) break;
-        if (byte == CR) {
-          do {
-            byte = readByteSync();
-            if (byte == LF) break outer;
-
-            line.add(CR);
-          } while (byte == CR);
-          // Fall through and handle non-CR character.
-        }
-        if (byte < 0) {
-          if (line.isEmpty) return null;
-          break;
-        }
-        line.add(byte);
-      }
-    }
-    return encoding.decode(line);
-  }
-
-  /**
-   * Check if echo mode is enabled on [stdin].
-   */
-  external bool get echoMode;
-
-  /**
-   * Enable or disable echo mode on [stdin].
-   *
-   * If disabled, input from to console will not be echoed.
-   *
-   * Default depends on the parent process, but usually enabled.
-   */
-  external void set echoMode(bool enabled);
-
-  /**
-   * Check if line mode is enabled on [stdin].
-   */
-  external bool get lineMode;
-
-  /**
-   * Enable or disable line mode on [stdin].
-   *
-   * If enabled, characters are delayed until a new-line character is entered.
-   * If disabled, characters will be available as typed.
-   *
-   * Default depends on the parent process, but usually enabled.
-   */
-  external void set lineMode(bool enabled);
-
-  /**
-   * Synchronously read a byte from stdin. This call will block until a byte is
-   * available.
-   *
-   * If at end of file, -1 is returned.
-   */
-  external int readByteSync();
-}
-
-
-/**
- * [Stdout] represents the [IOSink] for either `stdout` or `stderr`.
- *
- * It provides a *blocking* `IOSink`, so using this to write will block until
- * the output is written.
- *
- * In some situations this blocking behavior is undesirable as it does not
- * provide the same non-blocking behavior as dart:io in general exposes.
- * Use the property [nonBlocking] to get an `IOSink` which has the non-blocking
- * behavior.
- *
- * This class can also be used to check whether `stdout` or `stderr` is
- * connected to a terminal and query some terminal properties.
- */
-class Stdout extends _StdSink implements IOSink {
-  final int _fd;
-  IOSink _nonBlocking;
-
-  Stdout._(IOSink sink, this._fd) : super(sink);
-
-  /**
-   * Returns true if there is a terminal attached to stdout.
-   */
-  bool get hasTerminal => _hasTerminal(_fd);
-
-  /**
-   * Get the number of columns of the terminal.
-   *
-   * If no terminal is attached to stdout, a [StdoutException] is thrown. See
-   * [hasTerminal] for more info.
-   */
-  int get terminalColumns => _terminalColumns(_fd);
-
-  /**
-   * Get the number of lines of the terminal.
-   *
-   * If no terminal is attached to stdout, a [StdoutException] is thrown. See
-   * [hasTerminal] for more info.
-   */
-  int get terminalLines => _terminalLines(_fd);
-
-  external bool _hasTerminal(int fd);
-  external int _terminalColumns(int fd);
-  external int _terminalLines(int fd);
-
-  /**
-   * Get a non-blocking `IOSink`.
-   */
-  IOSink get nonBlocking {
-    if (_nonBlocking == null) {
-      _nonBlocking = new IOSink(new _FileStreamConsumer.fromStdio(_fd));
-    }
-    return _nonBlocking;
-  }
-}
-
-
-class StdoutException implements IOException {
-  final String message;
-  final OSError osError;
-
-  const StdoutException(this.message, [this.osError]);
-
-  String toString() {
-    return "StdoutException: $message${osError == null ? "" : ", $osError"}";
-  }
-}
-
-class _StdConsumer implements StreamConsumer<List<int>> {
-  final _file;
-
-  _StdConsumer(int fd) : _file = _File._openStdioSync(fd);
-
-  Future addStream(Stream<List<int>> stream) {
-    var completer = new Completer();
-    var sub;
-    sub = stream.listen(
-        (data) {
-          try {
-            _file.writeFromSync(data);
-          } catch (e, s) {
-            sub.cancel();
-            completer.completeError(e, s);
-          }
-        },
-        onError: completer.completeError,
-        onDone: completer.complete,
-        cancelOnError: true);
-    return completer.future;
-  }
-
-  Future close() {
-    _file.closeSync();
-    return new Future.value();
-  }
-}
-
-class _StdSink implements IOSink {
-  final IOSink _sink;
-
-  _StdSink(this._sink);
-
-  Encoding get encoding => _sink.encoding;
-  void set encoding(Encoding encoding) {
-    _sink.encoding = encoding;
-  }
-  void write(object) { _sink.write(object); }
-  void writeln([object = "" ]) { _sink.writeln(object); }
-  void writeAll(objects, [sep = ""]) { _sink.writeAll(objects, sep); }
-  void add(List<int> data) { _sink.add(data); }
-  void addError(error, [StackTrace stackTrace]) {
-    _sink.addError(error, stackTrace);
-  }
-  void writeCharCode(int charCode) { _sink.writeCharCode(charCode); }
-  Future addStream(Stream<List<int>> stream) => _sink.addStream(stream);
-  Future flush() => _sink.flush();
-  Future close() => _sink.close();
-  Future get done => _sink.done;
-}
-
-/// The type of object a standard IO stream is attached to.
-class StdioType {
-  static const StdioType TERMINAL = const StdioType._("terminal");
-  static const StdioType PIPE = const StdioType._("pipe");
-  static const StdioType FILE = const StdioType._("file");
-  static const StdioType OTHER = const StdioType._("other");
-  final String name;
-  const StdioType._(this.name);
-  String toString() => "StdioType: $name";
-}
-
-
-Stdin _stdin;
-Stdout _stdout;
-Stdout _stderr;
-
-
-/// The standard input stream of data read by this program.
-Stdin get stdin {
-  if (_stdin == null) {
-    _stdin = _StdIOUtils._getStdioInputStream();
-  }
-  return _stdin;
-}
-
-
-/// The standard output stream of data written by this program.
-Stdout get stdout {
-  if (_stdout == null) {
-    _stdout = _StdIOUtils._getStdioOutputStream(1);
-  }
-  return _stdout;
-}
-
-
-/// The standard output stream of errors written by this program.
-Stdout get stderr {
-  if (_stderr == null) {
-    _stderr = _StdIOUtils._getStdioOutputStream(2);
-  }
-  return _stderr;
-}
-
-
-/// For a stream, returns whether it is attached to a file, pipe, terminal, or
-/// something else.
-StdioType stdioType(object) {
-  if (object is _StdStream) {
-    object = object._stream;
-  } else if (object == stdout || object == stderr) {
-    switch (_StdIOUtils._getStdioHandleType(object == stdout ? 1 : 2)) {
-      case _STDIO_HANDLE_TYPE_TERMINAL: return StdioType.TERMINAL;
-      case _STDIO_HANDLE_TYPE_PIPE: return StdioType.PIPE;
-      case _STDIO_HANDLE_TYPE_FILE:  return StdioType.FILE;
-    }
-  }
-  if (object is _FileStream) {
-    return StdioType.FILE;
-  }
-  if (object is Socket) {
-    int socketType = _StdIOUtils._socketType(object);
-    if (socketType == null) return StdioType.OTHER;
-    switch (socketType) {
-      case _STDIO_HANDLE_TYPE_TERMINAL:
-        return StdioType.TERMINAL;
-      case _STDIO_HANDLE_TYPE_PIPE:
-        return StdioType.PIPE;
-      case _STDIO_HANDLE_TYPE_FILE:
-        return StdioType.FILE;
-    }
-  }
-  if (object is _IOSinkImpl) {
-    try {
-      if (object._target is _FileStreamConsumer) {
-        return StdioType.FILE;
-      }
-    } catch (e) {
-      // Only the interface implemented, _sink not available.
-    }
-  }
-  return StdioType.OTHER;
-}
-
-
-class _StdIOUtils {
-  external static _getStdioOutputStream(int fd);
-  external static Stdin _getStdioInputStream();
-  /// Returns the socket type or `null` if [socket] is not a builtin socket.
-  external static int _socketType(Socket socket);
-  external static _getStdioHandleType(int fd);
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/string_transformer.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/string_transformer.dart
deleted file mode 100644
index ab17eaf..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/string_transformer.dart
+++ /dev/null
@@ -1,130 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/// The current system encoding.
-///
-/// This us used for converting from bytes to/from String when
-/// communicating on stdin, stdout and stderr.
-///
-/// On Windows this will use the currently active code page for the
-/// conversion. On all other systems it will always use UTF-8.
-const SystemEncoding SYSTEM_ENCODING = const SystemEncoding();
-
-/**
- * The system encoding is the current code page on Windows and UTF-8 on
- * Linux and Mac.
- */
-class SystemEncoding extends Encoding {
-  const SystemEncoding();
-
-  String get name => 'system';
-
-  List<int> encode(String input) => encoder.convert(input);
-  String decode(List<int> encoded) => decoder.convert(encoded);
-
-  Converter<String, List<int>> get encoder {
-    if (Platform.operatingSystem == "windows") {
-      return const _WindowsCodePageEncoder();
-    } else {
-      return const Utf8Encoder();
-    }
-  }
-
-  Converter<List<int>, String> get decoder {
-    if (Platform.operatingSystem == "windows") {
-      return const _WindowsCodePageDecoder();
-    } else {
-      return const Utf8Decoder();
-    }
-  }
-}
-
-class _WindowsCodePageEncoder extends Converter<String, List<int>> {
-
-  const _WindowsCodePageEncoder();
-
-  List<int> convert(String input) {
-    List<int> encoded = _encodeString(input);
-    if (encoded == null) {
-      throw new FormatException("Invalid character for encoding");
-    }
-    return encoded;
-  }
-
-  /**
-   * Starts a chunked conversion.
-   */
-  StringConversionSink startChunkedConversion(Sink<List<int>> sink) {
-    return new _WindowsCodePageEncoderSink(sink);
-  }
-
-  external static List<int> _encodeString(String string);
-}
-
-class _WindowsCodePageEncoderSink extends StringConversionSinkBase {
-  // TODO(floitsch): provide more efficient conversions when the input is
-  // not a String.
-
-  final Sink<List<int>> _sink;
-
-  _WindowsCodePageEncoderSink(this._sink);
-
-  void close() {
-    _sink.close();
-  }
-
-  void add(String string) {
-    List<int> encoded = _WindowsCodePageEncoder._encodeString(string);
-    if (encoded == null) {
-      throw new FormatException("Invalid character for encoding");
-    }
-    _sink.add(encoded);
-  }
-
-  void addSlice(String source, int start, int end, bool isLast) {
-    if (start != 0 || end != source.length) {
-      source = source.substring(start, end);
-    }
-    add(source);
-    if (isLast) close();
-  }
-}
-
-
-class _WindowsCodePageDecoder extends Converter<List<int>, String> {
-
-  const _WindowsCodePageDecoder();
-
-  String convert(List<int> input) {
-    return _decodeBytes(input);
-  }
-
-  /**
-   * Starts a chunked conversion.
-   */
-  ByteConversionSink startChunkedConversion(Sink<String> sink) {
-    return new _WindowsCodePageDecoderSink(sink);
-  }
-
-  external static String _decodeBytes(List<int> bytes);
-}
-
-class _WindowsCodePageDecoderSink extends ByteConversionSinkBase {
-  // TODO(floitsch): provide more efficient conversions when the input is
-  // a slice.
-
-  final Sink<String> _sink;
-
-  _WindowsCodePageDecoderSink(this._sink);
-
-  void close() {
-    _sink.close();
-  }
-
-  void add(List<int> bytes) {
-    _sink.add(_WindowsCodePageDecoder._decodeBytes(bytes));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/websocket.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/websocket.dart
deleted file mode 100644
index 183714f..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/websocket.dart
+++ /dev/null
@@ -1,410 +0,0 @@
-// 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.
-
-part of dart.io;
-
-/**
- * WebSocket status codes used when closing a WebSocket connection.
- */
-abstract class WebSocketStatus {
-  static const int NORMAL_CLOSURE = 1000;
-  static const int GOING_AWAY = 1001;
-  static const int PROTOCOL_ERROR = 1002;
-  static const int UNSUPPORTED_DATA = 1003;
-  static const int RESERVED_1004 = 1004;
-  static const int NO_STATUS_RECEIVED = 1005;
-  static const int ABNORMAL_CLOSURE = 1006;
-  static const int INVALID_FRAME_PAYLOAD_DATA = 1007;
-  static const int POLICY_VIOLATION = 1008;
-  static const int MESSAGE_TOO_BIG = 1009;
-  static const int MISSING_MANDATORY_EXTENSION = 1010;
-  static const int INTERNAL_SERVER_ERROR = 1011;
-  static const int RESERVED_1015 = 1015;
-}
-
-/**
- * The [CompressionOptions] class allows you to control
- * the options of WebSocket compression.
- */
-class CompressionOptions {
-  /**
-   * Default WebSocket Compression options.
-   * Compression will be enabled with the following options:
-   * clientNoContextTakeover: false
-   * serverNoContextTakeover: false
-   * clientMaxWindowBits: 15
-   * serverMaxWindowBits: 15
-   */
-  static const CompressionOptions DEFAULT = const CompressionOptions();
-
-  /**
-   * Disables WebSocket Compression.
-   */
-  static const CompressionOptions OFF =
-      const CompressionOptions(enabled: false);
-
-  /**
-   * Control whether the client will reuse it's compression instances.
-   */
-  final bool clientNoContextTakeover;
-
-  /**
-   * Control whether the server will reuse it's compression instances.
-   */
-  final bool serverNoContextTakeover;
-
-  /**
-   * Sets the Max Window Bits for the Client.
-   */
-  final int clientMaxWindowBits;
-
-  /**
-   * Sets the Max Window Bits for the Server.
-   */
-  final int serverMaxWindowBits;
-
-  /**
-   * Enables or disables WebSocket compression.
-   */
-  final bool enabled;
-
-  const CompressionOptions(
-      {this.clientNoContextTakeover: false,
-      this.serverNoContextTakeover: false,
-      this.clientMaxWindowBits,
-      this.serverMaxWindowBits,
-      this.enabled: true});
-
-  /// Parses list of requested server headers to return server compression
-  /// response headers. Uses [serverMaxWindowBits] value if set, otherwise will
-  /// attempt to use value from headers. Defaults to
-  /// [WebSocket.DEFAULT_WINDOW_BITS]. Returns a [_CompressionMaxWindowBits]
-  /// object which contains the response headers and negotiated max window bits.
-  _CompressionMaxWindowBits _createServerResponseHeader(HeaderValue requested) {
-    var info = new _CompressionMaxWindowBits();
-
-    int mwb;
-    String part;
-    if (requested?.parameters != null) {
-      part = requested.parameters[_serverMaxWindowBits];
-    }
-    if (part != null) {
-      if (part.length >= 2 && part.startsWith('0')) {
-        throw new ArgumentError("Illegal 0 padding on value.");
-      } else {
-        mwb = serverMaxWindowBits == null
-            ? int.parse(part,
-                        onError: (source) => _WebSocketImpl.DEFAULT_WINDOW_BITS)
-            : serverMaxWindowBits;
-        info.headerValue = "; server_max_window_bits=${mwb}";
-        info.maxWindowBits = mwb;
-      }
-    } else {
-      info.headerValue = "";
-      info.maxWindowBits = _WebSocketImpl.DEFAULT_WINDOW_BITS;
-    }
-    return info;
-  }
-
-  /// Returns default values for client compression request headers.
-  String _createClientRequestHeader(HeaderValue requested, int size) {
-    var info = "";
-
-    // If responding to a valid request, specify size
-    if (requested != null) {
-      info = "; client_max_window_bits=$size";
-    } else {
-      // Client request. Specify default
-      if (clientMaxWindowBits == null) {
-        info = "; client_max_window_bits";
-      } else {
-        info = "; client_max_window_bits=$clientMaxWindowBits";
-      }
-      if (serverMaxWindowBits != null) {
-        info += "; server_max_window_bits=$serverMaxWindowBits";
-      }
-    }
-
-    return info;
-  }
-
-  /// Create a Compression Header. If [requested] is null or contains
-  /// client request headers, returns Client compression request headers with
-  /// default settings for `client_max_window_bits` header value.
-  /// If [requested] contains server response headers this method returns
-  /// a Server compression response header negotiating the max window bits
-  /// for both client and server as requested server_max_window_bits value.
-  /// This method returns a [_CompressionMaxWindowBits] object with the
-  /// response headers and negotiated maxWindowBits value.
-  _CompressionMaxWindowBits _createHeader([HeaderValue requested]) {
-    var info = new _CompressionMaxWindowBits("", 0);
-    if (!enabled) {
-      return info;
-    }
-
-    info.headerValue = _WebSocketImpl.PER_MESSAGE_DEFLATE;
-
-    if (clientNoContextTakeover &&
-        (requested == null || (requested != null &&
-            requested.parameters.containsKey(_clientNoContextTakeover)))) {
-      info.headerValue += "; client_no_context_takeover";
-    }
-
-    if (serverNoContextTakeover &&
-        (requested == null || (requested != null &&
-            requested.parameters.containsKey(_serverNoContextTakeover)))) {
-      info.headerValue += "; server_no_context_takeover";
-    }
-
-    var headerList = _createServerResponseHeader(requested);
-    info.headerValue += headerList.headerValue;
-    info.maxWindowBits = headerList.maxWindowBits;
-
-    info.headerValue +=
-        _createClientRequestHeader(requested, info.maxWindowBits);
-
-    return info;
-  }
-}
-
-/**
- * The [WebSocketTransformer] provides the ability to upgrade a
- * [HttpRequest] to a [WebSocket] connection. It supports both
- * upgrading a single [HttpRequest] and upgrading a stream of
- * [HttpRequest]s.
- *
- * To upgrade a single [HttpRequest] use the static [upgrade] method.
- *
- *     HttpServer server;
- *     server.listen((request) {
- *       if (...) {
- *         WebSocketTransformer.upgrade(request).then((websocket) {
- *           ...
- *         });
- *       } else {
- *         // Do normal HTTP request processing.
- *       }
- *     });
- *
- * To transform a stream of [HttpRequest] events as it implements a
- * stream transformer that transforms a stream of HttpRequest into a
- * stream of WebSockets by upgrading each HttpRequest from the HTTP or
- * HTTPS server, to the WebSocket protocol.
- *
- *     server.transform(new WebSocketTransformer()).listen((webSocket) => ...);
- *
- * This transformer strives to implement WebSockets as specified by RFC6455.
- */
-abstract class WebSocketTransformer
-    implements StreamTransformer<HttpRequest, WebSocket> {
-  /**
-   * Create a new [WebSocketTransformer].
-   *
-   * If [protocolSelector] is provided, [protocolSelector] will be called to
-   * select what protocol to use, if any were provided by the client.
-   * [protocolSelector] is should return either a [String] or a [Future]
-   * completing with a [String]. The [String] must exist in the list of
-   * protocols.
-   *
-   * If [compression] is provided, the [WebSocket] created will be configured
-   * to negotiate with the specified [CompressionOptions]. If none is specified
-   * then the [WebSocket] will be created with the default [CompressionOptions].
-   */
-  factory WebSocketTransformer(
-          {protocolSelector(List<String> protocols),
-          CompressionOptions compression: CompressionOptions.DEFAULT}) =>
-      new _WebSocketTransformerImpl(protocolSelector, compression);
-
-  /**
-   * Upgrades a [HttpRequest] to a [WebSocket] connection. If the
-   * request is not a valid WebSocket upgrade request an HTTP response
-   * with status code 500 will be returned. Otherwise the returned
-   * future will complete with the [WebSocket] when the upgrade pocess
-   * is complete.
-   *
-   * If [protocolSelector] is provided, [protocolSelector] will be called to
-   * select what protocol to use, if any were provided by the client.
-   * [protocolSelector] is should return either a [String] or a [Future]
-   * completing with a [String]. The [String] must exist in the list of
-   * protocols.
-   *
-   * If [compression] is provided, the [WebSocket] created will be configured
-   * to negotiate with the specified [CompressionOptions]. If none is specified
-   * then the [WebSocket] will be created with the default [CompressionOptions].
-   */
-  static Future<WebSocket> upgrade(HttpRequest request,
-      {protocolSelector(List<String> protocols),
-      CompressionOptions compression: CompressionOptions.DEFAULT}) {
-    return _WebSocketTransformerImpl._upgrade(
-        request, protocolSelector, compression);
-  }
-
-  /**
-   * Checks whether the request is a valid WebSocket upgrade request.
-   */
-  static bool isUpgradeRequest(HttpRequest request) {
-    return _WebSocketTransformerImpl._isUpgradeRequest(request);
-  }
-}
-
-/**
- * A two-way HTTP communication object for client or server applications.
- *
- * The stream exposes the messages received. A text message will be of type
- * [:String:] and a binary message will be of type [:List<int>:].
- */
-abstract class WebSocket implements Stream, StreamSink {
-  /**
-   * Possible states of the connection.
-   */
-  static const int CONNECTING = 0;
-  static const int OPEN = 1;
-  static const int CLOSING = 2;
-  static const int CLOSED = 3;
-
-  /**
-   * Set and get the interval for sending ping signals. If a ping message is not
-   * answered by a pong message from the peer, the `WebSocket` is assumed
-   * disconnected and the connection is closed with a
-   * [WebSocketStatus.GOING_AWAY] close code. When a ping signal is sent, the
-   * pong message must be received within [pingInterval].
-   *
-   * There are never two outstanding pings at any given time, and the next ping
-   * timer starts when the pong is received.
-   *
-   * Set the [pingInterval] to `null` to disable sending ping messages.
-   *
-   * The default value is `null`.
-   */
-  Duration pingInterval;
-
-  /**
-   * Create a new WebSocket connection. The URL supplied in [url]
-   * must use the scheme `ws` or `wss`.
-   *
-   * The [protocols] argument is specifying the subprotocols the
-   * client is willing to speak.
-   *
-   * The [headers] argument is specifying additional HTTP headers for
-   * setting up the connection. This would typically be the `Origin`
-   * header and potentially cookies. The keys of the map are the header
-   * fields and the values are either String or List<String>.
-   *
-   * If [headers] is provided, there are a number of headers
-   * which are controlled by the WebSocket connection process. These
-   * headers are:
-   *
-   *   - `connection`
-   *   - `sec-websocket-key`
-   *   - `sec-websocket-protocol`
-   *   - `sec-websocket-version`
-   *   - `upgrade`
-   *
-   * If any of these are passed in the `headers` map they will be ignored.
-   *
-   * If the `url` contains user information this will be passed as basic
-   * authentication when setting up the connection.
-   */
-  static Future<WebSocket> connect(String url,
-          {Iterable<String> protocols,
-          Map<String, dynamic> headers,
-          CompressionOptions compression: CompressionOptions.DEFAULT}) =>
-      _WebSocketImpl.connect(url, protocols, headers, compression: compression);
-
-  @Deprecated('This constructor will be removed in Dart 2.0. Use `implements`'
-      ' instead of `extends` if implementing this abstract class.')
-  WebSocket();
-
-  /**
-   * Creates a WebSocket from an already-upgraded socket.
-   *
-   * The initial WebSocket handshake must have occurred prior to this call. A
-   * WebSocket client can automatically perform the handshake using
-   * [WebSocket.connect], while a server can do so using
-   * [WebSocketTransformer.upgrade]. To manually upgrade an [HttpRequest],
-   * [HttpRequest.detachSocket] may be called.
-   *
-   * [protocol] should be the protocol negotiated by this handshake, if any.
-   *
-   * [serverSide] must be passed explicitly. If it's `false`, the WebSocket will
-   * act as the client and mask the messages it sends. If it's `true`, it will
-   * act as the server and will not mask its messages.
-   *
-   * If [compression] is provided, the [WebSocket] created will be configured
-   * to negotiate with the specified [CompressionOptions]. If none is specified
-   * then the [WebSocket] will be created with the default [CompressionOptions].
-   */
-  factory WebSocket.fromUpgradedSocket(Socket socket,
-      {String protocol,
-      bool serverSide,
-      CompressionOptions compression: CompressionOptions.DEFAULT}) {
-    if (serverSide == null) {
-      throw new ArgumentError("The serverSide argument must be passed "
-          "explicitly to WebSocket.fromUpgradedSocket.");
-    }
-    return new _WebSocketImpl._fromSocket(
-        socket, protocol, compression, serverSide);
-  }
-
-  /**
-   * Returns the current state of the connection.
-   */
-  int get readyState;
-
-  /**
-   * The extensions property is initially the empty string. After the
-   * WebSocket connection is established this string reflects the
-   * extensions used by the server.
-   */
-  String get extensions;
-
-  /**
-   * The protocol property is initially the empty string. After the
-   * WebSocket connection is established the value is the subprotocol
-   * selected by the server. If no subprotocol is negotiated the
-   * value will remain [:null:].
-   */
-  String get protocol;
-
-  /**
-   * The close code set when the WebSocket connection is closed. If
-   * there is no close code available this property will be [:null:]
-   */
-  int get closeCode;
-
-  /**
-   * The close reason set when the WebSocket connection is closed. If
-   * there is no close reason available this property will be [:null:]
-   */
-  String get closeReason;
-
-  /**
-   * Closes the WebSocket connection. Set the optional [code] and [reason]
-   * arguments to send close information to the remote peer. If they are
-   * omitted, the peer will see [WebSocketStatus.NO_STATUS_RECEIVED] code
-   * with no reason.
-   */
-  Future close([int code, String reason]);
-
-  /**
-   * Sends data on the WebSocket connection. The data in [data] must
-   * be either a [:String:], or a [:List<int>:] holding bytes.
-   */
-  void add(data);
-
-  /**
-   * Sends data from a stream on WebSocket connection. Each data event from
-   * [stream] will be send as a single WebSocket frame. The data from [stream]
-   * must be either [:String:]s, or [:List<int>:]s holding bytes.
-   */
-  Future addStream(Stream stream);
-}
-
-class WebSocketException implements IOException {
-  final String message;
-
-  const WebSocketException([this.message = ""]);
-
-  String toString() => "WebSocketException: $message";
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/io/websocket_impl.dart b/pkg/dev_compiler/tool/input_sdk/lib/io/websocket_impl.dart
deleted file mode 100644
index 18d1cf2..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/io/websocket_impl.dart
+++ /dev/null
@@ -1,1258 +0,0 @@
-// 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.
-
-part of dart.io;
-
-const String _webSocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
-const String _clientNoContextTakeover = "client_no_context_takeover";
-const String _serverNoContextTakeover = "server_no_context_takeover";
-const String _clientMaxWindowBits = "client_max_window_bits";
-const String _serverMaxWindowBits = "server_max_window_bits";
-
-// Matches _WebSocketOpcode.
-class _WebSocketMessageType {
-  static const int NONE = 0;
-  static const int TEXT = 1;
-  static const int BINARY = 2;
-}
-
-class _WebSocketOpcode {
-  static const int CONTINUATION = 0;
-  static const int TEXT = 1;
-  static const int BINARY = 2;
-  static const int RESERVED_3 = 3;
-  static const int RESERVED_4 = 4;
-  static const int RESERVED_5 = 5;
-  static const int RESERVED_6 = 6;
-  static const int RESERVED_7 = 7;
-  static const int CLOSE = 8;
-  static const int PING = 9;
-  static const int PONG = 10;
-  static const int RESERVED_B = 11;
-  static const int RESERVED_C = 12;
-  static const int RESERVED_D = 13;
-  static const int RESERVED_E = 14;
-  static const int RESERVED_F = 15;
-}
-
-/**
- *  Stores the header and integer value derived from negotiation of
- *  client_max_window_bits and server_max_window_bits. headerValue will be
- *  set in the Websocket response headers.
- */
-class _CompressionMaxWindowBits {
-  String headerValue;
-  int maxWindowBits;
-  _CompressionMaxWindowBits([this.headerValue, this.maxWindowBits]);
-  String toString() => headerValue;
-}
-
-/**
- * The web socket protocol transformer handles the protocol byte stream
- * which is supplied through the [:handleData:]. As the protocol is processed,
- * it'll output frame data as either a List<int> or String.
- *
- * Important information about usage: Be sure you use cancelOnError, so the
- * socket will be closed when the processor encounter an error. Not using it
- * will lead to undefined behaviour.
- */
-// TODO(ajohnsen): make this transformer reusable?
-class _WebSocketProtocolTransformer
-    implements StreamTransformer<List<int>, dynamic>, EventSink<Uint8List> {
-  static const int START = 0;
-  static const int LEN_FIRST = 1;
-  static const int LEN_REST = 2;
-  static const int MASK = 3;
-  static const int PAYLOAD = 4;
-  static const int CLOSED = 5;
-  static const int FAILURE = 6;
-  static const int FIN = 0x80;
-  static const int RSV1 = 0x40;
-  static const int RSV2 = 0x20;
-  static const int RSV3 = 0x10;
-  static const int OPCODE = 0xF;
-
-  int _state = START;
-  bool _fin = false;
-  bool _compressed = false;
-  int _opcode = -1;
-  int _len = -1;
-  bool _masked = false;
-  int _remainingLenBytes = -1;
-  int _remainingMaskingKeyBytes = 4;
-  int _remainingPayloadBytes = -1;
-  int _unmaskingIndex = 0;
-  int _currentMessageType = _WebSocketMessageType.NONE;
-  int closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
-  String closeReason = "";
-
-  EventSink _eventSink;
-
-  final bool _serverSide;
-  final List _maskingBytes = new List(4);
-  final BytesBuilder _payload = new BytesBuilder(copy: false);
-
-  _WebSocketPerMessageDeflate _deflate;
-  _WebSocketProtocolTransformer([this._serverSide = false, this._deflate]);
-
-  Stream bind(Stream stream) {
-    return new Stream.eventTransformed(stream, (EventSink eventSink) {
-      if (_eventSink != null) {
-        throw new StateError("WebSocket transformer already used.");
-      }
-      _eventSink = eventSink;
-      return this;
-    });
-  }
-
-  void addError(Object error, [StackTrace stackTrace]) {
-    _eventSink.addError(error, stackTrace);
-  }
-
-  void close() { _eventSink.close(); }
-
-  /**
-   * Process data received from the underlying communication channel.
-   */
-  void add(List<int> bytes) {
-    var buffer = bytes is Uint8List ? bytes : new Uint8List.fromList(bytes);
-    int index = 0;
-    int lastIndex = buffer.length;
-    if (_state == CLOSED) {
-      throw new WebSocketException("Data on closed connection");
-    }
-    if (_state == FAILURE) {
-      throw new WebSocketException("Data on failed connection");
-    }
-    while ((index < lastIndex) && _state != CLOSED && _state != FAILURE) {
-      int byte = buffer[index];
-      if (_state <= LEN_REST) {
-        if (_state == START) {
-          _fin = (byte & FIN) != 0;
-
-          if((byte & (RSV2 | RSV3)) != 0) {
-            // The RSV2, RSV3 bits must both be zero.
-            throw new WebSocketException("Protocol error");
-          }
-
-          _opcode = (byte & OPCODE);
-
-          if (_opcode != _WebSocketOpcode.CONTINUATION) {
-            if ((byte & RSV1) != 0) {
-              _compressed = true;
-            } else {
-              _compressed = false;
-            }
-          }
-
-          if (_opcode <= _WebSocketOpcode.BINARY) {
-            if (_opcode == _WebSocketOpcode.CONTINUATION) {
-              if (_currentMessageType == _WebSocketMessageType.NONE) {
-                throw new WebSocketException("Protocol error");
-              }
-            } else {
-              assert(_opcode == _WebSocketOpcode.TEXT ||
-                  _opcode == _WebSocketOpcode.BINARY);
-              if (_currentMessageType != _WebSocketMessageType.NONE) {
-                throw new WebSocketException("Protocol error");
-              }
-              _currentMessageType = _opcode;
-            }
-          } else if (_opcode >= _WebSocketOpcode.CLOSE &&
-              _opcode <= _WebSocketOpcode.PONG) {
-            // Control frames cannot be fragmented.
-            if (!_fin) throw new WebSocketException("Protocol error");
-          } else {
-            throw new WebSocketException("Protocol error");
-          }
-          _state = LEN_FIRST;
-        } else if (_state == LEN_FIRST) {
-          _masked = (byte & 0x80) != 0;
-          _len = byte & 0x7F;
-          if (_isControlFrame() && _len > 125) {
-            throw new WebSocketException("Protocol error");
-          }
-          if (_len == 126) {
-            _len = 0;
-            _remainingLenBytes = 2;
-            _state = LEN_REST;
-          } else if (_len == 127) {
-            _len = 0;
-            _remainingLenBytes = 8;
-            _state = LEN_REST;
-          } else {
-            assert(_len < 126);
-            _lengthDone();
-          }
-        } else {
-          assert(_state == LEN_REST);
-          _len = _len << 8 | byte;
-          _remainingLenBytes--;
-          if (_remainingLenBytes == 0) {
-            _lengthDone();
-          }
-        }
-      } else {
-        if (_state == MASK) {
-          _maskingBytes[4 - _remainingMaskingKeyBytes--] = byte;
-          if (_remainingMaskingKeyBytes == 0) {
-            _maskDone();
-          }
-        } else {
-          assert(_state == PAYLOAD);
-          // The payload is not handled one byte at a time but in blocks.
-          int payloadLength = min(lastIndex - index, _remainingPayloadBytes);
-          _remainingPayloadBytes -= payloadLength;
-          // Unmask payload if masked.
-          if (_masked) {
-            _unmask(index, payloadLength, buffer);
-          }
-          // Control frame and data frame share _payloads.
-          _payload.add(new Uint8List.view(buffer.buffer, index, payloadLength));
-          index += payloadLength;
-          if (_isControlFrame()) {
-            if (_remainingPayloadBytes == 0) _controlFrameEnd();
-          } else {
-            if (_currentMessageType != _WebSocketMessageType.TEXT &&
-                _currentMessageType != _WebSocketMessageType.BINARY) {
-              throw new WebSocketException("Protocol error");
-            }
-            if (_remainingPayloadBytes == 0) _messageFrameEnd();
-          }
-
-          // Hack - as we always do index++ below.
-          index--;
-        }
-      }
-
-      // Move to the next byte.
-      index++;
-    }
-  }
-
-  void _unmask(int index, int length, Uint8List buffer) {
-    const int BLOCK_SIZE = 16;
-    // Skip Int32x4-version if message is small.
-    if (length >= BLOCK_SIZE) {
-      // Start by aligning to 16 bytes.
-      final int startOffset = BLOCK_SIZE - (index & 15);
-      final int end = index + startOffset;
-      for (int i = index; i < end; i++) {
-        buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
-      }
-      index += startOffset;
-      length -= startOffset;
-      final int blockCount = length ~/ BLOCK_SIZE;
-      if (blockCount > 0) {
-        // Create mask block.
-        int mask = 0;
-        for (int i = 3; i >= 0; i--) {
-          mask = (mask << 8) | _maskingBytes[(_unmaskingIndex + i) & 3];
-        }
-        Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
-        Int32x4List blockBuffer =
-            new Int32x4List.view(buffer.buffer, index, blockCount);
-        for (int i = 0; i < blockBuffer.length; i++) {
-          blockBuffer[i] ^= blockMask;
-        }
-        final int bytes = blockCount * BLOCK_SIZE;
-        index += bytes;
-        length -= bytes;
-      }
-    }
-    // Handle end.
-    final int end = index + length;
-    for (int i = index; i < end; i++) {
-      buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
-    }
-  }
-
-  void _lengthDone() {
-    if (_masked) {
-      if (!_serverSide) {
-        throw new WebSocketException("Received masked frame from server");
-      }
-      _state = MASK;
-    } else {
-      if (_serverSide) {
-        throw new WebSocketException("Received unmasked frame from client");
-      }
-      _remainingPayloadBytes = _len;
-      _startPayload();
-    }
-  }
-
-  void _maskDone() {
-    _remainingPayloadBytes = _len;
-    _startPayload();
-  }
-
-  void _startPayload() {
-    // If there is no actual payload perform perform callbacks without
-    // going through the PAYLOAD state.
-    if (_remainingPayloadBytes == 0) {
-      if (_isControlFrame()) {
-        switch (_opcode) {
-          case _WebSocketOpcode.CLOSE:
-            _state = CLOSED;
-            _eventSink.close();
-            break;
-          case _WebSocketOpcode.PING:
-            _eventSink.add(new _WebSocketPing());
-            break;
-          case _WebSocketOpcode.PONG:
-            _eventSink.add(new _WebSocketPong());
-            break;
-        }
-        _prepareForNextFrame();
-      } else {
-        _messageFrameEnd();
-      }
-    } else {
-      _state = PAYLOAD;
-    }
-  }
-
-  void _messageFrameEnd() {
-    if (_fin) {
-      var bytes = _payload.takeBytes();
-      if (_deflate != null && _compressed) {
-        bytes = _deflate.processIncomingMessage(bytes);
-      }
-
-      switch (_currentMessageType) {
-        case _WebSocketMessageType.TEXT:
-          _eventSink.add(UTF8.decode(bytes));
-          break;
-        case _WebSocketMessageType.BINARY:
-          _eventSink.add(bytes);
-          break;
-      }
-      _currentMessageType = _WebSocketMessageType.NONE;
-    }
-    _prepareForNextFrame();
-  }
-
-  void _controlFrameEnd() {
-    switch (_opcode) {
-      case _WebSocketOpcode.CLOSE:
-        closeCode = WebSocketStatus.NO_STATUS_RECEIVED;
-        var payload = _payload.takeBytes();
-        if (payload.length > 0) {
-          if (payload.length == 1) {
-            throw new WebSocketException("Protocol error");
-          }
-          closeCode = payload[0] << 8 | payload[1];
-          if (closeCode == WebSocketStatus.NO_STATUS_RECEIVED) {
-            throw new WebSocketException("Protocol error");
-          }
-          if (payload.length > 2) {
-            closeReason = UTF8.decode(payload.sublist(2));
-          }
-        }
-        _state = CLOSED;
-        _eventSink.close();
-        break;
-
-      case _WebSocketOpcode.PING:
-        _eventSink.add(new _WebSocketPing(_payload.takeBytes()));
-        break;
-
-      case _WebSocketOpcode.PONG:
-        _eventSink.add(new _WebSocketPong(_payload.takeBytes()));
-        break;
-    }
-    _prepareForNextFrame();
-  }
-
-  bool _isControlFrame() {
-    return _opcode == _WebSocketOpcode.CLOSE ||
-        _opcode == _WebSocketOpcode.PING ||
-        _opcode == _WebSocketOpcode.PONG;
-  }
-
-  void _prepareForNextFrame() {
-    if (_state != CLOSED && _state != FAILURE) _state = START;
-    _fin = false;
-    _opcode = -1;
-    _len = -1;
-    _remainingLenBytes = -1;
-    _remainingMaskingKeyBytes = 4;
-    _remainingPayloadBytes = -1;
-    _unmaskingIndex = 0;
-  }
-}
-
-class _WebSocketPing {
-  final List<int> payload;
-  _WebSocketPing([this.payload = null]);
-}
-
-class _WebSocketPong {
-  final List<int> payload;
-  _WebSocketPong([this.payload = null]);
-}
-
-class _WebSocketTransformerImpl implements WebSocketTransformer {
-  final StreamController<WebSocket> _controller =
-      new StreamController<WebSocket>(sync: true);
-  final Function _protocolSelector;
-  final CompressionOptions _compression;
-
-  _WebSocketTransformerImpl(this._protocolSelector, this._compression);
-
-  Stream<WebSocket> bind(Stream<HttpRequest> stream) {
-    stream.listen((request) {
-      _upgrade(request, _protocolSelector, _compression)
-          .then((WebSocket webSocket) => _controller.add(webSocket))
-          .catchError(_controller.addError);
-    }, onDone: () {
-      _controller.close();
-    });
-
-    return _controller.stream;
-  }
-
-  static Future<WebSocket> _upgrade(
-      HttpRequest request, _protocolSelector, CompressionOptions compression) {
-    var response = request.response;
-    if (!_isUpgradeRequest(request)) {
-      // Send error response.
-      response
-        ..statusCode = HttpStatus.BAD_REQUEST
-        ..close();
-      return new Future.error(
-          new WebSocketException("Invalid WebSocket upgrade request"));
-    }
-
-    Future upgrade(String protocol) {
-      // Send the upgrade response.
-      response
-        ..statusCode = HttpStatus.SWITCHING_PROTOCOLS
-        ..headers.add(HttpHeaders.CONNECTION, "Upgrade")
-        ..headers.add(HttpHeaders.UPGRADE, "websocket");
-      String key = request.headers.value("Sec-WebSocket-Key");
-      _SHA1 sha1 = new _SHA1();
-      sha1.add("$key$_webSocketGUID".codeUnits);
-      String accept = _CryptoUtils.bytesToBase64(sha1.close());
-      response.headers.add("Sec-WebSocket-Accept", accept);
-      if (protocol != null) {
-        response.headers.add("Sec-WebSocket-Protocol", protocol);
-      }
-
-      var deflate = _negotiateCompression(request, response, compression);
-
-      response.headers.contentLength = 0;
-      return response.detachSocket().then((socket) =>
-          new _WebSocketImpl._fromSocket(
-              socket, protocol, compression, true, deflate));
-    }
-
-    var protocols = request.headers['Sec-WebSocket-Protocol'];
-    if (protocols != null && _protocolSelector != null) {
-      // The suggested protocols can be spread over multiple lines, each
-      // consisting of multiple protocols. To unify all of them, first join
-      // the lists with ', ' and then tokenize.
-      protocols = _HttpParser._tokenizeFieldValue(protocols.join(', '));
-      return new Future(() => _protocolSelector(protocols)).then((protocol) {
-        if (protocols.indexOf(protocol) < 0) {
-          throw new WebSocketException(
-              "Selected protocol is not in the list of available protocols");
-        }
-        return protocol;
-      }).catchError((error) {
-        response
-          ..statusCode = HttpStatus.INTERNAL_SERVER_ERROR
-          ..close();
-        throw error;
-      }).then(upgrade);
-    } else {
-      return upgrade(null);
-    }
-  }
-
-  static _WebSocketPerMessageDeflate _negotiateCompression(HttpRequest request,
-      HttpResponse response, CompressionOptions compression) {
-    var extensionHeader = request.headers.value("Sec-WebSocket-Extensions");
-
-    extensionHeader ??= "";
-
-    var hv = HeaderValue.parse(extensionHeader, valueSeparator: ',');
-    if (compression.enabled && hv.value == _WebSocketImpl.PER_MESSAGE_DEFLATE) {
-      var info = compression._createHeader(hv);
-
-      response.headers.add("Sec-WebSocket-Extensions", info.headerValue);
-      var serverNoContextTakeover =
-          (hv.parameters.containsKey(_serverNoContextTakeover) &&
-            compression.serverNoContextTakeover);
-      var clientNoContextTakeover =
-          (hv.parameters.containsKey(_clientNoContextTakeover) &&
-            compression.clientNoContextTakeover);
-      var deflate = new _WebSocketPerMessageDeflate(
-          serverNoContextTakeover: serverNoContextTakeover,
-          clientNoContextTakeover: clientNoContextTakeover,
-          serverMaxWindowBits: info.maxWindowBits,
-          clientMaxWindowBits: info.maxWindowBits,
-          serverSide: true);
-
-      return deflate;
-    }
-
-    return null;
-  }
-
-  static bool _isUpgradeRequest(HttpRequest request) {
-    if (request.method != "GET") {
-      return false;
-    }
-    if (request.headers[HttpHeaders.CONNECTION] == null) {
-      return false;
-    }
-    bool isUpgrade = false;
-    request.headers[HttpHeaders.CONNECTION].forEach((String value) {
-      if (value.toLowerCase() == "upgrade") isUpgrade = true;
-    });
-    if (!isUpgrade) return false;
-    String upgrade = request.headers.value(HttpHeaders.UPGRADE);
-    if (upgrade == null || upgrade.toLowerCase() != "websocket") {
-      return false;
-    }
-    String version = request.headers.value("Sec-WebSocket-Version");
-    if (version == null || version != "13") {
-      return false;
-    }
-    String key = request.headers.value("Sec-WebSocket-Key");
-    if (key == null) {
-      return false;
-    }
-    return true;
-  }
-}
-
-class _WebSocketPerMessageDeflate {
-  bool serverNoContextTakeover;
-  bool clientNoContextTakeover;
-  int clientMaxWindowBits;
-  int serverMaxWindowBits;
-  bool serverSide;
-
-  _Filter decoder;
-  _Filter encoder;
-
-  _WebSocketPerMessageDeflate(
-      {this.clientMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS,
-       this.serverMaxWindowBits: _WebSocketImpl.DEFAULT_WINDOW_BITS,
-       this.serverNoContextTakeover: false,
-       this.clientNoContextTakeover: false,
-       this.serverSide: false});
-
-  void _ensureDecoder() {
-    if (decoder == null) {
-      decoder = _Filter._newZLibInflateFilter(
-          serverSide ? clientMaxWindowBits : serverMaxWindowBits, null, true);
-    }
-  }
-
-  void _ensureEncoder() {
-    if (encoder == null) {
-      encoder = _Filter._newZLibDeflateFilter(
-          false,
-          ZLibOption.DEFAULT_LEVEL,
-          serverSide ? serverMaxWindowBits : clientMaxWindowBits,
-          ZLibOption.DEFAULT_MEM_LEVEL,
-          ZLibOption.STRATEGY_DEFAULT,
-          null,
-          true);
-    }
-  }
-
-  Uint8List processIncomingMessage(List<int> msg) {
-    _ensureDecoder();
-
-    var data = [];
-    data.addAll(msg);
-    data.addAll(const [0x00, 0x00, 0xff, 0xff]);
-
-    decoder.process(data, 0, data.length);
-    var result = [];
-    var out;
-
-    while ((out = decoder.processed()) != null) {
-      result.addAll(out);
-    }
-
-    if ((serverSide && clientNoContextTakeover) ||
-        (!serverSide && serverNoContextTakeover)) {
-      decoder = null;
-    }
-
-    return new Uint8List.fromList(result);
-  }
-
-  List<int> processOutgoingMessage(List<int> msg) {
-    _ensureEncoder();
-    var result = [];
-    Uint8List buffer;
-    var out;
-
-    if (msg is! Uint8List) {
-      for (var i = 0; i < msg.length; i++) {
-        if (msg[i] < 0 || 255 < msg[i]) {
-          throw new ArgumentError("List element is not a byte value "
-              "(value ${msg[i]} at index $i)");
-        }
-      }
-      buffer = new Uint8List.fromList(msg);
-    } else {
-      buffer = msg;
-    }
-
-    encoder.process(buffer, 0, buffer.length);
-
-    while ((out = encoder.processed()) != null) {
-      result.addAll(out);
-    }
-
-    if ((!serverSide && clientNoContextTakeover) ||
-        (serverSide && serverNoContextTakeover)) {
-      encoder = null;
-    }
-
-    if (result.length > 4) {
-      result = result.sublist(0, result.length - 4);
-    }
-
-    return result;
-  }
-}
-
-// TODO(ajohnsen): Make this transformer reusable.
-class _WebSocketOutgoingTransformer
-    implements StreamTransformer<dynamic, List<int>>, EventSink {
-  final _WebSocketImpl webSocket;
-  EventSink<List<int>> _eventSink;
-
-  _WebSocketPerMessageDeflate _deflateHelper;
-
-  _WebSocketOutgoingTransformer(this.webSocket) {
-    _deflateHelper = webSocket._deflate;
-  }
-
-  Stream<List<int>> bind(Stream stream) {
-    return new Stream.eventTransformed(stream, (eventSink) {
-      if (_eventSink != null) {
-        throw new StateError("WebSocket transformer already used");
-      }
-      _eventSink = eventSink;
-      return this;
-    });
-  }
-
-  void add(message) {
-    if (message is _WebSocketPong) {
-      addFrame(_WebSocketOpcode.PONG, message.payload);
-      return;
-    }
-    if (message is _WebSocketPing) {
-      addFrame(_WebSocketOpcode.PING, message.payload);
-      return;
-    }
-    List<int> data;
-    int opcode;
-    if (message != null) {
-      if (message is String) {
-        opcode = _WebSocketOpcode.TEXT;
-        data = UTF8.encode(message);
-      } else {
-        if (message is List<int>) {
-          data = message;
-          opcode = _WebSocketOpcode.BINARY;
-        } else {
-          throw new ArgumentError(message);
-        }
-      }
-
-      if (_deflateHelper != null) {
-        data = _deflateHelper.processOutgoingMessage(data);
-      }
-    } else {
-      opcode = _WebSocketOpcode.TEXT;
-    }
-    addFrame(opcode, data);
-  }
-
-  void addError(Object error, [StackTrace stackTrace]) {
-    _eventSink.addError(error, stackTrace);
-  }
-
-  void close() {
-    int code = webSocket._outCloseCode;
-    String reason = webSocket._outCloseReason;
-    List<int> data;
-    if (code != null) {
-      data = new List<int>();
-      data.add((code >> 8) & 0xFF);
-      data.add(code & 0xFF);
-      if (reason != null) {
-        data.addAll(UTF8.encode(reason));
-      }
-    }
-    addFrame(_WebSocketOpcode.CLOSE, data);
-    _eventSink.close();
-  }
-
-  void addFrame(int opcode, List<int> data) => createFrame(
-          opcode,
-          data,
-          webSocket._serverSide,
-          _deflateHelper != null &&
-              (opcode == _WebSocketOpcode.TEXT ||
-                  opcode == _WebSocketOpcode.BINARY)).forEach((e) {
-        _eventSink.add(e);
-      });
-
-  static Iterable<List<int>> createFrame(
-      int opcode, List<int> data, bool serverSide, bool compressed) {
-    bool mask = !serverSide; // Masking not implemented for server.
-    int dataLength = data == null ? 0 : data.length;
-    // Determine the header size.
-    int headerSize = (mask) ? 6 : 2;
-    if (dataLength > 65535) {
-      headerSize += 8;
-    } else if (dataLength > 125) {
-      headerSize += 2;
-    }
-    Uint8List header = new Uint8List(headerSize);
-    int index = 0;
-
-    // Set FIN and opcode.
-    var hoc = _WebSocketProtocolTransformer.FIN
-              | (compressed ? _WebSocketProtocolTransformer.RSV1 : 0)
-              | (opcode & _WebSocketProtocolTransformer.OPCODE);
-
-    header[index++] = hoc;
-    // Determine size and position of length field.
-    int lengthBytes = 1;
-    if (dataLength > 65535) {
-      header[index++] = 127;
-      lengthBytes = 8;
-    } else if (dataLength > 125) {
-      header[index++] = 126;
-      lengthBytes = 2;
-    }
-    // Write the length in network byte order into the header.
-    for (int i = 0; i < lengthBytes; i++) {
-      header[index++] = dataLength >> (((lengthBytes - 1) - i) * 8) & 0xFF;
-    }
-    if (mask) {
-      header[1] |= 1 << 7;
-      var maskBytes = _IOCrypto.getRandomBytes(4);
-      header.setRange(index, index + 4, maskBytes);
-      index += 4;
-      if (data != null) {
-        Uint8List list;
-        // If this is a text message just do the masking inside the
-        // encoded data.
-        if (opcode == _WebSocketOpcode.TEXT && data is Uint8List) {
-          list = data;
-        } else {
-          if (data is Uint8List) {
-            list = new Uint8List.fromList(data);
-          } else {
-            list = new Uint8List(data.length);
-            for (int i = 0; i < data.length; i++) {
-              if (data[i] < 0 || 255 < data[i]) {
-                throw new ArgumentError("List element is not a byte value "
-                    "(value ${data[i]} at index $i)");
-              }
-              list[i] = data[i];
-            }
-          }
-        }
-        const int BLOCK_SIZE = 16;
-        int blockCount = list.length ~/ BLOCK_SIZE;
-        if (blockCount > 0) {
-          // Create mask block.
-          int mask = 0;
-          for (int i = 3; i >= 0; i--) {
-            mask = (mask << 8) | maskBytes[i];
-          }
-          Int32x4 blockMask = new Int32x4(mask, mask, mask, mask);
-          Int32x4List blockBuffer =
-              new Int32x4List.view(list.buffer, 0, blockCount);
-          for (int i = 0; i < blockBuffer.length; i++) {
-            blockBuffer[i] ^= blockMask;
-          }
-        }
-        // Handle end.
-        for (int i = blockCount * BLOCK_SIZE; i < list.length; i++) {
-          list[i] ^= maskBytes[i & 3];
-        }
-        data = list;
-      }
-    }
-    assert(index == headerSize);
-    if (data == null) {
-      return [header];
-    } else {
-      return [header, data];
-    }
-  }
-}
-
-class _WebSocketConsumer implements StreamConsumer {
-  final _WebSocketImpl webSocket;
-  final Socket socket;
-  StreamController _controller;
-  StreamSubscription _subscription;
-  bool _issuedPause = false;
-  bool _closed = false;
-  Completer _closeCompleter = new Completer();
-  Completer _completer;
-
-  _WebSocketConsumer(this.webSocket, this.socket);
-
-  void _onListen() {
-    if (_subscription != null) {
-      _subscription.cancel();
-    }
-  }
-
-  void _onPause() {
-    if (_subscription != null) {
-      _subscription.pause();
-    } else {
-      _issuedPause = true;
-    }
-  }
-
-  void _onResume() {
-    if (_subscription != null) {
-      _subscription.resume();
-    } else {
-      _issuedPause = false;
-    }
-  }
-
-  void _cancel() {
-    if (_subscription != null) {
-      var subscription = _subscription;
-      _subscription = null;
-      subscription.cancel();
-    }
-  }
-
-  _ensureController() {
-    if (_controller != null) return;
-    _controller = new StreamController(
-        sync: true,
-        onPause: _onPause,
-        onResume: _onResume,
-        onCancel: _onListen);
-    var stream = _controller.stream
-        .transform(new _WebSocketOutgoingTransformer(webSocket));
-    socket.addStream(stream).then((_) {
-      _done();
-      _closeCompleter.complete(webSocket);
-    }, onError: (error, StackTrace stackTrace) {
-      _closed = true;
-      _cancel();
-      if (error is ArgumentError) {
-        if (!_done(error, stackTrace)) {
-          _closeCompleter.completeError(error, stackTrace);
-        }
-      } else {
-        _done();
-        _closeCompleter.complete(webSocket);
-      }
-    });
-  }
-
-  bool _done([error, StackTrace stackTrace]) {
-    if (_completer == null) return false;
-    if (error != null) {
-      _completer.completeError(error, stackTrace);
-    } else {
-      _completer.complete(webSocket);
-    }
-    _completer = null;
-    return true;
-  }
-
-  Future addStream(var stream) {
-    if (_closed) {
-      stream.listen(null).cancel();
-      return new Future.value(webSocket);
-    }
-    _ensureController();
-    _completer = new Completer();
-    _subscription = stream.listen((data) {
-      _controller.add(data);
-    }, onDone: _done, onError: _done, cancelOnError: true);
-    if (_issuedPause) {
-      _subscription.pause();
-      _issuedPause = false;
-    }
-    return _completer.future;
-  }
-
-  Future close() {
-    _ensureController();
-    Future closeSocket() {
-      return socket.close().catchError((_) {}).then((_) => webSocket);
-    }
-    _controller.close();
-    return _closeCompleter.future.then((_) => closeSocket());
-  }
-
-  void add(data) {
-    if (_closed) return;
-    _ensureController();
-    _controller.add(data);
-  }
-
-  void closeSocket() {
-    _closed = true;
-    _cancel();
-    close();
-  }
-}
-
-class _WebSocketImpl extends Stream with _ServiceObject implements WebSocket {
-  // Use default Map so we keep order.
-  static Map<int, _WebSocketImpl> _webSockets = new Map<int, _WebSocketImpl>();
-  static const int DEFAULT_WINDOW_BITS = 15;
-  static const String PER_MESSAGE_DEFLATE = "permessage-deflate";
-
-  final String protocol;
-
-  StreamController _controller;
-  StreamSubscription _subscription;
-  StreamSink _sink;
-
-  final _socket;
-  final bool _serverSide;
-  int _readyState = WebSocket.CONNECTING;
-  bool _writeClosed = false;
-  int _closeCode;
-  String _closeReason;
-  Duration _pingInterval;
-  Timer _pingTimer;
-  _WebSocketConsumer _consumer;
-
-  int _outCloseCode;
-  String _outCloseReason;
-  Timer _closeTimer;
-  _WebSocketPerMessageDeflate _deflate;
-
-  static final HttpClient _httpClient = new HttpClient();
-
-  static Future<WebSocket> connect(
-      String url, Iterable<String> protocols, Map<String, dynamic> headers,
-      {CompressionOptions compression: CompressionOptions.DEFAULT}) {
-    Uri uri = Uri.parse(url);
-    if (uri.scheme != "ws" && uri.scheme != "wss") {
-      throw new WebSocketException("Unsupported URL scheme '${uri.scheme}'");
-    }
-
-    Random random = new Random();
-    // Generate 16 random bytes.
-    Uint8List nonceData = new Uint8List(16);
-    for (int i = 0; i < 16; i++) {
-      nonceData[i] = random.nextInt(256);
-    }
-    String nonce = _CryptoUtils.bytesToBase64(nonceData);
-
-    uri = new Uri(
-        scheme: uri.scheme == "wss" ? "https" : "http",
-        userInfo: uri.userInfo,
-        host: uri.host,
-        port: uri.port,
-        path: uri.path,
-        query: uri.query,
-        fragment: uri.fragment);
-    return _httpClient.openUrl("GET", uri).then((request) {
-      if (uri.userInfo != null && !uri.userInfo.isEmpty) {
-        // If the URL contains user information use that for basic
-        // authorization.
-        String auth = _CryptoUtils.bytesToBase64(UTF8.encode(uri.userInfo));
-        request.headers.set(HttpHeaders.AUTHORIZATION, "Basic $auth");
-      }
-      if (headers != null) {
-        headers.forEach((field, value) => request.headers.add(field, value));
-      }
-      // Setup the initial handshake.
-      request.headers
-        ..set(HttpHeaders.CONNECTION, "Upgrade")
-        ..set(HttpHeaders.UPGRADE, "websocket")
-        ..set("Sec-WebSocket-Key", nonce)
-        ..set("Cache-Control", "no-cache")
-        ..set("Sec-WebSocket-Version", "13");
-      if (protocols != null) {
-        request.headers.add("Sec-WebSocket-Protocol", protocols.toList());
-      }
-
-      if (compression.enabled) {
-        request.headers
-            .add("Sec-WebSocket-Extensions", compression._createHeader());
-      }
-
-      return request.close();
-    }).then((response) {
-
-      void error(String message) {
-        // Flush data.
-        response.detachSocket().then((socket) {
-          socket.destroy();
-        });
-        throw new WebSocketException(message);
-      }
-
-      if (response.statusCode != HttpStatus.SWITCHING_PROTOCOLS ||
-          response.headers[HttpHeaders.CONNECTION] == null ||
-          !response.headers[HttpHeaders.CONNECTION]
-              .any((value) => value.toLowerCase() == "upgrade") ||
-          response.headers.value(HttpHeaders.UPGRADE).toLowerCase() !=
-              "websocket") {
-        error("Connection to '$uri' was not upgraded to websocket");
-      }
-      String accept = response.headers.value("Sec-WebSocket-Accept");
-      if (accept == null) {
-        error("Response did not contain a 'Sec-WebSocket-Accept' header");
-      }
-      _SHA1 sha1 = new _SHA1();
-      sha1.add("$nonce$_webSocketGUID".codeUnits);
-      List<int> expectedAccept = sha1.close();
-      List<int> receivedAccept = _CryptoUtils.base64StringToBytes(accept);
-      if (expectedAccept.length != receivedAccept.length) {
-        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
-      }
-      for (int i = 0; i < expectedAccept.length; i++) {
-        if (expectedAccept[i] != receivedAccept[i]) {
-          error("Bad response 'Sec-WebSocket-Accept' header");
-        }
-      }
-      var protocol = response.headers.value('Sec-WebSocket-Protocol');
-
-      _WebSocketPerMessageDeflate deflate =
-          negotiateClientCompression(response, compression);
-
-      return response.detachSocket().then/*<WebSocket>*/((socket) =>
-          new _WebSocketImpl._fromSocket(
-              socket, protocol, compression, false, deflate));
-    });
-  }
-
-  static _WebSocketPerMessageDeflate negotiateClientCompression(
-      HttpClientResponse response, CompressionOptions compression) {
-    String extensionHeader = response.headers.value('Sec-WebSocket-Extensions');
-
-    if (extensionHeader == null) {
-      extensionHeader = "";
-    }
-
-    var hv = HeaderValue.parse(extensionHeader, valueSeparator: ',');
-
-    if (compression.enabled && hv.value == PER_MESSAGE_DEFLATE) {
-      var serverNoContextTakeover =
-          hv.parameters.containsKey(_serverNoContextTakeover);
-      var clientNoContextTakeover =
-          hv.parameters.containsKey(_clientNoContextTakeover);
-
-      int getWindowBits(String type) {
-        var o = hv.parameters[type];
-        if (o == null) {
-          return DEFAULT_WINDOW_BITS;
-        }
-
-        return int.parse(o, onError: (s) => DEFAULT_WINDOW_BITS);
-      }
-
-      return new _WebSocketPerMessageDeflate(
-          clientMaxWindowBits: getWindowBits(_clientMaxWindowBits),
-          serverMaxWindowBits: getWindowBits(_serverMaxWindowBits),
-          clientNoContextTakeover: clientNoContextTakeover,
-          serverNoContextTakeover: serverNoContextTakeover);
-    }
-
-    return null;
-  }
-
-  _WebSocketImpl._fromSocket(
-      this._socket, this.protocol, CompressionOptions compression,
-      [this._serverSide = false, _WebSocketPerMessageDeflate deflate]) {
-    _consumer = new _WebSocketConsumer(this, _socket);
-    _sink = new _StreamSinkImpl(_consumer);
-    _readyState = WebSocket.OPEN;
-    _deflate = deflate;
-
-    var transformer = new _WebSocketProtocolTransformer(_serverSide, _deflate);
-    _subscription = _socket.transform(transformer).listen((data) {
-      if (data is _WebSocketPing) {
-        if (!_writeClosed) _consumer.add(new _WebSocketPong(data.payload));
-      } else if (data is _WebSocketPong) {
-        // Simply set pingInterval, as it'll cancel any timers.
-        pingInterval = _pingInterval;
-      } else {
-        _controller.add(data);
-      }
-    }, onError: (error, stackTrace) {
-      if (_closeTimer != null) _closeTimer.cancel();
-      if (error is FormatException) {
-        _close(WebSocketStatus.INVALID_FRAME_PAYLOAD_DATA);
-      } else {
-        _close(WebSocketStatus.PROTOCOL_ERROR);
-      }
-      // An error happened, set the close code set above.
-      _closeCode = _outCloseCode;
-      _closeReason = _outCloseReason;
-      _controller.close();
-    }, onDone: () {
-      if (_closeTimer != null) _closeTimer.cancel();
-      if (_readyState == WebSocket.OPEN) {
-        _readyState = WebSocket.CLOSING;
-        if (!_isReservedStatusCode(transformer.closeCode)) {
-          _close(transformer.closeCode, transformer.closeReason);
-        } else {
-          _close();
-        }
-        _readyState = WebSocket.CLOSED;
-      }
-      // Protocol close, use close code from transformer.
-      _closeCode = transformer.closeCode;
-      _closeReason = transformer.closeReason;
-      _controller.close();
-    }, cancelOnError: true);
-    _subscription.pause();
-    _controller = new StreamController(
-        sync: true, onListen: _subscription.resume, onCancel: () {
-      _subscription.cancel();
-      _subscription = null;
-    }, onPause: _subscription.pause, onResume: _subscription.resume);
-
-    _webSockets[_serviceId] = this;
-    try {
-      _socket._owner = this;
-    } catch (_) {}
-  }
-
-  StreamSubscription listen(void onData(message),
-      {Function onError, void onDone(), bool cancelOnError}) {
-    return _controller.stream.listen(onData,
-        onError: onError, onDone: onDone, cancelOnError: cancelOnError);
-  }
-
-  Duration get pingInterval => _pingInterval;
-
-  void set pingInterval(Duration interval) {
-    if (_writeClosed) return;
-    if (_pingTimer != null) _pingTimer.cancel();
-    _pingInterval = interval;
-
-    if (_pingInterval == null) return;
-
-    _pingTimer = new Timer(_pingInterval, () {
-      if (_writeClosed) return;
-      _consumer.add(new _WebSocketPing());
-      _pingTimer = new Timer(_pingInterval, () {
-        // No pong received.
-        _close(WebSocketStatus.GOING_AWAY);
-      });
-    });
-  }
-
-  int get readyState => _readyState;
-
-  String get extensions => null;
-  int get closeCode => _closeCode;
-  String get closeReason => _closeReason;
-
-  void add(data) { _sink.add(data); }
-  void addError(error, [StackTrace stackTrace]) {
-    _sink.addError(error, stackTrace);
-  }
-  Future addStream(Stream stream) => _sink.addStream(stream);
-  Future get done => _sink.done;
-
-  Future close([int code, String reason]) {
-    if (_isReservedStatusCode(code)) {
-      throw new WebSocketException("Reserved status code $code");
-    }
-    if (_outCloseCode == null) {
-      _outCloseCode = code;
-      _outCloseReason = reason;
-    }
-    if (!_controller.isClosed) {
-      // If a close has not yet been received from the other end then
-      //   1) make sure to listen on the stream so the close frame will be
-      //      processed if received.
-      //   2) set a timer terminate the connection if a close frame is
-      //      not received.
-      if (!_controller.hasListener && _subscription != null) {
-        _controller.stream.drain().catchError((_) => {});
-      }
-      if (_closeTimer == null) {
-        // When closing the web-socket, we no longer accept data.
-        _closeTimer = new Timer(const Duration(seconds: 5), () {
-          // Reuse code and reason from the local close.
-          _closeCode = _outCloseCode;
-          _closeReason = _outCloseReason;
-          if (_subscription != null) _subscription.cancel();
-          _controller.close();
-          _webSockets.remove(_serviceId);
-        });
-      }
-    }
-    return _sink.close();
-  }
-
-  void _close([int code, String reason]) {
-    if (_writeClosed) return;
-    if (_outCloseCode == null) {
-      _outCloseCode = code;
-      _outCloseReason = reason;
-    }
-    _writeClosed = true;
-    _consumer.closeSocket();
-    _webSockets.remove(_serviceId);
-  }
-
-  String get _serviceTypePath => 'io/websockets';
-  String get _serviceTypeName => 'WebSocket';
-
-  Map<String, dynamic> _toJSON(bool ref) {
-    var name = '${_socket.address.host}:${_socket.port}';
-    var r = <String, dynamic>{
-      'id': _servicePath,
-      'type': _serviceType(ref),
-      'name': name,
-      'user_name': name,
-    };
-    if (ref) {
-      return r;
-    }
-    try {
-      r['socket'] = _socket._toJSON(true);
-    } catch (_) {
-      r['socket'] = {
-        'id': _servicePath,
-        'type': '@Socket',
-        'name': 'UserSocket',
-        'user_name': 'UserSocket',
-      };
-    }
-    return r;
-  }
-
-  static bool _isReservedStatusCode(int code) {
-    return code != null &&
-        (code < WebSocketStatus.NORMAL_CLOSURE ||
-            code == WebSocketStatus.RESERVED_1004 ||
-            code == WebSocketStatus.NO_STATUS_RECEIVED ||
-            code == WebSocketStatus.ABNORMAL_CLOSURE ||
-            (code > WebSocketStatus.INTERNAL_SERVER_ERROR &&
-                code < WebSocketStatus.RESERVED_1015) ||
-            (code >= WebSocketStatus.RESERVED_1015 && code < 3000));
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/isolate/capability.dart b/pkg/dev_compiler/tool/input_sdk/lib/isolate/capability.dart
deleted file mode 100644
index a51eec2..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/isolate/capability.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// 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.
-
-part of dart.isolate;
-
-/**
- * An unforgeable object that comes back as equal when passed through other
- * isolates.
- *
- * Sending a capability object to another isolate, and getting it back,
- * will produce an object that is equal to the original.
- * There is no other way to create objects equal to a capability object.
- *
- * Capabilities can be used as access guards: A remote isolate can send
- * a request for an operation, but it is only allowed if the request contains
- * the correct capability object.
- *
- * This allows exposing the same interface to multiple clients,
- * but restricting some operations to only those clients
- * that have also been given the corresponding capability.
- *
- * Capabilities can be used inside a single isolate,
- * but they have no advantage over
- * just using `new Object` to create a unique object,
- * and it offers no real security against other code
- * running in the same isolate.
- */
-class Capability {
-  /**
-   * Create a new unforgeable capability object.
-   */
-  external factory Capability();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/isolate/isolate.dart b/pkg/dev_compiler/tool/input_sdk/lib/isolate/isolate.dart
deleted file mode 100644
index f0fd886..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/isolate/isolate.dart
+++ /dev/null
@@ -1,618 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Concurrent programming using _isolates_:
- * independent workers that are similar to threads
- * but don't share memory,
- * communicating only via messages.
- */
-library dart.isolate;
-
-import "dart:async";
-
-part "capability.dart";
-
-/**
- * Thrown when an isolate cannot be created.
- */
-class IsolateSpawnException implements Exception {
-  /** Error message reported by the spawn operation. */
-  final String message;
-  IsolateSpawnException(this.message);
-  String toString() => "IsolateSpawnException: $message";
-}
-
-/**
- * An isolated Dart execution context.
- *
- * All Dart code runs in an isolate, and code can access classes and values
- * only from the same isolate. Different isolates can communicate by sending
- * values through ports (see [ReceivePort], [SendPort]).
- *
- * An `Isolate` object is a reference to an isolate, usually different from
- * the current isolate.
- * It represents, and can be used control, the other isolate.
- *
- * When spawning a new isolate, the spawning isolate receives an `Isolate`
- * object representing the new isolate when the spawn operation succeeds.
- *
- * Isolates run code in its own event loop, and each event may run smaller tasks
- * in a nested microtask queue.
- *
- * An `Isolate` object allows other isolates to control the event loop
- * of the isolate that it represents, and to inspect the isolate,
- * for example by pausing the isolate or by getting events when the isolate
- * has an uncaught error.
- *
- * The [controlPort] gives access to controlling the isolate, and the
- * [pauseCapability] and [terminateCapability] guard access to some control
- * operations.
- * The `Isolate` object provided by a spawn operation will have the
- * control port and capabilities needed to control the isolate.
- * New isolates objects can be created without some of these capabilities
- * if necessary.
- *
- * An `Isolate` object cannot be sent over a `SendPort`, but the control port
- * and capabilities can be sent, and can be used to create a new functioning
- * `Isolate` object in the receiving port's isolate.
- */
-class Isolate {
-  /** Argument to `ping` and `kill`: Ask for immediate action. */
-  static const int IMMEDIATE = 0;
-  /** Argument to `ping` and `kill`: Ask for action before the next event. */
-  static const int BEFORE_NEXT_EVENT = 1;
-  /** Argument to `ping` and `kill`: Ask for action after normal events. */
-  static const int AS_EVENT = 2;
-
-  /**
-   * Control port used to send control messages to the isolate.
-   *
-   * This class provides helper functions that sends control messages
-   * to the control port.
-   *
-   * The control port identifies the isolate.
-   */
-  final SendPort controlPort;
-
-  /**
-   * Capability granting the ability to pause the isolate.
-   *
-   * This capability is used by [pause].
-   * If the capability is not the correct pause capability of the isolate,
-   * including if the capability is `null`, then calls to `pause` will have no
-   * effect.
-   *
-   * If the isolate is started in a paused state, use this capability as
-   * argument to [resume] to resume the isolate.
-   */
-  final Capability pauseCapability;
-
-  /**
-   * Capability granting the ability to terminate the isolate.
-   *
-   * This capability is used by [kill] and [setErrorsFatal].
-   * If the capability is not the correct termination capability of the isolate,
-   * including if the capability is `null`, then calls to those methods will
-   * have no effect.
-   */
-  final Capability terminateCapability;
-
-  /**
-   * Create a new [Isolate] object with a restricted set of capabilities.
-   *
-   * The port should be a control port for an isolate, as taken from
-   * another `Isolate` object.
-   *
-   * The capabilities should be the subset of the capabilities that are
-   * available to the original isolate.
-   * Capabilities of an isolate are locked to that isolate, and have no effect
-   * anywhere else, so the capabilities should come from the same isolate as
-   * the control port.
-   *
-   * If all the available capabilities are included,
-   * there is no reason to create a new object,
-   * since the behavior is defined entirely
-   * by the control port and capabilities.
-   */
-  Isolate(this.controlPort, {this.pauseCapability,
-                             this.terminateCapability});
-
-  /**
-   * Return the current [Isolate].
-   *
-   * The isolate gives access to the capabilities needed to inspect,
-   * pause or kill the isolate, and allows granting these capabilities
-   * to others.
-   */
-  external static Isolate get current;
-
-  /**
-   * Creates and spawns an isolate that shares the same code as the current
-   * isolate.
-   *
-   * The argument [entryPoint] specifies the entry point of the spawned
-   * isolate. It must be a top-level function or a static method that
-   * takes one argument - that is, one-parameter functions that can be
-   * compile-time constant function values.
-   * It is not allowed to pass the value of function expressions or an instance
-   * method extracted from an object.
-   *
-   * The entry-point function is invoked with the initial [message].
-   * Usually the initial [message] contains a [SendPort] so
-   * that the spawner and spawnee can communicate with each other.
-   *
-   * If the [paused] parameter is set to `true`,
-   * the isolate will start up in a paused state,
-   * as if by an initial call of `isolate.pause(isolate.pauseCapability)`.
-   * This allows setting up error or exit listeners on the isolate
-   * before it starts running.
-   * To resume the isolate, call `isolate.resume(isolate.pauseCapability)`.
-   *
-   * WARNING: The `pause` parameter is not implemented on all platforms yet.
-   *
-   * Returns a future that will complete with an [Isolate] instance if the
-   * spawning succeeded. It will complete with an error otherwise.
-   */
-  external static Future<Isolate> spawn(void entryPoint(message), var message,
-                                        { bool paused: false });
-
-  /**
-   * Creates and spawns an isolate that runs the code from the library with
-   * the specified URI.
-   *
-   * The isolate starts executing the top-level `main` function of the library
-   * with the given URI.
-   *
-   * The target `main` must be a subtype of one of these three signatures:
-   *
-   * * `main()`
-   * * `main(args)`
-   * * `main(args, message)`
-   *
-   * When present, the parameter `args` is set to the provided [args] list.
-   * When present, the parameter `message` is set to the initial [message].
-   *
-   * If the [packageRoot] parameter is provided, it is used to find the location
-   * of packages imports in the spawned isolate.
-   * The `packageRoot` URI must be a "file" or "http"/"https" URI that specifies
-   * a directory. If it doesn't end in a slash, one will be added before
-   * using the URI, and any query or fragment parts are ignored.
-   * Package imports (like "package:foo/bar.dart") in the new isolate are
-   * resolved against this location, as by
-   * `packageRoot.resolve("foo/bar.dart")`.
-   * This includes the main entry [uri] if it happens to be a package-URL.
-   * If [packageRoot] is omitted, it defaults to the same URI that
-   * the current isolate is using.
-   *
-   * WARNING: The [packageRoot] parameter is not implemented on all
-   * platforms yet.
-   *
-   * If the [paused] parameter is set to `true`,
-   * the isolate will start up in a paused state,
-   * as if by an initial call of `isolate.pause(isolate.pauseCapability)`.
-   * This allows setting up error or exit listeners on the isolate
-   * before it starts running.
-   * To resume the isolate, call `isolate.resume(isolate.pauseCapability)`.
-   *
-   * WARNING: The `pause` parameter is not implemented on all platforms yet.
-   *
-   * Returns a future that will complete with an [Isolate] instance if the
-   * spawning succeeded. It will complete with an error otherwise.
-   */
-  external static Future<Isolate> spawnUri(
-      Uri uri,
-      List<String> args,
-      var message,
-      {bool paused: false,
-       Uri packageRoot});
-
-  /**
-   * Requests the isolate to pause.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * The isolate should stop handling events by pausing its event queue.
-   * The request will eventually make the isolate stop doing anything.
-   * It will be handled before any other messages that are later sent to the
-   * isolate from the current isolate, but no other guarantees are provided.
-   *
-   * The event loop may be paused before previously sent, but not yet exeuted,
-   * messages have been reached.
-   *
-   * If [resumeCapability] is provided, it is used to identity the pause,
-   * and must be used again to end the pause using [resume].
-   * Otherwise a new resume capability is created and returned.
-   *
-   * If an isolate is paused more than once using the same capability,
-   * only one resume with that capability is needed to end the pause.
-   *
-   * If an isolate is paused using more than one capability,
-   * they must all be individully ended before the isolate resumes.
-   *
-   * Returns the capability that must be used to resume end the pause.
-   */
-  Capability pause([Capability resumeCapability]) {
-    if (resumeCapability == null) resumeCapability = new Capability();
-    _pause(resumeCapability);
-    return resumeCapability;
-  }
-
-  /** Internal implementation of [pause]. */
-  external void _pause(Capability resumeCapability);
-
-  /**
-   * Resumes a paused isolate.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * Sends a message to an isolate requesting that it ends a pause
-   * that was requested using the [resumeCapability].
-   *
-   * When all active pause requests have been cancelled, the isolate
-   * will continue handling normal messages.
-   *
-   * The capability must be one returned by a call to [pause] on this
-   * isolate, otherwise the resume call does nothing.
-   */
-  external void resume(Capability resumeCapability);
-
-  /**
-   * Asks the isolate to send a message on [responsePort] when it terminates.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * The isolate will send a `null` message on [responsePort] as the last
-   * thing before it terminates. It will run no further code after the message
-   * has been sent.
-   *
-   * If the isolate is already dead, no message will be sent.
-   */
-  /* TODO(lrn): Can we do better? Can the system recognize this message and
-   * send a reply if the receiving isolate is dead?
-   */
-  external void addOnExitListener(SendPort responsePort);
-
-  /**
-   * Stop listening on exit messages from the isolate.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * If a call has previously been made to [addOnExitListener] with the same
-   * send-port, this will unregister the port, and it will no longer receive
-   * a message when the isolate terminates.
-   * A response may still be sent until this operation is fully processed by
-   * the isolate.
-   */
-  external void removeOnExitListener(SendPort responsePort);
-
-  /**
-   * Set whether uncaught errors will terminate the isolate.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * If errors are fatal, any uncaught error will terminate the isolate
-   * event loop and shut down the isolate.
-   *
-   * This call requires the [terminateCapability] for the isolate.
-   * If the capability is not correct, no change is made.
-   */
-  external void setErrorsFatal(bool errorsAreFatal);
-
-  /**
-   * Requests the isolate to shut down.
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * The isolate is requested to terminate itself.
-   * The [priority] argument specifies when this must happen.
-   *
-   * The [priority] must be one of [IMMEDIATE], [BEFORE_NEXT_EVENT] or
-   * [AS_EVENT].
-   * The shutdown is performed at different times depending on the priority:
-   *
-   * * `IMMEDIATE`: The isolate shuts down as soon as possible.
-   *     Control messages are handled in order, so all previously sent control
-   *     events from this isolate will all have been processed.
-   *     The shutdown should happen no later than if sent with
-   *     `BEFORE_NEXT_EVENT`.
-   *     It may happen earlier if the system has a way to shut down cleanly
-   *     at an earlier time, even during the execution of another event.
-   * * `BEFORE_NEXT_EVENT`: The shutdown is scheduled for the next time
-   *     control returns to the event loop of the receiving isolate,
-   *     after the current event, and any already scheduled control events,
-   *     are completed.
-   * * `AS_EVENT`: The shutdown does not happen until all prevously sent
-   *     non-control messages from the current isolate to the receiving isolate
-   *     have been processed.
-   *     The kill operation effectively puts the shutdown into the normal event
-   *     queue after previously sent messages, and it is affected by any control
-   *     messages that affect normal events, including `pause`.
-   *     This can be used to wait for a another event to be processed.
-   */
-  external void kill([int priority = BEFORE_NEXT_EVENT]);
-
-  /**
-   * Request that the isolate send a response on the [responsePort].
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * If the isolate is alive, it will eventually send a `null` response on
-   * the response port.
-   *
-   * The [pingType] must be one of [IMMEDIATE], [BEFORE_NEXT_EVENT] or
-   * [AS_EVENT].
-   * The response is sent at different times depending on the ping type:
-   *
-   * * `IMMEDIATE`: The isolate responds as soon as it receives the
-   *     control message. This is after any previous control message
-   *     from the same isolate has been received.
-   * * `BEFORE_NEXT_EVENT`: The response is scheduled for the next time
-   *     control returns to the event loop of the receiving isolate,
-   *     after the current event, and any already scheduled control events,
-   *     are completed.
-   * * `AS_EVENT`: The response is not sent until all prevously sent
-   *     non-control messages from the current isolate to the receiving isolate
-   *     have been processed.
-   *     The ping effectively puts the response into the normal event queue
-   *     after previously sent messages, and it is affected by any control
-   *     messages that affect normal events, including `pause`.
-   *     This can be used to wait for a another event to be processed.
-   */
-  external void ping(SendPort responsePort, [int pingType = IMMEDIATE]);
-
-  /**
-   * Requests that uncaught errors of the isolate are sent back to [port].
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * The errors are sent back as two elements lists.
-   * The first element is a `String` representation of the error, usually
-   * created by calling `toString` on the error.
-   * The second element is a `String` representation of an accompanying
-   * stack trace, or `null` if no stack trace was provided.
-   *
-   * Listening using the same port more than once does nothing. It will only
-   * get each error once.
-   */
-  external void addErrorListener(SendPort port);
-
-  /**
-   * Stop listening for uncaught errors through [port].
-   *
-   * WARNING: This method is experimental and not handled on every platform yet.
-   *
-   * The `port` should be a port that is listening for errors through
-   * [addErrorListener]. This call requests that the isolate stops sending
-   * errors on the port.
-   *
-   * If the same port has been passed via `addErrorListener` more than once,
-   * only one call to `removeErrorListener` is needed to stop it from receiving
-   * errors.
-   *
-   * Closing the receive port at the end of the send port will not stop the
-   * isolate from sending errors, they are just going to be lost.
-   */
-  external void removeErrorListener(SendPort port);
-
-  /**
-   * Returns a broadcast stream of uncaught errors from the isolate.
-   *
-   * Each error is provided as an error event on the stream.
-   *
-   * The actual error object and stackTraces will not necessarily
-   * be the same object types as in the actual isolate, but they will
-   * always have the same [Object.toString] result.
-   *
-   * This stream is based on [addErrorListener] and [removeErrorListener].
-   */
-  Stream get errors {
-    StreamController controller;
-    RawReceivePort port;
-    void handleError(message) {
-      String errorDescription = message[0];
-      String stackDescription = message[1];
-      var error = new RemoteError(errorDescription, stackDescription);
-      controller.addError(error, error.stackTrace);
-    }
-    controller = new StreamController.broadcast(
-        sync: true,
-        onListen: () {
-          port = new RawReceivePort(handleError);
-          this.addErrorListener(port.sendPort);
-        },
-        onCancel: () {
-          this.removeErrorListener(port.sendPort);
-          port.close();
-          port = null;
-        });
-    return controller.stream;
-  }
-}
-
-/**
- * Sends messages to its [ReceivePort]s.
- *
- * [SendPort]s are created from [ReceivePort]s. Any message sent through
- * a [SendPort] is delivered to its corresponding [ReceivePort]. There might be
- * many [SendPort]s for the same [ReceivePort].
- *
- * [SendPort]s can be transmitted to other isolates, and they preserve equality
- * when sent.
- */
-abstract class SendPort implements Capability {
-
-  /**
-   * Sends an asynchronous [message] through this send port, to its
-   * corresponding `ReceivePort`.
-   *
-   * The content of [message] can be: primitive values (null, num, bool, double,
-   * String), instances of [SendPort], and lists and maps whose elements are any
-   * of these. List and maps are also allowed to be cyclic.
-   *
-   * In the special circumstances when two isolates share the same code and are
-   * running in the same process (e.g. isolates created via [Isolate.spawn]), it
-   * is also possible to send object instances (which would be copied in the
-   * process). This is currently only supported by the dartvm.  For now, the
-   * dart2js compiler only supports the restricted messages described above.
-   */
-  void send(var message);
-
-  /**
-   * Tests whether [other] is a [SendPort] pointing to the same
-   * [ReceivePort] as this one.
-   */
-  bool operator==(var other);
-
-  /**
-   * Returns an immutable hash code for this send port that is
-   * consistent with the == operator.
-   */
-  int get hashCode;
-}
-
-/**
- * Together with [SendPort], the only means of communication between isolates.
- *
- * [ReceivePort]s have a `sendPort` getter which returns a [SendPort].
- * Any message that is sent through this [SendPort]
- * is delivered to the [ReceivePort] it has been created from. There, the
- * message is dispatched to the `ReceivePort`'s listener.
- *
- * A [ReceivePort] is a non-broadcast stream. This means that it buffers
- * incoming messages until a listener is registered. Only one listener can
- * receive messages. See [Stream.asBroadcastStream] for transforming the port
- * to a broadcast stream.
- *
- * A [ReceivePort] may have many [SendPort]s.
- */
-abstract class ReceivePort implements Stream {
-
-  /**
-   * Opens a long-lived port for receiving messages.
-   *
-   * A [ReceivePort] is a non-broadcast stream. This means that it buffers
-   * incoming messages until a listener is registered. Only one listener can
-   * receive messages. See [Stream.asBroadcastStream] for transforming the port
-   * to a broadcast stream.
-   *
-   * A receive port is closed by canceling its subscription.
-   */
-  external factory ReceivePort();
-
-  /**
-   * Creates a [ReceivePort] from a [RawReceivePort].
-   *
-   * The handler of the given [rawPort] is overwritten during the construction
-   * of the result.
-   */
-  external factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort);
-
-  /**
-   * Inherited from [Stream].
-   *
-   * Note that [onError] and [cancelOnError] are ignored since a ReceivePort
-   * will never receive an error.
-   *
-   * The [onDone] handler will be called when the stream closes.
-   * The stream closes when [close] is called.
-   */
-  StreamSubscription listen(void onData(var message),
-                            { Function onError,
-                              void onDone(),
-                              bool cancelOnError });
-
-  /**
-   * Closes `this`.
-   *
-   * If the stream has not been canceled yet, adds a close-event to the event
-   * queue and discards any further incoming messages.
-   *
-   * If the stream has already been canceled this method has no effect.
-   */
-  void close();
-
-  /**
-   * Returns a [SendPort] that sends to this receive port.
-   */
-  SendPort get sendPort;
-}
-
-abstract class RawReceivePort {
-  /**
-   * Opens a long-lived port for receiving messages.
-   *
-   * A [RawReceivePort] is low level and does not work with [Zone]s. It
-   * can not be paused. The data-handler must be set before the first
-   * event is received.
-   */
-  external factory RawReceivePort([void handler(event)]);
-
-  /**
-   * Sets the handler that is invoked for every incoming message.
-   *
-   * The handler is invoked in the root-zone ([Zone.ROOT]).
-   */
-  void set handler(Function newHandler);
-
-  /**
-   * Closes the port.
-   *
-   * After a call to this method any incoming message is silently dropped.
-   */
-  void close();
-
-  /**
-   * Returns a [SendPort] that sends to this raw receive port.
-   */
-  SendPort get sendPort;
-}
-
-/**
- * Wraps unhandled exceptions thrown during isolate execution. It is
- * used to show both the error message and the stack trace for unhandled
- * exceptions.
- */
-// TODO(floitsch): probably going to remove and replace with something else.
-class _IsolateUnhandledException implements Exception {
-  /** Message being handled when exception occurred. */
-  final message;
-
-  /** Wrapped exception. */
-  final source;
-
-  /** Trace for the wrapped exception. */
-  final StackTrace stackTrace;
-
-  const _IsolateUnhandledException(this.message, this.source, this.stackTrace);
-
-  String toString() {
-    return 'IsolateUnhandledException: exception while handling message: '
-        '${message} \n  '
-        '${source.toString().replaceAll("\n", "\n  ")}\n'
-        'original stack trace:\n  '
-        '${stackTrace.toString().replaceAll("\n","\n  ")}';
-  }
-}
-
-/**
- * Description of an error from another isolate.
- *
- * This error has the same `toString()` and `stackTrace.toString()` behavior
- * as the original error, but has no other features of the original error.
- */
-class RemoteError implements Error {
-  final String _description;
-  final StackTrace stackTrace;
-  RemoteError(String description, String stackDescription)
-      : _description = description,
-        stackTrace = new _RemoteStackTrace(stackDescription);
-  String toString() => _description;
-}
-
-class _RemoteStackTrace implements StackTrace {
-  String _trace;
-  _RemoteStackTrace(this._trace);
-  String toString() => _trace;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/math/jenkins_smi_hash.dart b/pkg/dev_compiler/tool/input_sdk/lib/math/jenkins_smi_hash.dart
deleted file mode 100644
index 8a0056e..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/math/jenkins_smi_hash.dart
+++ /dev/null
@@ -1,41 +0,0 @@
-// 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.
-part of dart.math;
-
-/**
- * This is the [Jenkins hash function][1] but using masking to keep
- * values in SMI range.
- *
- * [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function
- *
- * Use:
- * Hash each value with the hash of the previous value, then get the final
- * hash by calling finish.
- *
- *     var hash = 0;
- *     for (var value in values) {
- *       hash = JenkinsSmiHash.combine(hash, value.hashCode);
- *     }
- *     hash = JenkinsSmiHash.finish(hash);
- */
-class _JenkinsSmiHash {
-  // TODO(11617): This class should be optimized and standardized elsewhere.
-
-  static int combine(int hash, int value) {
-    hash = 0x1fffffff & (hash + value);
-    hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-    return hash ^ (hash >> 6);
-  }
-
-  static int finish(int hash) {
-    hash = 0x1fffffff & (hash + ((0x03ffffff & hash) <<  3));
-    hash = hash ^ (hash >> 11);
-    return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
-  }
-
-  static int hash2(a, b) => finish(combine(combine(0, a), b));
-
-  static int hash4(a, b, c, d) =>
-      finish(combine(combine(combine(combine(0, a), b), c), d));
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/math/math.dart b/pkg/dev_compiler/tool/input_sdk/lib/math/math.dart
deleted file mode 100644
index 0f651b7..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/math/math.dart
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/**
- * Mathematical constants and functions, plus a random number generator.
- *
- * To use this library in your code:
- *
- *     import 'dart:math';
- */
-library dart.math;
-
-part "jenkins_smi_hash.dart";
-part "point.dart";
-part "random.dart";
-part "rectangle.dart";
-
-/**
- * Base of the natural logarithms.
- *
- * Typically written as "e".
- */
-const double E = 2.718281828459045;
-
-/**
- * Natural logarithm of 10.
- */
-const double LN10 =  2.302585092994046;
-
-/**
- * Natural logarithm of 2.
- */
-const double LN2 =  0.6931471805599453;
-
-/**
- * Base-2 logarithm of [E].
- */
-const double LOG2E = 1.4426950408889634;
-
-/**
- * Base-10 logarithm of [E].
- */
-const double LOG10E = 0.4342944819032518;
-
-/**
- * The PI constant.
- */
-const double PI = 3.1415926535897932;
-
-/**
- * Square root of 1/2.
- */
-const double SQRT1_2 = 0.7071067811865476;
-
-/**
- * Square root of 2.
- */
-const double SQRT2 = 1.4142135623730951;
-
-/**
-  * Returns the lesser of two numbers.
-  *
-  * Returns NaN if either argument is NaN.
-  * The lesser of `-0.0` and `0.0` is `-0.0`.
-  * If the arguments are otherwise equal (including int and doubles with the
-  * same mathematical value) then it is unspecified which of the two arguments
-  * is returned.
-  */
-external num/*=T*/ min/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b);
-
-/**
-  * Returns the larger of two numbers.
-  *
-  * Returns NaN if either argument is NaN.
-  * The larger of `-0.0` and `0.0` is `0.0`. If the arguments are
-  * otherwise equal (including int and doubles with the same mathematical value)
-  * then it is unspecified which of the two arguments is returned.
-  */
-external num/*=T*/ max/*<T extends num>*/(num/*=T*/ a, num/*=T*/ b);
-
-/**
- * A variant of [atan].
- *
- * Converts both arguments to doubles.
- *
- * Returns the angle between the positive x-axis and the vector ([b],[a]).
- * The result, in radians, is in the range -PI..PI.
- *
- * If [b] is positive, this is the same as `atan(b/a)`.
- *
- * The result is negative when [a] is negative (including when [a] is the
- * double -0.0).
- *
- * If [a] is equal to zero, the vector ([b],[a]) is considered parallel to
- * the x-axis, even if [b] is also equal to zero. The sign of [b] determines
- * the direction of the vector along the x-axis.
- *
- * Returns NaN if either argument is NaN.
- */
-external double atan2(num a, num b);
-
-/**
- * Returns [x] to the power of [exponent].
- *
- * If [x] is an [int] and [exponent] is a non-negative [int], the result is
- * an [int], otherwise both arguments are converted to doubles first, and the
- * result is a [double].
- *
- * For integers, the power is always equal to the mathematical result of `x` to
- * the power `exponent`, only limited by the available memory.
- *
- * For doubles, `pow(x, y)` handles edge cases as follows:
- *
- * - if `y` is zero (0.0 or -0.0), the result is always 1.0.
- * - if `x` is 1.0, the result is always 1.0.
- * - otherwise, if either `x` or `y` is NaN then the result is NaN.
- * - if `x` is negative (but not -0.0) and `y` is a finite non-integer, the
- *   result is NaN.
- * - if `x` is Infinity and `y` is negative, the result is 0.0.
- * - if `x` is Infinity and `y` is positive, the result is Infinity.
- * - if `x` is 0.0 and `y` is negative, the result is Infinity.
- * - if `x` is 0.0 and `y` is positive, the result is 0.0.
- * - if `x` is -Infinity or -0.0 and `y` is an odd integer, then the result is
- *   `-pow(-x ,y)`.
- * - if `x` is -Infinity or -0.0 and `y` is not an odd integer, then the result
- *   is the same as `pow(-x , y)`.
- * - if `y` is Infinity and the absolute value of `x` is less than 1, the
- *   result is 0.0.
- * - if `y` is Infinity and `x` is -1, the result is 1.0.
- * - if `y` is Infinity and the absolute value of `x` is greater than 1,
- *   the result is Infinity.
- * - if `y` is -Infinity, the result is `1/pow(x, Infinity)`.
- *
- * This corresponds to the `pow` function defined in the IEEE Standard 754-2008.
- *
- * Notice that an [int] result cannot overflow, but a [double] result might
- * be [double.INFINITY].
- */
-external num pow(num x, num exponent);
-
-/**
- * Converts [x] to a double and returns the sine of the value.
- *
- * If [x] is not a finite number, the result is NaN.
- */
-external double sin(num x);
-
-/**
- * Converts [x] to a double and returns the cosine of the value.
- *
- * If [x] is not a finite number, the result is NaN.
- */
-external double cos(num x);
-
-/**
- * Converts [x] to a double and returns the tangent of the value.
- *
- * The tangent function is equivalent to `sin(x)/cos(x)` and may be
- * infinite (positive or negative) when `cos(x)` is equal to zero.
- * If [x] is not a finite number, the result is NaN.
- */
-external double tan(num x);
-
-/**
- * Converts [x] to a double and returns the arc cosine of the value.
- *
- * Returns a value in the range 0..PI, or NaN if [x] is outside
- * the range -1..1.
- */
-external double acos(num x);
-
-/**
- * Converts [x] to a double and returns the arc sine of the value.
- *
- * Returns a value in the range -PI/2..PI/2, or NaN if [x] is outside
- * the range -1..1.
- */
-external double asin(num x);
-
-/**
- * Converts [x] to a double and returns the arc tangent of the value.
- *
- * Returns a value in the range -PI/2..PI/2, or NaN if [x] is NaN.
- */
-external double atan(num x);
-
-/**
- * Converts [x] to a double and returns the positive square root of the value.
- *
- * Returns -0.0 if [x] is -0.0, and NaN if [x] is otherwise negative or NaN.
- */
-external double sqrt(num x);
-
-/**
- * Converts [x] to a double and returns the natural exponent, [E],
- * to the power [x].
- *
- * Returns NaN if [x] is NaN.
- */
-external double exp(num x);
-
-/**
- * Converts [x] to a double and returns the natural logarithm of the value.
- *
- * Returns negative infinity if [x] is equal to zero.
- * Returns NaN if [x] is NaN or less than zero.
- */
-external double log(num x);
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/math/point.dart b/pkg/dev_compiler/tool/input_sdk/lib/math/point.dart
deleted file mode 100644
index 01ce93c..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/math/point.dart
+++ /dev/null
@@ -1,89 +0,0 @@
-// 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.
-part of dart.math;
-
-/**
- * A utility class for representing two-dimensional positions.
- */
-class Point<T extends num> {
-  final T x;
-  final T y;
-
-  const Point(T x, T y): this.x = x, this.y = y;
-
-  String toString() => 'Point($x, $y)';
-
-  /**
-   * A `Point` is only equal to another `Point` with the same coordinates.
-   *
-   * This point is equal to `other` if, and only if,
-   * `other` is a `Point` with
-   * [x] equal to `other.x` and [y] equal to `other.y`.
-   */
-  bool operator ==(other) {
-    if (other is !Point) return false;
-    return x == other.x && y == other.y;
-  }
-
-  int get hashCode => _JenkinsSmiHash.hash2(x.hashCode, y.hashCode);
-
-  /**
-   * Add [other] to `this`, as if both points were vectors.
-   *
-   * Returns the resulting "vector" as a Point.
-   */
-  Point<T> operator +(Point<T> other) {
-    return new Point<T>(x + other.x, y + other.y);
-  }
-
-  /**
-   * Subtract [other] from `this`, as if both points were vectors.
-   *
-   * Returns the resulting "vector" as a Point.
-   */
-  Point<T> operator -(Point<T> other) {
-    return new Point<T>(x - other.x, y - other.y);
-  }
-
-  /**
-   * Scale this point by [factor] as if it were a vector.
-   *
-   * *Important* *Note*: This function accepts a `num` as its argument only so
-   * that you can scale Point<double> objects by an `int` factor. Because the
-   * star operator always returns the same type of Point that originally called
-   * it, passing in a double [factor] on a `Point<int>` _causes_ _a_
-   * _runtime_ _error_ in checked mode.
-   */
-  Point<T> operator *(num/*T|int*/ factor) {
-    return new Point<T>(
-        (x * factor) as dynamic/*=T*/, (y * factor) as dynamic/*=T*/);
-  }
-
-  /**
-   * Get the straight line (Euclidean) distance between the origin (0, 0) and
-   * this point.
-   */
-  double get magnitude => sqrt(x * x + y * y);
-
-  /**
-   * Returns the distance between `this` and [other].
-   */
-  double distanceTo(Point<T> other) {
-    var dx = x - other.x;
-    var dy = y - other.y;
-    return sqrt(dx * dx + dy * dy);
-  }
-
-  /**
-   * Returns the squared distance between `this` and [other].
-   *
-   * Squared distances can be used for comparisons when the actual value is not
-   * required.
-   */
-  T squaredDistanceTo(Point<T> other) {
-    var dx = x - other.x;
-    var dy = y - other.y;
-    return dx * dx + dy * dy;
-  }
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/math/random.dart b/pkg/dev_compiler/tool/input_sdk/lib/math/random.dart
deleted file mode 100644
index 47c5582..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/math/random.dart
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-part of dart.math;
-
-/**
- * A generator of random bool, int, or double values.
- *
- * The default implementation supplies a stream of
- * pseudo-random bits that are not suitable for cryptographic purposes.
- *
- * Use the Random.secure() constructor for cryptographic
- * purposes.
- */
-abstract class Random {
-  /**
-   * Creates a random number generator.
-   *
-   * The optional parameter [seed] is used to initialize the
-   * internal state of the generator. The implementation of the
-   * random stream can change between releases of the library.
-   */
-  external factory Random([int seed]);
-
-  /**
-   * Creates a cryptographically secure random number generator.
-   *
-   * If the program cannot provide a cryptographically secure
-   * source of random numbers, it throws an [UnsupportedError].
-   */
-  external factory Random.secure();
-
-  /**
-   * Generates a non-negative random integer uniformly distributed in the range
-   * from 0, inclusive, to [max], exclusive.
-   *
-   * Implementation note: The default implementation supports [max] values
-   * between 1 and (1<<32) inclusive.
-   */
-  int nextInt(int max);
-
-  /**
-   * Generates a non-negative random floating point value uniformly distributed
-   * in the range from 0.0, inclusive, to 1.0, exclusive.
-   */
-  double nextDouble();
-
-  /**
-   * Generates a random boolean value.
-   */
-  bool nextBool();
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/math/rectangle.dart b/pkg/dev_compiler/tool/input_sdk/lib/math/rectangle.dart
deleted file mode 100644
index bae6602..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/math/rectangle.dart
+++ /dev/null
@@ -1,283 +0,0 @@
-// 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.
-part of dart.math;
-
-/**
- * A base class for representing two-dimensional axis-aligned rectangles.
- *
- * This rectangle uses a left-handed Cartesian coordinate system, with x
- * directed to the right and y directed down, as per the convention in 2D
- * computer graphics.
- *
- * See also:
- *    [W3C Coordinate Systems Specification](http://www.w3.org/TR/SVG/coords.html#InitialCoordinateSystem).
- *
- * The rectangle is the set of points with representable coordinates greater
- * than or equal to left/top, and with distance to left/top no greater than
- * width/height (to the limit of the precission of the coordinates).
- */
-abstract class _RectangleBase<T extends num> {
-  const _RectangleBase();
-
-  /** The x-coordinate of the left edge. */
-  T get left;
-  /** The y-coordinate of the top edge. */
-  T get top;
-  /** The width of the rectangle. */
-  T get width;
-  /** The height of the rectangle. */
-  T get height;
-
-  /** The x-coordinate of the right edge. */
-  T get right => left + width;
-  /** The y-coordinate of the bottom edge. */
-  T get bottom => top + height;
-
-  String toString() {
-    return 'Rectangle ($left, $top) $width x $height';
-  }
-
-  bool operator ==(other) {
-    if (other is !Rectangle) return false;
-    // TODO(rnystrom): Type promotion doesn't currently promote the [other]
-    // to Rectangle from the above line, so do it explicitly here to avoid a
-    // dynamic send and work around:
-    // https://github.com/dart-lang/sdk/issues/27551
-    var otherRect = other as Rectangle;
-    return left == otherRect.left &&
-        top == otherRect.top &&
-        right == otherRect.right &&
-        bottom == otherRect.bottom;
-  }
-
-  int get hashCode => _JenkinsSmiHash.hash4(left.hashCode, top.hashCode,
-      right.hashCode, bottom.hashCode);
-
-  /**
-   * Computes the intersection of `this` and [other].
-   *
-   * The intersection of two axis-aligned rectangles, if any, is always another
-   * axis-aligned rectangle.
-   *
-   * Returns the intersection of this and `other`, or `null` if they don't
-   * intersect.
-   */
-  Rectangle<T> intersection(Rectangle<T> other) {
-    var x0 = max(left, other.left);
-    var x1 = min(left + width, other.left + other.width);
-
-    if (x0 <= x1) {
-      var y0 = max(top, other.top);
-      var y1 = min(top + height, other.top + other.height);
-
-      if (y0 <= y1) {
-        return new Rectangle<T>(x0, y0, x1 - x0, y1 - y0);
-      }
-    }
-    return null;
-  }
-
-
-  /**
-   * Returns true if `this` intersects [other].
-   */
-  bool intersects(Rectangle<num> other) {
-    return (left <= other.left + other.width &&
-        other.left <= left + width &&
-        top <= other.top + other.height &&
-        other.top <= top + height);
-  }
-
-  /**
-   * Returns a new rectangle which completely contains `this` and [other].
-   */
-  Rectangle<T> boundingBox(Rectangle<T> other) {
-    var right = max(this.left + this.width, other.left + other.width);
-    var bottom = max(this.top + this.height, other.top + other.height);
-
-    var left = min(this.left, other.left);
-    var top = min(this.top, other.top);
-
-    return new Rectangle<T>(left, top, right - left, bottom - top);
-  }
-
-  /**
-   * Tests whether `this` entirely contains [another].
-   */
-  bool containsRectangle(Rectangle<num> another) {
-    return left <= another.left &&
-           left + width >= another.left + another.width &&
-           top <= another.top &&
-           top + height >= another.top + another.height;
-  }
-
-  /**
-   * Tests whether [another] is inside or along the edges of `this`.
-   */
-  bool containsPoint(Point<num> another) {
-    return another.x >= left &&
-           another.x <= left + width &&
-           another.y >= top &&
-           another.y <= top + height;
-  }
-
-  Point<T> get topLeft => new Point<T>(this.left, this.top);
-  Point<T> get topRight => new Point<T>(this.left + this.width, this.top);
-  Point<T> get bottomRight => new Point<T>(this.left + this.width,
-      this.top + this.height);
-  Point<T> get bottomLeft => new Point<T>(this.left,
-      this.top + this.height);
-}
-
-
-/**
- * A class for representing two-dimensional rectangles whose properties are
- * immutable.
- */
-class Rectangle<T extends num> extends _RectangleBase<T> {
-  final T left;
-  final T top;
-  final T width;
-  final T height;
-
-  /**
-   * Create a rectangle spanned by `(left, top)` and `(left+width, top+height)`.
-   *
-   * The rectangle contains the points
-   * with x-coordinate between `left` and `left + width`, and
-   * with y-coordinate between `top` and `top + height`, both inclusive.
-   *
-   * The `width` and `height` should be non-negative.
-   * If `width` or `height` are negative, they are clamped to zero.
-   *
-   * If `width` and `height` are zero, the "rectangle" comprises only the single
-   * point `(left, top)`.
-   */
-  const Rectangle(this.left, this.top, T width, T height)
-      : this.width = (width < 0) ? -width * 0 : width,  // Inline _clampToZero.
-        this.height = (height < 0) ?  -height * 0 : height;
-
-  /**
-   * Create a rectangle spanned by the points [a] and [b];
-   *
-   * The rectangle contains the points
-   * with x-coordinate between `a.x` and `b.x`, and
-   * with y-coordinate between `a.y` and `b.y`, both inclusive.
-   *
-   * If the distance between `a.x` and `b.x` is not representable
-   * (which can happen if one or both is a double),
-   * the actual right edge might be slightly off from `max(a.x, b.x)`.
-   * Similar for the y-coordinates and the bottom edge.
-   */
-  factory Rectangle.fromPoints(Point<T> a, Point<T> b) {
-    T left = min(a.x, b.x);
-    T width = max(a.x, b.x) - left;
-    T top = min(a.y, b.y);
-    T height = max(a.y, b.y) - top;
-    return new Rectangle<T>(left, top, width, height);
-  }
-}
-
-/**
- * A class for representing two-dimensional axis-aligned rectangles with mutable
- * properties.
- */
-class MutableRectangle<T extends num> extends _RectangleBase<T>
-                                      implements Rectangle<T> {
-
-  /**
-   * The x-coordinate of the left edge.
-   *
-   * Setting the value will move the rectangle without changing its width.
-   */
-  T left;
-  /**
-   * The y-coordinate of the left edge.
-   *
-   * Setting the value will move the rectangle without changing its height.
-   */
-  T top;
-  T _width;
-  T _height;
-
-  /**
-   * Create a mutable rectangle spanned by `(left, top)` and
-   * `(left+width, top+height)`.
-   *
-   * The rectangle contains the points
-   * with x-coordinate between `left` and `left + width`, and
-   * with y-coordinate between `top` and `top + height`, both inclusive.
-   *
-   * The `width` and `height` should be non-negative.
-   * If `width` or `height` are negative, they are clamped to zero.
-   *
-   * If `width` and `height` are zero, the "rectangle" comprises only the single
-   * point `(left, top)`.
-   */
-  MutableRectangle(this.left, this.top, T width, T height)
-      : this._width = (width < 0) ? _clampToZero/*<T>*/(width) : width,
-        this._height = (height < 0) ? _clampToZero/*<T>*/(height) : height;
-
-  /**
-   * Create a mutable rectangle spanned by the points [a] and [b];
-   *
-   * The rectangle contains the points
-   * with x-coordinate between `a.x` and `b.x`, and
-   * with y-coordinate between `a.y` and `b.y`, both inclusive.
-   *
-   * If the distance between `a.x` and `b.x` is not representable
-   * (which can happen if one or both is a double),
-   * the actual right edge might be slightly off from `max(a.x, b.x)`.
-   * Similar for the y-coordinates and the bottom edge.
-   */
-  factory MutableRectangle.fromPoints(Point<T> a, Point<T> b) {
-    T left = min(a.x, b.x);
-    T width = max(a.x, b.x) - left;
-    T top = min(a.y, b.y);
-    T height = max(a.y, b.y) - top;
-    return new MutableRectangle<T>(left, top, width, height);
-  }
-
-  T get width => _width;
-
- /**
-   * Sets the width of the rectangle.
-   *
-   * The width must be non-negative.
-   * If a negative width is supplied, it is clamped to zero.
-   *
-   * Setting the value will change the right edge of the rectangle,
-   * but will not change [left].
-   */
-  void set width(T width) {
-    if (width < 0) width = _clampToZero/*<T>*/(width);
-    _width = width;
-  }
-
-  T get height => _height;
-
-  /**
-   * Sets the height of the rectangle.
-   *
-   * The height must be non-negative.
-   * If a negative height is supplied, it is clamped to zero.
-   *
-   * Setting the value will change the bottom edge of the rectangle,
-   * but will not change [top].
-   */
-  void set height(T height) {
-    if (height < 0) height = _clampToZero/*<T>*/(height);
-    _height = height;
-  }
-}
-
-/**
- * Converts a negative [int] or [double] to a zero-value of the same type.
- *
- * Returns `0` if value is int, `0.0` if value is double.
- */
-num/*=T*/ _clampToZero/*<T extends num>*/(num/*=T*/ value) {
-  assert(value < 0);
-  return -value * 0;
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/lib/mirrors/mirrors.dart b/pkg/dev_compiler/tool/input_sdk/lib/mirrors/mirrors.dart
deleted file mode 100644
index 25cab26..0000000
--- a/pkg/dev_compiler/tool/input_sdk/lib/mirrors/mirrors.dart
+++ /dev/null
@@ -1,1426 +0,0 @@
-// 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.
-
-// For the purposes of the mirrors library, we adopt a naming
-// convention with respect to getters and setters.  Specifically, for
-// some variable or field...
-//
-//   var myField;
-//
-// ...the getter is named 'myField' and the setter is named
-// 'myField='.  This allows us to assign unique names to getters and
-// setters for the purposes of member lookup.
-
-/**
- * Basic reflection in Dart,
- * with support for introspection and dynamic invocation.
- *
- * *Introspection* is that subset of reflection by which a running
- * program can examine its own structure. For example, a function
- * that prints out the names of all the members of an arbitrary object.
- *
- * *Dynamic invocation* refers the ability to evaluate code that
- * has not been literally specified at compile time, such as calling a method
- * whose name is provided as an argument (because it is looked up
- * in a database, or provided interactively by the user).
- *
- * ## How to interpret this library's documentation
- *
- * As a rule, the names of Dart declarations are represented using
- * instances of class [Symbol]. Whenever the doc speaks of an object *s*
- * of class [Symbol] denoting a name, it means the string that
- * was used to construct *s*.
- *
- * The documentation frequently abuses notation with
- * Dart pseudo-code such as [:o.x(a):], where
- * o and a are defined to be objects; what is actually meant in these
- * cases is [:o'.x(a'):] where *o'* and *a'* are Dart variables
- * bound to *o* and *a* respectively. Furthermore, *o'* and *a'*
- * are assumed to be fresh variables (meaning that they are
- * distinct from any other variables in the program).
- *
- * Sometimes the documentation refers to *serializable* objects.
- * An object is serializable across isolates if and only if it is an instance of
- * num, bool, String, a list of objects that are serializable
- * across isolates, or a map with keys and values that are all serializable across
- * isolates.
- *
- * ## Status: Unstable
- *
- * The dart:mirrors library is unstable and its API might change slightly as a
- * result of user feedback. This library is platform dependent and therefore it
- * has implementations for both dart2js and the Dart VM. Both are under
- * development and may not support all operations yet.
- */
-library dart.mirrors;
-
-/**
- * A [MirrorSystem] is the main interface used to reflect on a set of
- * associated libraries.
- *
- * At runtime each running isolate has a distinct [MirrorSystem].
- *
- * It is also possible to have a [MirrorSystem] which represents a set
- * of libraries which are not running -- perhaps at compile-time.  In
- * this case, all available reflective functionality would be
- * supported, but runtime functionality (such as invoking a function
- * or inspecting the contents of a variable) would fail dynamically.
- */
-abstract class MirrorSystem {
-  /**
-   * All libraries known to the mirror system, indexed by their URI.
-   *
-   * Returns an unmodifiable map of the libraries with [LibraryMirror.uri] as
-   * keys.
-   *
-   * For a runtime mirror system, only libraries which are currently loaded
-   * are included, and repeated calls of this method may return different maps
-   * as libraries are loaded.
-   */
-  Map<Uri, LibraryMirror> get libraries;
-
-  /**
-   * Returns the unique library named [libraryName] if it exists.
-   *
-   * If no unique library exists, an error is thrown.
-   */
-  LibraryMirror findLibrary(Symbol libraryName) {
-    return libraries.values.singleWhere(
-        (library) => library.simpleName == libraryName);
-  }
-
-  /**
-   * A mirror on the isolate associated with this [MirrorSystem].
-   *
-   * This may be null if this mirror system is not running.
-   */
-  IsolateMirror get isolate;
-
-  /**
-   * A mirror on the [:dynamic:] type.
-   */
-  TypeMirror get dynamicType;
-
-  /**
-   * A mirror on the [:void:] type.
-   */
-  TypeMirror get voidType;
-
-  /**
-   * Returns the name of [symbol].
-   *
-   * The following text is non-normative:
-   *
-   * Using this method may result in larger output.  If possible, use
-   * [MirrorsUsed] to specify which symbols must be retained in clear text.
-   */
-  external static String getName(Symbol symbol);
-
-  /**
-   * Returns a symbol for [name].
-   *
-   * If [library] is not a [LibraryMirror] or if [name] is a private identifier
-   * and [library] is `null`, throws an [ArgumentError]. If [name] is a private
-   * identifier, the symbol returned is with respect to [library].
-   *
-   * The following text is non-normative:
-   *
-   * Using this method may result in larger output.  If possible, use
-   * the const constructor of [Symbol] or symbol literals.
-   */
-  external static Symbol getSymbol(String name, [LibraryMirror library]);
-}
-
-/**
- * Returns a [MirrorSystem] for the current isolate.
- */
-external MirrorSystem currentMirrorSystem();
-
-/**
- * Reflects an instance.
- *
- * Returns an [InstanceMirror] reflecting [reflectee]. If [reflectee] is a
- * function or an instance of a class that has a [:call:] method, the returned
- * instance mirror will be a [ClosureMirror].
- *
- * Note that since one cannot obtain an object from another isolate, this
- * function can only be used to obtain  mirrors on objects of the current
- * isolate.
- */
-external InstanceMirror reflect(Object reflectee);
-
-/**
- * Reflects a class declaration.
- *
- * Let *C* be the original class declaration of the class represented by [key].
- * This function returns a [ClassMirror] reflecting *C*.
- *
- * If [key] is not an instance of [Type], then this function throws an
- * [ArgumentError]. If [key] is the Type for dynamic or a function typedef,
- * throws an [ArgumentError].
- *
- * Note that since one cannot obtain a [Type] object from another isolate, this
- * function can only be used to obtain class mirrors on classes of the current
- * isolate.
- */
-external ClassMirror reflectClass(Type key);
-
-/**
- * Reflects the type represented by [key].
- *
- * If [key] is not an instance of [Type], then this function throws an
- * [ArgumentError].
- *
- * Note that since one cannot obtain a [Type] object from another isolate, this
- * function can only be used to obtain type mirrors on types of the current
- * isolate.
- */
-external TypeMirror reflectType(Type key);
-
-/**
- * A [Mirror] reflects some Dart language entity.
- *
- * Every [Mirror] originates from some [MirrorSystem].
- */
-abstract class Mirror {}
-
-/**
- * An [IsolateMirror] reflects an isolate.
- */
-abstract class IsolateMirror implements Mirror {
-  /**
-   * A unique name used to refer to the isolate in debugging messages.
-   */
-  String get debugName;
-
-  /**
-   * Whether this mirror reflects the currently running isolate.
-   */
-  bool get isCurrent;
-
-  /**
-   * The root library for the reflected isolate.
-   */
-  LibraryMirror get rootLibrary;
-
-  /**
-   * Whether [other] is an [IsolateMirror] on the same isolate as this mirror.
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. the isolate being reflected by this mirror is the same isolate being
-   *    reflected by [other].
-   */
-  bool operator == (other);
-}
-
-/**
- * A [DeclarationMirror] reflects some entity declared in a Dart program.
- */
-abstract class DeclarationMirror implements Mirror {
-  /**
-   * The simple name for this Dart language entity.
-   *
-   * The simple name is in most cases the identifier name of the entity,
-   * such as 'myMethod' for a method, [:void myMethod() {...}:] or 'mylibrary'
-   * for a [:library 'mylibrary';:] declaration.
-   */
-  Symbol get simpleName;
-
-  /**
-   * The fully-qualified name for this Dart language entity.
-   *
-   * This name is qualified by the name of the owner. For instance,
-   * the qualified name of a method 'method' in class 'Class' in
-   * library 'library' is 'library.Class.method'.
-   *
-   * Returns a [Symbol] constructed from a string representing the
-   * fully qualified name of the reflectee.
-   * Let *o* be the [owner] of this mirror, let *r* be the reflectee of
-   * this mirror, let *p* be the fully qualified
-   * name of the reflectee of *o*, and let *s* be the simple name of *r*
-   * computed by [simpleName].
-   * The fully qualified name of *r* is the
-   * concatenation of *p*, '.', and *s*.
-   *
-   * Because an isolate can contain more than one library with the same name (at
-   * different URIs), a fully-qualified name does not uniquely identify any
-   * language entity.
-   */
-  Symbol get qualifiedName;
-
-  /**
-   * A mirror on the owner of this Dart language entity.
-   *
-   * The owner is the declaration immediately surrounding the reflectee:
-   *
-   * * For a library, the owner is [:null:].
-   * * For a class declaration, typedef or top level function or variable, the
-   *   owner is the enclosing library.
-   * * For a mixin application `S with M`, the owner is the owner of `M`.
-   * * For a constructor, the owner is the immediately enclosing class.
-   * * For a method, instance variable or a static variable, the owner is the
-   *   immediately enclosing class, unless the class is a mixin application
-   *   `S with M`, in which case the owner is `M`. Note that `M` may be an
-   *   invocation of a generic.
-   * * For a parameter, local variable or local function the owner is the
-   *   immediately enclosing function.
-   */
-  DeclarationMirror get owner;
-
-  /**
-   * Whether this declaration is library private.
-   *
-   * Always returns `false` for a library declaration,
-   * otherwise returns `true` if the declaration's name starts with an
-   * underscore character (`_`), and `false` if it doesn't.
-   */
-  bool get isPrivate;
-
-  /**
-   * Whether this declaration is top-level.
-   *
-   * A declaration is considered top-level if its [owner] is a [LibraryMirror].
-   */
-  bool get isTopLevel;
-
-  /**
-   * The source location of this Dart language entity, or [:null:] if the
-   * entity is synthetic.
-   *
-   * If the reflectee is a variable, the returned location gives the position
-   * of the variable name at its point of declaration.
-   *
-   * If the reflectee is a library, class, typedef, function or type variable
-   * with associated metadata, the returned location gives the position of the
-   * first metadata declaration associated with the reflectee.
-   *
-   * Otherwise:
-   *
-   * If the reflectee is a library, the returned location gives the position of
-   * the keyword 'library' at the reflectee's point of declaration, if the
-   * reflectee is a named library, or the first character of the first line in
-   * the compilation unit defining the reflectee if the reflectee is anonymous.
-   *
-   * If the reflectee is an abstract class, the returned location gives the
-   * position of the keyword 'abstract' at the reflectee's point of declaration.
-   * Otherwise, if the reflectee is a class, the returned location gives the
-   * position of the keyword 'class' at the reflectee's point of declaration.
-   *
-   * If the reflectee is a typedef the returned location gives the position of
-   * the of the keyword 'typedef' at the reflectee's point of declaration.
-   *
-   * If the reflectee is a function with a declared return type, the returned
-   * location gives the position of the function's return type at the
-   * reflectee's point of declaration. Otherwise. the returned location gives
-   * the position of the function's name at the reflectee's point of
-   * declaration.
-   *
-   * This operation is optional and may throw an [UnsupportedError].
-   */
-  SourceLocation get location;
-
-  /**
-   * A list of the metadata associated with this declaration.
-   *
-   * Let *D* be the declaration this mirror reflects.
-   * If *D* is decorated with annotations *A1, ..., An*
-   * where *n > 0*, then for each annotation *Ai* associated
-   * with *D, 1 <= i <= n*, let *ci* be the constant object
-   * specified by *Ai*. Then this method returns a list whose
-   * members are instance mirrors on *c1, ..., cn*.
-   * If no annotations are associated with *D*, then
-   * an empty list is returned.
-   *
-   * If evaluating any of *c1, ..., cn* would cause a
-   * compilation error
-   * the effect is the same as if a non-reflective compilation error
-   * had been encountered.
-   */
-  List<InstanceMirror> get metadata;
-}
-
-/**
- * An [ObjectMirror] is a common superinterface of [InstanceMirror],
- * [ClassMirror], and [LibraryMirror] that represents their shared
- * functionality.
- *
- * For the purposes of the mirrors library, these types are all
- * object-like, in that they support method invocation and field
- * access.  Real Dart objects are represented by the [InstanceMirror]
- * type.
- *
- * See [InstanceMirror], [ClassMirror], and [LibraryMirror].
- */
-abstract class ObjectMirror implements Mirror {
-
-  /**
-   * Invokes the named function and returns a mirror on the result.
-   *
-   * Let *o* be the object reflected by this mirror, let *f* be the simple name
-   * of the member denoted by [memberName], let *a1, ..., an* be the elements
-   * of [positionalArguments], let *k1, ..., km* be the identifiers denoted by
-   * the elements of [namedArguments.keys], and let *v1, ..., vm* be the
-   * elements of [namedArguments.values]. Then this method will perform the
-   * method invocation *o.f(a1, ..., an, k1: v1, ..., km: vm)* in a scope that
-   * has access to the private members of *o* (if *o* is a class or library) or
-   * the private members of the class of *o* (otherwise).
-   *
-   * If the invocation returns a result *r*, this method returns the result of
-   * calling [reflect]\(*r*\).
-   *
-   * If the invocation causes a compilation error the effect is the same as if
-   * a non-reflective compilation error had been encountered.
-   *
-   * If the invocation throws an exception *e* (that it does not catch), this
-   * method throws *e*.
-   */
-  /*
-   * TODO(turnidge): Handle ambiguous names.
-   * TODO(turnidge): Handle optional & named arguments.
-   */
-  InstanceMirror invoke(Symbol memberName,
-                        List positionalArguments,
-                        [Map<Symbol,dynamic> namedArguments]);
-
-  /**
-   * Invokes a getter and returns a mirror on the result.
-   *
-   * The getter can be the implicit getter for a field or a user-defined getter
-   * method.
-   *
-   * Let *o* be the object reflected by this mirror,
-   * let *f* be the simple name of the getter denoted by [fieldName].
-   *
-   * Then this method will perform the getter invocation *o.f* in a scope that
-   * has access to the private members of *o* (if *o* is a class or library) or
-   * the private members of the class of *o* (otherwise).
-   *
-   * If this mirror is an [InstanceMirror], and [fieldName] denotes an instance
-   * method on its reflectee, the result of the invocation is an instance
-   * mirror on a closure corresponding to that method.
-   *
-   * If this mirror is a [LibraryMirror], and [fieldName] denotes a top-level
-   * method in the corresponding library, the result of the invocation is an
-   * instance mirror on a closure corresponding to that method.
-   *
-   * If this mirror is a [ClassMirror], and [fieldName] denotes a static method
-   * in the corresponding class, the result of the invocation is an instance
-   * mirror on a closure corresponding to that method.
-   *
-   * If the invocation returns a result *r*, this method returns the result of
-   * calling [reflect]\(*r*\).
-   *
-   * If the invocation causes a compilation error, the effect is the same as if
-   * a non-reflective compilation error had been encountered.
-   *
-   * If the invocation throws an exception *e* (that it does not catch), this
-   * method throws *e*.
-   */
-  // TODO(ahe): Remove stuff about scope and private members. [fieldName] is a
-  // capability giving access to private members.
-  InstanceMirror getField(Symbol fieldName);
-
-  /**
-   * Invokes a setter and returns a mirror on the result.
-   *
-   * The setter may be either the implicit setter for a non-final field or a
-   * user-defined setter method.
-   *
-   * Let *o* be the object reflected by this mirror,
-   * let *f* be the simple name of the getter denoted by [fieldName],
-   * and let *a* be the object bound to [value].
-   *
-   * Then this method will perform the setter invocation *o.f = a* in a scope
-   * that has access to the private members of *o* (if *o* is a class or
-   * library) or the private members of the class of *o* (otherwise).
-   *
-   * If the invocation returns a result *r*, this method returns the result of
-   * calling [reflect]\([value]\).
-   *
-   * If the invocation causes a compilation error, the effect is the same as if
-   * a non-reflective compilation error had been encountered.
-   *
-   * If the invocation throws an exception *e* (that it does not catch) this
-   * method throws *e*.
-   */
-  /* TODO(turnidge): Handle ambiguous names.*/
-  InstanceMirror setField(Symbol fieldName, Object value);
-}
-
-/**
- * An [InstanceMirror] reflects an instance of a Dart language object.
- */
-abstract class InstanceMirror implements ObjectMirror {
-  /**
-   * A mirror on the type of the reflectee.
-   *
-   * Returns a mirror on the actual class of the reflectee.
-   * The class of the reflectee may differ from
-   * the object returned by invoking [runtimeType] on
-   * the reflectee.
-   */
-  ClassMirror get type;
-
-  /**
-   * Whether [reflectee] will return the instance reflected by this mirror.
-   *
-   * This will always be true in the local case (reflecting instances in the
-   * same isolate), but only true in the remote case if this mirror reflects a
-   * simple value.
-   *
-   * A value is simple if one of the following holds:
-   *
-   * * the value is [:null:]
-   * * the value is of type [num]
-   * * the value is of type [bool]
-   * * the value is of type [String]
-   */
-  bool get hasReflectee;
-
-  /**
-   * If the [InstanceMirror] reflects an instance it is meaningful to
-   * have a local reference to, we provide access to the actual
-   * instance here.
-   *
-   * If you access [reflectee] when [hasReflectee] is false, an
-   * exception is thrown.
-   */
-  get reflectee;
-
-  /**
-   * Whether this mirror is equal to [other].
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. either
-   *
-   *    a. [hasReflectee] is true and so is
-   *    [:identical(reflectee, other.reflectee):], or
-   *
-   *    b. the remote objects reflected by this mirror and by [other] are
-   *    identical.
-   */
-  bool operator == (other);
-
-  /**
-   * Perform [invocation] on [reflectee].
-   * Equivalent to
-   *
-   * this.invoke(invocation.memberName,
-   *             invocation.positionalArguments,
-   *             invocation.namedArguments);
-   */
-  delegate(Invocation invocation);
-}
-
-/**
- * A [ClosureMirror] reflects a closure.
- *
- * A [ClosureMirror] provides the ability to execute its reflectee and
- * introspect its function.
- */
-abstract class ClosureMirror implements InstanceMirror {
-  /**
-   * A mirror on the function associated with this closure.
-   *
-   * The function associated with an implicit closure of a function is that
-   * function.
-   *
-   * The function associated with an instance of a class that has a [:call:]
-   * method is that [:call:] method.
-   *
-   * A Dart implementation might choose to create a class for each closure
-   * expression, in which case [:function:] would be the same as
-   * [:type.declarations[#call]:]. But the Dart language model does not require
-   * this. A more typical implementation involves a single closure class for
-   * each type signature, where the call method dispatches to a function held
-   * in the closure rather the call method
-   * directly implementing the closure body. So one cannot rely on closures from
-   * distinct closure expressions having distinct classes ([:type:]), but one
-   * can rely on them having distinct functions ([:function:]).
-   */
-  MethodMirror get function;
-
-  /**
-   * Executes the closure and returns a mirror on the result.
-   *
-   * Let *f* be the closure reflected by this mirror,
-   * let *a1, ..., an* be the elements of [positionalArguments],
-   * let *k1, ..., km* be the identifiers denoted by the elements of
-   * [namedArguments.keys],
-   * and let *v1, ..., vm* be the elements of [namedArguments.values].
-   *
-   * Then this method will perform the method invocation
-   * *f(a1, ..., an, k1: v1, ..., km: vm)*.
-   *
-   * If the invocation returns a result *r*, this method returns the result of
-   * calling [reflect]\(*r*\).
-   *
-   * If the invocation causes a compilation error, the effect is the same as if
-   * a non-reflective compilation error had been encountered.
-   *
-   * If the invocation throws an exception *e* (that it does not catch), this
-   * method throws *e*.
-   */
-  InstanceMirror apply(List positionalArguments,
-                       [Map<Symbol, dynamic> namedArguments]);
-}
-
-/**
- * A [LibraryMirror] reflects a Dart language library, providing
- * access to the variables, functions, and classes of the
- * library.
- */
-abstract class LibraryMirror implements DeclarationMirror, ObjectMirror {
-  /**
-   * The absolute uri of the library.
-   */
-  Uri get uri;
-
-  /**
-   * Returns an immutable map of the declarations actually given in the library.
-   *
-   * This map includes all regular methods, getters, setters, fields, classes
-   * and typedefs actually declared in the library. The map is keyed by the
-   * simple names of the declarations.
-   */
-  Map<Symbol, DeclarationMirror> get declarations;
-
-  /**
-   * Whether this mirror is equal to [other].
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. The library being reflected by this mirror and the library being
-   *    reflected by [other] are the same library in the same isolate.
-   */
-  bool operator ==(other);
-
-  /**
-   * Returns a list of the imports and exports in this library;
-   */
-  List<LibraryDependencyMirror> get libraryDependencies;
-}
-
-/// A mirror on an import or export declaration.
-abstract class LibraryDependencyMirror implements Mirror {
-  /// Is `true` if this dependency is an import.
-  bool get isImport;
-
-  /// Is `true` if this dependency is an export.
-  bool get isExport;
-
-  /// Returns the library mirror of the library that imports or exports the
-  /// [targetLibrary].
-  LibraryMirror get sourceLibrary;
-
-  /// Returns the library mirror of the library that is imported or exported,
-  /// or null if the library is not loaded.
-  LibraryMirror get targetLibrary;
-
-  /// Returns the prefix if this is a prefixed import and `null` otherwise.
-  Symbol get prefix;
-
-  /// Returns the list of show/hide combinators on the import/export
-  /// declaration.
-  List<CombinatorMirror> get combinators;
-
-  /// Returns the source location for this import/export declaration.
-  SourceLocation get location;
-
-  List<InstanceMirror> get metadata;
-}
-
-/// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorMirror implements Mirror {
-  /// The list of identifiers on the combinator.
-  List<Symbol> get identifiers;
-
-  /// Is `true` if this is a 'show' combinator.
-  bool get isShow;
-
-  /// Is `true` if this is a 'hide' combinator.
-  bool get isHide;
-}
-
-/**
- * A [TypeMirror] reflects a Dart language class, typedef,
- * function type or type variable.
- */
-abstract class TypeMirror implements DeclarationMirror {
-  /**
-   * Returns true if this mirror reflects dynamic, a non-generic class or
-   * typedef, or an instantiated generic class or typedef in the current
-   * isolate. Otherwise, returns false.
-   */
-  bool get hasReflectedType;
-
-  /**
-   * If [:hasReflectedType:] returns true, returns the corresponding [Type].
-   * Otherwise, an [UnsupportedError] is thrown.
-   */
-  Type get reflectedType;
-
-  /**
-   * An immutable list with mirrors for all type variables for this type.
-   *
-   * If this type is a generic declaration or an invocation of a generic
-   * declaration, the returned list contains mirrors on the type variables
-   * declared in the original declaration.
-   * Otherwise, the returned list is empty.
-   *
-   * This list preserves the order of declaration of the type variables.
-   */
-  List<TypeVariableMirror> get typeVariables;
-
-  /**
-   * An immutable list with mirrors for all type arguments for
-   * this type.
-   *
-   * If the reflectee is an invocation of a generic class,
-   * the type arguments are the bindings of its type parameters.
-   * If the reflectee is the original declaration of a generic,
-   * it has no type arguments and this method returns an empty list.
-   * If the reflectee is not generic, then
-   * it has no type arguments and this method returns an empty list.
-   *
-   * This list preserves the order of declaration of the type variables.
-   */
-  List<TypeMirror> get typeArguments;
-
-  /**
-   * Is this the original declaration of this type?
-   *
-   * For most classes, they are their own original declaration.  For
-   * generic classes, however, there is a distinction between the
-   * original class declaration, which has unbound type variables, and
-   * the instantiations of generic classes, which have bound type
-   * variables.
-   */
-  bool get isOriginalDeclaration;
-
-  /**
-   * A mirror on the original declaration of this type.
-   *
-   * For most classes, they are their own original declaration.  For
-   * generic classes, however, there is a distinction between the
-   * original class declaration, which has unbound type variables, and
-   * the instantiations of generic classes, which have bound type
-   * variables.
-   */
-  TypeMirror get originalDeclaration;
-
-
-  /**
-   * Checks the subtype relationship, denoted by `<:` in the language
-   * specification.
-   *
-   * This is the type relationship used in `is` test checks.
-   */
-  bool isSubtypeOf(TypeMirror other);
-
-  /**
-   * Checks the assignability relationship, denoted by `<=>` in the language
-   * specification.
-   *
-   * This is the type relationship tested on assignment in checked mode.
-   */
-  bool isAssignableTo(TypeMirror other);
-}
-
-/**
- * A [ClassMirror] reflects a Dart language class.
- */
-abstract class ClassMirror implements TypeMirror, ObjectMirror {
-  /**
-   * A mirror on the superclass on the reflectee.
-   *
-   * If this type is [:Object:], the superclass will be null.
-   */
-  ClassMirror get superclass;
-
-  /**
-   * A list of mirrors on the superinterfaces of the reflectee.
-   */
-  List<ClassMirror> get superinterfaces;
-
-  /**
-   * Is the reflectee abstract?
-   */
-  bool get isAbstract;
-
-  /**
-   * Returns an immutable map of the declarations actually given in the class
-   * declaration.
-   *
-   * This map includes all regular methods, getters, setters, fields,
-   * constructors and type variables actually declared in the class. Both
-   * static and instance members are included, but no inherited members are
-   * included. The map is keyed by the simple names of the declarations.
-   *
-   * This does not include inherited members.
-   */
-  Map<Symbol, DeclarationMirror> get declarations;
-
-  /**
-   * Returns a map of the methods, getters and setters of an instance of the
-   * class.
-   *
-   * The intent is to capture those members that constitute the API of an
-   * instance. Hence fields are not included, but the getters and setters
-   * implicitly introduced by fields are included. The map includes methods,
-   * getters and setters that are inherited as well as those introduced by the
-   * class itself.
-   *
-   * The map is keyed by the simple names of the members.
-   */
-  Map<Symbol, MethodMirror> get instanceMembers;
-
-  /**
-   * Returns a map of the static methods, getters and setters of the class.
-   *
-   * The intent is to capture those members that constitute the API of a class.
-   * Hence fields are not included, but the getters and setters implicitly
-   * introduced by fields are included.
-   *
-   * The map is keyed by the simple names of the members.
-   */
-  Map<Symbol, MethodMirror> get staticMembers;
-
-
-  /**
-   * The mixin of this class.
-   *
-   * If this class is the result of a mixin application of the form S with M,
-   * returns a class mirror on M. Otherwise returns a class mirror on
-   * [reflectee].
-   */
-  ClassMirror get mixin;
-
-  // TODO(ahe): What about:
-  // /// Finds the instance member named [name] declared or inherited in the
-  // /// reflected class.
-  // DeclarationMirror instanceLookup(Symbol name);
-
-  /**
-   * Invokes the named constructor and returns a mirror on the result.
-   *
-   * Let *c* be the class reflected by this mirror,
-   * let *a1, ..., an* be the elements of [positionalArguments],
-   * let *k1, ..., km* be the identifiers denoted by the elements of
-   * [namedArguments.keys],
-   * and let *v1, ..., vm* be the elements of [namedArguments.values].
-   *
-   * If [constructorName] was created from the empty string, then this method
-   * will execute the instance creation expression
-   * *new c(a1, ..., an, k1: v1, ..., km: vm)* in a scope that has access to
-   * the private members of *c*.
-   *
-   * Otherwise, let *f* be the simple name of the constructor denoted by
-   * [constructorName]. Then this method will execute the instance creation
-   * expression *new c.f(a1, ..., an, k1: v1, ..., km: vm)* in a scope that has
-   * access to the private members of *c*.
-   *
-   * In either case:
-   *
-   * * If the expression evaluates to a result *r*, this method returns the
-   *   result of calling [reflect]\(*r*\).
-   * * If evaluating the expression causes a compilation error, the effect is
-   *   the same as if a non-reflective compilation error had been encountered.
-   * * If evaluating the expression throws an exception *e* (that it does not
-   *   catch), this method throws *e*.
-   */
-  InstanceMirror newInstance(Symbol constructorName,
-                             List positionalArguments,
-                             [Map<Symbol,dynamic> namedArguments]);
-
-  /**
-   * Whether this mirror is equal to [other].
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. This mirror and [other] reflect the same class.
-   *
-   * Note that if the reflected class is an invocation of a generic class, 2.
-   * implies that the reflected class and [other] have equal type arguments.
-   */
-  bool operator == (other);
-
-  /**
-   * Returns whether the class denoted by the receiver is a subclass of the
-   * class denoted by the argument.
-   *
-   * Note that the subclass relationship is reflexive.
-   */
-  bool isSubclassOf(ClassMirror other);
-}
-
-/**
- * A [FunctionTypeMirror] represents the type of a function in the
- * Dart language.
- */
-abstract class FunctionTypeMirror implements ClassMirror {
-  /**
-   * Returns the return type of the reflectee.
-   */
-  TypeMirror get returnType;
-
-  /**
-   * Returns a list of the parameter types of the reflectee.
-   */
-  List<ParameterMirror> get parameters;
-
-  /**
-   * A mirror on the [:call:] method for the reflectee.
-   */
-  // This is only here because in the past the VM did not implement a call
-  // method on closures.
-  MethodMirror get callMethod;
-}
-
-/**
- * A [TypeVariableMirror] represents a type parameter of a generic type.
- */
-abstract class TypeVariableMirror extends TypeMirror {
-  /**
-   * A mirror on the type that is the upper bound of this type variable.
-   */
-  TypeMirror get upperBound;
-
-  /**
-   * Is the reflectee static?
-   *
-   * For the purposes of the mirrors library, type variables are considered
-   * non-static.
-   */
-  bool get isStatic;
-
-  /**
-   * Whether [other] is a [TypeVariableMirror] on the same type variable as this
-   * mirror.
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
-   */
-  bool operator == (other);
-}
-
-/**
- * A [TypedefMirror] represents a typedef in a Dart language program.
- */
-abstract class TypedefMirror implements TypeMirror {
-  /**
-   * The defining type for this typedef.
-   *
-   * If the type referred to by the reflectee is a function type *F*, the
-   * result will be [:FunctionTypeMirror:] reflecting *F* which is abstract
-   * and has an abstract method [:call:] whose signature corresponds to *F*.
-   * For instance [:void f(int):] is the referent for [:typedef void f(int):].
-   */
-  FunctionTypeMirror get referent;
-}
-
-/**
- * A [MethodMirror] reflects a Dart language function, method,
- * constructor, getter, or setter.
- */
-abstract class MethodMirror implements DeclarationMirror {
-  /**
-   * A mirror on the return type for the reflectee.
-   */
-  TypeMirror get returnType;
-
-  /**
-   * The source code for the reflectee, if available. Otherwise null.
-   */
-  String get source;
-
-  /**
-   * A list of mirrors on the parameters for the reflectee.
-   */
-  List<ParameterMirror> get parameters;
-
-  /**
-   * A function is considered non-static iff it is permited to refer to 'this'.
-   *
-   * Note that generative constructors are considered non-static, whereas
-   * factory constructors are considered static.
-   */
-  bool get isStatic;
-
-  /**
-   * Is the reflectee abstract?
-   */
-  bool get isAbstract;
-
-  /**
-   * Returns true if the reflectee is synthetic, and returns false otherwise.
-   *
-   * A reflectee is synthetic if it is a getter or setter implicitly introduced
-   * for a field or Type, or if it is a constructor that was implicitly
-   * introduced as a default constructor or as part of a mixin application.
-   */
-  bool get isSynthetic;
-
-  /**
-   * Is the reflectee a regular function or method?
-   *
-   * A function or method is regular if it is not a getter, setter, or
-   * constructor.  Note that operators, by this definition, are
-   * regular methods.
-   */
-  bool get isRegularMethod;
-
-  /**
-   * Is the reflectee an operator?
-   */
-  bool get isOperator;
-
-  /**
-   * Is the reflectee a getter?
-   */
-  bool get isGetter;
-
-  /**
-   * Is the reflectee a setter?
-   */
-  bool get isSetter;
-
-  /**
-   * Is the reflectee a constructor?
-   */
-  bool get isConstructor;
-
-  /**
-   * The constructor name for named constructors and factory methods.
-   *
-   * For unnamed constructors, this is the empty string.  For
-   * non-constructors, this is the empty string.
-   *
-   * For example, [:'bar':] is the constructor name for constructor
-   * [:Foo.bar:] of type [:Foo:].
-   */
-  Symbol get constructorName;
-
-  /**
-   * Is the reflectee a const constructor?
-   */
-  bool get isConstConstructor;
-
-  /**
-   * Is the reflectee a generative constructor?
-   */
-  bool get isGenerativeConstructor;
-
-  /**
-   * Is the reflectee a redirecting constructor?
-   */
-  bool get isRedirectingConstructor;
-
-  /**
-   * Is the reflectee a factory constructor?
-   */
-  bool get isFactoryConstructor;
-
-  /**
-   * Whether this mirror is equal to [other].
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
-   */
-  bool operator == (other);
-}
-
-/**
- * A [VariableMirror] reflects a Dart language variable declaration.
- */
-abstract class VariableMirror implements DeclarationMirror {
-  /**
-   * Returns a mirror on the type of the reflectee.
-   */
-  TypeMirror get type;
-
-  /**
-   * Returns [:true:] if the reflectee is a static variable.
-   * Otherwise returns [:false:].
-   *
-   * For the purposes of the mirror library, top-level variables are
-   * implicitly declared static.
-   */
-  bool get isStatic;
-
-  /**
-   * Returns [:true:] if the reflectee is a final variable.
-   * Otherwise returns [:false:].
-   */
-  bool get isFinal;
-
-  /**
-   * Returns [:true:] if the reflectee is declared [:const:].
-   * Otherwise returns [:false:].
-   */
-  bool get isConst;
-
-  /**
-   * Whether this mirror is equal to [other].
-   *
-   * The equality holds if and only if
-   *
-   * 1. [other] is a mirror of the same kind, and
-   * 2. [:simpleName == other.simpleName:] and [:owner == other.owner:].
-   */
-  bool operator == (other);
-}
-
-/**
- * A [ParameterMirror] reflects a Dart formal parameter declaration.
- */
-abstract class ParameterMirror implements VariableMirror {
-  /**
-   * A mirror on the type of this parameter.
-   */
-  TypeMirror get type;
-
-  /**
-   * Returns [:true:] if the reflectee is an optional parameter.
-   * Otherwise returns [:false:].
-   */
-  bool get isOptional;
-
-  /**
-   * Returns [:true:] if the reflectee is a named parameter.
-   * Otherwise returns [:false:].
-   */
-  bool get isNamed;
-
-  /**
-   * Returns [:true:] if the reflectee has explicitly declared a default value.
-   * Otherwise returns [:false:].
-   */
-  bool get hasDefaultValue;
-
-  /**
-   * Returns the default value of an optional parameter.
-   *
-   * Returns an [InstanceMirror] on the (compile-time constant)
-   * default value for an optional parameter.
-   * If no default value is declared, it defaults to `null`
-   * and a mirror of `null` is returned.
-   *
-   * Returns `null` for a required parameter.
-   */
-  InstanceMirror get defaultValue;
-}
-
-/**
- * A [SourceLocation] describes the span of an entity in Dart source code.
- */
-abstract class SourceLocation {
-  /**
-   * The 1-based line number for this source location.
-   *
-   * A value of 0 means that the line number is unknown.
-   */
-  int get line;
-
-  /**
-   * The 1-based column number for this source location.
-   *
-   * A value of 0 means that the column number is unknown.
-   */
-  int get column;
-
-  /**
-   * Returns the URI where the source originated.
-   */
-  Uri get sourceUri;
-}
-
-/**
- * Class used for encoding comments as metadata annotations.
- */
-class Comment {
-  /**
-   * The comment text as written in the source text.
-   */
-  final String text;
-
-  /**
-   * The comment text without the start, end, and padding text.
-   *
-   * For example, if [text] is [: /** Comment text. */ :] then the [trimmedText]
-   * is [: Comment text. :].
-   */
-  final String trimmedText;
-
-  /**
-   * Is [:true:] if this comment is a documentation comment.
-   *
-   * That is, that the comment is either enclosed in [: /** ... */ :] or starts
-   * with [: /// :].
-   */
-  final bool isDocComment;
-
-  const Comment(this.text, this.trimmedText, this.isDocComment);
-}
-
-/**
- * Annotation describing how "dart:mirrors" is used (EXPERIMENTAL).
- *
- * When used as metadata on an import of "dart:mirrors" in library *L*, this
- * class describes how "dart:mirrors" is used by library *L* unless overridden.
- * See [override].
- *
- * The following text is non-normative:
- *
- * In some scenarios, for example, when minifying Dart code, or when generating
- * JavaScript code from a Dart program, the size and performance of the output
- * can suffer from use of reflection.  In those cases, telling the compiler
- * what is used, can have a significant impact.
- *
- * Example usage:
- *
- *     @MirrorsUsed(symbols: 'foo')
- *     import 'dart:mirrors';
- *
- *     class Foo {
- *       noSuchMethod(Invocation invocation) {
- *         print(MirrorSystem.getName(invocation.memberName));
- *       }
- *     }
- *
- *     main() {
- *       new Foo().foo(); // Prints "foo".
- *       new Foo().bar(); // Might print an arbitrary (mangled) name, "bar".
- *     }
- *
- * For a detailed description of the parameters to the [MirrorsUsed] constructor
- * see the comments for [symbols], [targets], [metaTargets] and [override].
- *
- * An import of `dart:mirrors` may have multiple [MirrorsUsed] annotations. This
- * is particularly helpful to specify overrides for specific libraries. For 
- * example:
- *
- *     @MirrorsUsed(targets: 'foo.Bar', override: 'foo')
- *     @MirrorsUsed(targets: 'Bar')
- *     import 'dart:mirrors';
- *
- * will ensure that the target `Bar` from the current library and from library
- * `foo` is available for reflection. See also [override].
- */
-class MirrorsUsed {
-  // Note: the fields of this class are untyped.  This is because the most
-  // convenient way to specify symbols today is using a single string. In 
-  // some cases, a const list of classes might be convenient. Some
-  // might prefer to use a const list of symbols.
-
-  /**
-   * The list of strings passed to new [Symbol], and symbols that might be
-   * passed to [MirrorSystem.getName].
-   *
-   * Combined with the names of [targets], [metaTargets] and their members,
-   * this forms the complete list of strings passed to new [Symbol], and
-   * symbols that might be passed to [MirrorSystem.getName] by the library to
-   * which this metadata applies.
-   *
-   * The following text is non-normative:
-   *
-   * Dart2js currently supports the following formats to specify symbols:
-   *
-   * * A constant [List] of [String] constants representing symbol names, 
-   *   e.g., `const ['foo', 'bar']`.
-   * * A single [String] constant whose value is a comma-separated list of
-   *   symbol names, e.g., `"foo, bar"`.
-   *
-   * Specifying the `symbols` field turns off the following warnings emitted by
-   * dart2js:
-   *
-   * * Using "MirrorSystem.getName" may result in larger output.
-   * * Using "new Symbol" may result in larger output.
-   *
-   * For example, if you're using [noSuchMethod] to interact with a database,
-   * extract all the possible column names and include them in this list.
-   * Similarly, if you're using [noSuchMethod] to interact with another
-   * language (JavaScript, for example) extract all the identifiers from the
-   * API you use and include them in this list.
-   *
-   * Note that specifying a symbol only ensures that the symbol will be
-   * available under that name at runtime. It does not mark targets with
-   * that name as available for reflection. See [targets] and [metaTargets]
-   * for that purpose.
-   */
-  final symbols;
-
-  /**
-   * A list of reflective targets.
-   *
-   * Combined with [metaTargets], this provides the complete list of reflective
-   * targets used by the library to which this metadata applies.
-   *
-   * The following text is non-normative:
-   *
-   * For now, there is no formal description of what a reflective target is.
-   * Informally, a target is a library, a class, a method or a field.
-   *
-   * Dart2js currently supports the following formats to specify targets:
-   *
-   * * A constant [List] containing [String] constants representing (qualified)
-   *   names of targets and Dart types.
-   * * A single [String] constant whose value is a comma-separated list of
-   *   (qualified) names.
-   * * A single Dart type.
-   *
-   * A (qualified) name is resolved to a target as follows:
-   *
-   * 1. If the qualified name matches a library name, the matching library is
-   *    the target.
-   * 2. Else, find the longest prefix of the name such that the prefix ends
-   *    just before a `.` and is a library name. 
-   * 3. Use that library as current scope. If no matching prefix was found, use
-   *    the current library, i.e., the library where the [MirrorsUsed] 
-   *    annotation was placed.
-   * 4. Split the remaining suffix (the entire name if no library name was
-   *    found in step 3) into a list of [String] using `.` as a 
-   *    separator.
-   * 5. Select all targets in the current scope whose name matches a [String] 
-   *    from the list.
-   *
-   * For example:
-   *
-   *     library my.library.one;
-   *
-   *     class A {
-   *       var aField;
-   *     }
-   *
-   *     library main;
-   *
-   *     @MirrorsUsed(targets: "my.library.one.A.aField")
-   *     import "dart:mirrors";
-   *
-   * The [MirrorsUsed] annotation specifies `A` and `aField` from library 
-   * `my.library.one` as targets. This will mark the class `A` as a reflective
-   * target. The target specification for `aField` has no effect, as there is
-   * no target in `my.library.one` with that name. 
-   * 
-   * Note that everything within a target also is available for reflection.
-   * So, if a library is specified as target, all classes in that library
-   * become targets for reflection. Likewise, if a class is a target, all
-   * its methods and fields become targets for reflection. As a consequence,
-   * `aField` in the above example is also a reflective target.
-   *
-   */
-  final targets;
-
-  /**
-   * A list of classes that when used as metadata indicates a reflective
-   * target. See also [targets].
-   *
-   * The following text is non-normative:
-   *
-   * The format for specifying the list of classes is the same as used for
-   * specifying [targets]. However, as a library cannot be used as a metadata
-   * annotation in Dart, adding a library to the list of [metaTargets] has no
-   * effect. In particular, adding a library to [metaTargets] does not make
-   * the library's classes valid metadata annotations to enable reflection.
-   *
-   * If an instance of a class specified in [metaTargets] is used as 
-   * metadata annotation on a library, class, field or method, that library,
-   * class, field or  method is added to the set of targets for reflection. 
-   *
-   * Example usage:
-   *
-   *     library example;
-   *     @MirrorsUsed(metaTargets: "example.Reflectable")
-   *     import "dart:mirrors";
-   *
-   *     class Reflectable {
-   *       const Reflectable();
-   *     }
-   *
-   *     class Foo {
-   *       @Reflectable()
-   *       reflectableMethod() { ... }
-   *
-   *       nonReflectableMethod() { ... }
-   *     }
-   *
-   * In the above example. `reflectableMethod` is marked as reflectable by
-   * using the `Reflectable` class, which in turn is specified in the 
-   * [metaTargets] annotation.
-   *
-   * The method `nonReflectableMethod` lacks a metadata annotation and thus 
-   * will not be reflectable at runtime.
-   */
-  final metaTargets;
-
-  /**
-   * A list of library names or "*".
-   *
-   * When used as metadata on an import of "dart:mirrors", this metadata does
-   * not apply to the library in which the annotation is used, but instead
-   * applies to the other libraries (all libraries if "*" is used). 
-   *
-   * The following text is non-normative:
-   *
-   * Dart2js currently supports the following formats to specify libraries:
-   *
-   * * A constant [List] containing [String] constants representing names of
-   *   libraries.
-   * * A single [String] constant whose value is a comma-separated list of
-   *   library names.
-   * 
-   * Conceptually, a [MirrorsUsed] annotation with [override] has the same 
-   * effect as placing the annotation directly on the import of `dart:mirrors`
-   * in each of the referenced libraries. Thus, if the library had no 
-   * [MirrorsUsed] annotation before, its unconditional import of 
-   * `dart:mirrors` is overridden by an annotated import.
-   * 
-   * Note that, like multiple explicit [MirrorsUsed] annotations, using
-   * override on a library with an existing [MirrorsUsed] annotation is
-   * additive. That is, the overall set of reflective targets is the union
-   * of the reflective targets that arise from the original and the
-   * overriding [MirrorsUsed] annotations. 
-   *
-   * The use of [override] is only meaningful for libraries that have an 
-   * import of `dart:mirrors` without annotation because otherwise it would
-   * work exactly the same way without the [override] parameter.
-   *
-   * While the annotation will apply to the given target libraries, the
-   * [symbols], [targets] and [metaTargets] are still evaluated in the 
-   * scope of the annotation. Thus, to select a target from library `foo`,
-   * a qualified name has to be used or, if the target is visible in the
-   * current scope, its type may be referenced.
-   * 
-   * For example, the following code marks all targets in the library `foo`
-   * as reflectable that have a metadata annotation using the `Reflectable` 
-   * class from the same library.
-   *
-   *     @MirrorsUsed(metaTargets: "foo.Reflectable", override: "foo")
-   *
-   * However, the following code would require the use of the `Reflectable`
-   * class from the current library, instead.
-   *
-   *     @MirrorsUsed(metaTargets: "Reflectable", override: "foo")
-   *
-   */
-  final override;
-
-  /**
-   * See the documentation for [MirrorsUsed.symbols], [MirrorsUsed.targets], 
-   * [MirrorsUsed.metaTargets] and [MirrorsUsed.override] for documentation 
-   * of the parameters.
-   */
-  const MirrorsUsed(
-      {this.symbols, this.targets, this.metaTargets, this.override});
-}
diff --git a/pkg/dev_compiler/tool/input_sdk/libraries.dart b/pkg/dev_compiler/tool/input_sdk/libraries.dart
new file mode 100644
index 0000000..69b4856
--- /dev/null
+++ b/pkg/dev_compiler/tool/input_sdk/libraries.dart
@@ -0,0 +1,378 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library libraries;
+
+/**
+ * A bit flag used by [LibraryInfo] indicating that a library is used by dart2js
+ */
+const int DART2JS_PLATFORM = 1;
+
+/**
+ * A bit flag used by [LibraryInfo] indicating that a library is used by the VM
+ */
+const int VM_PLATFORM = 2;
+
+/// The contexts that a library can be used from.
+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;
+  }
+  return null;
+}
+
+/// 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",
+      categories: "Client,Server",
+      maturity: Maturity.STABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/async_patch.dart"),
+
+  "_blink": const LibraryInfo(
+      "_blink/dartium/_blink_dartium.dart",
+      categories: "Client",
+      implementation: true,
+      documented: false,
+      platforms: VM_PLATFORM),
+
+  "_chrome": const LibraryInfo(
+      "_chrome/dart2js/chrome_dart2js.dart",
+      categories: "Client",
+      documented: false),
+
+  "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",
+      categories: "Client,Server",
+      maturity: Maturity.STABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/convert_patch.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",
+      categories: "Client,Server,Embedded",
+      maturity: Maturity.UNSTABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/developer_patch.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",
+      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",
+      categories: "Client",
+      maturity: Maturity.WEB_STABLE,
+      dart2jsPath: "indexed_db/dart2js/indexed_db_dart2js.dart"),
+
+  "io": const LibraryInfo(
+      "io/io.dart",
+      categories: "Server",
+      dart2jsPatchPath: "_internal/js_runtime/lib/io_patch.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",
+      categories: "Client",
+      maturity: Maturity.STABLE,
+      dart2jsPath: "js/dart2js/js_dart2js.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",
+      categories: "Client,Server,Embedded",
+      maturity: Maturity.STABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/math_patch.dart"),
+
+  "mirrors": const LibraryInfo(
+      "mirrors/mirrors.dart",
+      categories: "Client,Server",
+      maturity: Maturity.UNSTABLE,
+      dart2jsPatchPath: "_internal/js_runtime/lib/mirrors_patch.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",
+      categories: "Client",
+      maturity: Maturity.WEB_STABLE,
+      dart2jsPath: "svg/dart2js/svg_dart2js.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",
+      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",
+      categories: "Client",
+      maturity: Maturity.WEB_STABLE,
+      dart2jsPath: "web_sql/dart2js/web_sql_dart2js.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),
+
+  "_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_names": const LibraryInfo(
+      "_internal/js_runtime/lib/js_names.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),
+
+  "_async_await_error_codes": const LibraryInfo(
+      "_internal/js_runtime/lib/shared/async_await_error_codes.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),
+
+  "_runtime": const LibraryInfo(
+      "_internal/js_runtime/lib/ddc_runtime/runtime.dart",
+      category: "",
+      documented: false,
+      platforms: DART2JS_PLATFORM),
+};
+
+/**
+ * Information about a "dart:" library.
+ */
+class LibraryInfo {
+  /**
+   * Path to the library's *.dart file relative to this file.
+   */
+  final String path;
+
+  /**
+   * The categories in which the library can be used encoded as a
+   * comma-separated String.
+   */
+  final String _categories;
+
+  /**
+   * Path to the dart2js library's *.dart file relative to this file
+   * or null if dart2js uses the common library path defined above.
+   * Access using the [#getDart2JsPath()] method.
+   */
+  final String dart2jsPath;
+
+  /**
+   * Path to the dart2js library's patch file relative to this file
+   * or null if no dart2js patch file associated with this library.
+   * Access using the [#getDart2JsPatchPath()] method.
+   */
+  final String dart2jsPatchPath;
+
+  /**
+   * True if this library is documented and should be shown to the user.
+   */
+  final bool documented;
+
+  /**
+   * Bit flags indicating which platforms consume this library.
+   * See [DART2JS_LIBRARY] and [VM_LIBRARY].
+   */
+  final int platforms;
+
+  /**
+   * True if the library contains implementation details for another library.
+   * The implication is that these libraries are less commonly used
+   * and that tools like Dart Editor should not show these libraries
+   * in a list of all libraries unless the user specifically asks the tool to
+   * do so.
+   */
+  final bool implementation;
+
+  /**
+   * States the current maturity of this library.
+   */
+  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})
+      : _categories = categories;
+
+  bool get isDart2jsLibrary => (platforms & DART2JS_PLATFORM) != 0;
+  bool get isVmLibrary => (platforms & VM_PLATFORM) != 0;
+
+  /**
+   * The categories in which the library can be used.
+   *
+   * If no categories are specified, the library is internal and can not be
+   * loaded by user code.
+   */
+  List<Category> get categories {
+    // `"".split(,)` returns [""] not [], so we handle that case separately.
+    if (_categories == "") return const <Category>[];
+    return _categories.split(",").map(parseCategory).toList();
+  }
+
+  bool get isInternal => categories.isEmpty;
+
+  /// The original "categories" String that was passed to the constructor.
+  ///
+  /// Can be used to construct a slightly modified copy of this LibraryInfo.
+  String get categoriesString {
+    return _categories;
+  }
+}
+
+/**
+ * Abstraction to capture the maturity of a library.
+ */
+class Maturity {
+  final int level;
+  final String name;
+  final String description;
+
+  const Maturity(this.level, this.name, this.description);
+
+  String toString() => "$name: $level\n$description\n";
+
+  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",
+      "This library is experimental and will likely change or be removed\n"
+      "in future versions.");
+
+  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",
+      "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",
+      "The library is stable. API backwards-compatibility is guaranteed.\n"
+      "However implementation details might change.");
+
+  static const Maturity LOCKED = const Maturity(5, "Locked",
+      "This library will not change except when serious bugs are encountered.");
+
+  static const Maturity UNSPECIFIED = const Maturity(-1, "Unspecified",
+      "The maturity for this library has not been specified.");
+}
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 7fccdc3..5e2a79c 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/collection_patch.dart
@@ -431,7 +431,7 @@
   String toString() => Maps.mapToString(this);
 }
 
-class _HashMapKeyIterable<E> extends Iterable<E> implements EfficientLength {
+class _HashMapKeyIterable<E> extends EfficientLengthIterable<E> {
   final _HashMap/*<E, dynamic>*/ _map;
   _HashMapKeyIterable(this._map);
 
@@ -639,8 +639,7 @@
   String toString() => Maps.mapToString(this);
 }
 
-class _Es6MapIterable<E> extends Iterable<E>
-                         implements EfficientLength {
+class _Es6MapIterable<E> extends EfficientLengthIterable<E> {
   final _map;
   final bool _isKeys;
 
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 910858f..71a568b 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/core_patch.dart
@@ -29,8 +29,10 @@
 @patch
 class Object {
   @patch
-  int get hashCode => Primitives.objectHashCode(this);
+  bool operator==(other) => identical(this, other);
 
+  @patch
+  int get hashCode => Primitives.objectHashCode(this);
 
   @patch
   String toString() => Primitives.objectToString(this);
@@ -49,6 +51,12 @@
       JS('Type', 'dart.wrapType(dart.getReifiedType(#))', this);
 }
 
+@patch
+class Null {
+  @patch
+  int get hashCode => super.hashCode;
+}
+
 // Patch for Function implementation.
 @patch
 class Function {
@@ -156,6 +164,18 @@
   StackTrace get stackTrace => Primitives.extractStackTrace(this);
 }
 
+@patch
+class FallThroughError {
+  @patch
+  String toString() => super.toString();
+}
+
+@patch
+class AbstractClassInstantiationError {
+  @patch
+  String toString() => "Cannot instantiate abstract class: '$_className'";
+}
+
 /// An interface type for all Strong-mode errors.
 class StrongModeError extends Error {}
 
@@ -427,6 +447,9 @@
     throw new UnsupportedError(
         'bool.fromEnvironment can only be used as a const constructor');
   }
+
+  @patch
+  int get hashCode => super.hashCode;  
 }
 
 @patch
@@ -513,6 +536,18 @@
 @patch
 class NoSuchMethodError {
   @patch
+  NoSuchMethodError(Object receiver,
+                    Symbol memberName,
+                    List positionalArguments,
+                    Map<Symbol, dynamic> namedArguments,
+                    [List existingArgumentNames = null])
+      : _receiver = receiver,
+        _memberName = memberName,
+        _arguments = positionalArguments,
+        _namedArguments = namedArguments,
+        _existingArgumentNames = existingArgumentNames;
+
+  @patch
   String toString() {
     StringBuffer sb = new StringBuffer();
     int i = 0;
@@ -561,15 +596,17 @@
 @patch
 class Uri {
   @patch
-  static bool get _isWindows => false;
-
-  @patch
   static Uri get base {
     String uri = Primitives.currentUri();
     if (uri != null) return Uri.parse(uri);
     throw new UnsupportedError("'Uri.base' is not supported");
   }
+}
 
+@patch
+class _Uri {
+  @patch
+  static bool get _isWindows => false;
 
   // Matches a String that _uriEncodes to itself regardless of the kind of
   // component.  This corresponds to [_unreservedTable], i.e. characters that
@@ -592,7 +629,7 @@
 
     // Encode the string into bytes then generate an ASCII only string
     // by percent encoding selected bytes.
-    StringBuffer result = new StringBuffer();
+    StringBuffer result = new StringBuffer('');
     var bytes = encoding.encode(text);
     for (int i = 0; i < bytes.length; i++) {
       int byte = bytes[i];
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 93f19fb..4cefe98 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/developer_patch.dart
@@ -8,7 +8,7 @@
 import 'dart:_foreign_helper' show JS;
 
 @patch
-// @ForceInline()
+@ForceInline()
 bool debugger({bool when: true, String message}) {
   if (when) {
     JS('', 'debugger');
@@ -46,7 +46,7 @@
 }
 
 @patch
-_postEvent(String eventKind, String eventData) {
+void _postEvent(String eventKind, String eventData) {
   // TODO.
 }
 
@@ -117,11 +117,63 @@
 }
 
 @patch
-void _getServerInfo(SendPort sp) {
-  sp.send(null);
+void _getServerInfo(SendPort sendPort) {
+  sendPort.send(null);
 }
 
 @patch
-void _webServerControl(SendPort sp, bool enable) {
-  sp.send(null);
+void _webServerControl(SendPort sendPort, bool enable) {
+  sendPort.send(null);
 }
+
+@patch
+String _getIsolateIDFromSendPort(SendPort sendPort) {
+  return null;
+}
+
+@patch
+class UserTag {
+  @patch
+  factory UserTag(String label) = _FakeUserTag;
+
+  @patch
+  static UserTag get defaultTag => _FakeUserTag._defaultTag;
+}
+
+class _FakeUserTag implements UserTag {
+  static Map _instances = {};
+
+  _FakeUserTag.real(this.label);
+
+  factory _FakeUserTag(String label) {
+    // Canonicalize by name.
+    var existingTag = _instances[label];
+    if (existingTag != null) {
+      return existingTag;
+    }
+    // Throw an exception if we've reached the maximum number of user tags.
+    if (_instances.length == UserTag.MAX_USER_TAGS) {
+      throw new UnsupportedError(
+          'UserTag instance limit (${UserTag.MAX_USER_TAGS}) reached.');
+    }
+    // Create a new instance and add it to the instance map.
+    var instance = new _FakeUserTag.real(label);
+    _instances[label] = instance;
+    return instance;
+  }
+
+  final String label;
+
+  UserTag makeCurrent() {
+    var old = _currentTag;
+    _currentTag = this;
+    return old;
+  }
+
+  static final UserTag _defaultTag = new _FakeUserTag('Default');
+}
+
+var _currentTag = _FakeUserTag._defaultTag;
+
+@patch
+UserTag getCurrentTag() => _currentTag;
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 22f67d3..d878d54 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/internal_patch.dart
@@ -11,11 +11,7 @@
 class Symbol implements core.Symbol {
   @patch
   const Symbol(String name)
-      : this._name = name, this._nativeSymbol = null;
-
-  @patch
-  const Symbol.es6(String name, dynamic nativeSymbol)
-      : this._name = name, this._nativeSymbol = nativeSymbol;
+      : this._name = name;
 
   @patch
   int get hashCode {
@@ -26,6 +22,33 @@
     JS('', '#._hashCode = #', this, hash);
     return hash;
   }
+  
+  @patch
+  toString() => 'Symbol("$_name")';
+}
+
+/// Used internally by DDC to map ES6 symbols to Dart.
+class PrivateSymbol implements core.Symbol {
+  // TODO(jmesserly): could also get this off the native symbol instead of
+  // storing it. Mirrors already does this conversion.
+  final String _name;
+  final Object _nativeSymbol;
+
+  const PrivateSymbol(this._name, this._nativeSymbol);
+
+  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);
+
+  // TODO(jmesserly): is this equivalent to _nativeSymbol toString?
+  toString() => 'Symbol("$_name")';
 }
 
 @patch
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 d941bb2..f79da5c 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/io_patch.dart
@@ -135,6 +135,18 @@
     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");
   }
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 3498c7a..637943b 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/isolate_patch.dart
@@ -6,12 +6,12 @@
 
 import 'dart:_js_helper' show patch;
 import 'dart:_isolate_helper' show CapabilityImpl,
-                                   CloseToken,
                                    IsolateNatives,
-                                   JsIsolateSink,
                                    ReceivePortImpl,
                                    RawReceivePortImpl;
 
+typedef _UnaryFunction(arg);
+
 @patch
 class Isolate {
   static final _currentIsolateCache = IsolateNatives.currentIsolate;
@@ -22,13 +22,61 @@
   static Isolate get current => _currentIsolateCache;
 
   @patch
+  static Future<Uri> get packageRoot {
+    throw new UnsupportedError("Isolate.packageRoot");
+  }
+
+  @patch
+  static Future<Uri> get packageConfig {
+    throw new UnsupportedError("Isolate.packageConfig");
+  }
+
+  static Uri _packageBase = Uri.base.resolve(IsolateNatives.packagesBase);
+
+  @patch
+  static Future<Uri> resolvePackageUri(Uri packageUri) async {
+    if (packageUri.scheme != 'package') return packageUri;
+    return _packageBase.resolveUri(packageUri.replace(scheme: ''));
+  }
+
+  @patch
   static Future<Isolate> spawn(void entryPoint(message), var message,
-                                     { bool paused: false }) {
+                               {bool paused: false, bool errorsAreFatal,
+                                SendPort onExit, SendPort onError}) {
+    bool forcePause = (errorsAreFatal != null) ||
+                      (onExit != null) ||
+                      (onError != null);
     try {
-      return IsolateNatives.spawnFunction(entryPoint, message, paused)
-          .then((msg) => new Isolate(msg[1],
-                                     pauseCapability: msg[2],
-                                     terminateCapability: msg[3]));
+      // Check for the type of `entryPoint` on the spawning isolate to make
+      // error-handling easier.
+      if (entryPoint is! _UnaryFunction) {
+        throw new ArgumentError(entryPoint);
+      }
+      // 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)
+          .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;
+          });
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
@@ -36,11 +84,26 @@
 
   @patch
   static Future<Isolate> spawnUri(
-      Uri uri, List<String> args, var message, { bool paused: false,
-                                                 Uri packageRoot }) {
+      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}) {
+    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);
     try {
-      if (args is List) {
+      if (args is List<String>) {
         for (int i = 0; i < args.length; i++) {
           if (args[i] is! String) {
             throw new ArgumentError("Args must be a list of Strings $args");
@@ -49,10 +112,31 @@
       } else if (args != null) {
         throw new ArgumentError("Args must be a list of Strings $args");
       }
-      return IsolateNatives.spawnUri(uri, args, message, paused)
-          .then((msg) => new Isolate(msg[1],
-                                     pauseCapability: msg[2],
-                                     terminateCapability: msg[3]));
+      // TODO: Handle [packageRoot] somehow, possibly by throwing.
+      // 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)
+          .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;
+          });
     } catch (e, st) {
       return new Future<Isolate>.error(e, st);
     }
@@ -76,12 +160,13 @@
   }
 
   @patch
-  void addOnExitListener(SendPort responsePort) {
+  void addOnExitListener(SendPort responsePort, {Object response}) {
     // TODO(lrn): Can we have an internal method that checks if the receiving
     // isolate of a SendPort is still alive?
-    var message = new List(2)
+    var message = new List(3)
         ..[0] = "add-ondone"
-        ..[1] = responsePort;
+        ..[1] = responsePort
+        ..[2] = response;
     controlPort.send(message);
   }
 
@@ -103,16 +188,18 @@
   }
 
   @patch
-  void kill([int priority = BEFORE_NEXT_EVENT]) {
+  void kill({int priority: BEFORE_NEXT_EVENT}) {
     controlPort.send(["kill", terminateCapability, priority]);
   }
 
   @patch
-  void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
-    var message = new List(3)
+  void ping(SendPort responsePort, {Object response,
+                                    int priority: IMMEDIATE}) {
+    var message = new List(4)
         ..[0] = "ping"
         ..[1] = responsePort
-        ..[2] = pingType;
+        ..[2] = priority
+        ..[3] = response;
     controlPort.send(message);
   }
 
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 758b164..eb6319c 100644
--- a/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
+++ b/pkg/dev_compiler/tool/input_sdk/patch/mirrors_patch.dart
@@ -10,6 +10,12 @@
 @patch
 class MirrorSystem {
   @patch
+  LibraryMirror findLibrary(Symbol libraryName) {
+    return libraries.values.singleWhere(
+        (library) => library.simpleName == libraryName);
+  }
+
+  @patch
   static String getName(Symbol symbol) => js.getName(symbol);
 
   @patch
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
index 6f4236c..f89ca0c 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/operations.dart
@@ -208,7 +208,7 @@
 
 Symbol _dartSymbol(name) {
   return (JS('bool', 'typeof # === "symbol"', name))
-      ? JS('', '#(new #.es6(#, #))', const_, _internal.Symbol,
+      ? JS('', '#(new #(#, #))', const_, _internal.PrivateSymbol,
           _toSymbolName(name), name)
       : JS('', '#(#.new(#))', const_, Symbol, _toDisplayName(name));
 }
@@ -882,6 +882,12 @@
     return JS('String', '#[dartx.toString]()', obj);
   }
   if (JS('bool', 'typeof # == "function"', obj)) {
+    // If the function is a Type object, we should just display the type name.
+    // Regular Dart code should typically get wrapped type objects instead of
+    // raw type (aka JS constructor) objects however raw type objects can be
+    // exposed to Dart code via JS interop or debugging tools.
+    if (isType(obj)) return typeName(obj);
+
     return JS(
         'String', r'"Closure: " + # + " from: " + #', getReifiedType(obj), obj);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
index 344c592..dc776c8 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/rtti.dart
@@ -74,6 +74,8 @@
 final _runtimeType = JS('', 'Symbol("_runtimeType")');
 final isNamedConstructor = JS('', 'Symbol("isNamedConstructor")');
 
+final _moduleName = JS('', 'Symbol("_moduleName")');
+
 _checkPrimitiveType(obj) {
   // TODO(jmesserly): JS is used to prevent type literal wrapping.  Is there a
   // better way we can handle this?  (sra: It is super dodgy that the values
@@ -187,9 +189,9 @@
 
 _getRuntimeType(value) => JS('', '#[#]', value, _runtimeType);
 getIsNamedConstructor(value) => JS('', '#[#]', value, isNamedConstructor);
-// TODO(bmilligan): Define the symbol in rtti.dart instead of dart_library.js
-// and get rid of the call to dart_library in the JS here.
-getDartLibraryName(value) => JS('', '#[dart_library.dartLibraryName]', value);
+
+/// Return the module name for a raw library object.
+getModuleName(value) => JS('', '#[#]', value, _moduleName);
 
 /// Tag the runtime type of [value] to be type [t].
 void tag(value, t) {
@@ -204,3 +206,22 @@
   JS('', '#(#, #, { get: # })', defineLazyProperty, value, _runtimeType,
       compute);
 }
+
+var _loadedModules = JS('', 'new Map()');
+
+List getModuleNames() {
+  return JS('', 'Array.from(#.keys())', _loadedModules);
+}
+
+/// Return all library objects in the specified module.
+getModuleLibraries(String name) {
+  var module = JS('', '#.get(#)', _loadedModules, name);
+  if (module == null) return null;
+  JS('', '#[#] = #', module, _moduleName, name);
+  return module;
+}
+
+/// Track all libraries
+void trackLibraries(String moduleName, libraries) {
+  JS('', '#.set(#, #)', _loadedModules, moduleName, libraries);
+}
\ No newline at end of file
diff --git a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
index e64daf7..d1000c7 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/ddc_runtime/types.dart
@@ -513,6 +513,12 @@
 definiteFunctionType(returnType, args, extra) =>
     _functionType(true, returnType, args, extra);
 
+bool isType(obj) => JS(
+    '',
+    '''(() => {
+  return $_getRuntimeType($obj) === $Type;
+  })()''');
+
 String typeName(type) => JS(
     '',
     '''(() => {
@@ -698,8 +704,8 @@
   if (JS('bool', '# === #', getGenericClass(type), getGenericClass(FutureOr))) {
     return _isTop(JS('', '#[0]', getGenericArgs(type)));
   }
-  return JS('bool', '# == # || # == # || # == #',
-      type, Object, type, dynamic, type, _void);
+  return JS('bool', '# == # || # == # || # == #', type, Object, type, dynamic,
+      type, _void);
 }
 
 _isSubtype(t1, t2, isCovariant) => JS(
diff --git a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
index a6bc963..7fbc2de 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/debugger.dart
@@ -53,11 +53,68 @@
 
 void addMetadataChildren(object, Set<NameValuePair> ret) {
   ret.add(new NameValuePair(
-      name: getTypeName(_getType(object)),
-      value: object,
+      name: "[[class]]",
+      value: dart.getReifiedType(object),
       config: JsonMLConfig.asClass));
 }
 
+/// Add properties from a signature definition [sig] for [object].
+/// Walk the prototype chain if [walkProtypeChain] is set.
+/// Tag types on function typed properties of [object] if [tagTypes] is set.
+///
+void addPropertiesFromSignature(
+    sig, Set<NameValuePair> properties, object, bool walkPrototypeChain,
+    {tagTypes: false}) {
+  // Including these property names doesn't add any value and just clutters
+  // the debugger output.
+  // TODO(jacobr): consider adding runtimeType to this list.
+  var skippedNames = new Set()..add('hashCode');
+
+  while (sig != null) {
+    for (var symbol in getOwnPropertySymbols(sig)) {
+      var dartName = symbolName(symbol);
+      String dartXPrefix = 'dartx.';
+      if (dartName.startsWith(dartXPrefix)) {
+        dartName = dartName.substring(dartXPrefix.length);
+      }
+      if (skippedNames.contains(dartName)) continue;
+      var value = safeGetProperty(object, symbol);
+      // Tag the function with its runtime type.
+      if (tagTypes && _typeof(value) == 'function') {
+        dart.tag(value, JS('', '#[#]', sig, symbol));
+      }
+      properties.add(new NameValuePair(name: dartName, value: value));
+    }
+
+    for (var name in getOwnPropertyNames(sig)) {
+      var value = safeGetProperty(object, name);
+      if (skippedNames.contains(name)) continue;
+      // Tag the function with its runtime type.
+      if (tagTypes && _typeof(value) == 'function') {
+        dart.tag(value, JS('', '#[#]', sig, name));
+      }
+      properties.add(new NameValuePair(name: name, value: value));
+    }
+
+    if (!walkPrototypeChain) break;
+
+    sig = safeGetProperty(sig, '__proto__');
+  }
+}
+
+/// Sort properties sorting public names before private names.
+List<NameValuePair> sortProperties(Iterable<NameValuePair> properties) {
+  var sortedProperties = properties.toList();
+
+  sortedProperties.sort((a, b) {
+    var aPrivate = a.name.startsWith('_');
+    var bPrivate = b.name.startsWith('_');
+    if (aPrivate != bPrivate) return aPrivate ? 1 : -1;
+    return a.name.compareTo(b.name);
+  });
+  return sortedProperties;
+}
+
 String getObjectTypeName(object) {
   var reifiedType = dart.getReifiedType(object);
   if (reifiedType == null) {
@@ -69,7 +126,7 @@
   return getTypeName(reifiedType);
 }
 
-String getTypeName(Type type) {
+String getTypeName(type) {
   var name = dart.typeName(type);
   // Hack to cleanup names for List<dynamic>
   // TODO(jacobr): it would be nice if there was a way we could distinguish
@@ -80,9 +137,6 @@
   return name;
 }
 
-Object _getType(object) =>
-    object is Type ? object : dart.getReifiedType(object);
-
 String safePreview(object, config) {
   try {
     var preview = _devtoolsFormatter._simpleFormatter.preview(object, config);
@@ -117,7 +171,12 @@
 
   // Define equality and hashCode so that NameValuePair can be used
   // in a Set to dedupe entries with duplicate names.
-  operator ==(other) => other is NameValuePair && other.name == name;
+  bool operator ==(other) {
+    if (other is! NameValuePair) return false;
+    if (this.hideName || other.hideName) return identical(this, other);
+    return other.name == name;
+  }
+
   int get hashCode => name.hashCode;
 
   final String name;
@@ -269,7 +328,7 @@
   // Treat Node objects as a native JavaScript type as the regular DOM render
   // in devtools is superior to the dart specific view.
   return (type != 'object' && type != 'function') ||
-      object is dart.JSObject ||
+      dart.isJsInterop(object) ||
       object is html.Node;
 }
 
@@ -328,27 +387,41 @@
       body.addStyle('color: rgb(196, 26, 22);');
     }
     var children = _simpleFormatter.children(object, config);
+    if (children == null) return body.toJsonML();
     for (NameValuePair child in children) {
       var li = body.createChild('li');
-      var nameSpan = new JsonMLElement('span')
-        ..createTextChild(
-            child.displayName.isNotEmpty ? '${child.displayName}: ' : '')
-        ..setStyle('color: rgb(136, 19, 145);');
+      li.setStyle("padding-left: 13px;");
+
+      // The value is indented when it is on a different line from the name
+      // by setting right padding of the name to -13px and the padding of the
+      // value to 13px.
+      JsonMLElement nameSpan;
+      var valueStyle = '';
+      if (!child.hideName) {
+        nameSpan = new JsonMLElement('span')
+          ..createTextChild(
+              child.displayName.isNotEmpty ? '${child.displayName}: ' : '')
+          ..setStyle('color: rgb(136, 19, 145); margin-right: -13px');
+        valueStyle = 'margin-left: 13px';
+      }
+
       if (_typeof(child.value) == 'object' ||
           _typeof(child.value) == 'function') {
-        nameSpan.addStyle("padding-left: 13px;");
-
-        li.appendChild(nameSpan);
-        var objectTag = li.createObjectTag(child.value);
-        objectTag.addAttribute('config', child.config);
-        if (!_simpleFormatter.hasChildren(child.value, child.config)) {
-          li.setStyle("padding-left: 13px;");
+        var valueSpan = new JsonMLElement('span')..setStyle(valueStyle);
+        valueSpan.createObjectTag(child.value)
+          ..addAttribute('config', child.config);
+        if (nameSpan != null) {
+          li.appendChild(nameSpan);
         }
+        li.appendChild(valueSpan);
       } else {
-        li.setStyle("padding-left: 13px;");
-        li.createChild('span')
-          ..appendChild(nameSpan)
-          ..createTextChild(safePreview(child.value, child.config));
+        var line = li.createChild('span');
+        if (nameSpan != null) {
+          line.appendChild(nameSpan);
+        }
+        line.appendChild(new JsonMLElement('span')
+          ..createTextChild(safePreview(child.value, child.config))
+          ..setStyle(valueStyle));
       }
     }
     return body.toJsonML();
@@ -370,6 +443,7 @@
     // precedence.
     _formatters = [
       new ClassFormatter(),
+      new TypeFormatter(),
       new NamedConstructorFormatter(),
       new MapFormatter(),
       new IterableFormatter(),
@@ -437,10 +511,6 @@
 
 /// Default formatter for Dart Objects.
 class ObjectFormatter extends Formatter {
-  static Set<String> _customNames = new Set()
-    ..add('constructor')
-    ..add('prototype')
-    ..add('__proto__');
   bool accept(object, config) => !isNativeJavaScriptObject(object);
 
   String preview(object) => getObjectTypeName(object);
@@ -448,76 +518,34 @@
   bool hasChildren(object) => true;
 
   List<NameValuePair> children(object) {
-    var properties = new LinkedHashSet<NameValuePair>();
-    // Set of property names used to avoid duplicates.
-    addMetadataChildren(object, properties);
-
-    var current = object;
-
-    var protoChain = <Object>[];
-    while (current != null &&
-        !isNativeJavaScriptObject(current) &&
-        JS("bool", "# !== Object.prototype", current)) {
-      protoChain.add(current);
-      current = safeGetProperty(current, '__proto__');
-    }
-
-    // We walk the prototype chain for symbol properties because they take
-    // priority and are accessed instead of Dart properties according to Dart
-    // calling conventions.
-    // TODO(jacobr): where possible use the data stored by dart.setSignature
-    // instead of walking the JavaScript object directly.
-    for (current in protoChain) {
-      for (var symbol in getOwnPropertySymbols(current)) {
-        var dartName = symbolName(symbol);
-        if (hasMethod(object, dartName)) {
-          continue;
-        }
-        // TODO(jacobr): find a cleaner solution than checking for dartx
-        String dartXPrefix = 'dartx.';
-        if (dartName.startsWith(dartXPrefix)) {
-          dartName = dartName.substring(dartXPrefix.length);
-        } else if (!dartName.startsWith('_')) {
-          // Dart method extension names should either be from dartx or should
-          // start with an _
-          continue;
-        }
-        var value = safeGetProperty(object, symbol);
-        properties.add(new NameValuePair(name: dartName, value: value));
-      }
-    }
-
-    for (current in protoChain) {
-      // TODO(jacobr): optionally distinguish properties and fields so that
-      // it is safe to expand untrusted objects without side effects.
-      var className = dart.getReifiedType(current).name;
-      for (var name in getOwnPropertyNames(current)) {
-        if (_customNames.contains(name) || name == className) continue;
-        if (hasMethod(object, name)) {
-          continue;
-        }
-        var value = safeGetProperty(object, name);
-        properties.add(new NameValuePair(name: name, value: value));
-      }
-    }
-
-    return properties.toList();
+    var type = dart.getType(object);
+    var ret = new LinkedHashSet<NameValuePair>();
+    // We use a Set rather than a List to avoid duplicates.
+    var properties = new Set<NameValuePair>();
+    addPropertiesFromSignature(
+        dart.getFieldSig(type), properties, object, true);
+    addPropertiesFromSignature(
+        dart.getGetterSig(type), properties, object, true);
+    ret.addAll(sortProperties(properties));
+    addMetadataChildren(object, ret);
+    return ret.toList();
   }
 }
 
 /// Formatter for module Dart Library objects.
 class LibraryModuleFormatter implements Formatter {
-  accept(object, config) => dart.getDartLibraryName(object) != null;
+  accept(object, config) => dart.getModuleName(object) != null;
 
   bool hasChildren(object) => true;
 
   String preview(object) {
-    var libraryNames = dart.getDartLibraryName(object).split('/');
+    var libraryNames = dart.getModuleName(object).split('/');
     // Library names are received with a repeat directory name, so strip the
     // last directory entry here to make the path cleaner. For example, the
     // library "third_party/dart/utf/utf" shoud display as
     // "third_party/dart/utf/".
-    if (libraryNames.length > 1) {
+    if (libraryNames.length > 1 &&
+        libraryNames.last == libraryNames[libraryNames.length - 2]) {
       libraryNames[libraryNames.length - 1] = '';
     }
     return 'Library Module: ${libraryNames.join('/')}';
@@ -527,9 +555,6 @@
     var children = new LinkedHashSet<NameValuePair>();
     for (var name in getOwnPropertyNames(object)) {
       var value = safeGetProperty(object, name);
-      // Replace __ with / to make file paths more readable. Then
-      // 'src__result__error' becomes 'src/result/error'.
-      name = '${name.replaceAll("__", "/")}.dart';
       children.add(new NameValuePair(
           name: name, value: new Library(name, value), hideName: true));
     }
@@ -547,51 +572,26 @@
   String preview(object) => object.name;
 
   List<NameValuePair> children(object) {
+    // Maintain library member order rather than sorting members as is the
+    // case for class members.
     var children = new LinkedHashSet<NameValuePair>();
-    var nonGenericProperties = new LinkedHashMap<String, Object>();
     var objectProperties = safeProperties(object.object);
     objectProperties.forEach((name, value) {
-      var genericTypeConstructor = dart.getGenericTypeCtor(value);
-      if (genericTypeConstructor != null) {
-        recordGenericParameters(name, genericTypeConstructor);
-      } else {
-        nonGenericProperties[name] = value;
-      }
-    });
-    nonGenericProperties.forEach((name, value) {
-      if (value is Type) {
-        children.add(classChild(name, value));
-      } else {
-        children.add(new NameValuePair(name: name, value: value));
-      }
+      // Skip the generic constructors for each class as users are only
+      // interested in seeing the actual classes.
+      if (dart.getGenericTypeCtor(value) != null) return;
+
+      children.add(dart.isType(value)
+          ? classChild(name, value)
+          : new NameValuePair(name: name, value: value));
     });
     return children.toList();
   }
 
-  recordGenericParameters(String name, Object genericTypeConstructor) {
-    // Using JS toString() eliminates the leading metadata that is generated
-    // with the toString function provided in operations.dart.
-    // Splitting by => and taking the first element gives the list of
-    // arguments in the constructor.
-    genericParameters[name] =
-        JS('String', '#.toString()', genericTypeConstructor)
-            .split(' =>')
-            .first
-            .replaceAll(new RegExp(r'[(|)]'), '');
-  }
-
   classChild(String name, Object child) {
     var typeName = getTypeName(child);
-    // Generic class names are generated with a $ at the end, so the
-    // corresponding non-generic class can be identified by adding $.
-    var parameterName = '$name\$';
-    if (genericParameters.keys.contains(parameterName)) {
-      typeName = '$typeName<${genericParameters[parameterName]}>';
-      // TODO(bmilligan): Add a symbol to classes with generic types at their
-      // creation so they can be recognized independently by the debugger.
-      JSNative.setProperty(child, 'genericTypeName', typeName);
-    }
-    return new NameValuePair(name: typeName, value: child);
+    return new NameValuePair(
+        name: typeName, value: child, config: JsonMLConfig.asClass);
   }
 }
 
@@ -770,14 +770,11 @@
 }
 
 class ClassFormatter implements Formatter {
-  accept(object, config) => object is Type || config == JsonMLConfig.asClass;
+  accept(object, config) => config == JsonMLConfig.asClass;
 
-  String preview(object) {
-    var typeName = safeGetProperty(object, 'genericTypeName');
-    if (typeName != null) return typeName;
-    var type = _getType(object);
+  String preview(type) {
     var implements = dart.getImplements(type);
-    typeName = getTypeName(type);
+    var typeName = getTypeName(type);
     if (implements != null) {
       var typeNames = implements().map(getTypeName);
       return '${typeName} implements ${typeNames.join(", ")}';
@@ -788,60 +785,86 @@
 
   bool hasChildren(object) => true;
 
-  List<NameValuePair> children(object) {
+  List<NameValuePair> children(type) {
     // TODO(jacobr): add other entries describing the class such as
-    // links to the superclass, mixins, implemented interfaces, and methods.
-    var type = _getType(object);
-    var children = <NameValuePair>[];
-    var typeName = getTypeName(_getType(object));
+    // implemented interfaces, and methods.
+    var ret = new LinkedHashSet<NameValuePair>();
+
+    var staticProperties = new Set<NameValuePair>();
+    var staticMethods = new Set<NameValuePair>();
+    // Static fields and properties.
+    addPropertiesFromSignature(
+        dart.getStaticFieldSig(type), staticProperties, type, false);
+    addPropertiesFromSignature(
+        dart.getStaticGetterSig(type), staticProperties, type, false);
+    // static methods.
+    addPropertiesFromSignature(
+        dart.getStaticSig(type), staticMethods, type, false);
+
+    if (staticProperties.isNotEmpty || staticMethods.isNotEmpty) {
+      ret
+        ..add(new NameValuePair(value: '[[Static members]]', hideName: true))
+        ..addAll(sortProperties(staticProperties))
+        ..addAll(sortProperties(staticMethods));
+    }
+
+    // instance methods.
+    var instanceMethods = new Set<NameValuePair>();
+    // Instance methods are defined on the prototype not the constructor object.
+    addPropertiesFromSignature(dart.getMethodSig(type), instanceMethods,
+        JS('', '#.prototype', type), false,
+        tagTypes: true);
+    if (instanceMethods.isNotEmpty) {
+      ret
+        ..add(new NameValuePair(value: '[[Instance Methods]]', hideName: true))
+        ..addAll(sortProperties(instanceMethods));
+    }
+
+    var typeName = getTypeName(type);
     var mixins = dart.getMixins(type);
     if (mixins != null && mixins.isNotEmpty) {
-      children.add(new NameValuePair(
+      ret.add(new NameValuePair(
           name: '[[Mixins]]', value: new HeritageClause('mixins', mixins)));
     }
 
-    var hiddenProperties = ['length', 'name', 'prototype', 'genericTypeName'];
-    // Addition of NameValuePairs for static variables and named constructors.
-    for (var name in getOwnPropertyNames(object)) {
-      // TODO(bmilligan): Perform more principled checks to filter out spurious
-      // members.
-      if (hiddenProperties.contains(name)) continue;
-      var value = safeGetProperty(object, name);
-      if (value != null && dart.getIsNamedConstructor(value) != null) {
-        value = new NamedConstructor(value);
-        name = '${typeName}.$name';
-      }
-      children.add(new NameValuePair(name: name, value: value));
+    var baseProto = JS('', '#.__proto__', type);
+    if (baseProto != null && !dart.isJsInterop(baseProto)) {
+      ret.add(new NameValuePair(
+          name: "[[base class]]",
+          value: baseProto,
+          config: JsonMLConfig.asClass));
     }
 
-    // TODO(bmilligan): Replace the hard coding of $identityHash.
-    var hiddenPrototypeProperties = ['constructor', 'new', r'$identityHash'];
-    // Addition of class methods.
-    var prototype = JS('var', '#["prototype"]', object);
-    if (prototype != null) {
-      for (var name in getOwnPropertyNames(prototype)) {
-        if (hiddenPrototypeProperties.contains(name)) continue;
-        // Simulate dart.bind by using dart.tag and tear off the function
-        // so it will be recognized by the FunctionFormatter.
-        var function = safeGetProperty(prototype, name);
-        var constructor = safeGetProperty(prototype, 'constructor');
-        var sigObj = dart.getMethodSig(constructor);
-        if (sigObj != null) {
-          var value = safeGetProperty(sigObj, name);
-          if (getTypeName(dart.getReifiedType(value)) != 'Null') {
-            dart.tag(function, value);
-            children.add(new NameValuePair(name: name, value: function));
-          }
-        }
-      }
-    }
-    return children;
+    // TODO(jacobr): add back fields for named constructors.
+    return ret.toList();
   }
 }
 
+class TypeFormatter implements Formatter {
+  accept(object, config) => object is Type;
+
+  String preview(object) => object.toString();
+
+  bool hasChildren(object) => false;
+
+  List<NameValuePair> children(object) => [];
+}
+
 /// This entry point is automatically invoked by the code generated by
 /// Dart Dev Compiler
 registerDevtoolsFormatter() {
   var formatters = [_devtoolsFormatter];
   JS('', 'dart.global.devtoolsFormatters = #', formatters);
 }
+
+// Expose these methods here to facilitate writing debugger tests.
+// If export worked for private SDK libraries we could just export
+// these methods from dart:_runtime.
+
+getModuleNames() {
+  return dart.getModuleNames();
+}
+
+getModuleLibraries(String name) {
+  return dart.getModuleLibraries(name);
+}
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 975dde7..a6310d5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/isolate_helper.dart
@@ -382,10 +382,6 @@
       return;
     }
     void respond() { responsePort.send(null); }
-    if (pingType == Isolate.AS_EVENT) {
-      _globalState.topEventLoop.enqueue(this, respond, "ping");
-      return;
-    }
     assert(pingType == Isolate.BEFORE_NEXT_EVENT);
     if (_scheduledControlEvents == null) {
       _scheduledControlEvents = new Queue();
@@ -401,10 +397,6 @@
       kill();
       return;
     }
-    if (priority == Isolate.AS_EVENT) {
-      _globalState.topEventLoop.enqueue(this, kill, "kill");
-      return;
-    }
     assert(priority == Isolate.BEFORE_NEXT_EVENT);
     if (_scheduledControlEvents == null) {
       _scheduledControlEvents = new Queue();
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 80a5289..c33ca35 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_array.dart
@@ -93,7 +93,7 @@
   void insertAll(int index, Iterable<E> iterable) {
     checkGrowable('insertAll');
     RangeError.checkValueInInterval(index, 0, this.length, "index");
-    if (iterable is! EfficientLength) {
+    if (iterable is! EfficientLengthIterable) {
       iterable = iterable.toList();
     }
     int insertionLength = iterable.length;
@@ -411,7 +411,7 @@
   void replaceRange(int start, int end, Iterable<E> replacement) {
     checkGrowable('replace range');
     RangeError.checkValidRange(start, end, this.length);
-    if (replacement is! EfficientLength) {
+    if (replacement is! EfficientLengthIterable) {
       replacement = replacement.toList();
     }
     int removeLength = end - start;
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 a20547b..fee11a5 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_helper.dart
@@ -12,7 +12,7 @@
 
 import 'dart:_interceptors';
 import 'dart:_internal' show
-    EfficientLength,
+    EfficientLengthIterable,
     MappedIterable,
     IterableElementError;
 
@@ -25,6 +25,8 @@
 part 'string_helper.dart';
 part 'js_rti.dart';
 
+final _identityHashCode = JS('', 'Symbol("_identityHashCode")');
+
 class _Patch {
   const _Patch();
 }
@@ -57,10 +59,10 @@
   }
 
   static int objectHashCode(object) {
-    int hash = JS('int|Null', r'#.$identityHash', object);
+    int hash = JS('int|Null', r'#[#]', object, _identityHashCode);
     if (hash == null) {
       hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
-      JS('void', r'#.$identityHash = #', object, hash);
+      JS('void', r'#[#] = #', object, _identityHashCode, hash);
     }
     return JS('int', '#', hash);
   }
diff --git a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
index 62cb4a6..98c6dbd 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/js_mirrors.dart
@@ -8,8 +8,13 @@
 import 'dart:_foreign_helper' show JS;
 import 'dart:_internal' as _internal;
 
-String getName(Symbol symbol) =>
-    _internal.Symbol.getName(symbol as _internal.Symbol);
+String getName(Symbol symbol) {
+  if (symbol is _internal.PrivateSymbol) {
+    return _internal.PrivateSymbol.getName(symbol);
+  } else {
+    return _internal.Symbol.getName(symbol as _internal.Symbol);
+  }
+}
 
 Symbol getSymbol(name, library) =>
     throw new UnimplementedError("MirrorSystem.getSymbol unimplemented");
@@ -79,7 +84,7 @@
 typedef T _Lazy<T>();
 
 dynamic _getESSymbol(Symbol symbol) =>
-    _internal.Symbol.getNativeSymbol(symbol as _internal.Symbol);
+    _internal.PrivateSymbol.getNativeSymbol(symbol);
 
 dynamic _getMember(Symbol symbol) {
   var privateSymbol = _getESSymbol(symbol);
@@ -116,7 +121,7 @@
 
 Symbol _getSymbolForESSymbol(member) {
   var name = _getNameForESSymbol(member);
-  return new _internal.Symbol.es6(name, member);
+  return new _internal.PrivateSymbol(name, member);
 }
 
 // The [member] must be either a string (public) or an ES6 symbol (private).
@@ -125,7 +130,7 @@
     return new Symbol(member);
   } else {
     var name = _getNameForESSymbol(member);
-    return new _internal.Symbol.es6(name, member);
+    return new _internal.PrivateSymbol(name, member);
   }
 }
 
@@ -379,7 +384,7 @@
       setters.forEach((symbol, ft) {
         var name = getName(symbol) + '=';
         // Create a separate symbol for the setter.
-        symbol = new _internal.Symbol.es6(name, _getESSymbol(symbol));
+        symbol = new _internal.PrivateSymbol(name, _getESSymbol(symbol));
         _declarations[symbol] =
             new JsMethodMirror._instanceMethod(this, symbol, ft);
       });
diff --git a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
index f6c20bf..19ab363 100644
--- a/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
+++ b/pkg/dev_compiler/tool/input_sdk/private/linked_hash_map.dart
@@ -382,8 +382,7 @@
   LinkedHashMapCell(this.hashMapCellKey, this.hashMapCellValue);
 }
 
-class LinkedHashMapKeyIterable<E> extends Iterable<E>
-    implements EfficientLength {
+class LinkedHashMapKeyIterable<E> extends EfficientLengthIterable<E> {
   final dynamic/*=JsLinkedHashMap<E, dynamic>*/ _map;
   LinkedHashMapKeyIterable(this._map);
 
diff --git a/pkg/dev_compiler/tool/input_sdk/version b/pkg/dev_compiler/tool/input_sdk/version
deleted file mode 100644
index c8f7f49..0000000
--- a/pkg/dev_compiler/tool/input_sdk/version
+++ /dev/null
@@ -1 +0,0 @@
-1.9.0-dev.4.0
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index 00ec5db..2b71640 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -15,39 +15,42 @@
 
 void main(List<String> argv) {
   var self = path.relative(path.fromUri(Platform.script));
-  if (argv.length < 2) {
+  if (argv.length < 3) {
     var toolDir = path.relative(path.dirname(path.fromUri(Platform.script)));
 
-    var inputExample = path.join(toolDir, 'input_sdk');
+    var inputExample = path.join(toolDir, '..', '..', '..');
+    var patchExample = path.join(toolDir, 'input_sdk');
     var outExample =
         path.relative(path.normalize(path.join('gen', 'patched_sdk')));
 
-    print('Usage: $self INPUT_DIR OUTPUT_DIR');
+    print('Usage: $self INPUT_SDK_DIR PATCH_DIR OUTPUT_DIR');
     print('For example:');
-    print('\$ $self $inputExample $outExample');
+    print('\$ $self $inputExample $patchExample $outExample');
     exit(1);
   }
 
   var selfModifyTime = new File(self).lastModifiedSync().millisecondsSinceEpoch;
 
-  var input = argv[0];
-  var sdkLibIn = path.join(input, 'lib');
-  var patchIn = path.join(input, 'patch');
-  var privateIn = path.join(input, 'private');
-  var sdkOut = path.join(argv[1], 'lib');
+  var inputDir = argv[0];
+  var patchDir = argv[1];
+  var sdkLibIn = path.join(inputDir, 'sdk', 'lib');
+  var patchIn = path.join(patchDir, 'patch');
+  var privateIn = path.join(patchDir, 'private');
+  var sdkOut = path.join(argv[2], 'lib');
 
-  var INTERNAL_PATH = '_internal/compiler/js_lib/';
+  var INTERNAL_PATH = '_internal/js_runtime/lib/';
 
   // Copy libraries.dart and version
-  var libContents = new File(path.join(sdkLibIn, '_internal', 'libraries.dart'))
-      .readAsStringSync();
+  var librariesDart = path.join(patchDir, 'libraries.dart');
+  var libContents = new File(librariesDart).readAsStringSync();
+  // TODO(jmesserly): can we remove this?
   _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), libContents);
   _writeSync(
       path.join(
           sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
       libContents);
   _writeSync(path.join(sdkOut, '..', 'version'),
-      new File(path.join(sdkLibIn, '..', 'version')).readAsStringSync());
+      new File(path.join(inputDir, 'tools', 'VERSION')).readAsStringSync());
 
   // Parse libraries.dart
   var sdkLibraries = _getSdkLibraries(libContents);
@@ -60,10 +63,13 @@
     if (library.isVmLibrary) continue;
 
     var libraryOut = path.join(sdkLibIn, library.path);
+    var libraryOverride = path.join(patchDir, 'lib', library.path);
     var libraryIn;
     if (library.path.contains(INTERNAL_PATH)) {
       libraryIn =
           path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
+    } else if (new File(libraryOverride).existsSync()) {
+      libraryIn = libraryOverride;
     } else {
       libraryIn = libraryOut;
     }
@@ -124,8 +130,12 @@
           contents = _patchLibrary(contents, patchContents);
         }
 
-        for (var i = 0; i < outPaths.length; i++) {
-          _writeSync(outPaths[i], contents[i]);
+        if (contents != null) {
+          for (var i = 0; i < outPaths.length; i++) {
+            _writeSync(outPaths[i], contents[i]);
+          }
+        } else {
+          exitCode = 2;
         }
       }
     }
@@ -167,12 +177,16 @@
   var patchFinder = new PatchFinder.parseAndVisit(patchContents);
 
   // Merge `external` declarations with the corresponding `@patch` code.
+  bool failed = false;
   for (var partContent in partsContents) {
     var partEdits = new StringEditBuffer(partContent);
     var partUnit = parseCompilationUnit(partContent);
-    partUnit.accept(new PatchApplier(partEdits, patchFinder));
+    var patcher = new PatchApplier(partEdits, patchFinder);
+    partUnit.accept(patcher);
+    if (!failed) failed = patcher.patchWasMissing;
     results.add(partEdits);
   }
+  if (failed) return null;
   return new List<String>.from(results.map((e) => e.toString()));
 }
 
@@ -182,6 +196,7 @@
   final PatchFinder patch;
 
   bool _isLibrary = true; // until proven otherwise.
+  bool patchWasMissing = false;
 
   PatchApplier(this.edits, this.patch);
 
@@ -258,6 +273,7 @@
     var patchNode = patch.patches[name];
     if (patchNode == null) {
       print('warning: patch not found for $name: $node');
+      patchWasMissing = true;
       return;
     }
 
diff --git a/pkg/dev_compiler/tool/patch_sdk.sh b/pkg/dev_compiler/tool/patch_sdk.sh
index c04c622..45370d1 100755
--- a/pkg/dev_compiler/tool/patch_sdk.sh
+++ b/pkg/dev_compiler/tool/patch_sdk.sh
@@ -2,4 +2,4 @@
 set -e
 
 cd "$(dirname "$BASH_SOURCE[0]")/.."
-dart -c tool/patch_sdk.dart tool/input_sdk gen/patched_sdk
+dart -c tool/patch_sdk.dart ../.. tool/input_sdk gen/patched_sdk
diff --git a/pkg/dev_compiler/tool/sdk_expected_errors.txt b/pkg/dev_compiler/tool/sdk_expected_errors.txt
index 381ac61..9badbd3 100644
--- a/pkg/dev_compiler/tool/sdk_expected_errors.txt
+++ b/pkg/dev_compiler/tool/sdk_expected_errors.txt
@@ -1,45 +1,65 @@
-[error] Couldn't infer type parameter 'T'; '_ControllerEventSinkWrapper<dynamic>' must be of type 'EventSink<T>'. (dart:async/stream.dart, line 1346, col 16)
-[error] The argument type '_ControllerEventSinkWrapper' can't be assigned to the parameter type 'EventSink<T>'. (dart:async/stream.dart, line 1346, col 53)
-[error] Type parameter bound types must be instantiated. (dart:collection/queue.dart, line 99, col 29)
+[error] Couldn't infer type parameter 'T'; '_ControllerEventSinkWrapper<dynamic>' must be of type 'EventSink<T>'. (dart:async/stream.dart, line 1359, col 16)
+[error] The argument type '_ControllerEventSinkWrapper' can't be assigned to the parameter type 'EventSink<T>'. (dart:async/stream.dart, line 1359, col 53)
+[error] Type parameter bound types must be instantiated. (dart:collection/queue.dart, line 99, col 32)
+[error] Invalid override. The type of '_UnicodeSubsetEncoder.startChunkedConversion' ('(Sink<List<int>>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/ascii.dart, line 107, col 3)
+[error] Invalid override. The type of '_UnicodeSubsetEncoder.bind' ('(Stream<String>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.bind' ('(dynamic) → dynamic'). (dart:convert/ascii.dart, line 115, col 3)
+[error] Invalid override. The type of '_UnicodeSubsetDecoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/ascii.dart, line 221, col 3)
+[error] Invalid override. The type of '_UnicodeSubsetDecoder.bind' ('(Stream<List<int>>) → Stream<String>') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.bind' ('(dynamic) → dynamic'). (dart:convert/ascii.dart, line 224, col 3)
+[error] Invalid override. The type of 'AsciiDecoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/ascii.dart, line 237, col 3)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<List<int>>) → Stream<String>') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.bind' ('(dynamic) → dynamic'). (dart:convert/base64.dart, line 207, col 21)
+[error] Invalid override. The type of 'Base64Encoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/base64.dart, line 222, col 3)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<String>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.bind' ('(dynamic) → dynamic'). (dart:convert/base64.dart, line 479, col 21)
+[error] Invalid override. The type of 'Base64Decoder.startChunkedConversion' ('(Sink<List<int>>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/base64.dart, line 493, col 3)
 [error] Invalid override. The type of 'ChunkedConverter.bind' ('(dynamic) → dynamic') isn't a subtype of 'Converter<S, T>.bind' ('(Stream<S>) → Stream<T>'). (dart:convert/chunked_conversion.dart, line 14, col 3)
 [error] Invalid override. The type of 'ChunkedConverter.bind' ('(dynamic) → dynamic') isn't a subtype of 'StreamTransformer<S, T>.bind' ('(Stream<S>) → Stream<T>'). (dart:convert/chunked_conversion.dart, line 14, col 3)
 [error] Invalid override. The type of 'ChunkedConverter.startChunkedConversion' ('(dynamic) → dynamic') isn't a subtype of 'Converter<S, T>.startChunkedConversion' ('(Sink<T>) → Sink<S>'). (dart:convert/chunked_conversion.dart, line 15, col 3)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<S>) → Stream<T>') isn't a subtype of 'ChunkedConverter<S, T, S, T>.bind' ('(dynamic) → dynamic'). (dart:convert/converter.dart, line 54, col 32)
+[error] Invalid override. The type of '_FusedConverter.startChunkedConversion' ('(Sink<T>) → Sink<S>') isn't a subtype of 'ChunkedConverter<S, T, S, T>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/converter.dart, line 63, col 3)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<String>) → Stream<String>') isn't a subtype of 'ChunkedConverter<String, String, String, String>.bind' ('(dynamic) → dynamic'). (dart:convert/html_escape.dart, line 155, col 18)
+[error] Invalid override. The type of 'HtmlEscape.startChunkedConversion' ('(Sink<String>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, String, String, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/html_escape.dart, line 207, col 3)
+[error] Invalid override. The type of 'JsonEncoder.startChunkedConversion' ('(Sink<String>) → ChunkedConversionSink<Object>') isn't a subtype of 'ChunkedConverter<Object, String, Object, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 257, col 3)
+[error] Invalid override. The type of 'JsonEncoder.bind' ('(Stream<Object>) → Stream<String>') isn't a subtype of 'ChunkedConverter<Object, String, Object, String>.bind' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 269, col 3)
+[error] Invalid override. The type of 'JsonUtf8Encoder.startChunkedConversion' ('(Sink<List<int>>) → ChunkedConversionSink<Object>') isn't a subtype of 'ChunkedConverter<Object, List<int>, Object, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 385, col 3)
+[error] Invalid override. The type of 'JsonUtf8Encoder.bind' ('(Stream<Object>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<Object, List<int>, Object, List<int>>.bind' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 397, col 3)
+[error] Invalid override. The type of 'JsonDecoder.startChunkedConversion' ('(Sink<Object>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, Object, String, Object>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 507, col 3)
+[error] Invalid override. The type of 'JsonDecoder.bind' ('(Stream<String>) → Stream<Object>') isn't a subtype of 'ChunkedConverter<String, Object, String, Object>.bind' ('(dynamic) → dynamic'). (dart:convert/json.dart, line 512, col 3)
+[error] Invalid override. The type of 'Latin1Decoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/latin1.dart, line 100, col 3)
+[error] Invalid override. The type of 'Utf8Encoder.startChunkedConversion' ('(Sink<List<int>>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/utf.dart, line 122, col 3)
+[error] Invalid override. The type of 'Utf8Encoder.bind' ('(Stream<String>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.bind' ('(dynamic) → dynamic'). (dart:convert/utf.dart, line 130, col 3)
+[error] Invalid override. The type of 'Utf8Decoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:convert/utf.dart, line 360, col 3)
+[error] Invalid override. The type of 'Utf8Decoder.bind' ('(Stream<List<int>>) → Stream<String>') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.bind' ('(dynamic) → dynamic'). (dart:convert/utf.dart, line 371, col 3)
 [error] Only redirecting factory constructors can be declared to be 'const'. (dart:core/bool.dart, line 41, col 9)
 [error] Const constructors can't throw exceptions. (dart:core/bool.dart, line 42, col 5)
 [error] Only redirecting factory constructors can be declared to be 'const'. (dart:core/int.dart, line 33, col 9)
 [error] Const constructors can't throw exceptions. (dart:core/int.dart, line 34, col 5)
+[error] Annotation must be either a const variable reference or const constructor invocation. (dart:core/stacktrace.dart, line 43, col 3)
 [error] Only redirecting factory constructors can be declared to be 'const'. (dart:core/string.dart, line 156, col 9)
 [error] Const constructors can't throw exceptions. (dart:core/string.dart, line 157, col 5)
-[error] Couldn't infer type parameter 'S'; 'RandomAccessFile' must be of type 'File'. (dart:io/file_impl.dart, line 216, col 19)
-[error] The argument type '(RandomAccessFile) → Future<RandomAccessFile>' can't be assigned to the parameter type '(RandomAccessFile) → FutureOr<File>'. (dart:io/file_impl.dart, line 216, col 24)
-[error] The return type 'Future' isn't a 'FutureOr<File>', as defined by the method ''. (dart:io/file_impl.dart, line 545, col 14)
-[error] The return type 'StreamSubscription<int>' isn't a 'StreamSubscription<List<int>>', as defined by the method 'listen'. (dart:io/http_parser.dart, line 208, col 14)
-[error] The argument type '(List<int>) → void' can't be assigned to the parameter type '(int) → void'. (dart:io/http_parser.dart, line 209, col 19)
-[error] Couldn't infer type parameter 'V'; 'Object' must be of type 'String'. (dart:io/io_resource_info.dart, line 27, col 7)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 30, col 15)
-[error] Couldn't infer type parameter 'V'; 'Object' must be of type 'String'. (dart:io/io_resource_info.dart, line 75, col 5)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 77, col 13)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 79, col 20)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 80, col 23)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 81, col 20)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 82, col 21)
-[error] The element type 'double' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 83, col 19)
-[error] The element type 'double' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 84, col 20)
-[error] Couldn't infer type parameter 'V'; 'Object' must be of type 'String'. (dart:io/io_resource_info.dart, line 159, col 5)
-[error] The element type 'int' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 161, col 13)
-[error] The element type 'double' can't be assigned to the map value type 'String'. (dart:io/io_resource_info.dart, line 164, col 20)
-[error] The argument type 'List' can't be assigned to the parameter type 'Iterable<int>'. (dart:io/secure_socket.dart, line 1129, col 23)
+[error] Annotation must be either a const variable reference or const constructor invocation. (dart:developer, line 39, col 1)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<List<int>>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<List<int>, List<int>, List<int>, List<int>>.bind' ('(dynamic) → dynamic'). (dart:io/data_transformer.dart, line 278, col 19)
+[error] Invalid override. The type of 'ZLibEncoder.startChunkedConversion' ('(Sink<List<int>>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, List<int>, List<int>, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:io/data_transformer.dart, line 370, col 3)
+[error] The argument type '(RandomAccessFile) → Future<RandomAccessFile>' can't be assigned to the parameter type '(RandomAccessFile) → FutureOr<File>'. (dart:io/file_impl.dart, line 216, col 30)
+[error] The return type 'Future' isn't a 'FutureOr<File>', as defined by the method ''. (dart:io/file_impl.dart, line 614, col 14)
+[error] Target of URI doesn't exist: 'dart:nativewrappers'. (dart:io, line 211, col 8)
 [error] Undefined name 'lineMode'. (dart:io/stdio.dart, line 64, col 10)
-[error] The name 'echoMode=' is already defined. (dart:io/stdio.dart, line 126, col 12)
-[error] The name 'lineMode=' is already defined. (dart:io/stdio.dart, line 145, col 12)
-[error] Couldn't infer type parameter 'S'; 'dynamic' must be of type 'WebSocket'. (dart:io/websocket_impl.dart, line 469, col 10)
-[error] The argument type '(String) → Future<dynamic>' can't be assigned to the parameter type '(dynamic) → FutureOr<WebSocket>'. (dart:io/websocket_impl.dart, line 469, col 15)
+[error] The name 'echoMode=' is already defined. (dart:io/stdio.dart, line 128, col 12)
+[error] The name 'lineMode=' is already defined. (dart:io/stdio.dart, line 149, col 12)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<String>) → Stream<List<int>>') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.bind' ('(dynamic) → dynamic'). (dart:io/string_transformer.dart, line 45, col 31)
+[error] Invalid override. The type of '_WindowsCodePageEncoder.startChunkedConversion' ('(Sink<List<int>>) → StringConversionSink') isn't a subtype of 'ChunkedConverter<String, List<int>, String, List<int>>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:io/string_transformer.dart, line 61, col 3)
+[error] Base class introduces an invalid override. The type of 'Converter.bind' ('(Stream<List<int>>) → Stream<String>') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.bind' ('(dynamic) → dynamic'). (dart:io/string_transformer.dart, line 100, col 31)
+[error] Invalid override. The type of '_WindowsCodePageDecoder.startChunkedConversion' ('(Sink<String>) → ByteConversionSink') isn't a subtype of 'ChunkedConverter<List<int>, String, List<int>, String>.startChunkedConversion' ('(dynamic) → dynamic'). (dart:io/string_transformer.dart, line 112, col 3)
+[error] The getter 'packagesBase' isn't defined for the class 'IsolateNatives'. (dart:isolate, line 721, col 61)
 [error] Invalid override. The type of 'JsArray.[]=' ('(Object, E) → void') isn't a subtype of 'JsObject.[]=' ('(Object, dynamic) → dynamic'). (dart:js, line 363, col 3)
+[error] The return type 'double' isn't a 'T', as defined by the method 'min'. (dart:math, line 90, col 16)
+[error] The return type 'double' isn't a 'T', as defined by the method 'max'. (dart:math, line 125, col 16)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<String>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:_js_helper/regexp_helper.dart, line 140, col 43)
 [warning] Unsafe implicit cast from 'List<dynamic>' to 'List<String>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:_js_helper/regexp_helper.dart, line 152, col 43)
+[warning] Unsafe implicit cast from 'Function' to '(dynamic) → FutureOr<T>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:async/future_impl.dart, line 151, col 11)
+[warning] Unsafe implicit cast from '(T) → dynamic' to '(T) → FutureOr<E>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:async/future_impl.dart, line 249, col 57)
+[warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<T>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:async/stream_impl.dart, line 1011, col 42)
 [warning] Unsafe implicit cast from 'Object' to 'K'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:collection, line 411, col 49)
-[warning] Unsafe implicit cast from 'Object' to 'E'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:collection, line 758, col 14)
-[warning] Unsafe implicit cast from 'Object' to 'E'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:collection, line 1135, col 14)
+[warning] Unsafe implicit cast from 'Object' to 'E'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:collection, line 757, col 14)
+[warning] Unsafe implicit cast from 'Object' to 'E'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:collection, line 1134, col 14)
 [warning] The final variable 'origin' must be initialized. (dart:html, line 177, col 3)
 [warning] The final variable 'origin' must be initialized. (dart:html, line 813, col 3)
 [warning] The final variables 'form', 'labels' and '3' more must be initialized. (dart:html, line 1691, col 3)
@@ -73,31 +93,9 @@
 [warning] The final variables 'readyState' and 'track' must be initialized. (dart:html, line 33056, col 3)
 [warning] The final variables 'decodedFrameCount', 'droppedFrameCount' and '2' more must be initialized. (dart:html, line 33754, col 3)
 [warning] Unsafe implicit cast from '(T) → void' to '(Event) → dynamic'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:html, line 40126, col 45)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/data_transformer.dart, line 492, col 23)
-[warning] Unsafe implicit cast from 'Stream<dynamic>' to 'Stream<FileSystemEntity>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/directory_impl.dart, line 239, col 12)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/file_impl.dart, line 484, col 14)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/file_impl.dart, line 831, col 33)
-[warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 269, col 14)
-[warning] Unsafe implicit cast from 'Stream<dynamic>' to 'Stream<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1056, col 29)
-[warning] Unsafe implicit cast from 'Function' to '(List<int>) → void'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1173, col 54)
-[warning] Unsafe implicit cast from 'Function' to '(List<int>) → void'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1175, col 33)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<_ConnectionInfo>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_impl.dart, line 1635, col 14)
-[warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_parser.dart, line 201, col 16)
-[warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<List<int>>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/http_parser.dart, line 203, col 50)
-[warning] Unsafe implicit cast from 'Map<dynamic, dynamic>' to 'Map<String, String>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/platform_impl.dart, line 100, col 69)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<SecureSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 92, col 12)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<SecureSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 138, col 12)
-[warning] Unsafe implicit cast from 'StreamSubscription<dynamic>' to 'StreamSubscription<RawSocketEvent>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 446, col 33)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<RawSecureSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 580, col 12)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/secure_socket.dart, line 1176, col 32)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/stdio.dart, line 109, col 28)
-[warning] Unsafe implicit cast from 'Future<dynamic>' to 'Future<WebSocket>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/websocket_impl.dart, line 471, col 14)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/websocket_impl.dart, line 577, col 21)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/websocket_impl.dart, line 590, col 35)
-[warning] Unsafe implicit cast from 'List<dynamic>' to 'List<int>'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:io/websocket_impl.dart, line 626, col 12)
-[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 158, col 22)
-[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 159, col 23)
-[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 282, col 10)
+[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 151, col 22)
+[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 152, col 23)
+[warning] Unsafe implicit cast from 'num' to 'T'. This usually indicates that type information was lost and resulted in 'dynamic' and/or a place that will have a failure at runtime. (dart:math/rectangle.dart, line 275, col 10)
 [warning] The final variables 'href' and 'target' must be initialized. (dart:svg, line 60, col 3)
 [warning] The final variables 'requiredExtensions', 'requiredFeatures' and '2' more must be initialized. (dart:svg, line 489, col 3)
 [warning] The final variables 'cx', 'cy' and '1' more must be initialized. (dart:svg, line 562, col 3)
diff --git a/pkg/front_end/lib/src/fasta/analyzer/analyzer_compile.dart b/pkg/front_end/lib/src/fasta/analyzer/analyzer_compile.dart
new file mode 100644
index 0000000..dd90575
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/analyzer/analyzer_compile.dart
@@ -0,0 +1,63 @@
+// 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.
+
+library fasta.analyzer_compile;
+
+import 'dart:async' show Future;
+
+import 'dart:io' show exitCode;
+
+import '../compiler_command_line.dart' show CompilerCommandLine;
+
+import '../compiler_context.dart' show CompilerContext;
+
+import '../ticker.dart' show Ticker;
+
+import '../outline.dart' show CompileTask;
+
+import '../errors.dart' show InputError;
+
+import 'analyzer_target.dart' show AnalyzerTarget;
+
+import '../dill/dill_target.dart' show DillTarget;
+
+import '../translate_uri.dart' show TranslateUri;
+
+const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
+
+Future<Uri> compile(List<String> arguments) async {
+  try {
+    return await CompilerCommandLine.withGlobalOptions("kompile", arguments,
+        (CompilerContext c) async {
+      if (c.options.verbose) {
+        print("Compiling via analyzer: ${arguments.join(' ')}");
+      }
+      AnalyzerCompileTask task =
+          new AnalyzerCompileTask(c, new Ticker(isVerbose: c.options.verbose));
+      return await task.compile();
+    });
+  } on InputError catch (e) {
+    exitCode = 1;
+    print(e.format());
+    return null;
+  }
+}
+
+class AnalyzerCompileTask extends CompileTask {
+  AnalyzerCompileTask(CompilerContext c, Ticker ticker) : super(c, ticker);
+
+  AnalyzerTarget createKernelTarget(
+      DillTarget dillTarget, TranslateUri uriTranslator) {
+    return new AnalyzerTarget(dillTarget, uriTranslator, c.uriToSource);
+  }
+}
+
+mainEntryPoint(List<String> arguments) async {
+  for (int i = 0; i < iterations; i++) {
+    if (i > 0) {
+      print("\n");
+    }
+    await compile(arguments);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/analyzer/analyzer_diet_listener.dart b/pkg/front_end/lib/src/fasta/analyzer/analyzer_diet_listener.dart
new file mode 100644
index 0000000..f907b47
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/analyzer/analyzer_diet_listener.dart
@@ -0,0 +1,37 @@
+// 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.
+
+library fasta.analyzer_diet_listener;
+
+import 'package:kernel/ast.dart' show AsyncMarker;
+
+import '../source/stack_listener.dart' show StackListener;
+
+import '../builder/builder.dart';
+
+import '../builder/scope.dart' show Scope;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../source/diet_listener.dart' show DietListener;
+
+import 'element_store.dart' show ElementStore;
+
+import 'ast_builder.dart' show AstBuilder;
+
+class AnalyzerDietListener extends DietListener {
+  final ElementStore elementStore;
+
+  AnalyzerDietListener(SourceLibraryBuilder library, this.elementStore)
+      : super(library, null, null);
+
+  StackListener createListener(
+      MemberBuilder builder, Scope memberScope, bool isInstanceMember,
+      [Scope formalParameterScope]) {
+    return new AstBuilder(library, builder, elementStore, memberScope, uri);
+  }
+
+  @override
+  AsyncMarker getAsyncMarker(StackListener listener) => null;
+}
diff --git a/pkg/front_end/lib/src/fasta/analyzer/analyzer_loader.dart b/pkg/front_end/lib/src/fasta/analyzer/analyzer_loader.dart
new file mode 100644
index 0000000..6cacc9e
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/analyzer/analyzer_loader.dart
@@ -0,0 +1,34 @@
+// 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.
+
+library fasta.analyzer_loader;
+
+import 'package:kernel/ast.dart' show Program;
+
+import '../builder/builder.dart' show LibraryBuilder;
+
+import '../target_implementation.dart' show TargetImplementation;
+
+import '../source/source_loader.dart' show SourceLoader;
+
+import 'element_store.dart' show ElementStore;
+
+import 'analyzer_diet_listener.dart' show AnalyzerDietListener;
+
+class AnalyzerLoader<L> extends SourceLoader<L> {
+  ElementStore elementStore;
+
+  AnalyzerLoader(TargetImplementation target) : super(target);
+
+  @override
+  void computeHierarchy(Program program) {
+    elementStore = new ElementStore(coreLibrary, builders);
+    ticker.logMs("Built analyzer element model.");
+  }
+
+  @override
+  AnalyzerDietListener createDietListener(LibraryBuilder library) {
+    return new AnalyzerDietListener(library, elementStore);
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/analyzer/analyzer_target.dart b/pkg/front_end/lib/src/fasta/analyzer/analyzer_target.dart
new file mode 100644
index 0000000..0562dfe
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/analyzer/analyzer_target.dart
@@ -0,0 +1,24 @@
+// 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.
+
+library fasta.analyzer_target;
+
+import 'package:kernel/ast.dart' show Library, Source;
+
+import '../kernel/kernel_target.dart' show KernelTarget;
+
+import '../translate_uri.dart' show TranslateUri;
+
+import '../dill/dill_target.dart' show DillTarget;
+
+import 'analyzer_loader.dart' show AnalyzerLoader;
+
+class AnalyzerTarget extends KernelTarget {
+  AnalyzerTarget(DillTarget dillTarget, TranslateUri uriTranslator,
+      [Map<String, Source> uriToSource])
+      : super(dillTarget, uriTranslator, uriToSource);
+
+  @override
+  AnalyzerLoader<Library> createLoader() => new AnalyzerLoader<Library>(this);
+}
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 fb2421a..c2d1c67 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/ast_builder.dart
@@ -9,18 +9,14 @@
 import 'package:analyzer/dart/ast/standard_ast_factory.dart' as standard;
 import 'package:analyzer/dart/ast/token.dart' as analyzer show Token;
 import 'package:analyzer/dart/element/element.dart' show Element;
-import 'package:front_end/src/fasta/parser/parser.dart'
-    show FormalParameterType;
-import 'package:front_end/src/fasta/scanner/token.dart'
-    show BeginGroupToken, Token;
-import 'package:kernel/ast.dart' show AsyncMarker;
+import '../parser/parser.dart' show FormalParameterType;
+import '../scanner/token.dart' show BeginGroupToken, Token;
 
 import '../errors.dart' show internalError;
 import '../kernel/kernel_builder.dart'
     show Builder, KernelLibraryBuilder, ProcedureBuilder;
 import '../parser/identifier_context.dart' show IdentifierContext;
 import '../quote.dart';
-import '../source/outline_builder.dart' show asyncMarkerFromTokens;
 import '../source/scope_listener.dart'
     show JumpTargetKind, NullValue, Scope, ScopeListener;
 import 'analyzer.dart' show toKernel;
@@ -44,11 +40,6 @@
   @override
   final Uri uri;
 
-  /// If `true`, the first call to [handleIdentifier] should push a
-  /// List<SimpleIdentifier> on the stack, and [handleQualified] should append
-  /// to the list.
-  var accumulateIdentifierComponents = false;
-
   /// The name of the class currently being parsed, or `null` if no class is
   /// being parsed.
   String className;
@@ -68,6 +59,40 @@
     push(token);
   }
 
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
+    push(NullValue.ConstructorReferenceContinuationAfterTypeArguments);
+  }
+
+  @override
+  void endConstructorReference(
+      Token start, Token periodBeforeName, Token endToken) {
+    debugEvent("ConstructorReference");
+    SimpleIdentifier constructorName = pop();
+    TypeArgumentList typeArguments = pop();
+    Identifier typeNameIdentifier = pop();
+    push(ast.constructorName(ast.typeName(typeNameIdentifier, typeArguments),
+        toAnalyzerToken(periodBeforeName), constructorName));
+  }
+
+  @override
+  void handleNewExpression(Token token) {
+    debugEvent("NewExpression");
+    MethodInvocation arguments = pop();
+    ConstructorName constructorName = pop();
+    push(ast.instanceCreationExpression(
+        toAnalyzerToken(token), constructorName, arguments.argumentList));
+  }
+
+  @override
+  void handleParenthesizedExpression(BeginGroupToken token) {
+    debugEvent("ParenthesizedExpression");
+    Expression expression = pop();
+    push(ast.parenthesizedExpression(
+        toAnalyzerToken(token), expression, toAnalyzerToken(token.endGroup)));
+  }
+
   void handleStringPart(Token token) {
     debugEvent("StringPart");
     push(token);
@@ -159,22 +184,24 @@
     MethodInvocation arguments = pop();
     TypeArgumentList typeArguments = pop();
     if (arguments != null) {
-      if (typeArguments != null) {
-        arguments.typeArguments = typeArguments;
-      }
-      doInvocation(token, arguments);
+      doInvocation(token, typeArguments, arguments);
     } else {
       doPropertyGet(token);
     }
   }
 
-  void doInvocation(Token token, MethodInvocation arguments) {
+  void doInvocation(
+      Token token, TypeArgumentList typeArguments, MethodInvocation arguments) {
     Expression receiver = pop();
     if (receiver is SimpleIdentifier) {
       arguments.methodName = receiver;
+      if (typeArguments != null) {
+        arguments.typeArguments = typeArguments;
+      }
       push(arguments);
     } else {
-      internalError("Unhandled receiver in send: ${receiver.runtimeType}");
+      push(ast.functionExpressionInvocation(
+          receiver, typeArguments, arguments.argumentList));
     }
   }
 
@@ -191,13 +218,22 @@
     if (beginToken != null) {
       exitLocalScope();
     }
-    push(ast.block(
-        toAnalyzerToken(beginToken), statements, toAnalyzerToken(endToken)));
+    Block block = ast.block(
+        toAnalyzerToken(beginToken), statements, toAnalyzerToken(endToken));
+    analyzer.Token star = pop();
+    analyzer.Token asyncKeyword = pop();
+    push(ast.blockFunctionBody(asyncKeyword, star, block));
   }
 
-  void finishFunction(formals, asyncModifier, Statement body) {
+  void finishFunction(formals, asyncModifier, FunctionBody body) {
     debugEvent("finishFunction");
-    var kernel = toKernel(body, elementStore, library.library, scope);
+    Statement bodyStatement;
+    if (body is ExpressionFunctionBody) {
+      bodyStatement = ast.returnStatement(null, body.expression, null);
+    } else {
+      bodyStatement = (body as BlockFunctionBody).block;
+    }
+    var kernel = toKernel(bodyStatement, elementStore, library.library, scope);
     if (member is ProcedureBuilder) {
       ProcedureBuilder builder = member;
       builder.body = kernel;
@@ -230,6 +266,7 @@
   void handleBinaryExpression(Token token) {
     debugEvent("BinaryExpression");
     if (identical(".", token.stringValue) ||
+        identical("?.", token.stringValue) ||
         identical("..", token.stringValue)) {
       doDotExpression(token);
     } else {
@@ -243,8 +280,13 @@
     Expression identifierOrInvoke = pop();
     Expression receiver = pop();
     if (identifierOrInvoke is SimpleIdentifier) {
-      push(ast.propertyAccess(
-          receiver, toAnalyzerToken(token), identifierOrInvoke));
+      if (receiver is SimpleIdentifier && identical('.', token.stringValue)) {
+        push(ast.prefixedIdentifier(
+            receiver, toAnalyzerToken(token), identifierOrInvoke));
+      } else {
+        push(ast.propertyAccess(
+            receiver, toAnalyzerToken(token), identifierOrInvoke));
+      }
     } else if (identifierOrInvoke is MethodInvocation) {
       assert(identifierOrInvoke.target == null);
       identifierOrInvoke
@@ -262,6 +304,16 @@
     push(ast.integerLiteral(toAnalyzerToken(token), int.parse(token.value)));
   }
 
+  void endExpressionFunctionBody(Token arrowToken, Token endToken) {
+    debugEvent("ExpressionFunctionBody");
+    Expression expression = pop();
+    analyzer.Token star = pop();
+    analyzer.Token asyncKeyword = pop();
+    assert(star == null);
+    push(ast.expressionFunctionBody(asyncKeyword, toAnalyzerToken(arrowToken),
+        expression, toAnalyzerToken(endToken)));
+  }
+
   void endReturnStatement(
       bool hasExpression, Token beginToken, Token endToken) {
     debugEvent("ReturnStatement");
@@ -337,7 +389,7 @@
     debugEvent("VariablesDeclaration");
     List<VariableDeclaration> variables = popList(count);
     TypeName type = pop();
-    pop(); // Modifiers.
+    pop(); // TODO(paulberry): Modifiers.
     push(ast.variableDeclarationStatement(
         ast.variableDeclarationList(null, null, null, type, variables),
         toAnalyzerToken(endToken)));
@@ -393,7 +445,8 @@
 
   void handleAsyncModifier(Token asyncToken, Token starToken) {
     debugEvent("AsyncModifier");
-    push(asyncMarkerFromTokens(asyncToken, starToken));
+    push(toAnalyzerToken(asyncToken) ?? NullValue.FunctionBodyAsyncToken);
+    push(toAnalyzerToken(starToken) ?? NullValue.FunctionBodyStarToken);
   }
 
   void endAwaitExpression(Token beginToken, Token endToken) {
@@ -444,6 +497,18 @@
     push(ast.symbolLiteral(toAnalyzerToken(hashToken), components));
   }
 
+  @override
+  void handleSuperExpression(Token token) {
+    debugEvent("SuperExpression");
+    push(ast.superExpression(toAnalyzerToken(token)));
+  }
+
+  @override
+  void handleThisExpression(Token token) {
+    debugEvent("ThisExpression");
+    push(ast.thisExpression(toAnalyzerToken(token)));
+  }
+
   void handleType(Token beginToken, Token endToken) {
     debugEvent("Type");
     TypeArgumentList arguments = pop();
@@ -516,7 +581,8 @@
     } else {
       name = nameOrFunctionTypedParameter;
       TypeName type = pop();
-      Token keyword = _popOptionalSingleModifier();
+      _Modifiers modifiers = pop();
+      Token keyword = modifiers?.finalConstOrVarKeyword;
       pop(); // TODO(paulberry): Metadata.
       if (thisKeyword == null) {
         node = ast.simpleFormalParameter2(
@@ -559,8 +625,8 @@
     TypeName returnType = pop();
 
     {
-      List<Token> modifiers = pop();
-      if (modifiers.isNotEmpty) {
+      _Modifiers modifiers = pop();
+      if (modifiers != null) {
         // TODO(scheglov): Report error.
         internalError('Unexpected modifier. Report an error.');
       }
@@ -709,26 +775,10 @@
 
   void handleModifiers(int count) {
     debugEvent("Modifiers");
-    push(popList(count) ?? const <Token>[]);
-  }
-
-  FunctionBody _endFunctionBody() {
-    AstNode body = pop();
-    // TODO(paulberry): asyncMarker should have a type that allows constructing
-    // the necessary analyzer AST data structures.
-    AsyncMarker asyncMarker = pop();
-    assert(asyncMarker == AsyncMarker.Sync);
-    analyzer.Token asyncKeyword = null;
-    analyzer.Token star = null;
-    if (body is Block) {
-      return ast.blockFunctionBody(asyncKeyword, star, body);
-    } else if (body is ReturnStatement) {
-      assert(star == null);
-      return ast.expressionFunctionBody(
-          asyncKeyword, body.returnKeyword, body.expression, body.semicolon);
+    if (count == 0) {
+      push(NullValue.Modifiers);
     } else {
-      return internalError(
-          'Unexpected function body type: ${body.runtimeType}');
+      push(new _Modifiers(popList(count)));
     }
   }
 
@@ -736,13 +786,14 @@
     // TODO(paulberry): set up scopes properly to resolve parameters and type
     // variables.
     debugEvent("TopLevelMethod");
-    FunctionBody body = _endFunctionBody();
+    FunctionBody body = pop();
     FormalParameterList parameters = pop();
     TypeParameterList typeParameters = pop();
     SimpleIdentifier name = pop();
     analyzer.Token propertyKeyword = toAnalyzerToken(getOrSet);
     TypeAnnotation returnType = pop();
-    Token externalKeyword = _popOptionalSingleModifier();
+    _Modifiers modifiers = pop();
+    Token externalKeyword = modifiers?.externalKeyword;
     List<Annotation> metadata = pop();
     // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
     Comment comment = null;
@@ -929,7 +980,8 @@
     SimpleIdentifier name = pop();
     assert(className == name.name);
     className = null;
-    Token abstractKeyword = _popOptionalSingleModifier();
+    _Modifiers modifiers = pop();
+    Token abstractKeyword = modifiers?.abstractKeyword;
     List<Annotation> metadata = pop();
     // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
     Comment comment = null;
@@ -977,7 +1029,8 @@
     analyzer.Token equals = toAnalyzerToken(equalsToken);
     TypeParameterList typeParameters = pop();
     SimpleIdentifier name = pop();
-    Token abstractKeyword = _popOptionalSingleModifier();
+    _Modifiers modifiers = pop();
+    Token abstractKeyword = modifiers?.abstractKeyword;
     List<Annotation> metadata = pop();
     // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
     Comment comment = null;
@@ -1058,7 +1111,7 @@
     // in constructors, so the logic should be shared with BodyBuilder as much
     // as possible.
     debugEvent("UnnamedFunction");
-    var body = _endFunctionBody();
+    FunctionBody body = pop();
     FormalParameterList parameters = pop();
     TypeParameterList typeParameters = pop();
     push(ast.functionExpression(typeParameters, parameters, body));
@@ -1083,7 +1136,8 @@
     debugEvent("TopLevelFields");
     List<VariableDeclaration> variables = popList(count);
     TypeAnnotation type = pop();
-    Token keyword = _popOptionalSingleModifier();
+    _Modifiers modifiers = pop();
+    Token keyword = modifiers?.finalConstOrVarKeyword;
     var variableList = ast.variableDeclarationList(
         null, null, toAnalyzerToken(keyword), type, variables);
     List<Annotation> metadata = pop();
@@ -1120,61 +1174,64 @@
   @override
   void endMethod(Token getOrSet, Token beginToken, Token endToken) {
     debugEvent("Method");
-    FunctionBody body = _endFunctionBody();
+    FunctionBody body = pop();
     ConstructorName redirectedConstructor = null; // TODO(paulberry)
     List<ConstructorInitializer> initializers = null; // TODO(paulberry)
     Token separator = null; // TODO(paulberry)
     FormalParameterList parameters = pop();
-    /* TypeParameterList typeParameters = */ pop(); // TODO(paulberry)
+    TypeParameterList typeParameters = pop(); // TODO(paulberry)
     var name = pop();
-    // TODO(paulberry)
-    // analyzer.Token propertyKeyword = toAnalyzerToken(getOrSet);
-    /* TypeAnnotation returnType = */ pop(); // TODO(paulberry)
-
-    Token externalKeyword = null;
-    Token constKeyword = null;
-    Token factoryKeyword = null;
-    List<Token> modifiers = pop();
-    for (Token modifier in modifiers) {
-      String value = modifier.stringValue;
-      if (identical('external', value)) {
-        // TODO(scheglov): Check the order and uniqueness.
-        externalKeyword = modifier;
-      } else if (identical('const', value)) {
-        // TODO(scheglov): Check the order and uniqueness.
-        constKeyword = modifier;
-      } else if (identical('factory', value)) {
-        // TODO(scheglov): Check the order and uniqueness.
-        factoryKeyword = modifier;
-      } else {
-        // TODO(scheglov): Report error.
-        internalError("Invalid modifier ($value). Report an error.");
-      }
-    }
-
+    TypeAnnotation returnType = pop(); // TODO(paulberry)
+    _Modifiers modifiers = pop();
     List<Annotation> metadata = pop();
     // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
     Comment comment = null;
-    SimpleIdentifier returnType2;
     Token period;
-    SimpleIdentifier name2;
-    if (name is SimpleIdentifier) {
-      returnType2 = name;
+    void unnamedConstructor(
+        SimpleIdentifier returnType, SimpleIdentifier name) {
+      push(ast.constructorDeclaration(
+          comment,
+          metadata,
+          toAnalyzerToken(modifiers?.externalKeyword),
+          toAnalyzerToken(modifiers?.finalConstOrVarKeyword),
+          null, // TODO(paulberry): factoryKeyword
+          returnType,
+          toAnalyzerToken(period),
+          name,
+          parameters,
+          toAnalyzerToken(separator),
+          initializers,
+          redirectedConstructor,
+          body));
     }
-    push(ast.constructorDeclaration(
-        comment,
-        metadata,
-        toAnalyzerToken(externalKeyword),
-        toAnalyzerToken(constKeyword),
-        toAnalyzerToken(factoryKeyword),
-        returnType2,
-        toAnalyzerToken(period),
-        name2,
-        parameters,
-        toAnalyzerToken(separator),
-        initializers,
-        redirectedConstructor,
-        body));
+
+    void method(Token operatorKeyword, SimpleIdentifier name) {
+      push(ast.methodDeclaration(
+          comment,
+          metadata,
+          toAnalyzerToken(modifiers?.externalKeyword),
+          toAnalyzerToken(
+              modifiers?.abstractKeyword ?? modifiers?.staticKeyword),
+          returnType,
+          toAnalyzerToken(getOrSet),
+          toAnalyzerToken(operatorKeyword),
+          name,
+          typeParameters,
+          parameters,
+          body));
+    }
+
+    if (name is SimpleIdentifier) {
+      if (name.name == className) {
+        unnamedConstructor(name, null);
+      } else {
+        method(null, name);
+      }
+    } else if (name is _OperatorName) {
+      method(name.operatorKeyword, name.name);
+    } else {
+      throw new UnimplementedError();
+    }
   }
 
   @override
@@ -1268,22 +1325,32 @@
         toAnalyzerToken(beginToken), arguments, toAnalyzerToken(endToken)));
   }
 
-  /**
-   * Pop the modifiers list, if the list is empty return `null`, if the list
-   * has one item return it; otherwise return `null`.
-   */
-  Token _popOptionalSingleModifier() {
-    List<Token> modifiers = pop();
-    if (modifiers.length == 0) {
-      return null;
-    } else if (modifiers.length == 1) {
-      // TODO(scheglov): Verify that the modifier is valid.
-      return modifiers[0];
-    } else {
-      // TODO(scheglov): Report error.
-      internalError("Invalid modifier. Report an error.");
-      return null;
-    }
+  @override
+  void endFields(
+      int count, Token covariantKeyword, Token beginToken, Token endToken) {
+    debugEvent("Fields");
+    List<VariableDeclaration> variables = popList(count);
+    TypeAnnotation type = pop();
+    _Modifiers modifiers = pop();
+    var variableList = ast.variableDeclarationList(null, null,
+        toAnalyzerToken(modifiers?.finalConstOrVarKeyword), type, variables);
+    List<Annotation> metadata = pop();
+    // TODO(paulberry): capture doc comments.  See dartbug.com/28851.
+    Comment comment = null;
+    push(ast.fieldDeclaration2(
+        comment: comment,
+        metadata: metadata,
+        covariantKeyword: toAnalyzerToken(covariantKeyword),
+        staticKeyword: toAnalyzerToken(modifiers?.staticKeyword),
+        fieldList: variableList,
+        semicolon: toAnalyzerToken(endToken)));
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    debugEvent("OperatorName");
+    push(new _OperatorName(operatorKeyword,
+        ast.simpleIdentifier(toAnalyzerToken(token), isDeclaration: true)));
   }
 
   ParameterKind _toAnalyzerParameterKind(FormalParameterType type) {
@@ -1346,3 +1413,45 @@
   _OptionalFormalParameters(
       this.parameters, this.leftDelimiter, this.rightDelimiter);
 }
+
+/// Data structure placed on the stack to represent the keyword "operator"
+/// followed by a token.
+class _OperatorName {
+  final Token operatorKeyword;
+  final SimpleIdentifier name;
+
+  _OperatorName(this.operatorKeyword, this.name);
+}
+
+/// Data structure placed on the stack to represent a non-empty sequence
+/// of modifiers.
+class _Modifiers {
+  Token abstractKeyword;
+  Token externalKeyword;
+  Token finalConstOrVarKeyword;
+  Token staticKeyword;
+
+  _Modifiers(List<Token> modifierTokens) {
+    // No need to check the order and uniqueness of the modifiers, or that
+    // disallowed modifiers are not used; the parser should do that.
+    // TODO(paulberry,ahe): implement the necessary logic in the parser.
+    for (var token in modifierTokens) {
+      var s = token.value;
+      if (identical('abstract', s)) {
+        abstractKeyword = token;
+      } else if (identical('const', s)) {
+        finalConstOrVarKeyword = token;
+      } else if (identical('external', s)) {
+        externalKeyword = token;
+      } else if (identical('final', s)) {
+        finalConstOrVarKeyword = token;
+      } else if (identical('static', s)) {
+        staticKeyword = token;
+      } else if (identical('var', s)) {
+        finalConstOrVarKeyword = token;
+      } else {
+        internalError('Unhandled modifier: $s');
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/compile_platform_dartk.dart b/pkg/front_end/lib/src/fasta/analyzer/compile_platform_dartk.dart
similarity index 96%
rename from pkg/front_end/lib/src/fasta/compile_platform_dartk.dart
rename to pkg/front_end/lib/src/fasta/analyzer/compile_platform_dartk.dart
index f494e05..2e7e2ca 100644
--- a/pkg/front_end/lib/src/fasta/compile_platform_dartk.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/compile_platform_dartk.dart
@@ -25,10 +25,10 @@
 
 import 'package:kernel/ast.dart' show Program;
 
-import 'environment_variable.dart'
+import '../environment_variable.dart'
     show EnvironmentVariableDirectory, fileExists;
 
-import 'errors.dart' show inputError;
+import '../errors.dart' show inputError;
 
 const EnvironmentVariableSdk dartAotSdk = const EnvironmentVariableSdk(
     "DART_AOT_SDK",
@@ -60,7 +60,7 @@
   }
 }
 
-main(List<String> arguments) async {
+mainEntryPoint(List<String> arguments) async {
   Uri output = Uri.base.resolveUri(new Uri.file(arguments.single));
   DartOptions options = new DartOptions(
       strongMode: false, sdk: await dartAotSdk.value, packagePath: null);
diff --git a/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart b/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
index 41481c7..4d7ccc2 100644
--- a/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
+++ b/pkg/front_end/lib/src/fasta/analyzer/token_utils.dart
@@ -4,20 +4,20 @@
 
 library fasta.analyzer.token_utils;
 
-import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
+import '../parser/error_kind.dart' show ErrorKind;
 
-import 'package:front_end/src/fasta/scanner/error_token.dart' show ErrorToken;
+import '../scanner/error_token.dart' show ErrorToken;
 
-import 'package:front_end/src/fasta/scanner/keyword.dart' show Keyword;
+import '../scanner/keyword.dart' show Keyword;
 
-import 'package:front_end/src/fasta/scanner/precedence.dart';
+import '../scanner/precedence.dart';
 
-import 'package:front_end/src/fasta/scanner/token.dart'
+import '../scanner/token.dart'
     show BeginGroupToken, KeywordToken, StringToken, SymbolToken, Token;
 
-import 'package:front_end/src/fasta/scanner/token_constants.dart';
+import '../scanner/token_constants.dart';
 
-import 'package:front_end/src/scanner/token.dart' as analyzer
+import '../../scanner/token.dart' as analyzer
     show
         BeginToken,
         BeginTokenWithComment,
@@ -30,8 +30,7 @@
         Token,
         TokenWithComment;
 
-import 'package:front_end/src/scanner/errors.dart' as analyzer
-    show ScannerErrorCode;
+import '../../scanner/errors.dart' as analyzer show ScannerErrorCode;
 
 import 'package:analyzer/dart/ast/token.dart' show TokenType;
 
diff --git a/pkg/front_end/lib/src/fasta/ast_kind.dart b/pkg/front_end/lib/src/fasta/ast_kind.dart
deleted file mode 100644
index e636942..0000000
--- a/pkg/front_end/lib/src/fasta/ast_kind.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library fasta.ast_kind;
-
-enum AstKind {
-  Analyzer,
-  Kernel,
-}
diff --git a/pkg/front_end/lib/src/fasta/bin/compile.dart b/pkg/front_end/lib/src/fasta/bin/compile.dart
deleted file mode 100644
index 65b2373..0000000
--- a/pkg/front_end/lib/src/fasta/bin/compile.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:front_end/src/fasta/outline.dart' as outline;
-
-const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
-
-main(List<String> arguments) async {
-  for (int i = 0; i < iterations; i++) {
-    if (i > 0) {
-      print("\n");
-    }
-    await outline.compile(arguments);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/bin/compile_platform.dart b/pkg/front_end/lib/src/fasta/bin/compile_platform.dart
deleted file mode 100644
index 93205c4..0000000
--- a/pkg/front_end/lib/src/fasta/bin/compile_platform.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:front_end/src/fasta/compile_platform.dart' as compile_platform;
-
-const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
-
-main(List<String> arguments) async {
-  for (int i = 0; i < iterations; i++) {
-    if (i > 0) {
-      print("\n");
-    }
-    await compile_platform.main(arguments);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/bin/kompile.dart b/pkg/front_end/lib/src/fasta/bin/kompile.dart
deleted file mode 100644
index 96e09a6..0000000
--- a/pkg/front_end/lib/src/fasta/bin/kompile.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:front_end/src/fasta/outline.dart' as outline;
-
-const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
-
-main(List<String> arguments) async {
-  for (int i = 0; i < iterations; i++) {
-    if (i > 0) {
-      print("\n");
-    }
-    await outline.kompile(arguments);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/bin/outline.dart b/pkg/front_end/lib/src/fasta/bin/outline.dart
deleted file mode 100644
index faa54a7..0000000
--- a/pkg/front_end/lib/src/fasta/bin/outline.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:front_end/src/fasta/outline.dart' as outline;
-
-const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
-
-main(List<String> arguments) async {
-  for (int i = 0; i < iterations; i++) {
-    if (i > 0) {
-      print("\n");
-    }
-    await outline.outline(arguments);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/bin/run.dart b/pkg/front_end/lib/src/fasta/bin/run.dart
deleted file mode 100644
index 501a26b..0000000
--- a/pkg/front_end/lib/src/fasta/bin/run.dart
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io' show exit, exitCode;
-
-import 'package:front_end/src/fasta/ast_kind.dart' show AstKind;
-
-import 'package:front_end/src/fasta/compiler_command_line.dart'
-    show CompilerCommandLine;
-
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-
-import 'package:front_end/src/fasta/outline.dart' show doCompile;
-
-import 'package:front_end/src/fasta/errors.dart' show InputError;
-
-import 'package:front_end/src/fasta/run.dart' show run;
-
-import 'package:front_end/src/fasta/ticker.dart' show Ticker;
-
-const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
-
-main(List<String> arguments) async {
-  Uri uri;
-  for (int i = 0; i < iterations; i++) {
-    await CompilerCommandLine.withGlobalOptions("run", arguments,
-        (CompilerContext c) async {
-      if (i > 0) {
-        print("\n");
-      }
-      try {
-        uri = await doCompile(
-            c, new Ticker(isVerbose: c.options.verbose), AstKind.Kernel);
-      } on InputError catch (e) {
-        print(e.format());
-        exit(1);
-      }
-      if (exitCode != 0) exit(exitCode);
-      if (i + 1 == iterations) {
-        exit(await run(uri, c));
-      }
-    });
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
index 7a7212b..af6ee41 100644
--- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart
@@ -4,8 +4,7 @@
 
 library fasta.formal_parameter_builder;
 
-import 'package:front_end/src/fasta/parser/parser.dart'
-    show FormalParameterType;
+import '../parser/parser.dart' show FormalParameterType;
 
 import 'builder.dart'
     show LibraryBuilder, MetadataBuilder, ModifierBuilder, TypeBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
index 64f19a7..fc62cee 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -69,7 +69,7 @@
     if (formals == null) return parent;
     Map<String, Builder> local = <String, Builder>{};
     for (FormalParameterBuilder formal in formals) {
-      if (!formal.hasThis) {
+      if (!isConstructor || !formal.hasThis) {
         local[formal.name] = formal;
       }
     }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
index 2b14e59..e0cc771 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
@@ -23,7 +23,7 @@
   final String relativeFileUri;
 
   TypeDeclarationBuilder(
-      this.metadata, this.modifiers, this.name, Builder parent, int charOffset,
+      this.metadata, this.modifiers, this.name, this.parent, int charOffset,
       [Uri fileUri])
       : fileUri = fileUri ?? parent?.fileUri,
         relativeFileUri =
diff --git a/pkg/front_end/lib/src/fasta/compile_platform.dart b/pkg/front_end/lib/src/fasta/compile_platform.dart
index 6774aed..879d08d 100644
--- a/pkg/front_end/lib/src/fasta/compile_platform.dart
+++ b/pkg/front_end/lib/src/fasta/compile_platform.dart
@@ -24,23 +24,29 @@
 
 import 'translate_uri.dart' show TranslateUri;
 
-import 'ast_kind.dart' show AstKind;
+const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
 
-Future main(List<String> arguments) async {
-  Ticker ticker = new Ticker();
-  try {
-    await CompilerCommandLine.withGlobalOptions("compile_platform", arguments,
-        (CompilerContext c) => compilePlatform(c, ticker));
-  } on InputError catch (e) {
-    exitCode = 1;
-    print(e.format());
-    return null;
+Future mainEntryPoint(List<String> arguments) async {
+  for (int i = 0; i < iterations; i++) {
+    if (i > 0) {
+      print("\n");
+    }
+    Ticker ticker = new Ticker();
+    try {
+      await CompilerCommandLine.withGlobalOptions("compile_platform", arguments,
+          (CompilerContext c) => compilePlatform(c, ticker));
+    } on InputError catch (e) {
+      exitCode = 1;
+      print(e.format());
+      return null;
+    }
   }
 }
 
 Future compilePlatform(CompilerContext c, Ticker ticker) async {
   ticker.isVerbose = c.options.verbose;
   Uri output = Uri.base.resolveUri(new Uri.file(c.options.arguments[1]));
+  Uri deps = Uri.base.resolveUri(new Uri.file("${c.options.arguments[1]}.d"));
   Uri patchedSdk = Uri.base.resolveUri(new Uri.file(c.options.arguments[0]));
   ticker.logMs("Parsed arguments");
   if (ticker.isVerbose) {
@@ -60,7 +66,6 @@
   await kernelTarget.writeOutline(output);
 
   if (exitCode != 0) return null;
-  await kernelTarget.writeProgram(output, AstKind.Kernel);
   if (c.options.dumpIr) {
     kernelTarget.dumpIr();
   }
@@ -76,4 +81,7 @@
       }
     }
   }
+  if (exitCode != 0) return null;
+  await kernelTarget.writeProgram(output);
+  await kernelTarget.writeDepsFile(output, deps);
 }
diff --git a/pkg/front_end/lib/src/fasta/compiler_command_line.dart b/pkg/front_end/lib/src/fasta/compiler_command_line.dart
index fedd733..5874bc3 100644
--- a/pkg/front_end/lib/src/fasta/compiler_command_line.dart
+++ b/pkg/front_end/lib/src/fasta/compiler_command_line.dart
@@ -139,7 +139,7 @@
 const String allOptions = """
 Supported options:
 
-  -o <file>, --out=<file>
+  -o <file>, --output=<file>
     Generate the output into <file>.
 
   -h, /h, /?, --help
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index 4f1fd41..281bfff 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -37,7 +37,7 @@
     builder.library.fields.forEach(builder.addMember);
   }
 
-  Future<Null> buildBody(DillLibraryBuilder builder, _) {
+  Future<Null> buildBody(DillLibraryBuilder builder) {
     return buildOutline(builder);
   }
 
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_target.dart b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
index 7114d5a..5bc79ab 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_target.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_target.dart
@@ -18,8 +18,6 @@
 
 import '../translate_uri.dart' show TranslateUri;
 
-import '../ast_kind.dart' show AstKind;
-
 import '../kernel/kernel_builder.dart' show ClassBuilder, KernelClassBuilder;
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
@@ -45,7 +43,7 @@
     }
   }
 
-  Future<Null> writeProgram(Uri uri, AstKind kind) {
+  Future<Null> writeProgram(Uri uri) {
     return internalError("not implemented.");
   }
 
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 b1d82d8..e906a19 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -4,13 +4,11 @@
 
 library fasta.body_builder;
 
-import 'package:front_end/src/fasta/parser/parser.dart'
-    show FormalParameterType, optional;
+import '../parser/parser.dart' show FormalParameterType, optional;
 
-import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
+import '../parser/error_kind.dart' show ErrorKind;
 
-import 'package:front_end/src/fasta/parser/identifier_context.dart'
-    show IdentifierContext;
+import '../parser/identifier_context.dart' show IdentifierContext;
 
 import 'package:kernel/ast.dart';
 
@@ -24,7 +22,7 @@
 
 import '../parser/dart_vm_native.dart' show skipNativeClause;
 
-import 'package:front_end/src/fasta/scanner/token.dart'
+import '../scanner/token.dart'
     show BeginGroupToken, Token, isBinaryOperator, isMinusOperator;
 
 import '../errors.dart' show internalError, printUnexpected;
@@ -295,7 +293,8 @@
   }
 
   @override
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantKeyword, Token beginToken, Token endToken) {
     debugEvent("Fields");
     doFields(count);
     pop(); // Metadata.
@@ -841,6 +840,12 @@
   }
 
   @override
+  void endExpressionFunctionBody(Token arrowToken, Token endToken) {
+    debugEvent("ExpressionFunctionBody");
+    endReturnStatement(true, arrowToken, endToken);
+  }
+
+  @override
   void endReturnStatement(
       bool hasExpression, Token beginToken, Token endToken) {
     debugEvent("ReturnStatement");
@@ -1316,7 +1321,7 @@
     FormalParameterType kind = optional("{", beginToken)
         ? FormalParameterType.NAMED
         : FormalParameterType.POSITIONAL;
-    push(new OptionalFormals(kind, popList(count)));
+    push(new OptionalFormals(kind, popList(count) ?? []));
   }
 
   @override
@@ -1647,6 +1652,11 @@
     List<DartType> typeArguments = pop();
     var type = pop();
 
+    if (arguments == null) {
+      push(buildCompileTimeError("No arguments.", token.charOffset));
+      return;
+    }
+
     if (typeArguments != null) {
       assert(arguments.types.isEmpty);
       arguments.types.addAll(typeArguments);
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
index 22be183..fae44fc 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
@@ -201,6 +201,7 @@
 
   void addFactoryMethod(
       List<MetadataBuilder> metadata,
+      int modifiers,
       ConstructorReferenceBuilder constructorName,
       List<FormalParameterBuilder> formals,
       AsyncMarker asyncModifier,
@@ -216,7 +217,7 @@
     assert(constructorName.suffix == null);
     KernelProcedureBuilder procedure = new KernelProcedureBuilder(
         metadata,
-        staticMask,
+        staticMask | modifiers,
         null,
         name,
         <TypeVariableBuilder>[],
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 1a1be1b..2ed1a8c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -41,6 +41,10 @@
 
 import 'package:kernel/text/ast_to_text.dart' show Printer;
 
+import 'package:kernel/transformations/erasure.dart' show Erasure;
+
+import 'package:kernel/transformations/continuation.dart' as transformAsync;
+
 import 'package:kernel/transformations/mixin_full_resolution.dart'
     show MixinFullResolution;
 
@@ -57,8 +61,6 @@
 
 import '../dill/dill_target.dart' show DillTarget;
 
-import '../ast_kind.dart' show AstKind;
-
 import '../errors.dart'
     show InputError, internalError, reportCrash, resetCrashReporting;
 
@@ -99,9 +101,11 @@
         uriToSource = uriToSource ?? CompilerContext.current.uriToSource,
         super(dillTarget.ticker, uriTranslator) {
     resetCrashReporting();
-    loader = new SourceLoader<Library>(this);
+    loader = createLoader();
   }
 
+  SourceLoader<Library> createLoader() => new SourceLoader<Library>(this);
+
   void addLineStarts(Uri uri, List<int> lineStarts) {
     String fileUri = relativizeUri(uri);
     uriToSource[fileUri] = new Source(lineStarts, fileUri);
@@ -205,24 +209,21 @@
         : writeLinkedProgram(uri, program, isFullProgram: isFullProgram);
   }
 
-  Future<Program> writeProgram(Uri uri, AstKind astKind) async {
+  Future<Program> writeProgram(Uri uri) async {
     if (loader.first == null) return null;
     if (errors.isNotEmpty) {
       return handleInputError(uri, null, isFullProgram: true);
     }
     try {
-      if (astKind == AstKind.Analyzer) {
-        loader.buildElementStore();
-      } else {
-        loader.computeHierarchy(program);
-      }
-      await loader.buildBodies(astKind);
+      loader.computeHierarchy(program);
+      await loader.buildBodies();
       loader.finishStaticInvocations();
       finishAllConstructors();
       loader.finishNativeMethods();
       transformMixinApplications();
       // TODO(ahe): Don't call this from two different places.
       setup_builtin_library.transformProgram(program);
+      otherTransformations();
       errors.addAll(loader.collectCompileTimeErrors().map((e) => e.format()));
       if (errors.isNotEmpty) {
         return handleInputError(uri, null, isFullProgram: true);
@@ -260,6 +261,20 @@
     }
   }
 
+  Future writeDepsFile(Uri output, Uri depsFile) async {
+    if (loader.first == null) return null;
+    StringBuffer sb = new StringBuffer();
+    Uri base = depsFile.resolve(".");
+    sb.write(Uri.parse(relativizeUri(output, base: base)).toFilePath());
+    sb.write(":");
+    for (Uri dependency in loader.getDependencies()) {
+      sb.write(" ");
+      sb.write(Uri.parse(relativizeUri(dependency, base: base)).toFilePath());
+    }
+    sb.writeln();
+    await new File.fromUri(depsFile).writeAsString("$sb");
+  }
+
   Program erroneousProgram(bool isFullProgram) {
     Uri uri = loader.first?.uri ?? Uri.parse("error:error");
     Uri fileUri = loader.first?.fileUri ?? uri;
@@ -293,12 +308,8 @@
   /// Creates a program by combining [libraries] with the libraries of
   /// `dillTarget.loader.program`.
   Program link(List<Library> libraries) {
-    Map<String, Source> uriToSource = <String, Source>{};
-
-    // for (Library library in libraries) {
-    //   // TODO(ahe): Compute line starts instead.
-    //   uriToLineStarts[library.fileUri] = <int>[0];
-    // }
+    Map<String, Source> uriToSource =
+        new Map<String, Source>.from(this.uriToSource);
 
     final Program binary = dillTarget.loader.program;
     if (binary != null) {
@@ -553,6 +564,15 @@
     ticker.logMs("Transformed mixin applications");
   }
 
+  void otherTransformations() {
+    // TODO(ahe): Don't generate type variables in the first place.
+    program.accept(new Erasure());
+    ticker.logMs("Erased type variables in generic methods");
+    // TODO(kmillikin): Make this run on a per-method basis.
+    transformAsync.transformProgram(program);
+    ticker.logMs("Transformed async methods");
+  }
+
   void dumpIr() {
     StringBuffer sb = new StringBuffer();
     for (Library library in loader.libraries) {
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index a38a15d..b1bab55 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -4,22 +4,54 @@
 
 library fasta.verifier;
 
-import 'package:kernel/ast.dart' show ExpressionStatement, Program;
+import 'package:kernel/ast.dart'
+    show
+        InvalidExpression,
+        InvalidStatement,
+        InvalidInitializer,
+        Class,
+        ExpressionStatement,
+        Field,
+        Library,
+        Procedure,
+        Program,
+        TreeNode;
 
-import 'package:kernel/verifier.dart' show VerifyingVisitor;
+import 'package:kernel/verifier.dart' show VerificationError, VerifyingVisitor;
+
+import '../errors.dart' show printUnexpected;
 
 import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
 
 void verifyProgram(Program program, {bool isOutline: false}) {
-  program.accept(new FastaVerifyingVisitor(isOutline));
+  FastaVerifyingVisitor verifier = new FastaVerifyingVisitor(isOutline);
+  program.accept(verifier);
+  if (verifier.errors.isNotEmpty) {
+    throw verifier.errors.first;
+  }
 }
 
 class FastaVerifyingVisitor extends VerifyingVisitor {
+  final List<VerificationError> errors = <VerificationError>[];
+
+  String fileUri;
+
   FastaVerifyingVisitor(bool isOutline) {
     this.isOutline = isOutline;
   }
 
   @override
+  problem(TreeNode node, String details) {
+    // TODO(karlklose): Remove this when underlying problem is fixed.
+    if (details.startsWith("Type parameter 'dart.collection::MapView::")) {
+      return;
+    }
+    VerificationError error = new VerificationError(context, node, details);
+    printUnexpected(Uri.parse(fileUri), node.fileOffset, "$error");
+    errors.add(error);
+  }
+
+  @override
   visitExpressionStatement(ExpressionStatement node) {
     // Bypass verification of the [StaticGet] in [RedirectingFactoryBody] as
     // this is a static get without a getter.
@@ -27,4 +59,43 @@
       super.visitExpressionStatement(node);
     }
   }
+
+  @override
+  visitLibrary(Library node) {
+    fileUri = node.fileUri;
+    super.visitLibrary(node);
+  }
+
+  @override
+  visitClass(Class node) {
+    fileUri = node.fileUri;
+    super.visitClass(node);
+  }
+
+  @override
+  visitField(Field node) {
+    fileUri = node.fileUri;
+    super.visitField(node);
+  }
+
+  @override
+  visitProcedure(Procedure node) {
+    fileUri = node.fileUri;
+    super.visitProcedure(node);
+  }
+
+  @override
+  visitInvalidExpression(InvalidExpression node) {
+    problem(node, "Invalid expression.");
+  }
+
+  @override
+  visitInvalidStatement(InvalidStatement node) {
+    problem(node, "Invalid statement.");
+  }
+
+  @override
+  visitInvalidInitializer(InvalidInitializer node) {
+    problem(node, "Invalid initializer.");
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 14a8b0c..0af3e1f 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -8,8 +8,6 @@
 
 import 'dart:collection' show Queue;
 
-import 'ast_kind.dart' show AstKind;
-
 import 'builder/builder.dart' show Builder, LibraryBuilder;
 
 import 'errors.dart' show InputError, firstSourceUri;
@@ -81,11 +79,11 @@
     }
   }
 
-  Future<Null> buildBodies(AstKind astKind) async {
+  Future<Null> buildBodies() async {
     assert(coreLibrary != null);
     for (LibraryBuilder library in builders.values) {
       currentUriForCrashReporting = library.uri;
-      await buildBody(library, astKind);
+      await buildBody(library);
     }
     currentUriForCrashReporting = null;
     ticker.log((Duration elapsed, Duration sinceStart) {
@@ -126,10 +124,7 @@
   Future<Null> buildOutline(covariant LibraryBuilder library);
 
   /// Builds all the method bodies found in the given [library].
-  ///
-  /// [astKind] determines whether or not analyzer ASTs are used as an
-  /// intermediate data structure.
-  Future<Null> buildBody(covariant LibraryBuilder library, AstKind astKind);
+  Future<Null> buildBody(covariant LibraryBuilder library);
 
   List<InputError> collectCompileTimeErrors() {
     List<InputError> errors = <InputError>[];
diff --git a/pkg/front_end/lib/src/fasta/outline.dart b/pkg/front_end/lib/src/fasta/outline.dart
index 128afb7..0604a26 100644
--- a/pkg/front_end/lib/src/fasta/outline.dart
+++ b/pkg/front_end/lib/src/fasta/outline.dart
@@ -24,7 +24,25 @@
 
 import 'translate_uri.dart' show TranslateUri;
 
-import 'ast_kind.dart' show AstKind;
+const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
+
+compileEntryPoint(List<String> arguments) async {
+  for (int i = 0; i < iterations; i++) {
+    if (i > 0) {
+      print("\n");
+    }
+    await compile(arguments);
+  }
+}
+
+outlineEntryPoint(List<String> arguments) async {
+  for (int i = 0; i < iterations; i++) {
+    if (i > 0) {
+      print("\n");
+    }
+    await outline(arguments);
+  }
+}
 
 Future<KernelTarget> outline(List<String> arguments) async {
   try {
@@ -33,8 +51,9 @@
       if (c.options.verbose) {
         print("Building outlines for ${arguments.join(' ')}");
       }
-      return await doOutline(
-          c, new Ticker(isVerbose: c.options.verbose), c.options.output);
+      CompileTask task =
+          new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
+      return await task.buildOutline(c.options.output);
     });
   } on InputError catch (e) {
     exitCode = 1;
@@ -50,8 +69,9 @@
       if (c.options.verbose) {
         print("Compiling directly to Kernel: ${arguments.join(' ')}");
       }
-      return await doCompile(
-          c, new Ticker(isVerbose: c.options.verbose), AstKind.Kernel);
+      CompileTask task =
+          new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
+      return await task.compile();
     });
   } on InputError catch (e) {
     exitCode = 1;
@@ -60,69 +80,62 @@
   }
 }
 
-Future<Uri> kompile(List<String> arguments) async {
-  try {
-    return await CompilerCommandLine.withGlobalOptions("kompile", arguments,
-        (CompilerContext c) async {
-      if (c.options.verbose) {
-        print("Compiling via analyzer: ${arguments.join(' ')}");
-      }
-      return await doCompile(
-          c, new Ticker(isVerbose: c.options.verbose), AstKind.Analyzer);
-    });
-  } on InputError catch (e) {
-    exitCode = 1;
-    print(e.format());
-    return null;
-  }
-}
+class CompileTask {
+  final CompilerContext c;
+  final Ticker ticker;
 
-Future<KernelTarget> doOutline(CompilerContext c, Ticker ticker,
-    [Uri output]) async {
-  TranslateUri uriTranslator = await TranslateUri.parse(c.options.sdk);
-  ticker.logMs("Read packages file");
-  DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
-  KernelTarget kernelTarget =
-      new KernelTarget(dillTarget, uriTranslator, c.uriToSource);
-  Uri platform = c.options.platform;
-  if (platform != null) {
-    dillTarget.read(platform);
-  }
-  String argument = c.options.arguments.first;
-  Uri uri = Uri.base.resolve(argument);
-  String path = uriTranslator.translate(uri)?.path ?? argument;
-  if (path.endsWith(".dart")) {
-    kernelTarget.read(uri);
-  } else {
-    inputError(uri, -1, "Unexpected input: $uri");
-  }
-  await dillTarget.writeOutline(null);
-  await kernelTarget.writeOutline(output);
-  if (c.options.dumpIr && output != null) {
-    kernelTarget.dumpIr();
-  }
-  return kernelTarget;
-}
+  CompileTask(this.c, this.ticker);
 
-Future<Uri> doCompile(CompilerContext c, Ticker ticker, AstKind kind) async {
-  KernelTarget kernelTarget = await doOutline(c, ticker);
-  if (exitCode != 0) return null;
-  Uri uri = c.options.output;
-  await kernelTarget.writeProgram(uri, kind);
-  if (c.options.dumpIr) {
-    kernelTarget.dumpIr();
+  KernelTarget createKernelTarget(
+      DillTarget dillTarget, TranslateUri uriTranslator) {
+    return new KernelTarget(dillTarget, uriTranslator, c.uriToSource);
   }
-  if (c.options.verify) {
-    try {
-      verifyProgram(kernelTarget.program);
-      ticker.logMs("Verified program");
-    } catch (e, s) {
-      exitCode = 1;
-      print("Verification of program failed: $e");
-      if (s != null && c.options.verbose) {
-        print(s);
+
+  Future<KernelTarget> buildOutline([Uri output]) async {
+    TranslateUri uriTranslator = await TranslateUri.parse(c.options.sdk);
+    ticker.logMs("Read packages file");
+    DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
+    KernelTarget kernelTarget = createKernelTarget(dillTarget, uriTranslator);
+    Uri platform = c.options.platform;
+    if (platform != null) {
+      dillTarget.read(platform);
+    }
+    String argument = c.options.arguments.first;
+    Uri uri = Uri.base.resolve(argument);
+    String path = uriTranslator.translate(uri)?.path ?? argument;
+    if (path.endsWith(".dart")) {
+      kernelTarget.read(uri);
+    } else {
+      inputError(uri, -1, "Unexpected input: $uri");
+    }
+    await dillTarget.writeOutline(null);
+    await kernelTarget.writeOutline(output);
+    if (c.options.dumpIr && output != null) {
+      kernelTarget.dumpIr();
+    }
+    return kernelTarget;
+  }
+
+  Future<Uri> compile() async {
+    KernelTarget kernelTarget = await buildOutline();
+    if (exitCode != 0) return null;
+    Uri uri = c.options.output;
+    await kernelTarget.writeProgram(uri);
+    if (c.options.dumpIr) {
+      kernelTarget.dumpIr();
+    }
+    if (c.options.verify) {
+      try {
+        verifyProgram(kernelTarget.program);
+        ticker.logMs("Verified program");
+      } catch (e, s) {
+        exitCode = 1;
+        print("Verification of program failed: $e");
+        if (s != null && c.options.verbose) {
+          print(s);
+        }
       }
     }
+    return uri;
   }
-  return uri;
 }
diff --git a/pkg/front_end/lib/src/fasta/parser.dart b/pkg/front_end/lib/src/fasta/parser.dart
index e99cfcf2..0a352e4 100644
--- a/pkg/front_end/lib/src/fasta/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser.dart
@@ -4,7 +4,7 @@
 
 library fasta.parser;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import 'scanner/token.dart' show Token;
 
 import 'parser/listener.dart' show Listener;
 
diff --git a/pkg/front_end/lib/src/fasta/parser/bin/parser.dart b/pkg/front_end/lib/src/fasta/parser/bin/parser.dart
deleted file mode 100644
index a20586a..0000000
--- a/pkg/front_end/lib/src/fasta/parser/bin/parser.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
-// for 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:front_end/src/fasta/parser/main.dart' as dart_parser;
-
-main(List<String> arguments) => dart_parser.main(arguments);
diff --git a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
index 679cb47..7901df0 100644
--- a/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/class_member_parser.dart
@@ -4,7 +4,7 @@
 
 library fasta.parser.class_member_parser;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import '../scanner/token.dart' show Token;
 
 import 'listener.dart' show Listener;
 
@@ -18,6 +18,13 @@
 
   Token parseExpression(Token token) => skipExpression(token);
 
+  Token parseRecoverExpression(Token token) {
+    Token begin = token;
+    token = skipExpression(token);
+    listener.handleRecoverExpression(begin);
+    return token;
+  }
+
   // This method is overridden for two reasons:
   // 1. Avoid generating events for arguments.
   // 2. Avoid calling skip expression for each argument (which doesn't work).
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index d489a1b..3c6c236 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -152,6 +152,12 @@
 
   void beginExpressionStatement(Token token) {}
 
+  /// Called by [ClassMemberParser] after skipping an expression as error
+  /// recovery.
+  void handleRecoverExpression(Token token) {
+    logEvent("RecoverExpression");
+  }
+
   void endExpressionStatement(Token token) {
     logEvent("ExpressionStatement");
   }
@@ -179,8 +185,15 @@
     logEvent("FormalParameters");
   }
 
+  /// Handle the end of a field declaration.  Substructures:
+  /// - Metadata
+  /// - Modifiers
+  /// - Type
+  /// - Variable declarations (count times)
+  ///
   /// Doesn't have a corresponding begin event, use [beginMember] instead.
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantKeyword, Token beginToken, Token endToken) {
     logEvent("Fields");
   }
 
@@ -544,6 +557,10 @@
 
   void beginReturnStatement(Token token) {}
 
+  void endExpressionFunctionBody(Token arrowToken, Token endToken) {
+    logEvent("ExpressionFunctionBody");
+  }
+
   void endReturnStatement(
       bool hasExpression, Token beginToken, Token endToken) {
     logEvent("ReturnStatement");
@@ -842,6 +859,10 @@
     logEvent("NoExpression");
   }
 
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    logEvent("NoConstructorReferenceContinuationAfterTypeArguments");
+  }
+
   void handleNoType(Token token) {
     logEvent("NoType");
   }
@@ -854,6 +875,7 @@
     logEvent("Operator");
   }
 
+  /// Handle the end of a construct of the form "operator <token>".
   void handleOperatorName(Token operatorKeyword, Token token) {
     logEvent("OperatorName");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index c517e22..ce6741a 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -8,9 +8,9 @@
 
 import '../scanner/recover.dart' show closeBraceFor, skipToEof;
 
-import 'package:front_end/src/fasta/scanner/keyword.dart' show Keyword;
+import '../scanner/keyword.dart' show Keyword;
 
-import 'package:front_end/src/fasta/scanner/precedence.dart'
+import '../scanner/precedence.dart'
     show
         ASSIGNMENT_PRECEDENCE,
         AS_INFO,
@@ -29,7 +29,7 @@
         QUESTION_PERIOD_INFO,
         RELATIONAL_PRECEDENCE;
 
-import 'package:front_end/src/fasta/scanner/token.dart'
+import '../scanner/token.dart'
     show
         BeginGroupToken,
         KeywordToken,
@@ -37,7 +37,7 @@
         Token,
         isUserDefinableOperator;
 
-import 'package:front_end/src/fasta/scanner/token_constants.dart'
+import '../scanner/token_constants.dart'
     show
         COMMA_TOKEN,
         DOUBLE_TOKEN,
@@ -61,10 +61,9 @@
         STRING_INTERPOLATION_TOKEN,
         STRING_TOKEN;
 
-import 'package:front_end/src/fasta/scanner/characters.dart'
-    show $CLOSE_CURLY_BRACKET;
+import '../scanner/characters.dart' show $CLOSE_CURLY_BRACKET;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import '../util/link.dart' show Link;
 
 import 'listener.dart' show Listener;
 
@@ -344,8 +343,13 @@
     assert(optional('part', token));
     assert(optional('of', token.next));
     Token partKeyword = token;
-    token = parseQualified(token.next.next, IdentifierContext.partName,
-        IdentifierContext.partNameContinuation);
+    token = token.next.next;
+    if (token.isIdentifier()) {
+      token = parseQualified(token, IdentifierContext.partName,
+          IdentifierContext.partNameContinuation);
+    } else {
+      token = parseLiteralStringOrRecoverExpression(token);
+    }
     Token semicolon = token;
     token = expect(';', token);
     listener.endPartOf(partKeyword, semicolon);
@@ -1165,8 +1169,15 @@
       Token getOrSet, Token name, bool isTopLevel) {
     bool hasType = type != null;
 
+    Token covariantKeyword;
     if (getOrSet == null && !isTopLevel) {
-      modifiers = removeOptCovariantTokenIfNotStatic(modifiers);
+      // TODO(ahe): replace the method removeOptCovariantTokenIfNotStatic with
+      // a better mechanism.
+      Link<Token> newModifiers = removeOptCovariantTokenIfNotStatic(modifiers);
+      if (!identical(newModifiers, modifiers)) {
+        covariantKeyword = modifiers.first;
+        modifiers = newModifiers;
+      }
     }
 
     Token varFinalOrConst =
@@ -1219,7 +1230,7 @@
     if (isTopLevel) {
       listener.endTopLevelFields(fieldCount, start, semicolon);
     } else {
-      listener.endFields(fieldCount, start, semicolon);
+      listener.endFields(fieldCount, covariantKeyword, start, semicolon);
     }
     return token;
   }
@@ -1443,7 +1454,7 @@
       return parseLiteralString(token);
     } else {
       reportRecoverableError(token, ErrorKind.ExpectedString);
-      return parseExpression(token);
+      return parseRecoverExpression(token);
     }
   }
 
@@ -1716,7 +1727,7 @@
         token = reportUnrecoverableError(token, ErrorKind.UnexpectedToken);
         if (identical(token.kind, EOF_TOKEN)) {
           // TODO(ahe): This is a hack, see parseTopLevelMember.
-          listener.endFields(1, start, token);
+          listener.endFields(1, null, start, token);
           listener.endMember();
           return token;
         }
@@ -1816,24 +1827,26 @@
   Token parseFactoryMethod(Token token) {
     assert(isFactoryDeclaration(token));
     Token start = token;
-    Token externalModifier;
-    if (identical(token.stringValue, 'external')) {
-      externalModifier = token;
-      token = token.next;
+    bool isExternal = false;
+    int modifierCount = 0;
+    while (isModifier(token)) {
+      if (optional('external', token)) {
+        isExternal = true;
+      }
+      token = parseModifier(token);
+      modifierCount++;
     }
-    if (optional('const', token)) {
-      token = token.next; // Skip const.
-    }
+    listener.handleModifiers(modifierCount);
     Token factoryKeyword = token;
     listener.beginFactoryMethod(factoryKeyword);
-    token = token.next; // Skip 'factory'.
+    token = expect('factory', token);
     token = parseConstructorReference(token);
     token = parseFormalParameters(token);
     token = parseAsyncModifier(token);
     if (optional('=', token)) {
       token = parseRedirectingFactoryBody(token);
     } else {
-      token = parseFunctionBody(token, false, externalModifier != null);
+      token = parseFunctionBody(token, false, isExternal);
     }
     listener.endFactoryMethod(start, token);
     return token.next;
@@ -1952,6 +1965,9 @@
       period = token;
       token = parseIdentifier(token.next,
           IdentifierContext.constructorReferenceContinuationAfterTypeArguments);
+    } else {
+      listener
+          .handleNoConstructorReferenceContinuationAfterTypeArguments(token);
     }
     listener.endConstructorReference(start, period, token);
     return token;
@@ -2005,9 +2021,9 @@
       token = parseExpression(token.next);
       if (!isExpression) {
         expectSemicolon(token);
-        listener.endReturnStatement(true, begin, token);
+        listener.endExpressionFunctionBody(begin, token);
       } else {
-        listener.endReturnStatement(true, begin, null);
+        listener.endExpressionFunctionBody(begin, null);
       }
       return token;
     } else if (optional('=', token)) {
@@ -2017,9 +2033,9 @@
       token = parseExpression(token.next);
       if (!isExpression) {
         expectSemicolon(token);
-        listener.endReturnStatement(true, begin, token);
+        listener.endExpressionFunctionBody(begin, token);
       } else {
-        listener.endReturnStatement(true, begin, null);
+        listener.endExpressionFunctionBody(begin, null);
       }
       return token;
     }
@@ -2407,6 +2423,8 @@
     return token;
   }
 
+  Token parseRecoverExpression(Token token) => parseExpression(token);
+
   int expressionDepth = 0;
   Token parseExpression(Token token) {
     if (expressionDepth++ > 500) {
diff --git a/pkg/front_end/lib/src/fasta/parser/main.dart b/pkg/front_end/lib/src/fasta/parser/parser_main.dart
similarity index 83%
rename from pkg/front_end/lib/src/fasta/parser/main.dart
rename to pkg/front_end/lib/src/fasta/parser/parser_main.dart
index 7e88b19..215bddf 100644
--- a/pkg/front_end/lib/src/fasta/parser/main.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser_main.dart
@@ -8,11 +8,11 @@
 
 import 'dart:io' show File;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import '../scanner/token.dart' show Token;
 
-import 'package:front_end/src/fasta/scanner/io.dart' show readBytesFromFileSync;
+import '../scanner/io.dart' show readBytesFromFileSync;
 
-import 'package:front_end/src/fasta/scanner.dart' show scan;
+import '../scanner.dart' show scan;
 
 import 'listener.dart' show Listener;
 
@@ -30,7 +30,7 @@
   }
 }
 
-main(List<String> arguments) async {
+mainEntryPoint(List<String> arguments) async {
   for (String argument in arguments) {
     if (argument.startsWith("@")) {
       Uri uri = Uri.base.resolve(argument.substring(1));
diff --git a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
index 7ba6383..3e1166f 100644
--- a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
@@ -4,7 +4,7 @@
 
 library fasta.parser.top_level_parser;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import '../scanner/token.dart' show Token;
 
 import 'listener.dart' show Listener;
 
diff --git a/pkg/front_end/lib/src/fasta/quote.dart b/pkg/front_end/lib/src/fasta/quote.dart
index abdf660..8d95253 100644
--- a/pkg/front_end/lib/src/fasta/quote.dart
+++ b/pkg/front_end/lib/src/fasta/quote.dart
@@ -6,7 +6,7 @@
 
 import 'errors.dart' show inputError, internalError;
 
-import 'package:front_end/src/fasta/scanner/characters.dart'
+import 'scanner/characters.dart'
     show
         $BACKSLASH,
         $BS,
diff --git a/pkg/front_end/lib/src/fasta/run.dart b/pkg/front_end/lib/src/fasta/run.dart
index d7f812f..12041a2 100644
--- a/pkg/front_end/lib/src/fasta/run.dart
+++ b/pkg/front_end/lib/src/fasta/run.dart
@@ -6,7 +6,7 @@
 
 import 'dart:async' show Future;
 
-import 'dart:io' show stdout;
+import 'dart:io' show stdout, exit, exitCode;
 
 import 'package:testing/testing.dart' show StdioProcess;
 
@@ -14,6 +14,40 @@
 
 import 'compiler_context.dart' show CompilerContext;
 
+import 'compiler_command_line.dart' show CompilerCommandLine;
+
+import 'outline.dart' show CompileTask;
+
+import 'errors.dart' show InputError;
+
+import 'ticker.dart' show Ticker;
+
+const int iterations = const int.fromEnvironment("iterations", defaultValue: 1);
+
+mainEntryPoint(List<String> arguments) async {
+  Uri uri;
+  for (int i = 0; i < iterations; i++) {
+    await CompilerCommandLine.withGlobalOptions("run", arguments,
+        (CompilerContext c) async {
+      if (i > 0) {
+        print("\n");
+      }
+      try {
+        CompileTask task =
+            new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
+        uri = await task.compile();
+      } on InputError catch (e) {
+        print(e.format());
+        exit(1);
+      }
+      if (exitCode != 0) exit(exitCode);
+      if (i + 1 == iterations) {
+        exit(await run(uri, c));
+      }
+    });
+  }
+}
+
 Future<int> run(Uri uri, CompilerContext c) async {
   Uri sdk = await computePatchedSdk();
   Uri dartVm = computeDartVm(sdk);
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 538c4c5..bf033f0 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
@@ -19,7 +19,7 @@
 
 import 'abstract_scanner.dart' show AbstractScanner;
 
-import 'package:front_end/src/fasta/util/link.dart' show Link;
+import '../util/link.dart' show Link;
 
 abstract class ArrayBasedScanner extends AbstractScanner {
   bool hasErrors = false;
diff --git a/pkg/front_end/lib/src/fasta/scanner/bin/scanner.dart b/pkg/front_end/lib/src/fasta/scanner/bin/scanner.dart
deleted file mode 100644
index 4d46811..0000000
--- a/pkg/front_end/lib/src/fasta/scanner/bin/scanner.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE.md file.
-
-import 'package:front_end/src/fasta/scanner/main.dart' as dart_scanner;
-
-main(List<String> arguments) => dart_scanner.main(arguments);
diff --git a/pkg/front_end/lib/src/fasta/scanner/keyword.dart b/pkg/front_end/lib/src/fasta/scanner/keyword.dart
index 701fa39..0e73786 100644
--- a/pkg/front_end/lib/src/fasta/scanner/keyword.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/keyword.dart
@@ -187,7 +187,7 @@
   final List<KeywordState> table;
   final Keyword keyword;
 
-  ArrayKeywordState(List<KeywordState> this.table, String syntax)
+  ArrayKeywordState(this.table, String syntax)
       : keyword = ((syntax == null) ? null : Keyword.keywords[syntax]);
 
   KeywordState next(int c);
diff --git a/pkg/front_end/lib/src/fasta/scanner/recover.dart b/pkg/front_end/lib/src/fasta/scanner/recover.dart
index 5faa291..46639b1 100644
--- a/pkg/front_end/lib/src/fasta/scanner/recover.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/recover.dart
@@ -18,7 +18,7 @@
 /// code.
 Token defaultRecoveryStrategy(
     List<int> bytes, Token tokens, List<int> lineStarts) {
-  // See [Parser.reportErrorToken](package:front_end/src/fasta/parser/src/parser.dart) for how
+  // See [Parser.reportErrorToken](../parser/src/parser.dart) for how
   // it currently handles lexical errors. In addition, notice how the parser
   // calls [handleInvalidExpression], [handleInvalidFunctionBody], and
   // [handleInvalidTypeReference] to allow the listener to recover its internal
diff --git a/pkg/front_end/lib/src/fasta/scanner/main.dart b/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
similarity index 95%
rename from pkg/front_end/lib/src/fasta/scanner/main.dart
rename to pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
index ccd6acb..f56aa98 100644
--- a/pkg/front_end/lib/src/fasta/scanner/main.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/scanner_main.dart
@@ -20,7 +20,7 @@
   print("Bytes/ms: ${byteCount/sw.elapsedMilliseconds}");
 }
 
-main(List<String> arguments) {
+mainEntryPoint(List<String> arguments) {
   Map<Uri, List<int>> files = <Uri, List<int>>{};
   Stopwatch sw = new Stopwatch()..start();
   for (String name in arguments) {
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 780d617..89cbf4a 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -29,12 +29,8 @@
 
 import '../builder/builder.dart';
 
-import '../analyzer/analyzer.dart';
-
 import '../builder/scope.dart' show Scope;
 
-import '../ast_kind.dart' show AstKind;
-
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
 import '../kernel/kernel_library_builder.dart' show isConstructorName;
@@ -42,14 +38,10 @@
 class DietListener extends StackListener {
   final SourceLibraryBuilder library;
 
-  final ElementStore elementStore;
-
   final ClassHierarchy hierarchy;
 
   final CoreTypes coreTypes;
 
-  final AstKind astKind;
-
   final bool isDartLibrary;
 
   ClassBuilder currentClass;
@@ -61,8 +53,7 @@
   @override
   Uri uri;
 
-  DietListener(SourceLibraryBuilder library, this.elementStore, this.hierarchy,
-      this.coreTypes, this.astKind)
+  DietListener(SourceLibraryBuilder library, this.hierarchy, this.coreTypes)
       : library = library,
         uri = library.fileUri,
         memberScope = library.scope,
@@ -108,6 +99,11 @@
   }
 
   @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
+  }
+
+  @override
   void handleNoType(Token token) {
     debugEvent("NoType");
   }
@@ -178,11 +174,12 @@
   }
 
   @override
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantToken, Token beginToken, Token endToken) {
     debugEvent("Fields");
     List<String> names = popList(count);
     Builder builder = lookupBuilder(beginToken, null, names.first);
-    buildFields(beginToken, false, builder.isInstanceMember);
+    buildFields(beginToken, false, builder);
   }
 
   @override
@@ -207,8 +204,9 @@
   @override
   void endTopLevelFields(int count, Token beginToken, Token endToken) {
     debugEvent("TopLevelFields");
-    discard(count);
-    buildFields(beginToken, true, false);
+    List<String> names = popList(count);
+    Builder builder = lookupBuilder(beginToken, null, names.first);
+    buildFields(beginToken, true, builder);
   }
 
   @override
@@ -373,24 +371,8 @@
   StackListener createListener(
       MemberBuilder builder, Scope memberScope, bool isInstanceMember,
       [Scope formalParameterScope]) {
-    switch (astKind) {
-      case AstKind.Kernel:
-        return new BodyBuilder(
-            library,
-            builder,
-            memberScope,
-            formalParameterScope,
-            hierarchy,
-            coreTypes,
-            currentClass,
-            isInstanceMember,
-            uri);
-
-      case AstKind.Analyzer:
-        return new AstBuilder(library, builder, elementStore, memberScope, uri);
-    }
-
-    return internalError("Unknown $astKind");
+    return new BodyBuilder(library, builder, memberScope, formalParameterScope,
+        hierarchy, coreTypes, currentClass, isInstanceMember, uri);
   }
 
   void buildFunctionBody(Token token, ProcedureBuilder builder) {
@@ -405,9 +387,9 @@
         token);
   }
 
-  void buildFields(Token token, bool isTopLevel, bool isInstanceMember) {
-    parseFields(
-        createListener(null, memberScope, isInstanceMember), token, isTopLevel);
+  void buildFields(Token token, bool isTopLevel, MemberBuilder builder) {
+    parseFields(createListener(builder, memberScope, builder.isInstanceMember),
+        token, isTopLevel);
   }
 
   @override
@@ -480,6 +462,8 @@
     return removeNativeClause(identifiers);
   }
 
+  AsyncMarker getAsyncMarker(StackListener listener) => listener.pop();
+
   void parseFunctionBody(StackListener listener, Token token) {
     try {
       Parser parser = new Parser(listener);
@@ -489,7 +473,7 @@
       listener.prepareInitializers();
       token = parser.parseInitializersOpt(token);
       token = parser.parseAsyncModifier(token);
-      AsyncMarker asyncModifier = listener.pop();
+      AsyncMarker asyncModifier = getAsyncMarker(listener);
       bool isExpression = false;
       bool allowAbstract = true;
       parser.parseFunctionBody(token, isExpression, allowAbstract);
diff --git a/pkg/front_end/lib/src/fasta/source/diet_parser.dart b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
index 6fc1c10..8c14258 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_parser.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_parser.dart
@@ -4,17 +4,15 @@
 
 library fasta.diet_parser;
 
-import 'package:front_end/src/fasta/scanner/token.dart'
-    show BeginGroupToken, Token;
+import '../scanner/token.dart' show BeginGroupToken, Token;
 
-import 'package:front_end/src/fasta/parser/class_member_parser.dart'
-    show ClassMemberParser;
+import '../parser/class_member_parser.dart' show ClassMemberParser;
 
-import 'package:front_end/src/fasta/parser/error_kind.dart' show ErrorKind;
+import '../parser/error_kind.dart' show ErrorKind;
 
-import 'package:front_end/src/fasta/parser/listener.dart' show Listener;
+import '../parser/listener.dart' show Listener;
 
-import 'package:front_end/src/fasta/parser/parser.dart' show optional;
+import '../parser/parser.dart' show optional;
 
 // TODO(ahe): Move this to parser package.
 class DietParser extends ClassMemberParser {
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 bd466f0..215d2eb 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -121,8 +121,10 @@
     Unhandled conditionalUris = pop();
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
-    library.addExport(
-        metadata, uri, conditionalUris, combinators, exportKeyword.charOffset);
+    if (uri != null) {
+      library.addExport(metadata, uri, conditionalUris, combinators,
+          exportKeyword.charOffset);
+    }
     checkEmpty(exportKeyword.charOffset);
   }
 
@@ -135,24 +137,34 @@
     Unhandled conditionalUris = pop();
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
-    library.addImport(
-        metadata,
-        uri,
-        conditionalUris,
-        prefix,
-        combinators,
-        deferredKeyword != null,
-        importKeyword.charOffset,
-        asKeyword?.next?.charOffset ?? -1);
+    if (uri != null) {
+      library.addImport(
+          metadata,
+          uri,
+          conditionalUris,
+          prefix,
+          combinators,
+          deferredKeyword != null,
+          importKeyword.charOffset,
+          asKeyword?.next?.charOffset ?? -1);
+    }
     checkEmpty(importKeyword.charOffset);
   }
 
   @override
+  void handleRecoverExpression(Token token) {
+    debugEvent("RecoverExpression");
+    push(NullValue.Expression);
+  }
+
+  @override
   void endPart(Token partKeyword, Token semicolon) {
     debugEvent("Part");
     String uri = pop();
     List<MetadataBuilder> metadata = pop();
-    library.addPart(metadata, uri);
+    if (uri != null) {
+      library.addPart(metadata, uri);
+    }
     checkEmpty(partKeyword.charOffset);
   }
 
@@ -413,7 +425,11 @@
     FormalParameterType kind = optional("{", beginToken)
         ? FormalParameterType.NAMED
         : FormalParameterType.POSITIONAL;
-    List parameters = popList(count);
+    // When recovering from an empty list of optional arguments, count may be
+    // 0. It might be simpler if the parser didn't call this method in that
+    // case, however, then [beginOptionalFormalParameters] wouldn't always be
+    // matched by this method.
+    List parameters = popList(count) ?? [];
     for (FormalParameterBuilder parameter in parameters) {
       parameter.kind = kind;
     }
@@ -491,7 +507,8 @@
   }
 
   @override
-  void endFields(int count, Token beginToken, Token endToken) {
+  void endFields(
+      int count, Token covariantToken, Token beginToken, Token endToken) {
     debugEvent("Fields");
     List<String> names = popList(count);
     TypeBuilder type = pop();
@@ -543,8 +560,9 @@
     AsyncMarker asyncModifier = pop();
     List<FormalParameterBuilder> formals = pop();
     var name = pop();
+    int modifiers = Modifier.validate(pop());
     List<MetadataBuilder> metadata = pop();
-    library.addFactoryMethod(metadata, name, formals, asyncModifier,
+    library.addFactoryMethod(metadata, modifiers, name, formals, asyncModifier,
         redirectionTarget, beginToken.charOffset, nativeMethodName);
     nativeMethodName = null;
   }
diff --git a/pkg/front_end/lib/src/fasta/source/scope_listener.dart b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
index 19d8564..78aed68 100644
--- a/pkg/front_end/lib/src/fasta/source/scope_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
@@ -4,7 +4,7 @@
 
 library fasta.scope_listener;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import '../scanner/token.dart' show Token;
 
 import 'unhandled_listener.dart' show NullValue, UnhandledListener;
 
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 6f591ef..498b074 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -211,6 +211,7 @@
 
   void addFactoryMethod(
       List<MetadataBuilder> metadata,
+      int modifiers,
       ConstructorReferenceBuilder name,
       List<FormalParameterBuilder> formals,
       AsyncMarker asyncModifier,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index e8c9a14..5e50846 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -8,13 +8,11 @@
 
 import 'dart:io' show FileSystemException;
 
-import 'package:front_end/src/fasta/scanner/io.dart' show readBytesFromFile;
+import '../scanner/io.dart' show readBytesFromFile;
 
-import 'package:front_end/src/fasta/scanner.dart'
-    show ErrorToken, ScannerResult, Token, scan;
+import '../scanner.dart' show ErrorToken, ScannerResult, Token, scan;
 
-import 'package:front_end/src/fasta/parser/class_member_parser.dart'
-    show ClassMemberParser;
+import '../parser/class_member_parser.dart' show ClassMemberParser;
 
 import 'package:kernel/ast.dart' show Program;
 
@@ -28,8 +26,6 @@
 
 import '../export.dart' show Export;
 
-import '../analyzer/element_store.dart' show ElementStore;
-
 import '../builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder;
 
 import 'outline_builder.dart' show OutlineBuilder;
@@ -44,8 +40,6 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-import '../ast_kind.dart' show AstKind;
-
 class SourceLoader<L> extends Loader<L> {
   final Map<Uri, List<int>> sourceBytes = <Uri, List<int>>{};
 
@@ -53,9 +47,6 @@
   ClassHierarchy hierarchy;
   CoreTypes coreTypes;
 
-  // Used when building analyzer ASTs.
-  ElementStore elementStore;
-
   SourceLoader(TargetImplementation target) : super(target);
 
   Future<Token> tokenize(SourceLibraryBuilder library,
@@ -100,15 +91,14 @@
     new ClassMemberParser(listener).parseUnit(tokens);
   }
 
-  Future<Null> buildBody(LibraryBuilder library, AstKind astKind) async {
+  Future<Null> buildBody(LibraryBuilder library) async {
     if (library is SourceLibraryBuilder) {
       // We tokenize source files twice to keep memory usage low. This is the
       // second time, and the first time was in [buildOutline] above. So this
       // time we suppress lexical errors.
       Token tokens = await tokenize(library, suppressLexicalErrors: true);
       if (tokens == null) return;
-      DietListener listener = new DietListener(
-          library, elementStore, hierarchy, coreTypes, astKind);
+      DietListener listener = createDietListener(library);
       DietParser parser = new DietParser(listener);
       parser.parseUnit(tokens);
       for (SourceLibraryBuilder part in library.parts) {
@@ -121,6 +111,10 @@
     }
   }
 
+  DietListener createDietListener(LibraryBuilder library) {
+    return new DietListener(library, hierarchy, coreTypes);
+  }
+
   void resolveParts() {
     List<Uri> parts = <Uri>[];
     builders.forEach((Uri uri, LibraryBuilder library) {
@@ -341,15 +335,12 @@
     ticker.logMs("Built program");
   }
 
-  void buildElementStore() {
-    elementStore = new ElementStore(coreLibrary, builders);
-    ticker.logMs("Built analyzer element model.");
-  }
-
   void computeHierarchy(Program program) {
     hierarchy = new ClassHierarchy(program);
     ticker.logMs("Computed class hierarchy");
     coreTypes = new CoreTypes(program);
     ticker.logMs("Computed core types");
   }
+
+  List<Uri> getDependencies() => sourceBytes.keys.toList();
 }
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 56fbbba..9793877 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -4,12 +4,11 @@
 
 library fasta.stack_listener;
 
-import 'package:front_end/src/fasta/parser.dart' show ErrorKind, Listener;
+import '../parser.dart' show ErrorKind, Listener;
 
-import 'package:front_end/src/fasta/parser/identifier_context.dart'
-    show IdentifierContext;
+import '../parser/identifier_context.dart' show IdentifierContext;
 
-import 'package:front_end/src/fasta/scanner.dart' show BeginGroupToken, Token;
+import '../scanner.dart' show BeginGroupToken, Token;
 
 import 'package:kernel/ast.dart' show AsyncMarker;
 
@@ -26,11 +25,14 @@
   CascadeReceiver,
   Combinators,
   ConditionalUris,
+  ConstructorReferenceContinuationAfterTypeArguments,
   ContinueTarget,
   Expression,
   FieldInitializer,
   FormalParameters,
   FunctionBody,
+  FunctionBodyAsyncToken,
+  FunctionBodyStarToken,
   IdentifierList,
   Initializers,
   Metadata,
@@ -154,6 +156,11 @@
   }
 
   @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    debugEvent("NoConstructorReferenceContinuationAfterTypeArguments");
+  }
+
+  @override
   void handleNoType(Token token) {
     debugEvent("NoType");
     push(NullValue.Type);
@@ -212,6 +219,11 @@
   }
 
   @override
+  void handleRecoverExpression(Token token) {
+    debugEvent("RecoverExpression");
+  }
+
+  @override
   void endCatchClause(Token token) {
     debugEvent("CatchClause");
   }
diff --git a/pkg/front_end/lib/src/fasta/source/unhandled_listener.dart b/pkg/front_end/lib/src/fasta/source/unhandled_listener.dart
index 500305c..fb25b83 100644
--- a/pkg/front_end/lib/src/fasta/source/unhandled_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/unhandled_listener.dart
@@ -4,7 +4,7 @@
 
 library fasta.unhandled_listener;
 
-import 'package:front_end/src/fasta/scanner/token.dart' show Token;
+import '../scanner/token.dart' show Token;
 
 import 'stack_listener.dart' show NullValue, StackListener;
 
diff --git a/pkg/front_end/lib/src/fasta/target.dart b/pkg/front_end/lib/src/fasta/target.dart
index 20c59f2..76f8ad3 100644
--- a/pkg/front_end/lib/src/fasta/target.dart
+++ b/pkg/front_end/lib/src/fasta/target.dart
@@ -8,8 +8,6 @@
 
 import 'ticker.dart' show Ticker;
 
-import 'ast_kind.dart' show AstKind;
-
 /// A compilation target.
 ///
 /// A target reads source files with [read] and writes out the resulting
@@ -23,7 +21,7 @@
   void read(Uri uri);
 
   /// Write the resulting program in the file [uri].
-  Future writeProgram(Uri uri, AstKind astKind);
+  Future writeProgram(Uri uri);
 
   /// Write the resulting outline in the file [uri].
   Future writeOutline(Uri uri);
diff --git a/pkg/front_end/lib/src/fasta/scanner/testing/scanner_chain.dart b/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
similarity index 83%
rename from pkg/front_end/lib/src/fasta/scanner/testing/scanner_chain.dart
rename to pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
index 138b8c4..277697e 100644
--- a/pkg/front_end/lib/src/fasta/scanner/testing/scanner_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/scanner_chain.dart
@@ -2,13 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE.md file.
 
-library fasta.scanner.testing.scanner_chain;
+library fasta.testing.scanner_chain;
 
 import 'package:testing/testing.dart';
 
-import 'package:front_end/src/fasta/scanner.dart';
+import '../scanner.dart';
 
-import 'package:front_end/src/fasta/scanner/io.dart';
+import '../scanner/io.dart';
 
 class Read extends Step<TestDescription, List<int>, ChainContext> {
   const Read();
diff --git a/pkg/front_end/lib/src/fasta/testing/suite.dart b/pkg/front_end/lib/src/fasta/testing/suite.dart
index f4bd276..8886460 100644
--- a/pkg/front_end/lib/src/fasta/testing/suite.dart
+++ b/pkg/front_end/lib/src/fasta/testing/suite.dart
@@ -28,18 +28,16 @@
 
 import '../translate_uri.dart' show TranslateUri;
 
+import '../analyzer/analyzer_target.dart' show AnalyzerTarget;
+
 import '../kernel/kernel_target.dart' show KernelTarget;
 
 import '../dill/dill_target.dart' show DillTarget;
 
-import '../ast_kind.dart' show AstKind;
-
 export 'kernel_chain.dart' show TestContext;
 
 export 'package:testing/testing.dart' show Chain, runMe;
 
-export '../ast_kind.dart' show AstKind;
-
 const String ENABLE_FULL_COMPILE = " full compile ";
 
 const String AST_KIND_INDEX = " AST kind index ";
@@ -63,7 +61,12 @@
   throw "Unknown AST kind: $astKind";
 }
 
-class FeContext extends TestContext {
+enum AstKind {
+  Analyzer,
+  Kernel,
+}
+
+class FastaContext extends TestContext {
   final TranslateUri uriTranslator;
 
   final List<Step> steps;
@@ -73,7 +76,7 @@
 
   Future<Program> platform;
 
-  FeContext(
+  FastaContext(
       Uri sdk,
       Uri vm,
       Uri packages,
@@ -122,33 +125,36 @@
     });
   }
 
-  static Future<FeContext> create(
-      Chain suite,
-      Map<String, String> environment,
-      Uri sdk,
-      Uri vm,
-      Uri packages,
-      bool strongMode,
-      DartSdk dartSdk,
-      bool updateExpectations) async {
-    TranslateUri uriTranslator = await TranslateUri.parse(packages);
-    String astKindString = environment[AST_KIND_INDEX];
-    AstKind astKind =
-        astKindString == null ? null : AstKind.values[int.parse(astKindString)];
-    return new FeContext(
-        sdk,
-        vm,
-        packages,
-        strongMode,
-        dartSdk,
-        updateExpectations,
-        uriTranslator,
-        environment.containsKey(ENABLE_FULL_COMPILE),
-        astKind);
+  static Future<FastaContext> create(
+      Chain suite, Map<String, String> environment) async {
+    return TestContext.create(suite, environment, (Chain suite,
+        Map<String, String> environment,
+        Uri sdk,
+        Uri vm,
+        Uri packages,
+        bool strongMode,
+        DartSdk dartSdk,
+        bool updateExpectations) async {
+      TranslateUri uriTranslator = await TranslateUri.parse(packages);
+      String astKindString = environment[AST_KIND_INDEX];
+      AstKind astKind = astKindString == null
+          ? null
+          : AstKind.values[int.parse(astKindString)];
+      return new FastaContext(
+          sdk,
+          vm,
+          packages,
+          strongMode,
+          dartSdk,
+          updateExpectations,
+          uriTranslator,
+          environment.containsKey(ENABLE_FULL_COMPILE),
+          astKind);
+    });
   }
 }
 
-class Outline extends Step<TestDescription, Program, FeContext> {
+class Outline extends Step<TestDescription, Program, FastaContext> {
   final bool fullCompile;
 
   final AstKind astKind;
@@ -156,28 +162,30 @@
   const Outline(this.fullCompile, this.astKind);
 
   String get name {
-    return fullCompile ? "${shortenAstKindName(astKind)} compile" : "outline";
+    return fullCompile ? "${astKind} compile" : "outline";
   }
 
   bool get isCompiler => fullCompile;
 
   Future<Result<Program>> run(
-      TestDescription description, FeContext context) async {
+      TestDescription description, FastaContext context) async {
     Program platform = await context.createPlatform();
     Ticker ticker = new Ticker();
     DillTarget dillTarget = new DillTarget(ticker, context.uriTranslator);
     dillTarget.loader
       ..input = Uri.parse("org.dartlang:platform") // Make up a name.
       ..setProgram(platform);
-    KernelTarget sourceTarget =
-        new KernelTarget(dillTarget, context.uriTranslator);
+    KernelTarget sourceTarget = astKind == AstKind.Analyzer
+        ? new AnalyzerTarget(dillTarget, context.uriTranslator)
+        : new KernelTarget(dillTarget, context.uriTranslator);
+
     Program p;
     try {
       sourceTarget.read(description.uri);
       await dillTarget.writeOutline(null);
       p = await sourceTarget.writeOutline(null);
       if (fullCompile) {
-        p = await sourceTarget.writeProgram(null, astKind);
+        p = await sourceTarget.writeProgram(null);
       }
     } on InputError catch (e, s) {
       return fail(null, e.error, s);
diff --git a/pkg/front_end/lib/src/fasta/util/link_implementation.dart b/pkg/front_end/lib/src/fasta/util/link_implementation.dart
index b76c98f..cc74c01 100644
--- a/pkg/front_end/lib/src/fasta/util/link_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/util/link_implementation.dart
@@ -12,7 +12,7 @@
   T _current;
   Link<T> _link;
 
-  LinkIterator(Link<T> this._link);
+  LinkIterator(this._link);
 
   T get current => _current;
 
@@ -64,7 +64,7 @@
   final T head;
   Link<T> tail;
 
-  LinkEntry(T this.head, [Link<T> tail])
+  LinkEntry(this.head, [Link<T> tail])
       : this.tail = ((tail == null) ? const Link() : tail);
 
   Link<T> prepend(T element) {
diff --git a/pkg/front_end/test/fasta/bootstrap_test.dart b/pkg/front_end/test/fasta/bootstrap_test.dart
new file mode 100644
index 0000000..265c616
--- /dev/null
+++ b/pkg/front_end/test/fasta/bootstrap_test.dart
@@ -0,0 +1,112 @@
+// 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' show Future;
+
+import 'dart:io' show Directory, File, Platform;
+
+import 'dart:isolate' show Isolate;
+
+import 'package:async_helper/async_helper.dart' show asyncEnd, asyncStart;
+
+import 'package:front_end/src/fasta/testing/kernel_chain.dart'
+    show computePatchedSdk;
+
+import 'package:testing/testing.dart' show StdioProcess;
+
+import 'package:kernel/binary/ast_from_binary.dart' show BinaryBuilder;
+
+import 'package:kernel/ast.dart' show Program;
+
+import 'package:kernel/text/ast_to_text.dart' show programToString;
+
+Future main() async {
+  asyncStart();
+  Uri sourceCompiler = Uri.base.resolve("pkg/front_end/tool/fasta/compile.dart");
+  Uri outline = Uri.base.resolve("pkg/front_end/tool/fasta/outline.dart");
+  Uri packages = await Isolate.packageConfig;
+  Directory tmp = await Directory.systemTemp.createTemp("fasta_bootstrap");
+  Uri compiledOnceOutput = tmp.uri.resolve("fasta1.dill");
+  Uri compiledTwiceOutput = tmp.uri.resolve("fasta2.dill");
+  Uri outlineOutput = tmp.uri.resolve("outline.dill");
+  try {
+    await runCompiler(sourceCompiler, sourceCompiler, compiledOnceOutput);
+    await runCompiler(compiledOnceOutput, sourceCompiler, compiledTwiceOutput);
+    await compare(compiledOnceOutput, compiledTwiceOutput);
+    await runCompiler(compiledTwiceOutput, outline, outlineOutput);
+    try {
+      // Test that compare actually works by comparing the compile program to
+      // the outline program (which are different, but similar).
+      await compare(compiledOnceOutput, outlineOutput, silent: true);
+      throw "Expected an error.";
+    } on ComparisonFailed {
+      // Expected.
+    }
+  } finally {
+    await tmp.delete(recursive: true);
+  }
+  asyncEnd();
+}
+
+Future runCompiler(Uri compiler, Uri input, Uri output) async {
+  Uri patchedSdk = await computePatchedSdk();
+  Uri dartVm = Uri.base.resolve(Platform.resolvedExecutable);
+  StdioProcess result = await StdioProcess.run(dartVm.toFilePath(), <String>[
+    "-c",
+    compiler.toFilePath(),
+    "--compile-sdk=${patchedSdk.toFilePath()}",
+    "--output=${output.toFilePath()}",
+    "--verify",
+    input.toFilePath(),
+  ]);
+  print(result.output);
+  if (result.exitCode != 0) {
+    throw "Compilation failed.";
+  }
+}
+
+Future compare(Uri a, Uri b, {bool silent: false}) async {
+  List<int> bytesA = await new File.fromUri(a).readAsBytes();
+  List<int> bytesB = await new File.fromUri(b).readAsBytes();
+  if (bytesA.length == bytesB.length) {
+    bool same = true;
+    for (int i = 0; i < bytesA.length; i++) {
+      if (bytesA[i] != bytesB[i]) {
+        same = false;
+        break;
+      }
+    }
+    if (same) return;
+  }
+  if (!silent) {
+    print("$a is different from $b");
+  }
+  Program programA = new Program();
+  Program programB = new Program();
+  new BinaryBuilder(bytesA, a.toFilePath()).readProgram(programA);
+  new BinaryBuilder(bytesB, b.toFilePath()).readProgram(programB);
+  RegExp splitLines = new RegExp('^', multiLine: true);
+  List<String> linesA = programToString(programA).split(splitLines);
+  List<String> linesB = programToString(programB).split(splitLines);
+  for (int i = 0; i < linesA.length && i < linesB.length; i++) {
+    String lineA = linesA[i].trimRight();
+    String lineB = linesB[i].trimRight();
+    if (lineA != lineB) {
+      String diffHunk = "${i}c$i\n>$lineA\n---\n<$lineB";
+      if (!silent) {
+        print(diffHunk);
+      }
+    }
+  }
+  throw new ComparisonFailed(a, b);
+}
+
+class ComparisonFailed {
+  final Uri a;
+  final Uri b;
+
+  ComparisonFailed(this.a, this.b);
+
+  toString() => "Error: $a is different from $b";
+}
diff --git a/pkg/front_end/test/fasta/compile.status b/pkg/front_end/test/fasta/compile.status
index 697e762..79faa18 100644
--- a/pkg/front_end/test/fasta/compile.status
+++ b/pkg/front_end/test/fasta/compile.status
@@ -9,6 +9,7 @@
 await: Fail
 invocations: Fail
 function_type_recovery: Crash
+statements: Fail # Make async tranformer optional for golden file testing.
 
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
@@ -65,9 +66,9 @@
 rasta/switch_execution_case_t02: Fail
 rasta/switch_fall_through: Fail
 rasta/try_label: Fail
-rasta/type_literals: Fail
+rasta/type_literals: VerificationError
 rasta/type_with_parse_error: Fail
-rasta/typedef: Fail
+rasta/typedef: VerificationError
 rasta/unresolved: Fail
 rasta/unresolved_constructor: Fail
 rasta/unresolved_for_in: Fail
diff --git a/pkg/front_end/test/fasta/compile_test.dart b/pkg/front_end/test/fasta/compile_test.dart
index cba4097..00a6a69 100644
--- a/pkg/front_end/test/fasta/compile_test.dart
+++ b/pkg/front_end/test/fasta/compile_test.dart
@@ -4,16 +4,15 @@
 
 library fasta.test.compile_test;
 
-import 'dart:async' show
-    Future;
+import 'dart:async' show Future;
 
 import 'package:front_end/src/fasta/testing/suite.dart';
 
-Future<FeContext> createContext(
+Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
   environment[ENABLE_FULL_COMPILE] = "";
   environment[AST_KIND_INDEX] = "${AstKind.Kernel.index}";
-  return TestContext.create(suite, environment, FeContext.create);
+  return FastaContext.create(suite, environment);
 }
 
 main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
diff --git a/pkg/front_end/test/fasta/kompile.status b/pkg/front_end/test/fasta/kompile.status
index 9a7396f..f0dc306 100644
--- a/pkg/front_end/test/fasta/kompile.status
+++ b/pkg/front_end/test/fasta/kompile.status
@@ -10,7 +10,7 @@
 accessors: Crash
 await: Fail
 classes: Crash
-cycles: Crash
+cycles: Fail
 default_values: Crash
 expressions: Crash
 fibonacci: Crash
@@ -20,16 +20,16 @@
 functions: Crash
 implicit_this: Crash
 invocations: Fail
-map: Crash
+map: Fail
 mixin: Crash
 operators: Crash
-redirecting_constructor: Crash
+redirecting_constructor: Fail
 statements: Crash
 super_rasta_copy: Crash
 top_level_accessors: Crash
 typedef: Crash
 
-rasta/abstract_constructor: Crash
+rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Crash
 rasta/bad_continue: Crash
 rasta/bad_default_constructor: Crash
@@ -41,7 +41,7 @@
 rasta/bad_unicode: Fail
 rasta/breaking_bad: Crash
 rasta/cascades: Crash
-rasta/class_hierarchy: Crash
+rasta/class_hierarchy: Fail
 rasta/class_member: Crash
 rasta/constant_get_and_invoke: Crash
 rasta/deferred_lib: Fail
@@ -51,12 +51,12 @@
 rasta/external_factory_redirection: Crash
 rasta/foo: Fail
 rasta/for_loop: Crash
-rasta/generic_factory: Crash
+rasta/generic_factory: VerificationError
 rasta/issue_000001: Crash
 rasta/issue_000002: Crash
 rasta/issue_000004: Crash
 rasta/issue_000006: Crash
-rasta/issue_000007: Crash
+rasta/issue_000007: Fail
 rasta/issue_000008: Crash
 rasta/issue_000011: Crash
 rasta/issue_000012: Crash
@@ -69,7 +69,7 @@
 rasta/issue_000035a: Fail
 rasta/issue_000036: Fail
 rasta/issue_000039: Crash
-rasta/issue_000041: Crash
+rasta/issue_000041: Fail
 rasta/issue_000042: Crash
 rasta/issue_000043: Fail
 rasta/issue_000044: Fail
@@ -86,7 +86,7 @@
 rasta/issue_000080: Crash
 rasta/issue_000081: Crash
 rasta/malformed_const_constructor: Fail
-rasta/malformed_function: Fail
+rasta/malformed_function: VerificationError
 rasta/malformed_function_type: Crash
 rasta/mandatory_parameter_initializer: Fail
 rasta/mixin_library: Crash
@@ -107,8 +107,8 @@
 rasta/type_literals: Crash
 rasta/type_with_parse_error: Fail
 rasta/typedef: Crash
-rasta/unresolved: Crash
+rasta/unresolved: Fail
 rasta/unresolved_constructor: Crash
 rasta/unresolved_for_in: Crash
-rasta/unresolved_recovery: Crash
+rasta/unresolved_recovery: Fail
 rasta/unsupported_platform_library: Fail
diff --git a/pkg/front_end/test/fasta/kompile_test.dart b/pkg/front_end/test/fasta/kompile_test.dart
index 34175ad..3a128eb 100644
--- a/pkg/front_end/test/fasta/kompile_test.dart
+++ b/pkg/front_end/test/fasta/kompile_test.dart
@@ -4,16 +4,15 @@
 
 library fasta.test.compile_test;
 
-import 'dart:async' show
-    Future;
+import 'dart:async' show Future;
 
 import 'package:front_end/src/fasta/testing/suite.dart';
 
-Future<FeContext> createContext(
+Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
   environment[ENABLE_FULL_COMPILE] = "";
   environment[AST_KIND_INDEX] = "${AstKind.Analyzer.index}";
-  return TestContext.create(suite, environment, FeContext.create);
+  return FastaContext.create(suite, environment);
 }
 
 main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
diff --git a/pkg/front_end/test/fasta/outline_test.dart b/pkg/front_end/test/fasta/outline_test.dart
index 1aad820..3826be1 100644
--- a/pkg/front_end/test/fasta/outline_test.dart
+++ b/pkg/front_end/test/fasta/outline_test.dart
@@ -4,14 +4,13 @@
 
 library fasta.test.outline_test;
 
-import 'dart:async' show
-    Future;
+import 'dart:async' show Future;
 
 import 'package:front_end/src/fasta/testing/suite.dart';
 
-Future<FeContext> createContext(
+Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) {
-  return TestContext.create(suite, environment, FeContext.create);
+  return FastaContext.create(suite, environment);
 }
 
 main(List<String> arguments) => runMe(arguments, createContext, "testing.json");
diff --git a/pkg/front_end/test/fasta/parser/parser_suite.dart b/pkg/front_end/test/fasta/parser/parser_suite.dart
index b5c1c03..1ac6b2b 100644
--- a/pkg/front_end/test/fasta/parser/parser_suite.dart
+++ b/pkg/front_end/test/fasta/parser/parser_suite.dart
@@ -6,7 +6,7 @@
 
 import 'package:front_end/src/fasta/scanner.dart';
 
-import 'package:front_end/src/fasta/scanner/testing/scanner_chain.dart';
+import 'package:front_end/src/fasta/testing/scanner_chain.dart';
 
 import 'package:front_end/src/fasta/parser.dart';
 
diff --git a/pkg/front_end/test/fasta/scanner/scanner_suite.dart b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
index 64ee2f0..ba48f08 100644
--- a/pkg/front_end/test/fasta/scanner/scanner_suite.dart
+++ b/pkg/front_end/test/fasta/scanner/scanner_suite.dart
@@ -4,7 +4,7 @@
 
 import 'package:testing/testing.dart';
 
-import 'package:front_end/src/fasta/scanner/testing/scanner_chain.dart';
+import 'package:front_end/src/fasta/testing/scanner_chain.dart';
 
 Future<ChainContext> createContext(
     Chain suite, Map<String, String> enviroment) async {
diff --git a/pkg/front_end/test/fasta/sdk_test.dart b/pkg/front_end/test/fasta/sdk_test.dart
index 9e77054..0480c67 100644
--- a/pkg/front_end/test/fasta/sdk_test.dart
+++ b/pkg/front_end/test/fasta/sdk_test.dart
@@ -4,20 +4,18 @@
 
 library fasta.test.compile_test;
 
-import 'dart:async' show
-    Future;
+import 'dart:async' show Future;
 
 import 'package:front_end/src/fasta/testing/suite.dart';
 
-import 'package:front_end/src/fasta/testing/kernel_chain.dart' show
-    MatchExpectation;
+import 'package:front_end/src/fasta/testing/kernel_chain.dart'
+    show MatchExpectation;
 
-Future<FeContext> createContext(
+Future<FastaContext> createContext(
     Chain suite, Map<String, String> environment) async {
   environment[ENABLE_FULL_COMPILE] = "";
   environment[AST_KIND_INDEX] = "${AstKind.Kernel.index}";
-  FeContext context =
-      await TestContext.create(suite, environment, FeContext.create);
+  FastaContext context = await FastaContext.create(suite, environment);
   int index;
   for (int i = 0; i < context.steps.length; i++) {
     if (context.steps[i] is MatchExpectation) {
diff --git a/pkg/front_end/test/fasta/testing.json b/pkg/front_end/test/fasta/testing.json
index 5c1d52c..e223c8b 100644
--- a/pkg/front_end/test/fasta/testing.json
+++ b/pkg/front_end/test/fasta/testing.json
@@ -136,25 +136,24 @@
     "uris": [
       "../../lib/src/fasta",
       "../../lib/src/fasta/analyzer",
-      "../../lib/src/fasta/bin",
       "../../lib/src/fasta/builder",
       "../../lib/src/fasta/dill",
       "../../lib/src/fasta/kernel",
       "../../lib/src/fasta/parser",
-      "../../lib/src/fasta/parser/bin",
       "../../lib/src/fasta/scanner",
-      "../../lib/src/fasta/scanner/bin",
-      "../../lib/src/fasta/scanner/testing",
       "../../lib/src/fasta/source",
       "../../lib/src/fasta/testing",
       "../../lib/src/fasta/util",
+      "../../tool",
+      "../../tool/fasta",
       "parser/parser_suite.dart",
       "scanner/scanner_suite.dart",
       "compile_test.dart",
       "kompile_test.dart",
       "outline_test.dart",
       "sdk_test.dart",
-      "../../../../utils/kernel-service/kernel-service.dart"
+      "../../../../utils/kernel-service/kernel-service.dart",
+      "../../../../tools/patch_sdk.dart"
     ],
 
     "exclude": [
diff --git a/pkg/front_end/test/subpackage_relationships_test.dart b/pkg/front_end/test/subpackage_relationships_test.dart
index 0cc4c26..ba82d6b 100644
--- a/pkg/front_end/test/subpackage_relationships_test.dart
+++ b/pkg/front_end/test/subpackage_relationships_test.dart
@@ -32,7 +32,7 @@
   'lib/src/base': new SubpackageRules(
       mayImportAnalyzer: true, allowedDependencies: ['lib']),
   'lib/src/fasta':
-      new SubpackageRules(mayImportAnalyzer: true, allowedDependencies: [
+      new SubpackageRules(mayImportAnalyzer: false, allowedDependencies: [
     'lib/src/fasta/builder',
     'lib/src/fasta/dill',
     'lib/src/fasta/kernel',
@@ -52,9 +52,6 @@
     'lib/src/fasta/scanner',
     'lib/src/fasta/source',
   ]),
-  'lib/src/fasta/bin': new SubpackageRules(allowedDependencies: [
-    'lib/src/fasta',
-  ]),
   'lib/src/fasta/builder': new SubpackageRules(allowedDependencies: [
     'lib/src/fasta',
     'lib/src/fasta/dill',
@@ -89,7 +86,6 @@
   ]),
   'lib/src/fasta/source': new SubpackageRules(allowedDependencies: [
     'lib/src/fasta',
-    'lib/src/fasta/analyzer',
     'lib/src/fasta/builder',
     'lib/src/fasta/dill',
     'lib/src/fasta/kernel',
@@ -102,6 +98,8 @@
     'lib/src/fasta',
     'lib/src/fasta/dill',
     'lib/src/fasta/kernel',
+    'lib/src/fasta/analyzer',
+    'lib/src/fasta/scanner',
   ]),
   'lib/src/fasta/util': new SubpackageRules(),
   'lib/src/scanner': new SubpackageRules(allowedDependencies: [
diff --git a/pkg/front_end/tool/fasta/analyzer_compile.dart b/pkg/front_end/tool/fasta/analyzer_compile.dart
new file mode 100644
index 0000000..27f34da
--- /dev/null
+++ b/pkg/front_end/tool/fasta/analyzer_compile.dart
@@ -0,0 +1,8 @@
+// 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:front_end/src/fasta/analyzer/analyzer_compile.dart'
+    show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/compile.dart b/pkg/front_end/tool/fasta/compile.dart
new file mode 100644
index 0000000..fc7ccb3
--- /dev/null
+++ b/pkg/front_end/tool/fasta/compile.dart
@@ -0,0 +1,7 @@
+// 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:front_end/src/fasta/outline.dart' show compileEntryPoint;
+
+main(List<String> arguments) => compileEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/compile_platform.dart b/pkg/front_end/tool/fasta/compile_platform.dart
new file mode 100644
index 0000000..3759783
--- /dev/null
+++ b/pkg/front_end/tool/fasta/compile_platform.dart
@@ -0,0 +1,7 @@
+// 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:front_end/src/fasta/compile_platform.dart' show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/compile_platform_dartk.dart b/pkg/front_end/tool/fasta/compile_platform_dartk.dart
new file mode 100644
index 0000000..78306c3
--- /dev/null
+++ b/pkg/front_end/tool/fasta/compile_platform_dartk.dart
@@ -0,0 +1,8 @@
+// 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:front_end/src/fasta/analyzer/compile_platform_dartk.dart'
+    show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/lib/src/fasta/bin/generate_dart_libraries.dart b/pkg/front_end/tool/fasta/generate_dart_libraries.dart
similarity index 100%
rename from pkg/front_end/lib/src/fasta/bin/generate_dart_libraries.dart
rename to pkg/front_end/tool/fasta/generate_dart_libraries.dart
diff --git a/pkg/front_end/lib/src/fasta/bin/log_analyzer.dart b/pkg/front_end/tool/fasta/log_analyzer.dart
similarity index 100%
rename from pkg/front_end/lib/src/fasta/bin/log_analyzer.dart
rename to pkg/front_end/tool/fasta/log_analyzer.dart
diff --git a/pkg/front_end/lib/src/fasta/bin/log_collector.dart b/pkg/front_end/tool/fasta/log_collector.dart
similarity index 100%
rename from pkg/front_end/lib/src/fasta/bin/log_collector.dart
rename to pkg/front_end/tool/fasta/log_collector.dart
diff --git a/pkg/front_end/tool/fasta/outline.dart b/pkg/front_end/tool/fasta/outline.dart
new file mode 100644
index 0000000..da75f37
--- /dev/null
+++ b/pkg/front_end/tool/fasta/outline.dart
@@ -0,0 +1,7 @@
+// 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:front_end/src/fasta/outline.dart' show outlineEntryPoint;
+
+main(List<String> arguments) => outlineEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/parser.dart b/pkg/front_end/tool/fasta/parser.dart
new file mode 100644
index 0000000..b6091b4
--- /dev/null
+++ b/pkg/front_end/tool/fasta/parser.dart
@@ -0,0 +1,8 @@
+// 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:front_end/src/fasta/parser/parser_main.dart'
+    show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/run.dart b/pkg/front_end/tool/fasta/run.dart
new file mode 100644
index 0000000..f42a5ef
--- /dev/null
+++ b/pkg/front_end/tool/fasta/run.dart
@@ -0,0 +1,7 @@
+// 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:front_end/src/fasta/run.dart' show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta/scanner.dart b/pkg/front_end/tool/fasta/scanner.dart
new file mode 100644
index 0000000..c0de49b
--- /dev/null
+++ b/pkg/front_end/tool/fasta/scanner.dart
@@ -0,0 +1,8 @@
+// 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.md file.
+
+import 'package:front_end/src/fasta/scanner/scanner_main.dart'
+    show mainEntryPoint;
+
+main(List<String> arguments) => mainEntryPoint(arguments);
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 246c2bb..5b992de 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -9,7 +9,6 @@
 import 'dart:io';
 
 import 'package:front_end/src/fasta/analyzer/ast_builder.dart';
-import 'package:front_end/src/fasta/ast_kind.dart' show AstKind;
 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
@@ -276,7 +275,7 @@
   }
   await dillTarget.writeOutline(null);
   var program = await kernelTarget.writeOutline(null);
-  program = await kernelTarget.writeProgram(null, AstKind.Kernel);
+  program = await kernelTarget.writeProgram(null);
   if (kernelTarget.errors.isNotEmpty) {
     throw kernelTarget.errors.first;
   }
diff --git a/pkg/kernel/bin/eval.dart b/pkg/kernel/bin/eval.dart
new file mode 100755
index 0000000..a3b6140
--- /dev/null
+++ b/pkg/kernel/bin/eval.dart
@@ -0,0 +1,22 @@
+#!/usr/bin/env dart
+// 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:kernel/kernel.dart';
+import 'package:kernel/interpreter/interpreter.dart';
+import 'dart:io';
+
+fail(String message) {
+  stderr.writeln(message);
+  exit(1);
+}
+
+main(List<String> args) {
+  if (args.length == 1 && args[0].endsWith('.dill')) {
+    var program = loadProgramFromBinary(args[0]);
+    new Interpreter(program).evalProgram();
+  } else {
+    return fail('One input binary file should be specified.');
+  }
+}
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 8f05d4d..aafafcd 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -1257,7 +1257,7 @@
       this.returnType: const DynamicType(),
       this.inferredReturnValue,
       this.asyncMarker: AsyncMarker.Sync,
-      this.dartAsyncMarker: AsyncMarker.Sync})
+      this.dartAsyncMarker})
       : this.positionalParameters =
             positionalParameters ?? <VariableDeclaration>[],
         this.requiredParameterCount =
@@ -1269,6 +1269,7 @@
     setParents(this.positionalParameters, this);
     setParents(this.namedParameters, this);
     body?.parent = this;
+    dartAsyncMarker ??= asyncMarker;
   }
 
   static DartType _getTypeOfVariable(VariableDeclaration node) => node.type;
@@ -1406,6 +1407,7 @@
   }
 
   accept(ExpressionVisitor v);
+  accept1(ExpressionVisitor1 v, arg);
 }
 
 /// An expression containing compile-time errors.
@@ -1415,6 +1417,7 @@
   DartType getStaticType(TypeEnvironment types) => const BottomType();
 
   accept(ExpressionVisitor v) => v.visitInvalidExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitInvalidExpression(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
@@ -1432,6 +1435,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitVariableGet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitVariableGet(this, arg);
 
   visitChildren(Visitor v) {
     promotedType?.accept(v);
@@ -1458,6 +1462,7 @@
   DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
 
   accept(ExpressionVisitor v) => v.visitVariableSet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitVariableSet(this, arg);
 
   visitChildren(Visitor v) {
     value?.accept(v);
@@ -1514,6 +1519,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitPropertyGet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitPropertyGet(this, arg);
 
   visitChildren(Visitor v) {
     receiver?.accept(v);
@@ -1560,6 +1566,7 @@
   DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
 
   accept(ExpressionVisitor v) => v.visitPropertySet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitPropertySet(this, arg);
 
   visitChildren(Visitor v) {
     receiver?.accept(v);
@@ -1610,6 +1617,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitDirectPropertyGet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitDirectPropertyGet(this, arg);
 
   DartType getStaticType(TypeEnvironment types) {
     Class superclass = target.enclosingClass;
@@ -1661,6 +1669,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitDirectPropertySet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitDirectPropertySet(this, arg);
 
   DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
 }
@@ -1707,6 +1716,8 @@
   }
 
   accept(ExpressionVisitor v) => v.visitDirectMethodInvocation(this);
+  accept1(ExpressionVisitor1 v, arg) =>
+      v.visitDirectMethodInvocation(this, arg);
 
   DartType getStaticType(TypeEnvironment types) {
     if (types.isOverloadedArithmeticOperator(target)) {
@@ -1755,6 +1766,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitSuperPropertyGet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitSuperPropertyGet(this, arg);
 
   visitChildren(Visitor v) {
     name?.accept(v);
@@ -1790,6 +1802,7 @@
   DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
 
   accept(ExpressionVisitor v) => v.visitSuperPropertySet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitSuperPropertySet(this, arg);
 
   visitChildren(Visitor v) {
     name?.accept(v);
@@ -1822,6 +1835,7 @@
   DartType getStaticType(TypeEnvironment types) => target.getterType;
 
   accept(ExpressionVisitor v) => v.visitStaticGet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitStaticGet(this, arg);
 
   visitChildren(Visitor v) {
     target?.acceptReference(v);
@@ -1854,6 +1868,7 @@
   DartType getStaticType(TypeEnvironment types) => value.getStaticType(types);
 
   accept(ExpressionVisitor v) => v.visitStaticSet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitStaticSet(this, arg);
 
   visitChildren(Visitor v) {
     target?.acceptReference(v);
@@ -1998,6 +2013,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitMethodInvocation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitMethodInvocation(this, arg);
 
   visitChildren(Visitor v) {
     receiver?.accept(v);
@@ -2055,6 +2071,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitSuperMethodInvocation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitSuperMethodInvocation(this, arg);
 
   visitChildren(Visitor v) {
     name?.accept(v);
@@ -2104,6 +2121,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitStaticInvocation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitStaticInvocation(this, arg);
 
   visitChildren(Visitor v) {
     target?.acceptReference(v);
@@ -2155,6 +2173,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitConstructorInvocation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitConstructorInvocation(this, arg);
 
   visitChildren(Visitor v) {
     target?.acceptReference(v);
@@ -2189,6 +2208,7 @@
   DartType getStaticType(TypeEnvironment types) => types.boolType;
 
   accept(ExpressionVisitor v) => v.visitNot(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitNot(this, arg);
 
   visitChildren(Visitor v) {
     operand?.accept(v);
@@ -2216,6 +2236,7 @@
   DartType getStaticType(TypeEnvironment types) => types.boolType;
 
   accept(ExpressionVisitor v) => v.visitLogicalExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitLogicalExpression(this, arg);
 
   visitChildren(Visitor v) {
     left?.accept(v);
@@ -2253,6 +2274,7 @@
   DartType getStaticType(TypeEnvironment types) => staticType;
 
   accept(ExpressionVisitor v) => v.visitConditionalExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitConditionalExpression(this, arg);
 
   visitChildren(Visitor v) {
     condition?.accept(v);
@@ -2297,6 +2319,7 @@
   DartType getStaticType(TypeEnvironment types) => types.stringType;
 
   accept(ExpressionVisitor v) => v.visitStringConcatenation(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitStringConcatenation(this, arg);
 
   visitChildren(Visitor v) {
     visitList(expressions, v);
@@ -2319,6 +2342,7 @@
   DartType getStaticType(TypeEnvironment types) => types.boolType;
 
   accept(ExpressionVisitor v) => v.visitIsExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitIsExpression(this, arg);
 
   visitChildren(Visitor v) {
     operand?.accept(v);
@@ -2346,6 +2370,7 @@
   DartType getStaticType(TypeEnvironment types) => type;
 
   accept(ExpressionVisitor v) => v.visitAsExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitAsExpression(this, arg);
 
   visitChildren(Visitor v) {
     operand?.accept(v);
@@ -2377,6 +2402,7 @@
   DartType getStaticType(TypeEnvironment types) => types.stringType;
 
   accept(ExpressionVisitor v) => v.visitStringLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitStringLiteral(this, arg);
 }
 
 class IntLiteral extends BasicLiteral {
@@ -2387,6 +2413,7 @@
   DartType getStaticType(TypeEnvironment types) => types.intType;
 
   accept(ExpressionVisitor v) => v.visitIntLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitIntLiteral(this, arg);
 }
 
 class DoubleLiteral extends BasicLiteral {
@@ -2397,6 +2424,7 @@
   DartType getStaticType(TypeEnvironment types) => types.doubleType;
 
   accept(ExpressionVisitor v) => v.visitDoubleLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitDoubleLiteral(this, arg);
 }
 
 class BoolLiteral extends BasicLiteral {
@@ -2407,6 +2435,7 @@
   DartType getStaticType(TypeEnvironment types) => types.boolType;
 
   accept(ExpressionVisitor v) => v.visitBoolLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitBoolLiteral(this, arg);
 }
 
 class NullLiteral extends BasicLiteral {
@@ -2415,6 +2444,7 @@
   DartType getStaticType(TypeEnvironment types) => const BottomType();
 
   accept(ExpressionVisitor v) => v.visitNullLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitNullLiteral(this, arg);
 }
 
 class SymbolLiteral extends Expression {
@@ -2425,6 +2455,7 @@
   DartType getStaticType(TypeEnvironment types) => types.symbolType;
 
   accept(ExpressionVisitor v) => v.visitSymbolLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitSymbolLiteral(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
@@ -2438,6 +2469,7 @@
   DartType getStaticType(TypeEnvironment types) => types.typeType;
 
   accept(ExpressionVisitor v) => v.visitTypeLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitTypeLiteral(this, arg);
 
   visitChildren(Visitor v) {
     type?.accept(v);
@@ -2452,6 +2484,7 @@
   DartType getStaticType(TypeEnvironment types) => types.thisType;
 
   accept(ExpressionVisitor v) => v.visitThisExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitThisExpression(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
@@ -2461,6 +2494,7 @@
   DartType getStaticType(TypeEnvironment types) => const BottomType();
 
   accept(ExpressionVisitor v) => v.visitRethrow(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitRethrow(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
@@ -2476,6 +2510,7 @@
   DartType getStaticType(TypeEnvironment types) => const BottomType();
 
   accept(ExpressionVisitor v) => v.visitThrow(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitThrow(this, arg);
 
   visitChildren(Visitor v) {
     expression?.accept(v);
@@ -2505,6 +2540,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitListLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitListLiteral(this, arg);
 
   visitChildren(Visitor v) {
     typeArgument?.accept(v);
@@ -2537,6 +2573,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitMapLiteral(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitMapLiteral(this, arg);
 
   visitChildren(Visitor v) {
     keyType?.accept(v);
@@ -2592,6 +2629,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitAwaitExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitAwaitExpression(this, arg);
 
   visitChildren(Visitor v) {
     operand?.accept(v);
@@ -2618,6 +2656,7 @@
   DartType getStaticType(TypeEnvironment types) => function.functionType;
 
   accept(ExpressionVisitor v) => v.visitFunctionExpression(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitFunctionExpression(this, arg);
 
   visitChildren(Visitor v) {
     function?.accept(v);
@@ -2644,6 +2683,7 @@
   DartType getStaticType(TypeEnvironment types) => body.getStaticType(types);
 
   accept(ExpressionVisitor v) => v.visitLet(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitLet(this, arg);
 
   visitChildren(Visitor v) {
     variable?.accept(v);
@@ -2685,6 +2725,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitLoadLibrary(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitLoadLibrary(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
@@ -2702,6 +2743,7 @@
   }
 
   accept(ExpressionVisitor v) => v.visitCheckLibraryIsLoaded(this);
+  accept1(ExpressionVisitor1 v, arg) => v.visitCheckLibraryIsLoaded(this, arg);
 
   visitChildren(Visitor v) {}
   transformChildren(Transformer v) {}
diff --git a/pkg/kernel/lib/interpreter/interpreter.dart b/pkg/kernel/lib/interpreter/interpreter.dart
new file mode 100644
index 0000000..f4f8779
--- /dev/null
+++ b/pkg/kernel/lib/interpreter/interpreter.dart
@@ -0,0 +1,83 @@
+// 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.
+library kernerl.interpreter;
+
+import 'dart:collection';
+import '../ast.dart';
+
+class NotImplemented {
+  String message;
+
+  NotImplemented(this.message);
+
+  String toString() => message;
+}
+
+class Interpreter {
+  Program program;
+
+  Interpreter(this.program);
+
+  void evalProgram() {
+    assert(program.libraries.isEmpty);
+    Procedure mainMethod = program.mainMethod;
+    Statement statementBlock = mainMethod.function.body;
+    // Evaluate only statement with one expression, ExpressionStatement, which
+    // is StaticInvocation of the method print.
+    if (statementBlock is Block) {
+      Statement statement = statementBlock.statements.first;
+      if (statement is ExpressionStatement) {
+        statement.expression.accept1(new ExpressionEval1(),
+            new ExpressionState(new HashMap<String, Object>()));
+      }
+    } else {
+      throw new NotImplemented('Evaluation for statement type '
+          '${statementBlock.runtimeType} is not implemented');
+    }
+  }
+}
+
+class InvalidExpressionError {
+  InvalidExpression expression;
+
+  InvalidExpressionError(this.expression);
+
+  String toString() => 'Invalid expression at '
+      '${expression.location.toString()}';
+}
+
+class ExpressionState {
+  Map<String, Object> environment;
+
+  ExpressionState(this.environment);
+}
+
+class ExpressionEval1 extends ExpressionVisitor1<Object> {
+  @override
+  Object defaultExpression(Expression node, arg) {
+    throw new NotImplemented('Evaluation for expressions of type '
+        '${node.runtimeType} is not implemented.');
+  }
+
+  Object visitInvalidExpression1(InvalidExpression node, arg) =>
+      throw new InvalidExpressionError(node);
+
+  Object visitStaticInvocation(StaticInvocation node, arg) {
+    if ('print' == node.name.toString()) {
+      // Special evaluation of print.
+      var res = node.arguments.positional[0].accept1(this, arg);
+      print(res);
+    } else {
+      throw new NotImplemented('Support for statement type '
+          '${node.runtimeType} is not implemented');
+    }
+  }
+
+  // Evaluation of BasicLiterals.
+  Object visitStringLiteral(StringLiteral node, arg) => node.value;
+  Object visitIntLiteral(IntLiteral node, arg) => node.value;
+  Object visitDoubleLiteral(DoubleLiteral node, arg) => node.value;
+  Object visitBoolLiteral(BoolLiteral node, arg) => node.value;
+  Object visitNullLiteral(NullLiteral node, arg) => node.value;
+}
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/kernel/lib/transformations/async.dart
index b01f71a..352b416 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/kernel/lib/transformations/async.dart
@@ -417,7 +417,8 @@
     Arguments arguments = new Arguments(<Expression>[
       expr.operand,
       new VariableGet(R.thenContinuationVariable),
-      new VariableGet(R.catchErrorContinuationVariable)
+      new VariableGet(R.catchErrorContinuationVariable),
+      new VariableGet(R.nestedClosureVariable),
     ]);
     statements.add(new ExpressionStatement(
         new StaticInvocation(R.helper.awaitHelper, arguments)
diff --git a/pkg/kernel/lib/transformations/insert_covariance_checks.dart b/pkg/kernel/lib/transformations/insert_covariance_checks.dart
index 081dbfa..7bc18bea 100644
--- a/pkg/kernel/lib/transformations/insert_covariance_checks.dart
+++ b/pkg/kernel/lib/transformations/insert_covariance_checks.dart
@@ -377,7 +377,8 @@
       // function type parameters (in case the function is generic).
       var targetType = cloneParameter.type;
       cloneParameter.type = cloner.visitType(getSafeType(unsafeInputs));
-      return new AsExpression(new VariableGet(cloneParameter), targetType);
+      return new AsExpression(new VariableGet(cloneParameter), targetType)
+          ..fileOffset = parameter.fileOffset;
     }
 
     // TODO: Insert checks for type parameter bounds.
@@ -416,7 +417,8 @@
     Expression argument = new VariableGet(parameter);
     if (unsafeTypes != null) {
       var castType = substitute(field.type, ownSubstitution);
-      argument = new AsExpression(argument, castType);
+      argument = new AsExpression(argument, castType)
+          ..fileOffset = field.fileOffset;
       var inputType = substitute(getSafeType(unsafeTypes), ownSubstitution);
       parameter.type = inputType;
     }
@@ -429,7 +431,8 @@
     var setter = new Procedure(
         covariantCheckedName(field.name),
         ProcedureKind.Setter,
-        new FunctionNode(body, positionalParameters: [parameter]));
+        new FunctionNode(body, positionalParameters: [parameter]))
+      ..fileUri = field.fileUri;
     host.addMember(setter);
 
     if (field.enclosingClass == host) {
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index 5aec3f7..4790e73 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -318,3 +318,66 @@
     return node;
   }
 }
+
+abstract class ExpressionVisitor1<R> {
+  R defaultExpression(Expression node, arg) => null;
+  R defaultBasicLiteral(BasicLiteral node, arg) => defaultExpression(node, arg);
+  R visitInvalidExpression(InvalidExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitVariableGet(VariableGet node, arg) => defaultExpression(node, arg);
+  R visitVariableSet(VariableSet node, arg) => defaultExpression(node, arg);
+  R visitPropertyGet(PropertyGet node, arg) => defaultExpression(node, arg);
+  R visitPropertySet(PropertySet node, arg) => defaultExpression(node, arg);
+  R visitDirectPropertyGet(DirectPropertyGet node, arg) =>
+      defaultExpression(node, arg);
+  R visitDirectPropertySet(DirectPropertySet node, arg) =>
+      defaultExpression(node, arg);
+  R visitSuperPropertyGet(SuperPropertyGet node, arg) =>
+      defaultExpression(node, arg);
+  R visitSuperPropertySet(SuperPropertySet node, arg) =>
+      defaultExpression(node, arg);
+  R visitStaticGet(StaticGet node, arg) => defaultExpression(node, arg);
+  R visitStaticSet(StaticSet node, arg) => defaultExpression(node, arg);
+  R visitMethodInvocation(MethodInvocation node, arg) =>
+      defaultExpression(node, arg);
+  R visitDirectMethodInvocation(DirectMethodInvocation node, arg) =>
+      defaultExpression(node, arg);
+  R visitSuperMethodInvocation(SuperMethodInvocation node, arg) =>
+      defaultExpression(node, arg);
+  R visitStaticInvocation(StaticInvocation node, arg) =>
+      defaultExpression(node, arg);
+  R visitConstructorInvocation(ConstructorInvocation node, arg) =>
+      defaultExpression(node, arg);
+  R visitNot(Not node, arg) => defaultExpression(node, arg);
+  R visitLogicalExpression(LogicalExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitConditionalExpression(ConditionalExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitStringConcatenation(StringConcatenation node, arg) =>
+      defaultExpression(node, arg);
+  R visitIsExpression(IsExpression node, arg) => defaultExpression(node, arg);
+  R visitAsExpression(AsExpression node, arg) => defaultExpression(node, arg);
+  R visitSymbolLiteral(SymbolLiteral node, arg) => defaultExpression(node, arg);
+  R visitTypeLiteral(TypeLiteral node, arg) => defaultExpression(node, arg);
+  R visitThisExpression(ThisExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitRethrow(Rethrow node, arg) => defaultExpression(node, arg);
+  R visitThrow(Throw node, arg) => defaultExpression(node, arg);
+  R visitListLiteral(ListLiteral node, arg) => defaultExpression(node, arg);
+  R visitMapLiteral(MapLiteral node, arg) => defaultExpression(node, arg);
+  R visitAwaitExpression(AwaitExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitFunctionExpression(FunctionExpression node, arg) =>
+      defaultExpression(node, arg);
+  R visitStringLiteral(StringLiteral node, arg) =>
+      defaultBasicLiteral(node, arg);
+  R visitIntLiteral(IntLiteral node, arg) => defaultBasicLiteral(node, arg);
+  R visitDoubleLiteral(DoubleLiteral node, arg) =>
+      defaultBasicLiteral(node, arg);
+  R visitBoolLiteral(BoolLiteral node, arg) => defaultBasicLiteral(node, arg);
+  R visitNullLiteral(NullLiteral node, arg) => defaultBasicLiteral(node, arg);
+  R visitLet(Let node, arg) => defaultExpression(node, arg);
+  R visitLoadLibrary(LoadLibrary node, arg) => defaultExpression(node, arg);
+  R visitCheckLibraryIsLoaded(CheckLibraryIsLoaded node, arg) =>
+      defaultExpression(node, arg);
+}
diff --git a/pkg/kernel/testcases/strong-mode/covariant_generic.baseline.txt b/pkg/kernel/testcases/strong-mode/covariant_generic.baseline.txt
index 5bd8f3c..1e99fae 100644
--- a/pkg/kernel/testcases/strong-mode/covariant_generic.baseline.txt
+++ b/pkg/kernel/testcases/strong-mode/covariant_generic.baseline.txt
@@ -15,7 +15,7 @@
   method withCallback((self::Foo::T) → void callback) → void {
     callback.call(this.{self::Foo::finalField});
   }
-  set /* from null */ mutableField$cc(core::Object mutableField_) → dynamic
+  set mutableField$cc(core::Object mutableField_) → dynamic
     this.{=self::Foo::mutableField} = mutableField_ as self::Foo::T;
   method method$cc(core::Object x) → void
     this.{=self::Foo::method}(x as self::Foo::T);
diff --git a/pkg/pkg.status b/pkg/pkg.status
index f842b8f..ba2d694 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -28,6 +28,7 @@
 front_end/test/fasta/sdk_test: SkipByDesign
 
 front_end/test/fasta/compile_test: Pass, Slow
+front_end/test/fasta/bootstrap_test: Pass, Slow
 
 # These are not tests but input for tests.
 kernel/testcases/*: Skip
@@ -75,6 +76,7 @@
 front_end/test/fasta/compile_test: Skip # Issue 28629
 front_end/test/fasta/kompile_test: Skip # Issue 28629
 front_end/test/fasta/outline_test: Skip # Issue 28629
+front_end/test/fasta/bootstrap_test: Skip # Issue 28629
 
 [ $runtime == vm && $use_sdk == false ]
 front_end/test/incremental_kernel_generator_test: Skip # Issue 28698
diff --git a/runtime/bin/isolate_data.cc b/runtime/bin/isolate_data.cc
index c10180d..1cf3ebe 100644
--- a/runtime/bin/isolate_data.cc
+++ b/runtime/bin/isolate_data.cc
@@ -29,6 +29,14 @@
 }
 
 
+void IsolateData::OnIsolateShutdown() {
+  if (builtin_lib_ != NULL) {
+    Dart_DeletePersistentHandle(builtin_lib_);
+    builtin_lib_ = NULL;
+  }
+}
+
+
 IsolateData::~IsolateData() {
   free(script_url);
   script_url = NULL;
@@ -38,9 +46,6 @@
   packages_file = NULL;
   free(udp_receive_buffer);
   udp_receive_buffer = NULL;
-  if (builtin_lib_ != NULL) {
-    Dart_DeletePersistentHandle(builtin_lib_);
-  }
   delete app_snapshot_;
   app_snapshot_ = NULL;
 }
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index fea458c..792f893 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -68,6 +68,8 @@
     dependencies_ = deps;
   }
 
+  void OnIsolateShutdown();
+
  private:
   Dart_Handle builtin_lib_;
   Loader* loader_;
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 6d7bc5e..5290205 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -1150,7 +1150,14 @@
   return buffer;
 }
 
-static void ShutdownIsolate(void* callback_data) {
+
+static void OnIsolateShutdown(void* callback_data) {
+  IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data);
+  isolate_data->OnIsolateShutdown();
+}
+
+
+static void DeleteIsolateData(void* callback_data) {
   IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data);
   delete isolate_data;
 }
@@ -1613,7 +1620,8 @@
   init_params.vm_snapshot_data = vm_snapshot_data;
   init_params.vm_snapshot_instructions = vm_snapshot_instructions;
   init_params.create = CreateIsolateAndSetup;
-  init_params.shutdown = ShutdownIsolate;
+  init_params.shutdown = OnIsolateShutdown;
+  init_params.cleanup = DeleteIsolateData;
   init_params.file_open = DartUtils::OpenFile;
   init_params.file_read = DartUtils::ReadFile;
   init_params.file_write = DartUtils::WriteFile;
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 2749b14..ed1e096 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -123,7 +123,7 @@
   ASSERT(set_vm_flags_success);
   const char* err_msg = Dart::InitOnce(
       dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions, NULL,
-      NULL, NULL, dart::bin::DartUtils::OpenFile,
+      NULL, NULL, NULL, dart::bin::DartUtils::OpenFile,
       dart::bin::DartUtils::ReadFile, dart::bin::DartUtils::WriteFile,
       dart::bin::DartUtils::CloseFile, NULL, NULL);
   ASSERT(err_msg == NULL);
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 020badb..c789dcf 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -4,6 +4,17 @@
 
 part of vmservice_io;
 
+final bool silentObservatory =
+    const bool.fromEnvironment('SILENT_OBSERVATORY');
+
+void serverPrint(String s) {
+  if (silentObservatory) {
+    // We've been requested to be silent.
+    return;
+  }
+  print(s);
+}
+
 class WebSocketClient extends Client {
   static const int PARSE_ERROR_CODE = 4000;
   static const int BINARY_MESSAGE_ERROR_CODE = 4001;
@@ -60,9 +71,9 @@
         socket.addUtf8Text(cstring);
       }
     } catch (e, st) {
-      print("Ignoring error posting over WebSocket.");
-      print(e);
-      print(st);
+      serverPrint("Ignoring error posting over WebSocket.");
+      serverPrint(e);
+      serverPrint(st);
     }
   }
 
@@ -292,8 +303,8 @@
       var message = new Message.fromUri(client, request.uri);
       client.onMessage(null, message);
     } catch (e) {
-      print('Unexpected error processing HTTP request uri: '
-            '${request.uri}\n$e\n');
+      serverPrint('Unexpected error processing HTTP request uri: '
+                  '${request.uri}\n$e\n');
       rethrow;
     }
   }
@@ -319,13 +330,13 @@
       }
       _server = await HttpServer.bind(address, _port);
       _server.listen(_requestHandler, cancelOnError: true);
-      print('Observatory listening on $serverAddress');
+      serverPrint('Observatory listening on $serverAddress');
       // Server is up and running.
       _notifyServerState(serverAddress.toString());
       onServerAddressChange('$serverAddress');
       return this;
     } catch (e, st) {
-      print('Could not start Observatory HTTP server:\n$e\n$st\n');
+      serverPrint('Could not start Observatory HTTP server:\n$e\n$st\n');
       _notifyServerState("");
       onServerAddressChange(null);
       return this;
@@ -348,14 +359,14 @@
     // Shutdown HTTP server and subscription.
     Uri oldServerAddress = serverAddress;
     return cleanup(forced).then((_) {
-      print('Observatory no longer listening on $oldServerAddress');
+      serverPrint('Observatory no longer listening on $oldServerAddress');
       _server = null;
       _notifyServerState("");
       onServerAddressChange(null);
       return this;
     }).catchError((e, st) {
       _server = null;
-      print('Could not shutdown Observatory HTTP server:\n$e\n$st\n');
+      serverPrint('Could not shutdown Observatory HTTP server:\n$e\n$st\n');
       _notifyServerState("");
       onServerAddressChange(null);
       return this;
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 4db9363..0bbb63b 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -611,7 +611,7 @@
  * for each part.
  */
 
-#define DART_FLAGS_CURRENT_VERSION (0x00000001)
+#define DART_FLAGS_CURRENT_VERSION (0x00000002)
 
 typedef struct {
   int32_t version;
@@ -619,6 +619,7 @@
   bool enable_asserts;
   bool enable_error_on_bad_type;
   bool enable_error_on_bad_override;
+  bool use_field_guards;
 } Dart_IsolateFlags;
 
 /**
@@ -708,6 +709,22 @@
 typedef void (*Dart_IsolateShutdownCallback)(void* callback_data);
 
 /**
+ * An isolate cleanup callback function.
+ *
+ * This callback, provided by the embedder, is called after the vm
+ * shuts down an isolate. There will be no current isolate and it is *not*
+ * safe to run Dart code.
+ *
+ * This function should be used to dispose of native resources that
+ * are allocated to an isolate in order to avoid leaks.
+ *
+ * \param callback_data The same callback data which was passed to the
+ *   isolate when it was created.
+ *
+ */
+typedef void (*Dart_IsolateCleanupCallback)(void* callback_data);
+
+/**
  * A thread death callback function.
  * This callback, provided by the embedder, is called before a thread in the
  * vm thread pool exits.
@@ -788,6 +805,8 @@
  *   See Dart_IsolateCreateCallback.
  * \param shutdown A function to be called when an isolate is shutdown.
  *   See Dart_IsolateShutdownCallback.
+ * \param cleanup A function to be called after an isolate is shutdown.
+ *   See Dart_IsolateCleanupCallback.
  * \param get_service_assets A function to be called by the service isolate when
  *    it requires the vmservice assets archive.
  *    See Dart_GetVMServiceAssetsArchive.
@@ -798,6 +817,7 @@
   const uint8_t* vm_snapshot_instructions;
   Dart_IsolateCreateCallback create;
   Dart_IsolateShutdownCallback shutdown;
+  Dart_IsolateCleanupCallback cleanup;
   Dart_ThreadExitCallback thread_exit;
   Dart_FileOpenCallback file_open;
   Dart_FileReadCallback file_read;
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index 0dd99e0..2823b73 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -45,7 +45,10 @@
 ///
 /// Returns the result of registering with `.then`.
 Future _awaitHelper(
-    var object, Function thenCallback, Function errorCallback) {
+    var object,
+    Function thenCallback,
+    Function errorCallback,
+    var awaiter) {
   if (object is! Future) {
     object = new _Future().._setValue(object);
   } else if (object is! _Future) {
@@ -59,9 +62,20 @@
   //
   // We can only do this for our internal futures (the default implementation of
   // all futures that are constructed by the `dart:async` library).
+  object._awaiter = awaiter;
   return object._thenNoZoneRegistration(thenCallback, errorCallback);
 }
 
+// Called as part of the 'await for (...)' construct. Registers the
+// awaiter on the stream.
+void _asyncStarListenHelper(var object, var awaiter) {
+  if (object is! _StreamImpl) {
+    return;
+  }
+  // `object` is a `_StreamImpl`.
+  object._awaiter = awaiter;
+}
+
 // _AsyncStarStreamController is used by the compiler to implement
 // async* generator functions.
 class _AsyncStarStreamController {
@@ -73,7 +87,14 @@
   bool isSuspendedAtYield = false;
   Completer cancellationCompleter = null;
 
-  Stream get stream => controller.stream;
+  Stream get stream {
+    Stream local = controller.stream;
+    if (local is! _StreamImpl) {
+      return local;
+    }
+    local._generator = asyncStarBody;
+    return local;
+  }
 
   void runBody() {
     isScheduled = false;
@@ -194,10 +215,23 @@
 
 @patch void _rethrow(Object error, StackTrace stackTrace) native "Async_rethrow";
 
+@patch class _Future<T> {
+  /// The closure implementing the async[*]-body that is `await`ing this future.
+  Function _awaiter;
+}
+
+@patch class _StreamImpl<T> {
+  /// The closure implementing the async[*]-body that is `await`ing this future.
+  Function _awaiter;
+  /// The closure implementing the async-generator body that is creating events
+  /// for this stream.
+  Function _generator;
+}
 
 /// Returns a [StackTrace] object containing the synchronous prefix for this
 /// asynchronous method.
-Object _asyncStackTraceHelper() native "StackTrace_asyncStackTraceHelper";
+Object _asyncStackTraceHelper()
+    native "StackTrace_asyncStackTraceHelper";
 
 void _clearAsyncThreadStackTrace()
     native "StackTrace_clearAsyncThreadStackTrace";
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
new file mode 100644
index 0000000..1812693
--- /dev/null
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions2_test.dart
@@ -0,0 +1,53 @@
+// 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.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_io.dart';
+import 'package:observatory/models.dart' as M;
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const LINE_A = 29;
+
+class Foo {
+
+}
+
+doThrow() {
+  throw "TheException"; // Line 13.
+  return "end of doThrow";
+}
+
+asyncThrower() async {
+  doThrow();
+}
+
+testeeMain() async {
+  // No try ... catch.
+  await asyncThrower();
+}
+
+var tests = [
+  hasStoppedWithUnhandledException,
+
+  (Isolate isolate) async {
+    print("We stoppped!");
+    var stack = await isolate.getStack();
+    expect(stack['asyncCausalFrames'], isNotNull);
+    var asyncStack = stack['asyncCausalFrames'];
+    expect(asyncStack[0].toString(), contains('doThrow'));
+    expect(asyncStack[1].toString(), contains('asyncThrower'));
+    expect(asyncStack[2].kind, equals(M.FrameKind.asyncSuspensionMarker));
+    expect(asyncStack[3].toString(), contains('testeeMain'));
+    // We've stopped at LINE_A.
+    expect(await asyncStack[3].location.toUserString(),
+           contains('.dart:$LINE_A'));
+  }
+];
+
+main(args) => runIsolateTests(args,
+                              tests,
+                              pause_on_unhandled_exceptions: true,
+                              testeeConcurrent: testeeMain);
diff --git a/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
new file mode 100644
index 0000000..2f4354e
--- /dev/null
+++ b/runtime/observatory/tests/service/pause_on_unhandled_async_exceptions_test.dart
@@ -0,0 +1,65 @@
+// 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.
+// VMOptions=--error_on_bad_type --error_on_bad_override
+
+import 'package:observatory/service_io.dart';
+import 'package:observatory/models.dart' as M;
+import 'package:unittest/unittest.dart';
+import 'test_helper.dart';
+import 'service_test_common.dart';
+
+const LINE_A = 37;
+
+class Foo {
+
+}
+
+doThrow() {
+  throw "TheException"; // Line 13.
+  return "end of doThrow";
+}
+
+asyncThrower() async {
+  doThrow();
+}
+
+testeeMain() async {
+  try {
+    // caught.
+    try {
+      await asyncThrower();
+    } catch (e) {
+    }
+
+    // uncaught.
+    try {
+      await asyncThrower();  // LINE_A.
+    } on double catch (e) {
+    }
+  } on Foo catch (e) {
+  }
+}
+
+var tests = [
+  hasStoppedWithUnhandledException,
+
+  (Isolate isolate) async {
+    print("We stoppped!");
+    var stack = await isolate.getStack();
+    expect(stack['asyncCausalFrames'], isNotNull);
+    var asyncStack = stack['asyncCausalFrames'];
+    expect(asyncStack[0].toString(), contains('doThrow'));
+    expect(asyncStack[1].toString(), contains('asyncThrower'));
+    expect(asyncStack[2].kind, equals(M.FrameKind.asyncSuspensionMarker));
+    expect(asyncStack[3].toString(), contains('testeeMain'));
+    // We've stopped at LINE_A.
+    expect(await asyncStack[3].location.toUserString(),
+           contains('.dart:$LINE_A'));
+  }
+];
+
+main(args) => runIsolateTests(args,
+                              tests,
+                              pause_on_unhandled_exceptions: true,
+                              testeeConcurrent: testeeMain);
diff --git a/runtime/tools/utils.py b/runtime/tools/utils.py
index 242e6d3..595a9ca 100644
--- a/runtime/tools/utils.py
+++ b/runtime/tools/utils.py
@@ -54,9 +54,9 @@
 # Try to guess the number of cpus on this machine.
 def GuessCpus():
   if os.path.exists("/proc/cpuinfo"):
-    return int(commands.getoutput("grep -E '^processor' /proc/cpuinfo | wc -l"))
+    return int(commands.getoutput("GREP_OPTIONS= grep -E '^processor' /proc/cpuinfo | wc -l"))
   if os.path.exists("/usr/bin/hostinfo"):
-    return int(commands.getoutput('/usr/bin/hostinfo | grep "processors are logically available." | awk "{ print \$1 }"'))
+    return int(commands.getoutput('/usr/bin/hostinfo | GREP_OPTIONS= grep "processors are logically available." | awk "{ print \$1 }"'))
   win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
   if win_cpu_count:
     return int(win_cpu_count)
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index c99b6cb..ead710e 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -1801,6 +1801,7 @@
 class CatchClauseNode : public AstNode {
  public:
   static const intptr_t kInvalidTryIndex = -1;
+  static const intptr_t kImplicitAsyncTryIndex = 0;
 
   CatchClauseNode(TokenPosition token_pos,
                   SequenceNode* catch_block,
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index af1331c..d21ef31 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -136,7 +136,10 @@
   //   :await_temp_var_X = <expr>;
   //   AwaitMarker(kNewContinuationState);
   //   :result_param = _awaitHelper(
-  //      :await_temp_var_X, :async_then_callback, :async_catch_error_callback);
+  //      :await_temp_var_X,
+  //      :async_then_callback,
+  //      :async_catch_error_callback,
+  //      :async_op);
   //   return;  // (return_type() == kContinuationTarget)
   //
   //   :saved_try_ctx_var = :await_saved_try_ctx_var_y;
@@ -165,7 +168,10 @@
   preamble_->Add(await_marker);
 
   // :result_param = _awaitHelper(
-  //      :await_temp, :async_then_callback, :async_catch_error_callback)
+  //      :await_temp,
+  //      :async_then_callback,
+  //      :async_catch_error_callback,
+  //      :async_op)
   const Library& async_lib = Library::Handle(Library::AsyncLibrary());
   const Function& async_await_helper = Function::ZoneHandle(
       Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper()));
@@ -177,6 +183,7 @@
       new (Z) LoadLocalNode(token_pos, async_then_callback));
   async_await_helper_args->Add(
       new (Z) LoadLocalNode(token_pos, async_catch_error_callback));
+  async_await_helper_args->Add(new (Z) LoadLocalNode(token_pos, async_op));
   StaticCallNode* await_helper_call = new (Z) StaticCallNode(
       node->token_pos(), async_await_helper, async_await_helper_args);
 
@@ -214,8 +221,8 @@
       new (Z) LoadLocalNode(token_pos, stack_trace_param);
   SequenceNode* error_ne_null_branch =
       new (Z) SequenceNode(token_pos, ChainNewScope(preamble_->scope()));
-  error_ne_null_branch->Add(new (Z) ThrowNode(
-      node->token_pos(), load_error_param, load_stack_trace_param));
+  error_ne_null_branch->Add(
+      new (Z) ThrowNode(token_pos, load_error_param, load_stack_trace_param));
   preamble_->Add(new (Z) IfNode(
       token_pos, new (Z) ComparisonNode(
                      token_pos, Token::kNE, load_error_param,
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index 1735bdc..3bd1c6c 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -1093,7 +1093,7 @@
         Thread::Current(), Timeline::GetIsolateStream(), "PostLoadField"));
 
     Field& field = Field::Handle(zone);
-    if (!FLAG_use_field_guards) {
+    if (!Isolate::Current()->use_field_guards()) {
       for (intptr_t i = start_index_; i < stop_index_; i++) {
         field ^= refs.At(i);
         field.set_guarded_cid(kDynamicCid);
@@ -4648,7 +4648,8 @@
   const intptr_t version_len = strlen(expected_version);
   WriteBytes(reinterpret_cast<const uint8_t*>(expected_version), version_len);
 
-  const char* expected_features = Dart::FeaturesString(kind_);
+  const char* expected_features =
+      Dart::FeaturesString(Isolate::Current(), kind_);
   ASSERT(expected_features != NULL);
   const intptr_t features_len = strlen(expected_features);
   WriteBytes(reinterpret_cast<const uint8_t*>(expected_features),
@@ -4986,7 +4987,7 @@
 }
 
 
-RawApiError* Deserializer::VerifyVersionAndFeatures() {
+RawApiError* Deserializer::VerifyVersionAndFeatures(Isolate* isolate) {
   // If the version string doesn't match, return an error.
   // Note: New things are allocated only if we're going to return an error.
 
@@ -5023,7 +5024,7 @@
   }
   Advance(version_len);
 
-  const char* expected_features = Dart::FeaturesString(kind_);
+  const char* expected_features = Dart::FeaturesString(isolate, kind_);
   ASSERT(expected_features != NULL);
   const intptr_t expected_len = strlen(expected_features);
 
@@ -5475,7 +5476,7 @@
   Deserializer deserializer(thread_, kind_, buffer_, size_,
                             instructions_buffer_, data_buffer_);
 
-  RawApiError* error = deserializer.VerifyVersionAndFeatures();
+  RawApiError* error = deserializer.VerifyVersionAndFeatures(/*isolate=*/NULL);
   if (error != ApiError::null()) {
     return error;
   }
@@ -5499,7 +5500,8 @@
   Deserializer deserializer(thread_, kind_, buffer_, size_,
                             instructions_buffer_, data_buffer_);
 
-  RawApiError* error = deserializer.VerifyVersionAndFeatures();
+  RawApiError* error =
+      deserializer.VerifyVersionAndFeatures(thread_->isolate());
   if (error != ApiError::null()) {
     return error;
   }
diff --git a/runtime/vm/clustered_snapshot.h b/runtime/vm/clustered_snapshot.h
index e110f74..8e76043 100644
--- a/runtime/vm/clustered_snapshot.h
+++ b/runtime/vm/clustered_snapshot.h
@@ -360,7 +360,7 @@
     return instructions_reader_->GetObjectAt(offset);
   }
 
-  RawApiError* VerifyVersionAndFeatures();
+  RawApiError* VerifyVersionAndFeatures(Isolate* isolate);
 
   void Prepare();
   void Deserialize();
diff --git a/runtime/vm/code_descriptors.cc b/runtime/vm/code_descriptors.cc
index 1eb2092..3922ada 100644
--- a/runtime/vm/code_descriptors.cc
+++ b/runtime/vm/code_descriptors.cc
@@ -102,12 +102,14 @@
       ASSERT((list_[i].outer_try_index == -1) &&
              (list_[i].pc_offset == ExceptionHandlers::kInvalidPcOffset));
       handlers.SetHandlerInfo(i, list_[i].outer_try_index, list_[i].pc_offset,
-                              list_[i].needs_stacktrace, has_catch_all);
+                              list_[i].needs_stacktrace, has_catch_all,
+                              list_[i].token_pos, list_[i].is_generated);
       handlers.SetHandledTypes(i, Array::empty_array());
     } else {
       const bool has_catch_all = ContainsDynamic(*list_[i].handler_types);
       handlers.SetHandlerInfo(i, list_[i].outer_try_index, list_[i].pc_offset,
-                              list_[i].needs_stacktrace, has_catch_all);
+                              list_[i].needs_stacktrace, has_catch_all,
+                              list_[i].token_pos, list_[i].is_generated);
       handlers.SetHandledTypes(i, *list_[i].handler_types);
     }
   }
@@ -323,7 +325,7 @@
     if (inline_id < inline_id_to_function_.length()) {
       const Function* function = inline_id_to_function_[inline_id];
       Script& script = Script::Handle(function->script());
-      line = script.GetTokenLineUsingLineStarts(pos);
+      line = script.GetTokenLineUsingLineStarts(pos.SourcePosition());
     }
     stream_.Write<int32_t>(static_cast<int32_t>(line));
   } else {
diff --git a/runtime/vm/code_descriptors.h b/runtime/vm/code_descriptors.h
index 2500ed8..5a1528e 100644
--- a/runtime/vm/code_descriptors.h
+++ b/runtime/vm/code_descriptors.h
@@ -74,6 +74,8 @@
   struct HandlerDesc {
     intptr_t outer_try_index;    // Try block in which this try block is nested.
     intptr_t pc_offset;          // Handler PC offset value.
+    TokenPosition token_pos;     // Token position of handler.
+    bool is_generated;           // False if this is directly from Dart code.
     const Array* handler_types;  // Catch clause guards.
     bool needs_stacktrace;
   };
@@ -86,6 +88,8 @@
     struct HandlerDesc data;
     data.outer_try_index = -1;
     data.pc_offset = ExceptionHandlers::kInvalidPcOffset;
+    data.token_pos = TokenPosition::kNoSource;
+    data.is_generated = true;
     data.handler_types = NULL;
     data.needs_stacktrace = false;
     list_.Add(data);
@@ -94,6 +98,8 @@
   void AddHandler(intptr_t try_index,
                   intptr_t outer_try_index,
                   intptr_t pc_offset,
+                  TokenPosition token_pos,
+                  bool is_generated,
                   const Array& handler_types,
                   bool needs_stacktrace) {
     ASSERT(try_index >= 0);
@@ -103,6 +109,8 @@
     list_[try_index].outer_try_index = outer_try_index;
     ASSERT(list_[try_index].pc_offset == ExceptionHandlers::kInvalidPcOffset);
     list_[try_index].pc_offset = pc_offset;
+    list_[try_index].token_pos = token_pos;
+    list_[try_index].is_generated = is_generated;
     ASSERT(handler_types.IsZoneHandle());
     list_[try_index].handler_types = &handler_types;
     list_[try_index].needs_stacktrace |= needs_stacktrace;
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 2a109db..5a621ef 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -543,6 +543,34 @@
       Code::Handle(Code::FinalizeCode(function, assembler, optimized()));
   code.set_is_optimized(optimized());
   code.set_owner(function);
+#if !defined(PRODUCT)
+  if (FLAG_support_debugger) {
+    ZoneGrowableArray<TokenPosition>* await_token_positions =
+        flow_graph->await_token_positions();
+    if (await_token_positions != NULL) {
+      Smi& token_pos_value = Smi::Handle(zone);
+      if (await_token_positions->length() > 0) {
+        const Array& await_to_token_map = Array::Handle(
+            zone, Array::New(await_token_positions->length(), Heap::kOld));
+        ASSERT(!await_to_token_map.IsNull());
+        for (intptr_t i = 0; i < await_token_positions->length(); i++) {
+          TokenPosition token_pos =
+              await_token_positions->At(i).FromSynthetic();
+          if (!token_pos.IsReal()) {
+            // Some async machinary uses sentinel values. Map them to
+            // no source position.
+            token_pos_value = Smi::New(TokenPosition::kNoSourcePos);
+          } else {
+            token_pos_value = Smi::New(token_pos.value());
+          }
+          await_to_token_map.SetAt(i, token_pos_value);
+        }
+        code.SetAwaitTokenPositions(await_to_token_map);
+      }
+    }
+  }
+#endif  // !defined(PRODUCT)
+
   if (!function.IsOptimizable()) {
     // A function with huge unoptimized code can become non-optimizable
     // after generating unoptimized code.
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 83b1055..5a6a1b9 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -125,6 +125,7 @@
                      const uint8_t* instructions_snapshot,
                      Dart_IsolateCreateCallback create,
                      Dart_IsolateShutdownCallback shutdown,
+                     Dart_IsolateCleanupCallback cleanup,
                      Dart_ThreadExitCallback thread_exit,
                      Dart_FileOpenCallback file_open,
                      Dart_FileReadCallback file_read,
@@ -313,6 +314,7 @@
   Thread::ExitIsolate();  // Unregister the VM isolate from this thread.
   Isolate::SetCreateCallback(create);
   Isolate::SetShutdownCallback(shutdown);
+  Isolate::SetCleanupCallback(cleanup);
 
   if (FLAG_support_service) {
     Service::SetGetServiceAssetsCallback(get_service_assets);
@@ -653,7 +655,7 @@
 }
 
 
-const char* Dart::FeaturesString(Snapshot::Kind kind) {
+const char* Dart::FeaturesString(Isolate* isolate, Snapshot::Kind kind) {
   TextBuffer buffer(64);
 
 // Different fields are included for DEBUG/RELEASE/PRODUCT.
@@ -667,9 +669,15 @@
 
   if (Snapshot::IncludesCode(kind)) {
     // Checked mode affects deopt ids.
-    buffer.AddString(FLAG_enable_asserts ? " asserts" : " no-asserts");
-    buffer.AddString(FLAG_enable_type_checks ? " type-checks"
-                                             : " no-type-checks");
+    const bool asserts =
+        (isolate != NULL) ? isolate->asserts() : FLAG_enable_asserts;
+    const bool type_checks =
+        (isolate != NULL) ? isolate->type_checks() : FLAG_enable_type_checks;
+    const bool field_guards =
+        (isolate != NULL) ? isolate->use_field_guards() : FLAG_use_field_guards;
+    buffer.AddString(asserts ? " asserts" : " no-asserts");
+    buffer.AddString(type_checks ? " type-checks" : " no-type-checks");
+    buffer.AddString(field_guards ? "field-guards" : "no-field-guards");
 
 // Generated code must match the host architecture and ABI.
 #if defined(TARGET_ARCH_ARM)
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index b4376dd..e79fccc 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -28,6 +28,7 @@
                         const uint8_t* vm_snapshot_instructions,
                         Dart_IsolateCreateCallback create,
                         Dart_IsolateShutdownCallback shutdown,
+                        Dart_IsolateCleanupCallback cleanup,
                         Dart_ThreadExitCallback thread_exit,
                         Dart_FileOpenCallback file_open,
                         Dart_FileReadCallback file_read,
@@ -72,7 +73,7 @@
   static uword AllocateReadOnlyHandle();
   static bool IsReadOnlyHandle(uword address);
 
-  static const char* FeaturesString(Snapshot::Kind kind);
+  static const char* FeaturesString(Isolate* isolate, Snapshot::Kind kind);
   static Snapshot::Kind vm_snapshot_kind() { return vm_snapshot_kind_; }
 
   static Dart_ThreadExitCallback thread_exit_callback() {
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index be6c3f3..f8db6b4 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -1192,9 +1192,9 @@
 
   return Dart::InitOnce(
       params->vm_snapshot_data, params->vm_snapshot_instructions,
-      params->create, params->shutdown, params->thread_exit, params->file_open,
-      params->file_read, params->file_write, params->file_close,
-      params->entropy_source, params->get_service_assets);
+      params->create, params->shutdown, params->cleanup, params->thread_exit,
+      params->file_open, params->file_read, params->file_write,
+      params->file_close, params->entropy_source, params->get_service_assets);
 }
 
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index c17c4d2..297703e 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -3521,7 +3521,7 @@
 
   // Create an isolate with checked mode flags.
   Dart_IsolateFlags api_flags;
-  api_flags.version = DART_FLAGS_CURRENT_VERSION;
+  Isolate::FlagsInitialize(&api_flags);
   api_flags.enable_type_checks = true;
   api_flags.enable_asserts = true;
   api_flags.enable_error_on_bad_type = true;
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index a74a0f5..61956fa 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -259,7 +259,7 @@
       ctx_(Context::ZoneHandle()),
       code_(Code::ZoneHandle(code.raw())),
       function_(Function::ZoneHandle(code.function())),
-      live_frame_(kind == kRegular),
+      live_frame_((kind == kRegular) || (kind == kAsyncActivation)),
       token_pos_initialized_(false),
       token_pos_(TokenPosition::kNoSource),
       try_index_(-1),
@@ -297,6 +297,37 @@
       desc_indices_(8),
       pc_desc_(PcDescriptors::ZoneHandle()) {}
 
+
+ActivationFrame::ActivationFrame(const Closure& async_activation)
+    : pc_(0),
+      fp_(0),
+      sp_(0),
+      ctx_(Context::ZoneHandle()),
+      code_(Code::ZoneHandle()),
+      function_(Function::ZoneHandle()),
+      live_frame_(false),
+      token_pos_initialized_(false),
+      token_pos_(TokenPosition::kNoSource),
+      try_index_(-1),
+      line_number_(-1),
+      column_number_(-1),
+      context_level_(-1),
+      deopt_frame_(Array::ZoneHandle()),
+      deopt_frame_offset_(0),
+      kind_(kAsyncActivation),
+      vars_initialized_(false),
+      var_descriptors_(LocalVarDescriptors::ZoneHandle()),
+      desc_indices_(8),
+      pc_desc_(PcDescriptors::ZoneHandle()) {
+  // Extract the function and the code from the asynchronous activation.
+  function_ = async_activation.function();
+  code_ = function_.unoptimized_code();
+  ctx_ = async_activation.context();
+  ASSERT(fp_ == 0);
+  ASSERT(!ctx_.IsNull());
+}
+
+
 bool Debugger::NeedsIsolateEvents() {
   return ((isolate_ != Dart::vm_isolate()) &&
           !ServiceIsolate::IsServiceIsolateDescendant(isolate_) &&
@@ -589,8 +620,8 @@
 
 intptr_t ActivationFrame::LineNumber() {
   // Compute line number lazily since it causes scanning of the script.
-  if ((line_number_ < 0) && TokenPos().IsReal()) {
-    const TokenPosition token_pos = TokenPos();
+  if ((line_number_ < 0) && TokenPos().IsSourcePosition()) {
+    const TokenPosition token_pos = TokenPos().SourcePosition();
     const Script& script = Script::Handle(SourceScript());
     script.GetTokenLocation(token_pos, &line_number_, NULL);
   }
@@ -600,8 +631,8 @@
 
 intptr_t ActivationFrame::ColumnNumber() {
   // Compute column number lazily since it causes scanning of the script.
-  if ((column_number_ < 0) && TokenPos().IsReal()) {
-    const TokenPosition token_pos = TokenPos();
+  if ((column_number_ < 0) && TokenPos().IsSourcePosition()) {
+    const TokenPosition token_pos = TokenPos().SourcePosition();
     const Script& script = Script::Handle(SourceScript());
     if (script.HasSource()) {
       script.GetTokenLocation(token_pos, &line_number_, &column_number_);
@@ -680,6 +711,191 @@
 }
 
 
+RawObject* ActivationFrame::GetAsyncContextVariable(const String& name) {
+  if (!function_.IsAsyncClosure()) {
+    return Object::null();
+  }
+  GetVarDescriptors();
+  intptr_t var_desc_len = var_descriptors_.Length();
+  for (intptr_t i = 0; i < var_desc_len; i++) {
+    RawLocalVarDescriptors::VarInfo var_info;
+    var_descriptors_.GetInfo(i, &var_info);
+    if (var_descriptors_.GetName(i) == name.raw()) {
+      const int8_t kind = var_info.kind();
+      if (!live_frame_) {
+        ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+      }
+      if (kind == RawLocalVarDescriptors::kStackVar) {
+        return GetStackVar(var_info.index());
+      } else {
+        ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+        if (!live_frame_) {
+          ASSERT(!ctx_.IsNull());
+          return ctx_.At(var_info.index());
+        }
+        return GetContextVar(var_info.scope_id, var_info.index());
+      }
+    }
+  }
+  return Object::null();
+}
+
+
+RawObject* ActivationFrame::GetAsyncCompleter() {
+  return GetAsyncContextVariable(Symbols::AsyncCompleter());
+}
+
+
+RawObject* ActivationFrame::GetAsyncCompleterAwaiter(const Object& completer) {
+  const Class& sync_completer_cls = Class::Handle(completer.clazz());
+  ASSERT(!sync_completer_cls.IsNull());
+  const Class& completer_cls = Class::Handle(sync_completer_cls.SuperClass());
+  const Field& future_field =
+      Field::Handle(completer_cls.LookupInstanceFieldAllowPrivate(
+          Symbols::CompleterFuture()));
+  ASSERT(!future_field.IsNull());
+  Instance& future = Instance::Handle();
+  future ^= Instance::Cast(completer).GetField(future_field);
+  ASSERT(!future.IsNull());
+  const Class& future_cls = Class::Handle(future.clazz());
+  ASSERT(!future_cls.IsNull());
+  const Field& awaiter_field = Field::Handle(
+      future_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
+  ASSERT(!awaiter_field.IsNull());
+  return future.GetField(awaiter_field);
+}
+
+
+RawObject* ActivationFrame::GetAsyncStreamControllerStream() {
+  return GetAsyncContextVariable(Symbols::ControllerStream());
+}
+
+
+RawObject* ActivationFrame::GetAsyncStreamControllerStreamAwaiter(
+    const Object& stream) {
+  const Class& stream_cls = Class::Handle(stream.clazz());
+  ASSERT(!stream_cls.IsNull());
+  const Class& stream_impl_cls = Class::Handle(stream_cls.SuperClass());
+  const Field& awaiter_field = Field::Handle(
+      stream_impl_cls.LookupInstanceFieldAllowPrivate(Symbols::_Awaiter()));
+  ASSERT(!awaiter_field.IsNull());
+  return Instance::Cast(stream).GetField(awaiter_field);
+}
+
+
+RawObject* ActivationFrame::GetAsyncAwaiter() {
+  const Object& completer = Object::Handle(GetAsyncCompleter());
+  if (!completer.IsNull()) {
+    return GetAsyncCompleterAwaiter(completer);
+  }
+  const Object& async_stream_controller_stream =
+      Object::Handle(GetAsyncStreamControllerStream());
+  if (!async_stream_controller_stream.IsNull()) {
+    return GetAsyncStreamControllerStreamAwaiter(
+        async_stream_controller_stream);
+  }
+  return Object::null();
+}
+
+
+bool ActivationFrame::HandlesException(const Instance& exc_obj) {
+  intptr_t try_index = TryIndex();
+  if (try_index < 0) {
+    return false;
+  }
+  ExceptionHandlers& handlers = ExceptionHandlers::Handle();
+  Array& handled_types = Array::Handle();
+  AbstractType& type = Type::Handle();
+  const TypeArguments& no_instantiator = TypeArguments::Handle();
+  const bool is_async =
+      function().IsAsyncClosure() || function().IsAsyncGenClosure();
+  handlers = code().exception_handlers();
+  ASSERT(!handlers.IsNull());
+  intptr_t num_handlers_checked = 0;
+  while (try_index != CatchClauseNode::kInvalidTryIndex) {
+    // Detect circles in the exception handler data.
+    num_handlers_checked++;
+    ASSERT(num_handlers_checked <= handlers.num_entries());
+    // Only consider user written handlers for async methods.
+    if (!is_async || !handlers.IsGenerated(try_index)) {
+      handled_types = handlers.GetHandledTypes(try_index);
+      const intptr_t num_types = handled_types.Length();
+      for (intptr_t k = 0; k < num_types; k++) {
+        type ^= handled_types.At(k);
+        ASSERT(!type.IsNull());
+        // Uninstantiated types are not added to ExceptionHandlers data.
+        ASSERT(type.IsInstantiated());
+        if (type.IsMalformed()) {
+          continue;
+        }
+        if (type.IsDynamicType()) {
+          return true;
+        }
+        if (exc_obj.IsInstanceOf(type, no_instantiator, NULL)) {
+          return true;
+        }
+      }
+    }
+    try_index = handlers.OuterTryIndex(try_index);
+  }
+  return false;
+}
+
+
+void ActivationFrame::ExtractTokenPositionFromAsyncClosure() {
+  // Attempt to determine the token position from the async closure.
+  ASSERT(function_.IsAsyncGenClosure() || function_.IsAsyncClosure());
+  // This should only be called on frames that aren't active on the stack.
+  ASSERT(fp() == 0);
+  const Array& await_to_token_map =
+      Array::Handle(code_.await_token_positions());
+  if (await_to_token_map.IsNull()) {
+    // No mapping.
+    return;
+  }
+  GetVarDescriptors();
+  GetPcDescriptors();
+  intptr_t var_desc_len = var_descriptors_.Length();
+  intptr_t await_jump_var = -1;
+  for (intptr_t i = 0; i < var_desc_len; i++) {
+    RawLocalVarDescriptors::VarInfo var_info;
+    var_descriptors_.GetInfo(i, &var_info);
+    const int8_t kind = var_info.kind();
+    if (var_descriptors_.GetName(i) == Symbols::AwaitJumpVar().raw()) {
+      ASSERT(kind == RawLocalVarDescriptors::kContextVar);
+      ASSERT(!ctx_.IsNull());
+      Object& await_jump_index = Object::Handle(ctx_.At(var_info.index()));
+      ASSERT(await_jump_index.IsSmi());
+      await_jump_var = Smi::Cast(await_jump_index).Value();
+    }
+  }
+  if (await_jump_var < 0) {
+    return;
+  }
+  ASSERT(await_jump_var < await_to_token_map.Length());
+  const Object& token_pos =
+      Object::Handle(await_to_token_map.At(await_jump_var));
+  if (token_pos.IsNull()) {
+    return;
+  }
+  ASSERT(token_pos.IsSmi());
+  token_pos_ = TokenPosition(Smi::Cast(token_pos).Value());
+  token_pos_initialized_ = true;
+  PcDescriptors::Iterator iter(pc_desc_, RawPcDescriptors::kAnyKind);
+  while (iter.MoveNext()) {
+    if (iter.TokenPos() == token_pos_) {
+      // Match the lowest try index at this token position.
+      // TODO(johnmccutchan): Is this heuristic precise enough?
+      if (iter.TryIndex() != CatchClauseNode::kInvalidTryIndex) {
+        if ((try_index_ == -1) || (iter.TryIndex() < try_index_)) {
+          try_index_ = iter.TryIndex();
+        }
+      }
+    }
+  }
+}
+
+
 // Get the saved current context of this activation.
 const Context& ActivationFrame::GetSavedCurrentContext() {
   if (!ctx_.IsNull()) return ctx_;
@@ -724,35 +940,10 @@
 
 ActivationFrame* DebuggerStackTrace::GetHandlerFrame(
     const Instance& exc_obj) const {
-  ExceptionHandlers& handlers = ExceptionHandlers::Handle();
-  Array& handled_types = Array::Handle();
-  AbstractType& type = Type::Handle();
-  const TypeArguments& no_instantiator = TypeArguments::Handle();
   for (intptr_t frame_index = 0; frame_index < Length(); frame_index++) {
     ActivationFrame* frame = FrameAt(frame_index);
-    intptr_t try_index = frame->TryIndex();
-    if (try_index < 0) continue;
-    handlers = frame->code().exception_handlers();
-    ASSERT(!handlers.IsNull());
-    intptr_t num_handlers_checked = 0;
-    while (try_index >= 0) {
-      // Detect circles in the exception handler data.
-      num_handlers_checked++;
-      ASSERT(num_handlers_checked <= handlers.num_entries());
-      handled_types = handlers.GetHandledTypes(try_index);
-      const intptr_t num_types = handled_types.Length();
-      for (intptr_t k = 0; k < num_types; k++) {
-        type ^= handled_types.At(k);
-        ASSERT(!type.IsNull());
-        // Uninstantiated types are not added to ExceptionHandlers data.
-        ASSERT(type.IsInstantiated());
-        if (type.IsMalformed()) continue;
-        if (type.IsDynamicType()) return frame;
-        if (exc_obj.IsInstanceOf(type, no_instantiator, NULL)) {
-          return frame;
-        }
-      }
-      try_index = handlers.OuterTryIndex(try_index);
+    if (frame->HandlesException(exc_obj)) {
+      return frame;
     }
   }
   return NULL;
@@ -1128,10 +1319,7 @@
   const Script& script = Script::Handle(SourceScript());
   jsobj->AddProperty("type", "Frame");
   jsobj->AddProperty("kind", KindToCString(kind_));
-  TokenPosition pos = TokenPos();
-  if (pos.IsSynthetic()) {
-    pos = pos.FromSynthetic();
-  }
+  const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function(), !full);
   jsobj->AddProperty("code", code());
@@ -1152,7 +1340,10 @@
       TokenPosition visible_end_token_pos;
       VariableAt(v, &var_name, &declaration_token_pos, &visible_start_token_pos,
                  &visible_end_token_pos, &var_value);
-      if (var_name.raw() != Symbols::AsyncOperation().raw()) {
+      if ((var_name.raw() != Symbols::AsyncOperation().raw()) &&
+          (var_name.raw() != Symbols::AsyncCompleter().raw()) &&
+          (var_name.raw() != Symbols::ControllerStream().raw()) &&
+          (var_name.raw() != Symbols::AwaitJumpVar().raw())) {
         JSONObject jsvar(&jsvars);
         jsvar.AddProperty("type", "BoundVariable");
         var_name = String::ScrubName(var_name);
@@ -1175,10 +1366,7 @@
   jsobj->AddProperty("type", "Frame");
   jsobj->AddProperty("kind", KindToCString(kind_));
   const Script& script = Script::Handle(SourceScript());
-  TokenPosition pos = TokenPos();
-  if (pos.IsSynthetic()) {
-    pos = pos.FromSynthetic();
-  }
+  const TokenPosition pos = TokenPos().SourcePosition();
   jsobj->AddLocation(script, pos);
   jsobj->AddProperty("function", function(), !full);
   jsobj->AddProperty("code", code());
@@ -1548,10 +1736,12 @@
                                             StackFrame* frame,
                                             const Code& code,
                                             const Array& deopt_frame,
-                                            intptr_t deopt_frame_offset) {
+                                            intptr_t deopt_frame_offset,
+                                            ActivationFrame::Kind kind) {
   ASSERT(code.ContainsInstructionAt(pc));
-  ActivationFrame* activation = new ActivationFrame(
-      pc, frame->fp(), frame->sp(), code, deopt_frame, deopt_frame_offset);
+  ActivationFrame* activation =
+      new ActivationFrame(pc, frame->fp(), frame->sp(), code, deopt_frame,
+                          deopt_frame_offset, kind);
   if (FLAG_trace_debugger_stacktrace) {
     const Context& ctx = activation->GetSavedCurrentContext();
     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
@@ -1728,6 +1918,64 @@
   return stack_trace;
 }
 
+
+DebuggerStackTrace* Debugger::CollectAwaiterReturnStackTrace() {
+  if (!FLAG_causal_async_stacks) {
+    return NULL;
+  }
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  Isolate* isolate = thread->isolate();
+  DebuggerStackTrace* stack_trace = new DebuggerStackTrace(8);
+
+  StackFrameIterator iterator(StackFrameIterator::kDontValidateFrames);
+
+  Code& code = Code::Handle(zone);
+  Function& function = Function::Handle(zone);
+  Code& inlined_code = Code::Handle(zone);
+  Closure& async_activation = Closure::Handle(zone);
+  Array& deopt_frame = Array::Handle(zone);
+
+  for (StackFrame* frame = iterator.NextFrame(); frame != NULL;
+       frame = iterator.NextFrame()) {
+    ASSERT(frame->IsValid());
+    if (frame->IsDartFrame()) {
+      code = frame->LookupDartCode();
+      function = code.function();
+      if (function.IsAsyncClosure() || function.IsAsyncGenClosure()) {
+        ActivationFrame* activation = CollectDartFrame(
+            isolate, frame->pc(), frame, code, Object::null_array(), 0,
+            ActivationFrame::kAsyncActivation);
+        ASSERT(activation != NULL);
+        stack_trace->AddActivation(activation);
+        // Grab the awaiter.
+        async_activation ^= activation->GetAsyncAwaiter();
+        break;
+      } else {
+        AppendCodeFrames(thread, isolate, zone, stack_trace, frame, &code,
+                         &inlined_code, &deopt_frame);
+      }
+    }
+  }
+
+  // Return NULL to indicate that there is no useful information in this stack
+  // trace because we never found an awaiter.
+  if (async_activation.IsNull()) {
+    return NULL;
+  }
+
+  // Append the awaiter return call stack.
+  while (!async_activation.IsNull()) {
+    ActivationFrame* activation = new ActivationFrame(async_activation);
+    async_activation ^= activation->GetAsyncAwaiter();
+    activation->ExtractTokenPositionFromAsyncClosure();
+    stack_trace->AddActivation(activation);
+  }
+
+  return stack_trace;
+}
+
+
 ActivationFrame* Debugger::TopDartFrame() const {
   StackFrameIterator iterator(false);
   StackFrame* frame = iterator.NextFrame();
@@ -1828,6 +2076,29 @@
 }
 
 
+bool Debugger::ShouldPauseOnAsyncException(DebuggerStackTrace* stack_trace,
+                                           const Instance& exc) {
+  if (exc_pause_info_ == kNoPauseOnExceptions) {
+    return false;
+  }
+  if (exc_pause_info_ == kPauseOnAllExceptions) {
+    return true;
+  }
+  ASSERT(exc_pause_info_ == kPauseOnUnhandledExceptions);
+  for (intptr_t i = 0; i < stack_trace->Length(); i++) {
+    ActivationFrame* frame = stack_trace->FrameAt(i);
+    if (frame->HandlesException(exc)) {
+      if (FLAG_verbose_debug) {
+        OS::PrintErr("%s is caught by frame %s\n", exc.ToCString(),
+                     frame->ToCString());
+      }
+      return false;
+    }
+  }
+  return true;
+}
+
+
 bool Debugger::ShouldPauseOnException(DebuggerStackTrace* stack_trace,
                                       const Instance& exception) {
   if (exc_pause_info_ == kNoPauseOnExceptions) {
@@ -1859,9 +2130,16 @@
       (exc_pause_info_ == kNoPauseOnExceptions)) {
     return;
   }
+  DebuggerStackTrace* awaiter_stack_trace = CollectAwaiterReturnStackTrace();
   DebuggerStackTrace* stack_trace = CollectStackTrace();
-  if (!ShouldPauseOnException(stack_trace, exc)) {
-    return;
+  if (awaiter_stack_trace != NULL) {
+    if (!ShouldPauseOnAsyncException(awaiter_stack_trace, exc)) {
+      return;
+    }
+  } else {
+    if (!ShouldPauseOnException(stack_trace, exc)) {
+      return;
+    }
   }
   ServiceEvent event(isolate_, ServiceEvent::kPauseException);
   event.set_exception(&exc);
@@ -3291,10 +3569,12 @@
   }
 
   if (FLAG_verbose_debug) {
-    OS::Print(">>> hit breakpoint at %s:%" Pd " (token %s) (address %#" Px
-              ")\n",
-              String::Handle(cbpt->SourceUrl()).ToCString(), cbpt->LineNumber(),
-              cbpt->token_pos().ToCString(), top_frame->pc());
+    OS::Print(">>> hit breakpoint %" Pd " at %s:%" Pd
+              " (token %s) "
+              "(address %#" Px ")\n",
+              bpt_hit->id(), String::Handle(cbpt->SourceUrl()).ToCString(),
+              cbpt->LineNumber(), cbpt->token_pos().ToCString(),
+              top_frame->pc());
   }
 
   CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace());
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index bf932fe..d9acb88 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -260,6 +260,7 @@
     kRegular,
     kAsyncSuspensionMarker,
     kAsyncCausal,
+    kAsyncActivation,
   };
 
   ActivationFrame(uword pc,
@@ -274,6 +275,8 @@
 
   explicit ActivationFrame(Kind kind);
 
+  explicit ActivationFrame(const Closure& async_activation);
+
   uword pc() const { return pc_; }
   uword fp() const { return fp_; }
   uword sp() const { return sp_; }
@@ -332,6 +335,10 @@
   // the complete script, function, and, local variable objects are included.
   void PrintToJSONObject(JSONObject* jsobj, bool full = false);
 
+  RawObject* GetAsyncAwaiter();
+
+  bool HandlesException(const Instance& exc_obj);
+
  private:
   void PrintToJSONObjectRegular(JSONObject* jsobj, bool full);
   void PrintToJSONObjectAsyncCausal(JSONObject* jsobj, bool full);
@@ -346,6 +353,13 @@
   void GetVarDescriptors();
   void GetDescIndices();
 
+  RawObject* GetAsyncContextVariable(const String& name);
+  RawObject* GetAsyncStreamControllerStreamAwaiter(const Object& stream);
+  RawObject* GetAsyncStreamControllerStream();
+  RawObject* GetAsyncCompleterAwaiter(const Object& completer);
+  RawObject* GetAsyncCompleter();
+  void ExtractTokenPositionFromAsyncClosure();
+
   static const char* KindToCString(Kind kind) {
     switch (kind) {
       case kRegular:
@@ -627,12 +641,14 @@
   void SyncBreakpointLocation(BreakpointLocation* loc);
 
   ActivationFrame* TopDartFrame() const;
-  static ActivationFrame* CollectDartFrame(Isolate* isolate,
-                                           uword pc,
-                                           StackFrame* frame,
-                                           const Code& code,
-                                           const Array& deopt_frame,
-                                           intptr_t deopt_frame_offset);
+  static ActivationFrame* CollectDartFrame(
+      Isolate* isolate,
+      uword pc,
+      StackFrame* frame,
+      const Code& code,
+      const Array& deopt_frame,
+      intptr_t deopt_frame_offset,
+      ActivationFrame::Kind kind = ActivationFrame::kRegular);
   static RawArray* DeoptimizeToArray(Thread* thread,
                                      StackFrame* frame,
                                      const Code& code);
@@ -648,10 +664,14 @@
                                Array* deopt_frame);
   static DebuggerStackTrace* CollectStackTrace();
   static DebuggerStackTrace* CollectAsyncCausalStackTrace();
+  static DebuggerStackTrace* CollectAwaiterReturnStackTrace();
   void SignalPausedEvent(ActivationFrame* top_frame, Breakpoint* bpt);
 
   intptr_t nextId() { return next_id_++; }
 
+  bool ShouldPauseOnAsyncException(DebuggerStackTrace* stack_trace,
+                                   const Instance& exc);
+
   bool ShouldPauseOnException(DebuggerStackTrace* stack_trace,
                               const Instance& exc);
 
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 7799153..c2a3350 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -99,6 +99,7 @@
   int16_t outer_try_index;     // Try block index of enclosing try block.
   int8_t needs_stacktrace;     // True if a stacktrace is needed.
   int8_t has_catch_all;        // Catches all exceptions.
+  int8_t is_generated;         // True if this is a generated handler.
 };
 
 }  // namespace dart
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index 8a3a691..1ddea4e 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -46,6 +46,7 @@
       loop_headers_(NULL),
       loop_invariant_loads_(NULL),
       deferred_prefixes_(parsed_function.deferred_prefixes()),
+      await_token_positions_(NULL),
       captured_parameters_(new (zone()) BitVector(zone(), variable_count())),
       inlining_id_(-1) {
   DiscoverBlocks();
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 9e20957..ff4b7a4 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -286,6 +286,15 @@
   // Merge instructions (only per basic-block).
   void TryOptimizePatterns();
 
+  ZoneGrowableArray<TokenPosition>* await_token_positions() const {
+    return await_token_positions_;
+  }
+
+  void set_await_token_positions(
+      ZoneGrowableArray<TokenPosition>* await_token_positions) {
+    await_token_positions_ = await_token_positions;
+  }
+
   // Replaces uses that are dominated by dom of 'def' with 'other'.
   // Note: uses that occur at instruction dom itself are not dominated by it.
   static void RenameDominatedUses(Definition* def,
@@ -391,6 +400,7 @@
   ZoneGrowableArray<BlockEntryInstr*>* loop_headers_;
   ZoneGrowableArray<BitVector*>* loop_invariant_loads_;
   ZoneGrowableArray<const LibraryPrefix*>* deferred_prefixes_;
+  ZoneGrowableArray<TokenPosition>* await_token_positions_;
   DirectChainedHashMap<ConstantPoolTrait> constant_instr_pool_;
   BitVector* captured_parameters_;
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index b5061df..bb52f8f 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -323,7 +323,8 @@
       nesting_stack_(NULL),
       osr_id_(osr_id),
       jump_count_(0),
-      await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()) {}
+      await_joins_(new (Z) ZoneGrowableArray<JoinEntryInstr*>()),
+      await_token_positions_(new (Z) ZoneGrowableArray<TokenPosition>()) {}
 
 
 void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
@@ -2186,6 +2187,8 @@
   Value* jump_val = Bind(new (Z) ConstantInstr(
       Smi::ZoneHandle(Z, Smi::New(jump_count)), node->token_pos()));
   Do(BuildStoreLocal(*jump_var, jump_val, node->token_pos()));
+  // Add a mapping from jump_count -> token_position.
+  owner()->AppendAwaitTokenPosition(node->token_pos());
   // Save the current context for resuming.
   BuildSaveContext(*ctx_var, node->token_pos());
 }
@@ -3432,7 +3435,7 @@
   node->value()->Visit(&for_value);
   Append(for_value);
   Value* store_value = for_value.value();
-  if (Isolate::Current()->type_checks()) {
+  if (isolate()->type_checks()) {
     const AbstractType& type =
         AbstractType::ZoneHandle(Z, node->field().type());
     const String& dst_name = String::ZoneHandle(Z, node->field().name());
@@ -3440,7 +3443,7 @@
                                        type, dst_name);
   }
 
-  if (FLAG_use_field_guards) {
+  if (isolate()->use_field_guards()) {
     store_value = Bind(BuildStoreExprTemp(store_value, token_pos));
     GuardFieldClassInstr* guard_field_class = new (Z) GuardFieldClassInstr(
         store_value, node->field(), thread()->GetNextDeoptId());
@@ -4078,6 +4081,7 @@
   ASSERT(!catch_block->stacktrace_var().is_captured());
 
   CatchBlockEntryInstr* catch_entry = new (Z) CatchBlockEntryInstr(
+      catch_block->token_pos(), (node->token_pos() == TokenPosition::kNoSource),
       owner()->AllocateBlockId(), catch_handler_index, owner()->graph_entry(),
       catch_block->handler_types(), try_handler_index,
       catch_block->exception_var(), catch_block->stacktrace_var(),
@@ -4120,6 +4124,8 @@
     const Array& types = Array::ZoneHandle(Z, Array::New(1, Heap::kOld));
     types.SetAt(0, Object::dynamic_type());
     CatchBlockEntryInstr* finally_entry = new (Z) CatchBlockEntryInstr(
+        finally_block->token_pos(),
+        true,  // this is not a catch block from user code.
         owner()->AllocateBlockId(), original_handler_index,
         owner()->graph_entry(), types, catch_handler_index,
         catch_block->exception_var(), catch_block->stacktrace_var(),
@@ -4367,10 +4373,16 @@
 
   FlowGraph* graph =
       new (Z) FlowGraph(parsed_function(), graph_entry_, last_used_block_id_);
+  graph->set_await_token_positions(await_token_positions_);
   return graph;
 }
 
 
+void FlowGraphBuilder::AppendAwaitTokenPosition(TokenPosition token_pos) {
+  await_token_positions_->Add(token_pos);
+}
+
+
 void FlowGraphBuilder::PruneUnreachable() {
   ASSERT(osr_id_ != Compiler::kNoOSRDeoptId);
   BitVector* block_marks = new (Z) BitVector(Z, last_used_block_id_ + 1);
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 98819bc..56ca965 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -172,6 +172,12 @@
   Isolate* isolate() const { return parsed_function().isolate(); }
   Zone* zone() const { return parsed_function().zone(); }
 
+  void AppendAwaitTokenPosition(TokenPosition token_pos);
+
+  ZoneGrowableArray<TokenPosition>* await_token_positions() const {
+    return await_token_positions_;
+  }
+
  private:
   friend class NestedStatement;  // Explicit access to nesting_stack_.
   friend class Intrinsifier;
@@ -212,6 +218,7 @@
 
   intptr_t jump_count_;
   ZoneGrowableArray<JoinEntryInstr*>* await_joins_;
+  ZoneGrowableArray<TokenPosition>* await_token_positions_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(FlowGraphBuilder);
 };
diff --git a/runtime/vm/flow_graph_builder_test.cc b/runtime/vm/flow_graph_builder_test.cc
index 122e6d4..74a8562 100644
--- a/runtime/vm/flow_graph_builder_test.cc
+++ b/runtime/vm/flow_graph_builder_test.cc
@@ -215,10 +215,7 @@
       BlockEntryInstr* entry = (*blocks_)[i];
       for (ForwardInstructionIterator it(entry); !it.Done(); it.Advance()) {
         Instruction* instr = it.Current();
-        TokenPosition token_pos = instr->token_pos();
-        if (token_pos.IsSynthetic()) {
-          token_pos = token_pos.FromSynthetic();
-        }
+        const TokenPosition token_pos = instr->token_pos().SourcePosition();
         if (!token_pos.IsReal()) {
           continue;
         }
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 0c9c743..1aa4347 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -671,10 +671,13 @@
 void FlowGraphCompiler::AddExceptionHandler(intptr_t try_index,
                                             intptr_t outer_try_index,
                                             intptr_t pc_offset,
+                                            TokenPosition token_pos,
+                                            bool is_generated,
                                             const Array& handler_types,
                                             bool needs_stacktrace) {
   exception_handlers_list_->AddHandler(try_index, outer_try_index, pc_offset,
-                                       handler_types, needs_stacktrace);
+                                       token_pos, is_generated, handler_types,
+                                       needs_stacktrace);
 }
 
 
@@ -1081,7 +1084,7 @@
       if (field.is_instance() &&
           (FLAG_precompiled_mode || !IsPotentialUnboxedField(field))) {
         GenerateInlinedGetter(field.Offset());
-        return !FLAG_use_field_guards;
+        return !isolate()->use_field_guards();
       }
       return false;
     }
@@ -1094,7 +1097,7 @@
       if (field.is_instance() &&
           (FLAG_precompiled_mode || field.guarded_cid() == kDynamicCid)) {
         GenerateInlinedSetter(field.Offset());
-        return !FLAG_use_field_guards;
+        return !isolate()->use_field_guards();
       }
       return false;
     }
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index a382ef6..b0f034d 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -491,6 +491,8 @@
   void AddExceptionHandler(intptr_t try_index,
                            intptr_t outer_try_index,
                            intptr_t pc_offset,
+                           TokenPosition token_pos,
+                           bool is_generated,
                            const Array& handler_types,
                            bool needs_stacktrace);
   void SetNeedsStackTrace(intptr_t try_index);
diff --git a/runtime/vm/flow_graph_range_analysis.cc b/runtime/vm/flow_graph_range_analysis.cc
index b19b4e6..d680ea6 100644
--- a/runtime/vm/flow_graph_range_analysis.cc
+++ b/runtime/vm/flow_graph_range_analysis.cc
@@ -2348,7 +2348,7 @@
     *result_min = RangeBoundary::FromConstant(0);
   } else {
     *result_min =
-        RangeBoundary::FromConstant(static_cast<int64_t>(-1) << bitsize);
+        RangeBoundary::FromConstant(-(static_cast<int64_t>(1) << bitsize));
   }
 
   *result_max =
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 5f837bf..b58d9bf 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -1469,7 +1469,9 @@
 
 class CatchBlockEntryInstr : public BlockEntryInstr {
  public:
-  CatchBlockEntryInstr(intptr_t block_id,
+  CatchBlockEntryInstr(TokenPosition handler_token_pos,
+                       bool is_generated,
+                       intptr_t block_id,
                        intptr_t try_index,
                        GraphEntryInstr* graph_entry,
                        const Array& handler_types,
@@ -1487,7 +1489,9 @@
         exception_var_(exception_var),
         stacktrace_var_(stacktrace_var),
         needs_stacktrace_(needs_stacktrace),
-        should_restore_closure_context_(should_restore_closure_context) {
+        should_restore_closure_context_(should_restore_closure_context),
+        handler_token_pos_(handler_token_pos),
+        is_generated_(is_generated) {
     deopt_id_ = deopt_id;
   }
 
@@ -1508,6 +1512,9 @@
 
   bool needs_stacktrace() const { return needs_stacktrace_; }
 
+  bool is_generated() const { return is_generated_; }
+  TokenPosition handler_token_pos() const { return handler_token_pos_; }
+
   // Returns try index for the try block to which this catch handler
   // corresponds.
   intptr_t catch_try_index() const { return catch_try_index_; }
@@ -1541,6 +1548,8 @@
   const LocalVariable& stacktrace_var_;
   const bool needs_stacktrace_;
   const bool should_restore_closure_context_;
+  TokenPosition handler_token_pos_;
+  bool is_generated_;
 
   DISALLOW_COPY_AND_ASSIGN(CatchBlockEntryInstr);
 };
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 093970f..a327937 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -2874,6 +2874,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index fa44b58..0d78d48 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -2594,6 +2594,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/intermediate_language_dbc.cc b/runtime/vm/intermediate_language_dbc.cc
index e15e4fa..7e63b63 100644
--- a/runtime/vm/intermediate_language_dbc.cc
+++ b/runtime/vm/intermediate_language_dbc.cc
@@ -1149,6 +1149,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 7ccabe0..e19bbf1 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -2515,6 +2515,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index fec6937..36217a4 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -2731,6 +2731,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index a835e4c..0193a09 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -2546,6 +2546,7 @@
   __ Bind(compiler->GetJumpLabel(this));
   compiler->AddExceptionHandler(catch_try_index(), try_index(),
                                 compiler->assembler()->CodeSize(),
+                                handler_token_pos(), is_generated(),
                                 catch_handler_types_, needs_stacktrace());
   // On lazy deoptimization we patch the optimized code here to enter the
   // deoptimization stub.
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index c4dd798..af870e9 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -726,6 +726,7 @@
   api_flags->enable_asserts = FLAG_enable_asserts;
   api_flags->enable_error_on_bad_type = FLAG_error_on_bad_type;
   api_flags->enable_error_on_bad_override = FLAG_error_on_bad_override;
+  api_flags->use_field_guards = FLAG_use_field_guards;
 }
 
 
@@ -735,6 +736,7 @@
   api_flags->enable_asserts = asserts();
   api_flags->enable_error_on_bad_type = error_on_bad_type();
   api_flags->enable_error_on_bad_override = error_on_bad_override();
+  api_flags->use_field_guards = use_field_guards();
 }
 
 
@@ -744,6 +746,7 @@
   asserts_ = api_flags.enable_asserts;
   error_on_bad_type_ = api_flags.enable_error_on_bad_type;
   error_on_bad_override_ = api_flags.enable_error_on_bad_override;
+  use_field_guards_ = api_flags.use_field_guards;
   // Leave others at defaults.
 }
 #endif  // !defined(PRODUCT)
@@ -1780,11 +1783,17 @@
   // TODO(5411455): For now just make sure there are no current isolates
   // as we are shutting down the isolate.
   Thread::ExitIsolate();
+
+  Dart_IsolateCleanupCallback cleanup = Isolate::CleanupCallback();
+  if (cleanup != NULL) {
+    cleanup(init_callback_data());
+  }
 }
 
 
 Dart_IsolateCreateCallback Isolate::create_callback_ = NULL;
 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = NULL;
+Dart_IsolateCleanupCallback Isolate::cleanup_callback_ = NULL;
 
 Monitor* Isolate::isolates_list_monitor_ = NULL;
 Isolate* Isolate::isolates_list_head_ = NULL;
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 115a3a9..3d9bf2b 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -399,6 +399,14 @@
     return shutdown_callback_;
   }
 
+  static void SetCleanupCallback(Dart_IsolateCleanupCallback cb) {
+    cleanup_callback_ = cb;
+  }
+  static Dart_IsolateCleanupCallback CleanupCallback() {
+    return cleanup_callback_;
+  }
+
+
   void set_object_id_ring(ObjectIdRing* ring) { object_id_ring_ = ring; }
   ObjectIdRing* object_id_ring() { return object_id_ring_; }
 
@@ -630,11 +638,13 @@
   bool asserts() const { return FLAG_enable_asserts; }
   bool error_on_bad_type() const { return FLAG_error_on_bad_type; }
   bool error_on_bad_override() const { return FLAG_error_on_bad_override; }
+  bool use_field_guards() const { return FLAG_use_field_guards; }
 #else   // defined(PRODUCT)
   bool type_checks() const { return type_checks_; }
   bool asserts() const { return asserts_; }
   bool error_on_bad_type() const { return error_on_bad_type_; }
   bool error_on_bad_override() const { return error_on_bad_override_; }
+  bool use_field_guards() const { return use_field_guards_; }
 #endif  // defined(PRODUCT)
 
   static void KillAllIsolates(LibMsgId msg_id);
@@ -764,6 +774,7 @@
   bool asserts_;
   bool error_on_bad_type_;
   bool error_on_bad_override_;
+  bool use_field_guards_;
 #endif  // !defined(PRODUCT)
 
   // Timestamps of last operation via service.
@@ -851,6 +862,7 @@
 
   static Dart_IsolateCreateCallback create_callback_;
   static Dart_IsolateShutdownCallback shutdown_callback_;
+  static Dart_IsolateCleanupCallback cleanup_callback_;
 
   static void WakePauseEventHandler(Dart_Isolate isolate);
 
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index 8bc0776..ac9db2d3 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -1805,7 +1805,7 @@
     AddReceiverCheck(instr);
   }
   if (field.guarded_cid() != kDynamicCid) {
-    ASSERT(FLAG_use_field_guards);
+    ASSERT(I->use_field_guards());
     InsertBefore(
         instr, new (Z) GuardFieldClassInstr(new (Z) Value(instr->ArgumentAt(1)),
                                             field, instr->deopt_id()),
@@ -1813,7 +1813,7 @@
   }
 
   if (field.needs_length_check()) {
-    ASSERT(FLAG_use_field_guards);
+    ASSERT(I->use_field_guards());
     InsertBefore(instr, new (Z) GuardFieldLengthInstr(
                             new (Z) Value(instr->ArgumentAt(1)), field,
                             instr->deopt_id()),
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index df7bec8..d7e526f 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -318,7 +318,7 @@
 
  private:
   Program* program_;
-  MallocGrowableArray<Ref<CanonicalName> > canonical_names_;
+  MallocGrowableArray<CanonicalName*> canonical_names_;
   BlockStack<VariableDeclaration> scope_;
   BlockStack<TypeParameter> type_parameters_;
   BlockStack<SwitchCase> switch_cases_;
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index e10391c..d0a09f8 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -68,8 +68,19 @@
       return;
     }
 
+    // Note: these flags must match those passed to the VM during
+    // the app-jit training run (see //utils/kernel-service/BUILD.gn).
     Dart_IsolateFlags api_flags;
-    Isolate::FlagsInitialize(&api_flags);
+    api_flags.version = DART_FLAGS_CURRENT_VERSION;
+    api_flags.enable_type_checks = false;
+    api_flags.enable_asserts = false;
+    api_flags.enable_error_on_bad_type = false;
+    api_flags.enable_error_on_bad_override = false;
+#if defined(DART_PRECOMPILER)
+    api_flags.use_field_guards = false;
+#else
+    api_flags.use_field_guards = true;
+#endif
 
     isolate = reinterpret_cast<Isolate*>(create_callback(
         KernelIsolate::kName, NULL, NULL, NULL, &api_flags, NULL, &error));
diff --git a/runtime/vm/kernel_to_il.cc b/runtime/vm/kernel_to_il.cc
index 57a1ba3..6f1a8c1 100644
--- a/runtime/vm/kernel_to_il.cc
+++ b/runtime/vm/kernel_to_il.cc
@@ -2277,6 +2277,8 @@
   const bool should_restore_closure_context =
       CurrentException()->is_captured() || CurrentCatchContext()->is_captured();
   CatchBlockEntryInstr* entry = new (Z) CatchBlockEntryInstr(
+      TokenPosition::kNoSource,  // Token position of catch block.
+      false,                     // Not an artifact of compilation.
       AllocateBlockId(), CurrentTryIndex(), graph_entry_, handler_types,
       handler_index, *CurrentException(), *CurrentStackTrace(),
       /* needs_stacktrace = */ true, H.thread()->GetNextDeoptId(),
@@ -2686,7 +2688,7 @@
     bool is_initialization_store) {
   Fragment instructions;
   const dart::Field& field_clone = MayCloneField(Z, field);
-  if (FLAG_use_field_guards) {
+  if (I->use_field_guards()) {
     LocalVariable* store_expression = MakeTemporary();
     instructions += LoadLocal(store_expression);
     instructions += GuardFieldClass(field_clone, H.thread()->GetNextDeoptId());
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 386c301..37f76b2 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -7655,7 +7655,7 @@
   // dynamic and possibly null). Attempt to relax this later.
   const bool use_guarded_cid =
       FLAG_precompiled_mode ||
-      (FLAG_use_field_guards && !isolate->HasAttemptedReload());
+      (isolate->use_field_guards() && !isolate->HasAttemptedReload());
   result.set_guarded_cid(use_guarded_cid ? kIllegalCid : kDynamicCid);
   result.set_is_nullable(use_guarded_cid ? false : true);
   result.set_guarded_list_length_in_object_offset(Field::kUnknownLengthOffset);
@@ -8166,7 +8166,7 @@
 
 void Field::RecordStore(const Object& value) const {
   ASSERT(IsOriginal());
-  if (!FLAG_use_field_guards) {
+  if (!Isolate::Current()->use_field_guards()) {
     return;
   }
 
@@ -12493,7 +12493,9 @@
                                        intptr_t outer_try_index,
                                        uword handler_pc_offset,
                                        bool needs_stacktrace,
-                                       bool has_catch_all) const {
+                                       bool has_catch_all,
+                                       TokenPosition token_pos,
+                                       bool is_generated) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
   NoSafepointScope no_safepoint;
   ExceptionHandlerInfo* info =
@@ -12506,6 +12508,7 @@
   info->handler_pc_offset = handler_pc_offset;
   info->needs_stacktrace = needs_stacktrace;
   info->has_catch_all = has_catch_all;
+  info->is_generated = is_generated;
 }
 
 void ExceptionHandlers::GetHandlerInfo(intptr_t try_index,
@@ -12534,6 +12537,12 @@
 }
 
 
+bool ExceptionHandlers::IsGenerated(intptr_t try_index) const {
+  ASSERT((try_index >= 0) && (try_index < num_entries()));
+  return raw_ptr()->data()[try_index].is_generated;
+}
+
+
 bool ExceptionHandlers::HasCatchAll(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < num_entries()));
   return raw_ptr()->data()[try_index].has_catch_all;
@@ -12612,7 +12621,7 @@
 
 
 const char* ExceptionHandlers::ToCString() const {
-#define FORMAT1 "%" Pd " => %#x  (%" Pd " types) (outer %d)\n"
+#define FORMAT1 "%" Pd " => %#x  (%" Pd " types) (outer %d) %s\n"
 #define FORMAT2 "  %d. %s\n"
   if (num_entries() == 0) {
     return "empty ExceptionHandlers\n";
@@ -12628,7 +12637,8 @@
     const intptr_t num_types =
         handled_types.IsNull() ? 0 : handled_types.Length();
     len += OS::SNPrint(NULL, 0, FORMAT1, i, info.handler_pc_offset, num_types,
-                       info.outer_try_index);
+                       info.outer_try_index,
+                       info.is_generated ? "(generated)" : "");
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
       ASSERT(!type.IsNull());
@@ -12646,7 +12656,8 @@
         handled_types.IsNull() ? 0 : handled_types.Length();
     num_chars +=
         OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT1, i,
-                    info.handler_pc_offset, num_types, info.outer_try_index);
+                    info.handler_pc_offset, num_types, info.outer_try_index,
+                    info.is_generated ? "(generated)" : "");
     for (int k = 0; k < num_types; k++) {
       type ^= handled_types.At(k);
       num_chars += OS::SNPrint((buffer + num_chars), (len - num_chars), FORMAT2,
@@ -14621,6 +14632,14 @@
 }
 
 
+RawArray* Code::await_token_positions() const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Array::null();
+#else
+  return raw_ptr()->await_token_positions_;
+#endif
+}
+
 RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
   ASSERT(num_variables >= 0);
   ASSERT(Object::context_class() != Class::null());
@@ -22504,11 +22523,11 @@
   if (FLAG_precompiled_mode) {
     line = token_pos.value();
   } else {
-    if (!script.IsNull() && token_pos.IsReal()) {
+    if (!script.IsNull() && token_pos.IsSourcePosition()) {
       if (script.HasSource() || script.kind() == RawScript::kKernelTag) {
-        script.GetTokenLocation(token_pos, &line, &column);
+        script.GetTokenLocation(token_pos.SourcePosition(), &line, &column);
       } else {
-        script.GetTokenLocation(token_pos, &line, NULL);
+        script.GetTokenLocation(token_pos.SourcePosition(), &line, NULL);
       }
     }
   }
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index de4a284..84656ed 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -4513,12 +4513,15 @@
   uword HandlerPCOffset(intptr_t try_index) const;
   intptr_t OuterTryIndex(intptr_t try_index) const;
   bool NeedsStackTrace(intptr_t try_index) const;
+  bool IsGenerated(intptr_t try_index) const;
 
   void SetHandlerInfo(intptr_t try_index,
                       intptr_t outer_try_index,
                       uword handler_pc_offset,
                       bool needs_stacktrace,
-                      bool has_catch_all) const;
+                      bool has_catch_all,
+                      TokenPosition token_pos,
+                      bool is_generated) const;
 
   RawArray* GetHandledTypes(intptr_t try_index) const;
   void SetHandledTypes(intptr_t try_index, const Array& handled_types) const;
@@ -4682,6 +4685,9 @@
     StorePointer(&raw_ptr()->code_source_map_, code_source_map.raw());
   }
 
+  RawArray* await_token_positions() const;
+  void SetAwaitTokenPositions(const Array& await_token_positions) const;
+
   // Used during reloading (see object_reload.cc). Calls Reset on all ICDatas
   // that are embedded inside the Code object.
   void ResetICDatas(Zone* zone) const;
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index a7c846b..8cf15a8 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -869,6 +869,13 @@
 }
 
 
+void Code::SetAwaitTokenPositions(const Array& await_token_positions) const {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  StorePointer(&raw_ptr()->await_token_positions_, await_token_positions.raw());
+#endif
+}
+
+
 void Context::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
   // TODO(turnidge): Should the user level type for Context be Context
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 46f8eea..fdaff29 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -2800,10 +2800,14 @@
   exception_handlers ^= ExceptionHandlers::New(kNumEntries);
   const bool kNeedsStackTrace = true;
   const bool kNoStackTrace = false;
-  exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false);
-  exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false);
-  exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStackTrace, true);
-  exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStackTrace, true);
+  exception_handlers.SetHandlerInfo(0, -1, 20u, kNeedsStackTrace, false,
+                                    TokenPosition::kNoSource, true);
+  exception_handlers.SetHandlerInfo(1, 0, 30u, kNeedsStackTrace, false,
+                                    TokenPosition::kNoSource, true);
+  exception_handlers.SetHandlerInfo(2, -1, 40u, kNoStackTrace, true,
+                                    TokenPosition::kNoSource, true);
+  exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStackTrace, true,
+                                    TokenPosition::kNoSource, true);
 
   extern void GenerateIncrement(Assembler * assembler);
   Assembler _assembler_;
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index f9664bd..f139e76 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -6609,7 +6609,7 @@
   // :controller.AddError(:exception, :stack_trace);
   // return;  // The finally block will close the stream.
   LocalVariable* controller =
-      current_block_->scope->LookupVariable(Symbols::Controller(), false);
+      current_block_->scope->LookupVariable(Symbols::ColonController(), false);
   ASSERT(controller != NULL);
   ArgumentListNode* args = new (Z) ArgumentListNode(TokenPosition::kNoSource);
   args->Add(new (Z)
@@ -6817,6 +6817,8 @@
   // This is the outermost try-catch in the function.
   ASSERT(try_stack_ == NULL);
   PushTry(current_block_);
+  // Validate that we always get try index of 0.
+  ASSERT(try_stack_->try_index() == CatchClauseNode::kImplicitAsyncTryIndex);
 
   SetupSavedTryContext(context_var);
 }
@@ -7086,11 +7088,12 @@
   //   var :async_then_callback;
   //   var :async_catch_error_callback;
   //   var :async_stack_trace;
+  //   var :controller_stream;
   // These variables are used to store the async generator closure containing
   // the body of the async* function. They are used by the await operator.
   LocalVariable* controller_var =
       new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
-                            Symbols::Controller(), Object::dynamic_type());
+                            Symbols::ColonController(), Object::dynamic_type());
   current_block_->scope->AddVariable(controller_var);
   LocalVariable* async_op_var =
       new (Z) LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
@@ -7108,6 +7111,10 @@
       LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
                     Symbols::AsyncStackTraceVar(), Object::dynamic_type());
   current_block_->scope->AddVariable(async_stack_trace);
+  LocalVariable* controller_stream = new (Z)
+      LocalVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                    Symbols::ControllerStream(), Object::dynamic_type());
+  current_block_->scope->AddVariable(controller_stream);
 }
 
 
@@ -7177,7 +7184,8 @@
 //   var :async_then_callback = _asyncThenWrapperHelper(:async_op);
 //   var :async_catch_error_callback = _asyncCatchErrorWrapperHelper(:async_op);
 //   :controller = new _AsyncStarStreamController(:async_op);
-//   return :controller.stream;
+//   var :controller_stream = :controller.stream;
+//   return :controller_stream;
 // }
 SequenceNode* Parser::CloseAsyncGeneratorFunction(const Function& closure_func,
                                                   SequenceNode* closure_body) {
@@ -7194,7 +7202,7 @@
       closure_body->scope()->LookupVariable(Symbols::AwaitContextVar(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
   existing_var =
-      closure_body->scope()->LookupVariable(Symbols::Controller(), false);
+      closure_body->scope()->LookupVariable(Symbols::ColonController(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
   existing_var =
       closure_body->scope()->LookupVariable(Symbols::AsyncOperation(), false);
@@ -7208,6 +7216,9 @@
   existing_var = closure_body->scope()->LookupVariable(
       Symbols::AsyncStackTraceVar(), false);
   ASSERT((existing_var != NULL) && existing_var->is_captured());
+  existing_var =
+      closure_body->scope()->LookupVariable(Symbols::ControllerStream(), false);
+  ASSERT((existing_var != NULL) && existing_var->is_captured());
 
   const Library& async_lib = Library::Handle(Library::AsyncLibrary());
 
@@ -7311,18 +7322,33 @@
                                   TypeArguments::ZoneHandle(Z),
                                   controller_constructor, arguments);
   LocalVariable* controller_var =
-      current_block_->scope->LookupVariable(Symbols::Controller(), false);
+      current_block_->scope->LookupVariable(Symbols::ColonController(), false);
   StoreLocalNode* store_controller = new (Z) StoreLocalNode(
       TokenPosition::kNoSource, controller_var, controller_constructor_call);
   current_block_->statements->Add(store_controller);
 
+  // Grab :controller.stream
+  InstanceGetterNode* controller_stream = new (Z) InstanceGetterNode(
+      TokenPosition::kNoSource,
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
+      Symbols::Stream());
+
+  // Store :controller.stream into :controller_stream inside the closure.
+  // We have to remember the stream because a new instance is generated for
+  // each getter invocation and in order to recreate the linkage, we need the
+  // awaited on instance.
+  LocalVariable* controller_stream_var =
+      current_block_->scope->LookupVariable(Symbols::ControllerStream(), false);
+  ASSERT(controller_stream_var != NULL);
+
+  StoreLocalNode* store_controller_stream = new (Z) StoreLocalNode(
+      TokenPosition::kNoSource, controller_stream_var, controller_stream);
+  current_block_->statements->Add(store_controller_stream);
+
   // return :controller.stream;
   ReturnNode* return_node = new (Z) ReturnNode(
       TokenPosition::kNoSource,
-      new (Z) InstanceGetterNode(
-          TokenPosition::kNoSource,
-          new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_var),
-          Symbols::Stream()));
+      new (Z) LoadLocalNode(TokenPosition::kNoSource, controller_stream_var));
   current_block_->statements->Add(return_node);
   return CloseBlock();
 }
@@ -9066,6 +9092,37 @@
       ParseAwaitableExpr(kAllowConst, kConsumeCascades, NULL);
   ExpectToken(Token::kRPAREN);
 
+  // Create :stream to store the stream into temporarily.
+  LocalVariable* stream_var =
+      new (Z) LocalVariable(stream_expr_pos, stream_expr_pos,
+                            Symbols::ColonStream(), Object::dynamic_type());
+  current_block_->scope->AddVariable(stream_var);
+
+  // Store the stream expression into a variable.
+  StoreLocalNode* store_stream_var =
+      new (Z) StoreLocalNode(stream_expr_pos, stream_var, stream_expr);
+  current_block_->statements->Add(store_stream_var);
+
+  // Register the awaiter on the stream by invoking `_asyncStarListenHelper`.
+  const Library& async_lib = Library::Handle(Library::AsyncLibrary());
+  const Function& async_star_listen_helper = Function::ZoneHandle(
+      Z,
+      async_lib.LookupFunctionAllowPrivate(Symbols::_AsyncStarListenHelper()));
+  ASSERT(!async_star_listen_helper.IsNull());
+  LocalVariable* async_op_var =
+      current_block_->scope->LookupVariable(Symbols::AsyncOperation(), false);
+  ASSERT(async_op_var != NULL);
+  ArgumentListNode* async_star_listen_helper_args =
+      new (Z) ArgumentListNode(stream_expr_pos);
+  async_star_listen_helper_args->Add(
+      new (Z) LoadLocalNode(stream_expr_pos, stream_var));
+  async_star_listen_helper_args->Add(
+      new (Z) LoadLocalNode(stream_expr_pos, async_op_var));
+  StaticCallNode* async_star_listen_helper_call = new (Z) StaticCallNode(
+      stream_expr_pos, async_star_listen_helper, async_star_listen_helper_args);
+
+  current_block_->statements->Add(async_star_listen_helper_call);
+
   // Build creation of implicit StreamIterator.
   // var :for-in-iter = new StreamIterator(stream_expr).
   const Class& stream_iterator_cls =
@@ -9076,7 +9133,7 @@
       stream_iterator_cls.LookupFunction(Symbols::StreamIteratorConstructor()));
   ASSERT(!iterator_ctor.IsNull());
   ArgumentListNode* ctor_args = new (Z) ArgumentListNode(stream_expr_pos);
-  ctor_args->Add(stream_expr);
+  ctor_args->Add(new (Z) LoadLocalNode(stream_expr_pos, stream_var));
   ConstructorCallNode* ctor_call = new (Z) ConstructorCallNode(
       stream_expr_pos, TypeArguments::ZoneHandle(Z), iterator_ctor, ctor_args);
   const AbstractType& iterator_type = Object::dynamic_type();
@@ -10348,7 +10405,8 @@
     ASSERT(innermost_function().IsAsyncGenerator() ||
            innermost_function().IsAsyncGenClosure());
 
-    LocalVariable* controller_var = LookupLocalScope(Symbols::Controller());
+    LocalVariable* controller_var =
+        LookupLocalScope(Symbols::ColonController());
     ASSERT(controller_var != NULL);
     // :controller.add[Stream](expr);
     ArgumentListNode* add_args = new (Z) ArgumentListNode(yield_pos);
diff --git a/runtime/vm/profiler_service.cc b/runtime/vm/profiler_service.cc
index 8b9bee9..e750b2c 100644
--- a/runtime/vm/profiler_service.cc
+++ b/runtime/vm/profiler_service.cc
@@ -2590,7 +2590,7 @@
     return NULL;
   }
   TokenPosition token_pos = pfsp.token_pos();
-  if (!token_pos.IsReal() && !token_pos.IsSynthetic()) {
+  if (!token_pos.IsSourcePosition()) {
     // Not a location in a script.
     return NULL;
   }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 85cebf5..7f2afec 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1141,6 +1141,7 @@
   RawArray* stackmaps_;
   RawArray* inlined_id_to_function_;
   RawCodeSourceMap* code_source_map_;
+  NOT_IN_PRECOMPILED(RawArray* await_token_positions_);
   NOT_IN_PRECOMPILED(RawInstructions* active_instructions_);
   NOT_IN_PRECOMPILED(RawArray* deopt_info_array_);
   // (code-offset, function, code) triples.
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 95a71c1..db9d539 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -872,7 +872,7 @@
                      kAsReference);
   field.StorePointer(&field.raw_ptr()->dependent_code_, Array::null());
 
-  if (!FLAG_use_field_guards) {
+  if (!reader->isolate()->use_field_guards()) {
     field.set_guarded_cid(kDynamicCid);
     field.set_is_nullable(true);
     field.set_guarded_list_length(Field::kNoFixedLength);
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index 75f5d68..e7c0432 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -264,6 +264,18 @@
     // Keep :async_op for asynchronous debugging.
     return false;
   }
+  if (str.raw() == Symbols::AsyncCompleter().raw()) {
+    // Keep :async_completer for asynchronous debugging.
+    return false;
+  }
+  if (str.raw() == Symbols::ControllerStream().raw()) {
+    // Keep :controller_stream for asynchronous debugging.
+    return false;
+  }
+  if (str.raw() == Symbols::AwaitJumpVar().raw()) {
+    // Keep :await_jump_var for asynchronous debugging.
+    return false;
+  }
   return str.CharAt(0) == ':';
 }
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 97f0d84..5eddb35 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -513,7 +513,7 @@
       pobj_ = ReadObjectImpl(read_as_reference);
       result->SetFieldAtOffset(offset, pobj_);
       if ((offset != type_argument_field_offset) &&
-          (kind_ == Snapshot::kMessage) && FLAG_use_field_guards) {
+          (kind_ == Snapshot::kMessage) && isolate()->use_field_guards()) {
         // TODO(fschneider): Consider hoisting these lookups out of the loop.
         // This would involve creating a handle, since cls_ can't be reused
         // across the call to ReadObjectImpl.
@@ -580,7 +580,7 @@
   ASSERT(kind_ == Snapshot::kScript);
 
   // First read the version string, and check that it matches.
-  RawApiError* error = VerifyVersionAndFeatures();
+  RawApiError* error = VerifyVersionAndFeatures(Isolate::Current());
   if (error != ApiError::null()) {
     return error;
   }
@@ -602,7 +602,7 @@
 }
 
 
-RawApiError* SnapshotReader::VerifyVersionAndFeatures() {
+RawApiError* SnapshotReader::VerifyVersionAndFeatures(Isolate* isolate) {
   // If the version string doesn't match, return an error.
   // Note: New things are allocated only if we're going to return an error.
 
@@ -639,7 +639,7 @@
   }
   Advance(version_len);
 
-  const char* expected_features = Dart::FeaturesString(kind_);
+  const char* expected_features = Dart::FeaturesString(isolate, kind_);
   ASSERT(expected_features != NULL);
   const intptr_t expected_len = strlen(expected_features);
 
@@ -1842,7 +1842,8 @@
   const intptr_t version_len = strlen(expected_version);
   WriteBytes(reinterpret_cast<const uint8_t*>(expected_version), version_len);
 
-  const char* expected_features = Dart::FeaturesString(kind_);
+  const char* expected_features =
+      Dart::FeaturesString(Isolate::Current(), kind_);
   ASSERT(expected_features != NULL);
   const intptr_t features_len = strlen(expected_features);
   WriteBytes(reinterpret_cast<const uint8_t*>(expected_features),
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 487aaa9..6051639 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -396,7 +396,7 @@
   RawObject* ReadScriptSnapshot();
 
   // Read version number of snapshot and verify.
-  RawApiError* VerifyVersionAndFeatures();
+  RawApiError* VerifyVersionAndFeatures(Isolate* isolate);
 
   RawObject* NewInteger(int64_t value);
 
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 1508ae7..cc3cf21 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -332,8 +332,7 @@
       for (intptr_t i = 0; i < profile_function->NumSourcePositions(); i++) {
         const ProfileFunctionSourcePosition& position =
             profile_function->GetSourcePosition(i);
-        if (position.token_pos().IsSourcePosition() &&
-            !position.token_pos().IsNoSource()) {
+        if (position.token_pos().IsSourcePosition()) {
           // Add as an integer.
           positions.AddValue(position.token_pos().Pos());
         } else {
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 828a7de..edc7f1b 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -46,8 +46,10 @@
   V(IteratorParameter, ":iterator")                                            \
   V(_AsyncStarStreamController, "_AsyncStarStreamController")                  \
   V(_AsyncStarStreamControllerConstructor, "_AsyncStarStreamController.")      \
-  V(Controller, ":controller")                                                 \
+  V(ColonController, ":controller")                                            \
+  V(ControllerStream, ":controller_stream")                                    \
   V(Stream, "stream")                                                          \
+  V(_StreamImpl, "_StreamImpl")                                                \
   V(isPaused, "isPaused")                                                      \
   V(AddError, "addError")                                                      \
   V(AddStream, "addStream")                                                    \
@@ -127,6 +129,7 @@
   V(AsyncStackTraceHelper, "_asyncStackTraceHelper")                           \
   V(AsyncAwaitHelper, "_awaitHelper")                                          \
   V(Await, "await")                                                            \
+  V(_Awaiter, "_awaiter")                                                      \
   V(AwaitTempVarPrefix, ":await_temp_var_")                                    \
   V(AwaitContextVar, ":await_ctx_var")                                         \
   V(AwaitJumpVar, ":await_jump_var")                                           \
@@ -218,6 +221,7 @@
   V(_RegExp, "_RegExp")                                                        \
   V(RegExp, "RegExp")                                                          \
   V(ColonMatcher, ":matcher")                                                  \
+  V(ColonStream, ":stream")                                                    \
   V(Object, "Object")                                                          \
   V(Int, "int")                                                                \
   V(Double, "double")                                                          \
@@ -429,7 +433,8 @@
   V(_classRangeCheckNegative, "_classRangeCheckNegative")                      \
   V(GetRuntimeType, "get:runtimeType")                                         \
   V(HaveSameRuntimeType, "_haveSameRuntimeType")                               \
-  V(DartDeveloperCausalAsyncStacks, "dart.developer.causal_async_stacks")
+  V(DartDeveloperCausalAsyncStacks, "dart.developer.causal_async_stacks")      \
+  V(_AsyncStarListenHelper, "_asyncStarListenHelper")
 
 
 // Contains a list of frequently used strings in a canonicalized form. This
diff --git a/runtime/vm/token_position.h b/runtime/vm/token_position.h
index b0a2062..65dd3ed 100644
--- a/runtime/vm/token_position.h
+++ b/runtime/vm/token_position.h
@@ -134,9 +134,11 @@
   bool IsReal() const { return value_ >= kMinSourcePos; }
 
   // Is |this| a source position?
-  bool IsSourcePosition() const {
-    return IsReal() || IsNoSource() || IsSynthetic();
-  }
+  bool IsSourcePosition() const { return IsReal() || IsSynthetic(); }
+
+  // Convert |this| into a real source position. Sentinel values remain
+  // unchanged.
+  TokenPosition SourcePosition() const { return FromSynthetic(); }
 
   // Is |this| a debug pause source position?
   bool IsDebugPause() const {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 86e80d8..6e1548d 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -3361,6 +3361,59 @@
   throw new TypeErrorImplementation(value, 'void');
 }
 
+extractFunctionTypeObjectFrom(o) {
+  var interceptor = getInterceptor(o);
+  var signatureName = JS_GET_NAME(JsGetName.SIGNATURE_NAME);
+  return JS('bool', '# in #', signatureName, interceptor)
+      ? JS('', '#[#]()', interceptor, signatureName)
+      : null;
+}
+
+functionTypeTest(value, functionTypeRti) {
+  if (value == null) return false;
+  var functionTypeObject = extractFunctionTypeObjectFrom(value);
+  return functionTypeObject == null
+      ? false
+      : isFunctionSubtype(functionTypeObject, functionTypeRti);
+}
+
+// Declared as 'var' to avoid assignment checks.
+var _inTypeAssertion = false;
+
+functionTypeCheck(value, functionTypeRti) {
+  if (value == null) return value;
+
+  // The function type test code contains type assertions for function
+  // types. This leads to unbounded recursion, so disable the type checking of
+  // function types while checking function types.
+
+  if (true == _inTypeAssertion) return value;
+
+  _inTypeAssertion = true;
+  try {
+    if (functionTypeTest(value, functionTypeRti)) return value;
+    var self = runtimeTypeToString(functionTypeRti);
+    throw new TypeErrorImplementation(value, self);
+  } finally {
+    _inTypeAssertion = false;
+  }
+}
+
+functionTypeCast(value, functionTypeRti) {
+  if (value == null) return value;
+  if (functionTypeTest(value, functionTypeRti)) return value;
+
+  var self = runtimeTypeToString(functionTypeRti);
+  var functionTypeObject = extractFunctionTypeObjectFrom(value);
+  var pretty;
+  if (functionTypeObject != null) {
+    pretty = runtimeTypeToString(functionTypeObject);
+  } else {
+    pretty = Primitives.objectTypeName(value);
+  }
+  throw new CastErrorImplementation(pretty, self);
+}
+
 checkMalformedType(value, message) {
   if (value == null) return value;
   throw new TypeErrorImplementation.fromMessage(message);
@@ -3489,338 +3542,6 @@
   }
 }
 
-abstract class RuntimeType {
-  const RuntimeType();
-
-  toRti();
-}
-
-class RuntimeFunctionType extends RuntimeType {
-  final RuntimeType returnType;
-  final List<RuntimeType> parameterTypes;
-  final List<RuntimeType> optionalParameterTypes;
-  final namedParameters;
-
-  static var /* bool */ inAssert = false;
-
-  RuntimeFunctionType(this.returnType,
-                      this.parameterTypes,
-                      this.optionalParameterTypes,
-                      this.namedParameters);
-
-  bool get isVoid => returnType is VoidRuntimeType;
-
-  /// Called from generated code. [expression] is a Dart object and this method
-  /// returns true if [this] is a supertype of [expression].
-  @NoInline() @NoSideEffects()
-  bool _isTest(expression) {
-    var functionTypeObject = extractFunctionTypeObjectFrom(expression);
-    return functionTypeObject == null
-        ? false
-        : isFunctionSubtype(functionTypeObject, toRti());
-  }
-
-  @NoInline() @NoSideEffects()
-  _asCheck(expression) {
-    // Type inferrer doesn't think this is called with dynamic arguments.
-    return _check(JS('', '#', expression), true);
-  }
-
-  @NoInline() @NoSideEffects()
-  _assertCheck(expression) {
-    if (inAssert) return null;
-    inAssert = true; // Don't try to check this library itself.
-    try {
-      // Type inferrer don't think this is called with dynamic arguments.
-      return _check(JS('', '#', expression), false);
-    } finally {
-      inAssert = false;
-    }
-  }
-
-  _check(expression, bool isCast) {
-    if (expression == null) return null;
-    if (_isTest(expression)) return expression;
-
-    var self = runtimeTypeToString(toRti());
-    if (isCast) {
-      var functionTypeObject = extractFunctionTypeObjectFrom(expression);
-      var pretty;
-      if (functionTypeObject != null) {
-        pretty = runtimeTypeToString(functionTypeObject);
-      } else {
-        pretty = Primitives.objectTypeName(expression);
-      }
-      throw new CastErrorImplementation(pretty, self);
-    } else {
-      // TODO(ahe): Pass "pretty" function-type to TypeErrorImplementation?
-      throw new TypeErrorImplementation(expression, self);
-    }
-  }
-
-  toRti() {
-    var result = createDartFunctionTypeRti();
-    if (isVoid) {
-      JS('', '#[#] = true', result,
-          JS_GET_NAME(JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG));
-    } else {
-      if (returnType is! DynamicRuntimeType) {
-        JS('', '#[#] = #', result,
-           JS_GET_NAME(JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG),
-           returnType.toRti());
-      }
-    }
-    if (parameterTypes != null && !parameterTypes.isEmpty) {
-      JS('', '#[#] = #', result,
-         JS_GET_NAME(JsGetName.FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG),
-         listToRti(parameterTypes));
-    }
-
-    if (optionalParameterTypes != null && !optionalParameterTypes.isEmpty) {
-      JS('', '#[#] = #', result,
-         JS_GET_NAME(JsGetName.FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG),
-         listToRti(optionalParameterTypes));
-    }
-
-    if (namedParameters != null) {
-      var namedRti = JS('=Object', 'Object.create(null)');
-      var keys = extractKeys(namedParameters);
-      for (var i = 0; i < keys.length; i++) {
-        var name = keys[i];
-        var rti = JS('', '#[#]', namedParameters, name).toRti();
-        JS('', '#[#] = #', namedRti, name, rti);
-      }
-      JS('', '#[#] = #', result,
-         JS_GET_NAME(JsGetName.FUNCTION_TYPE_NAMED_PARAMETERS_TAG),
-         namedRti);
-    }
-
-    return result;
-  }
-
-  static listToRti(list) {
-    list = JS('JSFixedArray', '#', list);
-    var result = JS('JSExtendableArray', '[]');
-    for (var i = 0; i < list.length; i++) {
-      JS('', '#.push(#)', result, list[i].toRti());
-    }
-    return result;
-  }
-
-  String toString() {
-    String result = '(';
-    bool needsComma = false;
-    if (parameterTypes != null) {
-      for (var i = 0; i < parameterTypes.length; i++) {
-        RuntimeType type = parameterTypes[i];
-        if (needsComma) result += ', ';
-        result += '$type';
-        needsComma = true;
-      }
-    }
-    if (optionalParameterTypes != null && !optionalParameterTypes.isEmpty) {
-      if (needsComma) result += ', ';
-      needsComma = false;
-      result += '[';
-      for (var i = 0; i < optionalParameterTypes.length; i++) {
-        RuntimeType type = optionalParameterTypes[i];
-        if (needsComma) result += ', ';
-        result += '$type';
-        needsComma = true;
-      }
-      result += ']';
-    } else if (namedParameters != null) {
-      if (needsComma) result += ', ';
-      needsComma = false;
-      result += '{';
-      var keys = extractKeys(namedParameters);
-      for (var i = 0; i < keys.length; i++) {
-        var name = keys[i];
-        if (needsComma) result += ', ';
-        var rti = JS('', '#[#]', namedParameters, name).toRti();
-        result += '$rti ${JS("String", "#", name)}';
-        needsComma = true;
-      }
-      result += '}';
-    }
-
-    result += ') -> $returnType';
-    return result;
-  }
-}
-
-extractFunctionTypeObjectFrom(o) {
-  var interceptor = getInterceptor(o);
-  var signatureName = JS_GET_NAME(JsGetName.SIGNATURE_NAME);
-  return JS('bool', '# in #', signatureName, interceptor)
-      ? JS('', '#[#]()', interceptor, signatureName)
-      : null;
-}
-
-RuntimeFunctionType buildFunctionType(returnType,
-                                      parameterTypes,
-                                      optionalParameterTypes) {
-  return new RuntimeFunctionType(
-      returnType,
-      parameterTypes,
-      optionalParameterTypes,
-      null);
-}
-
-RuntimeFunctionType buildNamedFunctionType(returnType,
-                                           parameterTypes,
-                                           namedParameters) {
-  return new RuntimeFunctionType(
-      returnType,
-      parameterTypes,
-      null,
-      namedParameters);
-}
-
-RuntimeType buildInterfaceType(rti, typeArguments) {
-  String jsConstructorName = rawRtiToJsConstructorName(rti);
-  if (typeArguments == null || typeArguments.isEmpty) {
-    return new RuntimeTypePlain(jsConstructorName);
-  }
-  return new RuntimeTypeGeneric(jsConstructorName, typeArguments, null);
-}
-
-class DynamicRuntimeType extends RuntimeType {
-  const DynamicRuntimeType();
-
-  String toString() => 'dynamic';
-
-  toRti() => null;
-}
-
-RuntimeType getDynamicRuntimeType() => const DynamicRuntimeType();
-
-class VoidRuntimeType extends RuntimeType {
-  const VoidRuntimeType();
-
-  String toString() => 'void';
-
-  toRti() => throw 'internal error';
-}
-
-RuntimeType getVoidRuntimeType() => const VoidRuntimeType();
-
-/**
- * Meta helper for function type tests.
- *
- * A "meta helper" is a helper function that is never called but simulates how
- * generated code behaves as far as resolution and type inference is concerned.
- */
-functionTypeTestMetaHelper() {
-  var dyn = JS('', 'x');
-  var dyn2 = JS('', 'x');
-  List fixedListOrNull = JS('JSFixedArray|Null', 'x');
-  List fixedListOrNull2 = JS('JSFixedArray|Null', 'x');
-  List fixedList = JS('JSFixedArray', 'x');
-  // TODO(ahe): Can we use [UnknownJavaScriptObject] below?
-  var /* UnknownJavaScriptObject */ jsObject = JS('=Object', 'x');
-
-  buildFunctionType(dyn, fixedListOrNull, fixedListOrNull2);
-  buildNamedFunctionType(dyn, fixedList, jsObject);
-  buildInterfaceType(dyn, fixedListOrNull);
-  getDynamicRuntimeType();
-  getVoidRuntimeType();
-  convertRtiToRuntimeType(dyn);
-  dyn._isTest(dyn2);
-  dyn._asCheck(dyn2);
-  dyn._assertCheck(dyn2);
-}
-
-RuntimeType convertRtiToRuntimeType(rti) {
-  if (rti == null) {
-    return getDynamicRuntimeType();
-  } else if (JS('bool', 'typeof # == "function"', rti)) {
-    return new RuntimeTypePlain(JS('String', r'#.name', rti));
-  } else if (JS('bool', '#.constructor == Array', rti)) {
-    List list = JS('JSFixedArray', '#', rti);
-    String name = JS('String', r'#.name', list[0]);
-    List arguments = [];
-    for (int i = 1; i < list.length; i++) {
-      arguments.add(convertRtiToRuntimeType(list[i]));
-    }
-    return new RuntimeTypeGeneric(name, arguments, rti);
-  } else if (JS('bool', '"func" in #', rti)) {
-    return new FunctionTypeInfoDecoderRing(rti).toRuntimeType();
-  } else {
-    throw new RuntimeError(
-        "Cannot convert "
-        "'${JS('String', 'JSON.stringify(#)', rti)}' to RuntimeType.");
-  }
-}
-
-class RuntimeTypePlain extends RuntimeType {
-  /// The constructor name of this raw type.
-  final String _jsConstructorName;
-
-  RuntimeTypePlain(this._jsConstructorName);
-
-  toRti() {
-    var rti = jsConstructorNameToRti(_jsConstructorName);
-    if (rti == null) throw "no type for '$_jsConstructorName'";
-    return rti;
-  }
-
-  String toString() => _jsConstructorName;
-}
-
-class RuntimeTypeGeneric extends RuntimeType {
-  /// The constructor name of the raw type for this generic type.
-  final String _jsConstructorName;
-  final List<RuntimeType> arguments;
-  var rti;
-
-  RuntimeTypeGeneric(this._jsConstructorName, this.arguments, this.rti);
-
-  toRti() {
-    if (rti != null) return rti;
-    var result = [jsConstructorNameToRti(_jsConstructorName)];
-    if (result[0] == null) {
-      throw "no type for '$_jsConstructorName<...>'";
-    }
-    for (RuntimeType argument in arguments) {
-      result.add(argument.toRti());
-    }
-    return rti = result;
-  }
-
-  String toString() => '$_jsConstructorName<${arguments.join(", ")}>';
-}
-
-class FunctionTypeInfoDecoderRing {
-  final _typeData;
-  String _cachedToString;
-
-  FunctionTypeInfoDecoderRing(this._typeData);
-
-  bool get _hasReturnType => JS('bool', '"ret" in #', _typeData);
-  get _returnType => JS('', '#.ret', _typeData);
-
-  bool get _isVoid => JS('bool', '!!#.v', _typeData);
-
-  bool get _hasArguments => JS('bool', '"args" in #', _typeData);
-  List get _arguments => JS('JSExtendableArray', '#.args', _typeData);
-
-  bool get _hasOptionalArguments => JS('bool', '"opt" in #', _typeData);
-  List get _optionalArguments => JS('JSExtendableArray', '#.opt', _typeData);
-
-  bool get _hasNamedArguments => JS('bool', '"named" in #', _typeData);
-  get _namedArguments => JS('=Object', '#.named', _typeData);
-
-  RuntimeType toRuntimeType() {
-    // TODO(ahe): Implement this (and update return type).
-    return const DynamicRuntimeType();
-  }
-
-  String toString() {
-    return _cachedToString ??= runtimeTypeToString(_typeData);
-  }
-}
-
 // TODO(ahe): Remove this class and call noSuchMethod instead.
 class UnimplementedNoSuchMethodError extends Error
     implements NoSuchMethodError {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 8f27e95..8ee404e 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -371,23 +371,21 @@
 }
 
 Object subtypeCast(Object object, String isField, List checks, String asField) {
-  if (object != null && !checkSubtype(object, isField, checks, asField)) {
-    String actualType = Primitives.objectTypeName(object);
-    String typeName = computeTypeName(isField, checks);
-    // TODO(johnniwinther): Move type lookup to [CastErrorImplementation] to
-    // align with [TypeErrorImplementation].
-    throw new CastErrorImplementation(actualType, typeName);
-  }
-  return object;
+  if (object == null) return object;
+  if (checkSubtype(object, isField, checks, asField)) return object;
+  String actualType = Primitives.objectTypeName(object);
+  String typeName = computeTypeName(isField, checks);
+  // TODO(johnniwinther): Move type lookup to [CastErrorImplementation] to
+  // align with [TypeErrorImplementation].
+  throw new CastErrorImplementation(actualType, typeName);
 }
 
-Object assertSubtype(Object object, String isField, List checks,
-                     String asField) {
-  if (object != null && !checkSubtype(object, isField, checks, asField)) {
-    String typeName = computeTypeName(isField, checks);
-    throw new TypeErrorImplementation(object, typeName);
-  }
-  return object;
+Object assertSubtype(
+    Object object, String isField, List checks, String asField) {
+  if (object == null) return object;
+  if (checkSubtype(object, isField, checks, asField)) return object;
+  String typeName = computeTypeName(isField, checks);
+  throw new TypeErrorImplementation(object, typeName);
 }
 
 /// Checks that the type represented by [subtype] is a subtype of [supertype].
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index 5b570c6..3e5dd58 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -304,7 +304,9 @@
     StackTrace stackTrace;  // The stackTrace that came with the error.
 
     // Handle an error from any of the futures.
-    void handleError(theError, theStackTrace) {
+    // TODO(jmesserly): use `void` return type once it can be inferred for the
+    // `then` call below.
+    handleError(theError, theStackTrace) {
       remaining--;
       if (values != null) {
         if (cleanUp != null) {
@@ -551,17 +553,15 @@
    *     }
    *
    */
-  // The `Function` below can stand for several types:
-  // - (dynamic) -> T
-  // - (dynamic, StackTrace) -> T
-  // - (dynamic) -> Future<T>
-  // - (dynamic, StackTrace) -> Future<T>
+  // The `Function` below stands for one of two types:
+  // - (dynamic) -> FutureOr<T>
+  // - (dynamic, StackTrace) -> FutureOr<T>
   // Given that there is a `test` function that is usually used to do an
   // `isCheck` we should also expect functions that take a specific argument.
   // Note: making `catchError` return a `Future<T>` in non-strong mode could be
   // a breaking change.
   Future<T> catchError(Function onError,
-                           {bool test(Object error)});
+                       {bool test(Object error)});
 
   /**
    * Register a function to be called when this future completes.
@@ -783,7 +783,7 @@
    *
    * All listeners on the future are informed about the value.
    */
-  void complete([value]);
+  void complete([FutureOr<T> value]);
 
   /**
    * Complete [future] with an error.
@@ -825,5 +825,4 @@
 }
 
 /** Helper function that converts `null` to a [NullThrownError]. */
-Object _nonNullError(Object error) =>
-  (error != null) ? error : new NullThrownError();
+Object _nonNullError(Object error) => error ?? new NullThrownError();
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index eaad3b4..844646b 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -14,7 +14,7 @@
 abstract class _Completer<T> implements Completer<T> {
   final _Future<T> future = new _Future<T>();
 
-  void complete([value]);
+  void complete([FutureOr<T> value]);
 
   void completeError(Object error, [StackTrace stackTrace]) {
     error = _nonNullError(error);
@@ -36,7 +36,7 @@
 
 class _AsyncCompleter<T> extends _Completer<T> {
 
-  void complete([value]) {
+  void complete([FutureOr<T> value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
     future._asyncComplete(value);
   }
@@ -47,7 +47,7 @@
 }
 
 class _SyncCompleter<T> extends _Completer<T> {
-  void complete([value]) {
+  void complete([FutureOr<T> value]) {
     if (!future._mayComplete) throw new StateError("Future already completed");
     future._complete(value);
   }
@@ -237,7 +237,7 @@
     if (!identical(currentZone, _ROOT_ZONE)) {
       f = currentZone.registerUnaryCallback<FutureOr<E>, T>(f);
       if (onError != null) {
-        onError = _registerErrorHandler<T>(onError, currentZone);
+        onError = _registerErrorHandler<E>(onError, currentZone);
       }
     }
     return _thenNoZoneRegistration<E>(f, onError);
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index b81b8dd..f340a5e 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -267,30 +267,28 @@
   }
 
   void removeWhere(bool test(E element)) {
-    _filter(this, test, false);
+    _filter(test, false);
   }
 
   void retainWhere(bool test(E element)) {
-    _filter(this, test, true);
+    _filter(test, true);
   }
 
-  static void _filter(List source,
-                      bool test(var element),
-                      bool retainMatching) {
-    List retained = [];
-    int length = source.length;
+  void _filter(bool test(var element), bool retainMatching) {
+    List<E> retained = <E>[];
+    int length = this.length;
     for (int i = 0; i < length; i++) {
-      var element = source[i];
+      var element = this[i];
       if (test(element) == retainMatching) {
         retained.add(element);
       }
-      if (length != source.length) {
-        throw new ConcurrentModificationError(source);
+      if (length != this.length) {
+        throw new ConcurrentModificationError(this);
       }
     }
-    if (retained.length != source.length) {
-      source.setRange(0, retained.length, retained);
-      source.length = retained.length;
+    if (retained.length != this.length) {
+      this.setRange(0, retained.length, retained);
+      this.length = retained.length;
     }
   }
 
@@ -308,11 +306,13 @@
   }
 
   void sort([int compare(E a, E b)]) {
-    if (compare == null) {
-      Sort.sort(this, Comparable.compare);
-    } else {
-      Sort.sort(this, compare);
-    }
+    Sort.sort(this, compare ?? _compareAny);
+  }
+
+  static int _compareAny(a, b) {
+    // In strong mode Comparable.compare requires an implicit cast to ensure
+    // `a` and `b` are Comparable.
+    return Comparable.compare(a, b);
   }
 
   void shuffle([Random random]) {
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 232d552..4ce1c17 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -697,7 +697,7 @@
    * in [RFC-3986 Section 5](http://tools.ietf.org/html/rfc3986#section-5 "RFC-1123").
    *
    * Updated to handle the case where the base URI is just a relative path -
-   * that is: when it has no scheme or authority and the path does not start
+   * that is: when it has no scheme and no authority and the path does not start
    * with a slash.
    * In that case, the paths are combined without removing leading "..", and
    * an empty path is not converted to "/".
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index b1e1fca..3a5ca68 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -112,7 +112,7 @@
 
   /**
    * Returns a [Future] that completes once all buffered data is accepted by the
-   * to underlying [StreamConsumer].
+   * underlying [StreamConsumer].
    *
    * This method must not be called while an [addStream] is incomplete.
    *
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 029924a..fa74a1d 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -10422,21 +10422,6 @@
 WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
 
-[ $compiler == dart2js && $runtime == ie11 && $builder_tag == win7]
-LayoutTests/fast/canvas/webgl/copy-tex-image-and-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas-repaint_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/css-webkit-canvas_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/framebuffer-object-attachment_t01: RuntimeError #  fixed by co19 pull request whesse-patch-2
-LayoutTests/fast/canvas/webgl/object-deletion-behaviour_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-array-buffer-view_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgb565_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba4444_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data-rgba5551_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-image-data_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-2d_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/tex-sub-image-cube-maps_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/webgl/webgl-depth-texture_t01: RuntimeError # Please triage this failure
-
 [ $compiler == dart2js && $runtime == ie11 && $builder_tag == win8]
 LibTest/typed_data/ByteData/offsetInBytes_A01_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # Please triage this failure
diff --git a/tests/co19/co19-kernel.status b/tests/co19/co19-kernel.status
index 0ddcfa4..c7dda2b 100644
--- a/tests/co19/co19-kernel.status
+++ b/tests/co19/co19-kernel.status
@@ -18,6 +18,7 @@
 Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/name_t02: DartkCrash
+Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: RuntimeError # Dartk Issue 28566
 Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
@@ -27,1291 +28,7 @@
 Language/Classes/Constructors/Generative_Constructors/formal_parameter_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/formal_parameter_t08: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/initializers_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t01: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t03: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t04: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t05: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t06: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t01: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t02: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t04: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t05: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t02: MissingCompileTimeError
-Language/Classes/Getters/syntax_t03: MissingCompileTimeError
-Language/Classes/Getters/syntax_t04: MissingCompileTimeError
-Language/Classes/Getters/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t05: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t09: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t10: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t11: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t12: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t13: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t14: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t15: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t16: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t17: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t18: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/syntax_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_setter_t01: CompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
-Language/Classes/Setters/name_t01: CompileTimeError
-Language/Classes/Setters/name_t02: CompileTimeError
-Language/Classes/Setters/name_t07: CompileTimeError
-Language/Classes/Setters/parameter_t01: MissingCompileTimeError
-Language/Classes/Setters/parameter_t02: MissingCompileTimeError
-Language/Classes/Setters/parameter_t03: MissingCompileTimeError
-Language/Classes/Setters/parameter_t04: MissingCompileTimeError
-Language/Classes/Setters/parameter_t05: MissingCompileTimeError
-Language/Classes/Setters/parameter_t06: MissingCompileTimeError
-Language/Classes/Setters/parameter_t07: MissingCompileTimeError
-Language/Classes/Setters/parameter_t08: MissingCompileTimeError
-Language/Classes/Setters/static_setter_t05: RuntimeError
-Language/Classes/Setters/static_setter_t06: DartkCrash
-Language/Classes/Setters/syntax_t01: RuntimeError
-Language/Classes/Setters/syntax_t03: MissingCompileTimeError
-Language/Classes/Setters/syntax_t04: RuntimeError
-Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
-Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
-Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: RuntimeError
-Language/Classes/Superclasses/superclass_of_itself_t01: MissingCompileTimeError
-Language/Classes/Superclasses/superclass_of_itself_t02: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t01: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t02: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t03: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t05: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t07: Crash
-Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t02: MissingCompileTimeError
-Language/Classes/Superinterfaces/itself_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/type_variable_as_superinterface_t01: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t02: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t03: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
-Language/Classes/declarations_t02: MissingCompileTimeError
-Language/Classes/declarations_t03: MissingCompileTimeError
-Language/Classes/declarations_t04: MissingCompileTimeError
-Language/Classes/declarations_t06: MissingCompileTimeError
-Language/Classes/declarations_t08: MissingCompileTimeError
-Language/Classes/declarations_t33: MissingCompileTimeError
-Language/Classes/definition_t23: RuntimeError
-Language/Classes/same_name_member_and_class_t01: MissingCompileTimeError
-Language/Classes/same_name_member_and_class_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t01: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t02: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t05: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t06: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t08: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t09: MissingCompileTimeError
-Language/Enums/restrictions_t01: Crash
-Language/Enums/restrictions_t02: MissingCompileTimeError
-Language/Enums/restrictions_t03: MissingCompileTimeError
-Language/Enums/restrictions_t04: MissingCompileTimeError
-Language/Enums/restrictions_t05: MissingCompileTimeError
-Language/Enums/restrictions_t06: MissingCompileTimeError
-Language/Enums/restrictions_t07: MissingCompileTimeError
-Language/Enums/restrictions_t08: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t04: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t05: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t23: DartkCrash
-Language/Expressions/Assignment/expression_assignment_failed_t03: RuntimeError
-Language/Expressions/Assignment/expression_assignment_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t01: RuntimeError
-Language/Expressions/Assignment/no_such_method_t02: RuntimeError
-Language/Expressions/Assignment/no_such_method_t03: RuntimeError
-Language/Expressions/Assignment/no_such_method_t04: RuntimeError
-Language/Expressions/Assignment/no_such_method_t05: RuntimeError
-Language/Expressions/Assignment/no_such_method_t06: RuntimeError
-Language/Expressions/Assignment/no_such_method_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t08: RuntimeError
-Language/Expressions/Assignment/no_such_method_t09: RuntimeError
-Language/Expressions/Assignment/static_type_t05: RuntimeError
-Language/Expressions/Assignment/static_type_t06: RuntimeError
-Language/Expressions/Assignment/static_warning_t03/none: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t01: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t02: RuntimeError
-Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Await_Expressions/syntax_t06: Crash
-Language/Expressions/Conditional/syntax_t04: MissingCompileTimeError
-Language/Expressions/Constants/bitwise_operators_t02: Crash
-Language/Expressions/Constants/bitwise_operators_t03: Crash
-Language/Expressions/Constants/bitwise_operators_t04: Crash
-Language/Expressions/Constants/bitwise_operators_t05: Crash
-Language/Expressions/Constants/bitwise_operators_t06: Crash
-Language/Expressions/Constants/constant_constructor_t03: MissingCompileTimeError
-Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
-Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/equals_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/exception_t03: Crash
-Language/Expressions/Constants/exception_t04: MissingCompileTimeError
-Language/Expressions/Constants/identical_t02: Crash
-Language/Expressions/Constants/identical_t03: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t03: Crash
-Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t03: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t04: Crash
-Language/Expressions/Constants/literal_string_t05: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t04: MissingCompileTimeError
-Language/Expressions/Constants/math_operators_t02: Crash
-Language/Expressions/Constants/math_operators_t03: Crash
-Language/Expressions/Constants/math_operators_t04: Crash
-Language/Expressions/Constants/math_operators_t05: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t06: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t07: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t08: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t09: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t10: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t11: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t12: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t13: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t14: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t15: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t17: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t18: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t20: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t21: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t31: Crash
-Language/Expressions/Constants/static_constant_t02: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t03: Crash
-Language/Expressions/Constants/static_constant_t04: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/static_method_t02: Crash
-Language/Expressions/Constants/string_length_t02: MissingCompileTimeError
-Language/Expressions/Constants/string_length_t03: MissingCompileTimeError
-Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t01: Crash
-Language/Expressions/Constants/top_level_function_t02: Crash
-Language/Expressions/Constants/top_level_function_t04: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t05: MissingCompileTimeError
-Language/Expressions/Function_Expressions/syntax_t03: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t02: DartkCrash
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t03: DartkCrash
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/same_name_arguments_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t02: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t03: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t04: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t05: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t06: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t12: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_static_t02: Crash
-Language/Expressions/Identifier_Reference/syntax_built_in_t01: CompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/undeclared_identifier_t04: RuntimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t03: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t05: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t06: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t07: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/exception_t01: Crash
-Language/Expressions/Instance_Creation/New/evaluation_t01: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t02: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t06: RuntimeError
-Language/Expressions/Instance_Creation/New/syntax_t02: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t03: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t05: DartkCrash
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t04: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t01: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t02: Crash
-Language/Expressions/Maps/constant_map_key_value_t01: Crash
-Language/Expressions/Maps/constant_map_key_value_t03: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_t01: Crash
-Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_type_t01: MissingCompileTimeError
-Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t04: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t17: RuntimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t07: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t08: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t03: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t04: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t03: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Numbers/extend_or_implement_double_t06: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t21: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t25: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t26: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t27: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t29: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t06: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Postfix_Expressions/syntax_t08: DartkCrash
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: RuntimeError
-Language/Expressions/This/placement_t04: MissingCompileTimeError
-Language/Expressions/Throw/no_catch_clause_t01: Crash
-Language/Expressions/Throw/no_catch_clause_t02: Crash
-Language/Expressions/Throw/no_catch_clause_t03: Crash
-Language/Expressions/Throw/no_catch_clause_t04: Crash
-Language/Expressions/Throw/no_catch_clause_t05: Crash
-Language/Expressions/Throw/no_catch_clause_t06: Crash
-Language/Expressions/Throw/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Cast/evaluation_t04: RuntimeError
-Language/Expressions/Type_Cast/evaluation_t05: RuntimeError
-Language/Expressions/Type_Cast/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Test/evaluation_t03: RuntimeError
-Language/Expressions/Type_Test/evaluation_t04: RuntimeError
-Language/Expressions/Unary_Expressions/syntax_t06: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t08: MissingCompileTimeError
-Language/Expressions/Unary_Expressions/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t07: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t08: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t10: DartkCrash
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t11: DartkCrash
-Language/Functions/Formal_Parameters/declare_as_constant_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t05: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/syntax_t06: DartkCrash
-Language/Functions/Formal_Parameters/syntax_t13: DartkCrash
-Language/Functions/Function_Declarations/external_function_t01: MissingCompileTimeError
-Language/Functions/Function_Declarations/external_function_t02: MissingCompileTimeError
-Language/Functions/ctor_modifier_t03: MissingCompileTimeError
-Language/Functions/ctor_modifier_t04: MissingCompileTimeError
-Language/Functions/ctor_modifier_t09: MissingCompileTimeError
-Language/Functions/ctor_modifier_t10: MissingCompileTimeError
-Language/Functions/ctor_modifier_t15: MissingCompileTimeError
-Language/Functions/ctor_modifier_t16: MissingCompileTimeError
-Language/Functions/setter_modifier_t01: MissingCompileTimeError
-Language/Functions/setter_modifier_t02: MissingCompileTimeError
-Language/Functions/setter_modifier_t03: MissingCompileTimeError
-Language/Functions/setter_modifier_t04: MissingCompileTimeError
-Language/Functions/setter_modifier_t05: MissingCompileTimeError
-Language/Functions/setter_modifier_t06: MissingCompileTimeError
-Language/Functions/syntax_t05: MissingCompileTimeError
-Language/Functions/syntax_t31: MissingCompileTimeError
-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
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t02: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t03: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Exports/invalid_uri_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t07: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t08: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t16: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t17: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t27: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t02/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t05: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t10: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t12/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t15/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t17: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t19: RuntimeError
-Language/Libraries_and_Scripts/Imports/static_type_t01: Skip # No support for deferred libraries.
-Language/Libraries_and_Scripts/Imports/syntax_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t04: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t11: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t13: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t18: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t20: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t21: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t32: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/syntax_t41: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t01: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t02: Timeout
-Language/Libraries_and_Scripts/Parts/compilation_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t08: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t09: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t10: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t11: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/static_warning_t01: RuntimeError
-Language/Libraries_and_Scripts/Parts/syntax_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/syntax_t05: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t07: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t08: DartkCrash
-Language/Libraries_and_Scripts/Scripts/syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t06: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t08: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t10: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t14: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Crash
-Language/Libraries_and_Scripts/Scripts/top_level_main_t02: Crash
-Language/Libraries_and_Scripts/definition_syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/private_access_t03: RuntimeError
-Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t04: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t05: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t06: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t08: Crash
-Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t02: DartkCrash
-Language/Mixins/Mixin_Application/wrong_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t04: Crash
-Language/Mixins/Mixin_Application/wrong_type_t05: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t06: Crash
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t02: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t03: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t04: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t07: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t08: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t09: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t10: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t06: RuntimeError
-Language/Overview/Privacy/private_and_public_t09: RuntimeError
-Language/Overview/Privacy/private_and_public_t10: RuntimeError
-Language/Overview/Privacy/private_and_public_t19: RuntimeError
-Language/Overview/Privacy/private_and_public_t20: RuntimeError
-Language/Overview/Scoping/conflicting_names_t04: DartkCrash
-Language/Overview/Scoping/conflicting_names_t11: DartkCrash
-Language/Overview/Scoping/conflicting_names_t16: Crash
-Language/Overview/Scoping/conflicting_names_t17: Crash
-Language/Overview/Scoping/conflicting_names_t18: Crash
-Language/Overview/Scoping/conflicting_names_t25: Crash
-Language/Overview/Scoping/conflicting_names_t26: Crash
-Language/Overview/Scoping/conflicting_names_t27: Crash
-Language/Overview/Scoping/conflicting_names_t31: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t32: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t33: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t34: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t35: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t37: Crash
-Language/Overview/Scoping/conflicting_names_t38: Crash
-Language/Overview/Scoping/conflicting_names_t39: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t40: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t41: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t44: Crash
-Language/Overview/Scoping/hiding_declaration_t16: Crash
-Language/Overview/Scoping/hiding_declaration_t28: DartkCrash
-Language/Reference/Lexical_Rules/Comments/documentation_t02: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t03: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t04: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t05: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t06: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t10: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t11: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t03: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t04: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t05: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t06: Crash
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t01: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t05: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t06: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t07: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t08: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t09: MissingCompileTimeError
-Language/Statements/Break/label_t11: DartkCrash
-Language/Statements/Break/label_t12: DartkCrash
-Language/Statements/Continue/async_loops_t10: DartkCrash
-Language/Statements/Continue/label_t03: DartkCrash
-Language/Statements/Continue/label_t06: MissingCompileTimeError
-Language/Statements/Continue/label_t08: MissingCompileTimeError
-Language/Statements/Continue/label_t09: MissingCompileTimeError
-Language/Statements/Continue/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t11: MissingCompileTimeError
-Language/Statements/Continue/label_t14: DartkCrash
-Language/Statements/Continue/label_t17: DartkCrash
-Language/Statements/Do/execution_t04: Crash
-Language/Statements/For/Asynchronous_For_in/execution_t04: RuntimeError
-Language/Statements/For/Asynchronous_For_in/syntax_t02: MissingCompileTimeError
-Language/Statements/For/syntax_t07: RuntimeError
-Language/Statements/For/syntax_t09: MissingCompileTimeError
-Language/Statements/For/syntax_t12: MissingCompileTimeError
-Language/Statements/For/syntax_t13: MissingCompileTimeError
-Language/Statements/For/syntax_t16: MissingCompileTimeError
-Language/Statements/For/syntax_t19: MissingCompileTimeError
-Language/Statements/For/syntax_t20: MissingCompileTimeError
-Language/Statements/If/execution_t03: Crash
-Language/Statements/Labels/namespace_t01: DartkCrash
-Language/Statements/Labels/scope_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t01: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t03: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t06: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t11: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t20: MissingCompileTimeError
-Language/Statements/Rethrow/on_catch_clause_t01: Crash
-Language/Statements/Rethrow/on_catch_clause_t02: Crash
-Language/Statements/Return/generator_function_t01: MissingCompileTimeError
-Language/Statements/Return/generator_function_t02: MissingCompileTimeError
-Language/Statements/Return/generator_function_t03: MissingCompileTimeError
-Language/Statements/Return/generator_function_t04: MissingCompileTimeError
-Language/Statements/Return/generator_function_t05: MissingCompileTimeError
-Language/Statements/Return/generator_function_t06: MissingCompileTimeError
-Language/Statements/Return/generator_function_t07: MissingCompileTimeError
-Language/Statements/Return/generator_function_t08: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t01: MissingCompileTimeError
-Language/Statements/Switch/expressions_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t03: MissingCompileTimeError
-Language/Statements/Switch/expressions_t04: MissingCompileTimeError
-Language/Statements/Switch/labels_constants_t01: MissingCompileTimeError
-Language/Statements/Switch/syntax_t16: MissingCompileTimeError
-Language/Statements/Switch/syntax_t17: MissingCompileTimeError
-Language/Statements/Try/malformed_type_t04: RuntimeError
-Language/Statements/Try/syntax_t06: MissingCompileTimeError
-Language/Statements/Try/syntax_t13: MissingCompileTimeError
-Language/Statements/Try/syntax_t15: Crash
-Language/Statements/While/execution_t03: Crash
-Language/Statements/Yield_and_Yield_Each/Yield/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/static_type_t02: Crash
-Language/Types/Static_Types/malformed_type_t01: RuntimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t01: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t04: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t09: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t10: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t11: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t12: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t13: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t14: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t15: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t16: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t17: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t02: MissingCompileTimeError
-Language/Variables/constant_initialization_t01: MissingCompileTimeError
-Language/Variables/constant_initialization_t02: MissingCompileTimeError
-Language/Variables/constant_variable_t03: RuntimeError
-Language/Variables/constant_variable_t04: RuntimeError
-Language/Variables/constant_variable_t05: MissingCompileTimeError
-Language/Variables/constant_variable_t06: MissingCompileTimeError
-Language/Variables/constant_variable_t07: MissingCompileTimeError
-Language/Variables/constant_variable_t08: MissingCompileTimeError
-Language/Variables/constant_variable_t10: RuntimeError
-Language/Variables/local_variable_t01: MissingCompileTimeError
-Language/Variables/local_variable_t04: MissingCompileTimeError
-Language/Variables/local_variable_t05: MissingCompileTimeError
-Language/Variables/syntax_t04: MissingCompileTimeError
-Language/Variables/syntax_t05: MissingCompileTimeError
-Language/Variables/syntax_t08: MissingCompileTimeError
-Language/Variables/syntax_t12: MissingCompileTimeError
-Language/Variables/syntax_t13: MissingCompileTimeError
-Language/Variables/syntax_t14: MissingCompileTimeError
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # No support for deferred libraries.
-LibTest/async/Future/catchError_A03_t05: Crash
-LibTest/async/Future/then_A05_t01: Crash
-LibTest/async/Stream/Stream.fromFutures_A01_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A01_t02: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t02: DartkCrash
-LibTest/async/Stream/asBroadcastStream_A03_t02: Crash
-LibTest/async/Stream/asBroadcastStream_A03_t03: Crash
-LibTest/async/Zone/bindBinaryCallback_A01_t01: Crash
-LibTest/async/Zone/bindCallback_A01_t01: Crash
-LibTest/async/Zone/bindUnaryCallback_A01_t01: Crash
-LibTest/async/Zone/current_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t01: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t03: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t05: Crash
-LibTest/async/Zone/parent_A01_t01: Crash
-LibTest/core/Invocation/isAccessor_A01_t01: RuntimeError
-LibTest/core/Invocation/isAccessor_A01_t02: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t02: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t01: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t02: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t02: RuntimeError
-LibTest/core/Invocation/memberName_A01_t01: RuntimeError
-LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
-LibTest/core/Invocation/positionalArguments_A01_t01: RuntimeError
-LibTest/isolate/Isolate/spawnUri_A01_t06: Skip
-
-Language/Metadata/before_export_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_import_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_library_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t02: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t03: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t04: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t05: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t06: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t07: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t08: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_param_t09: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_typedef_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_variable_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-Language/Metadata/before_variable_t02: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t03: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t04: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t05: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t06: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t07: RuntimeError
-
-
-# Override tests marked as failing elsewhere.
-[ $compiler == dartk || $compiler == dartkp ]
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t01: Crash
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t03: Crash
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/syntax_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t01: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t03: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t04: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t05: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t06: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t01: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t02: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t04: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t05: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t02: MissingCompileTimeError
-Language/Classes/Getters/syntax_t03: MissingCompileTimeError
-Language/Classes/Getters/syntax_t04: MissingCompileTimeError
-Language/Classes/Getters/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t05: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t09: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t10: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t11: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t12: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t13: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t14: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t15: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t16: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t17: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t18: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/syntax_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_setter_t01: CompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
-Language/Classes/Setters/name_t01: CompileTimeError
-Language/Classes/Setters/name_t02: CompileTimeError
-Language/Classes/Setters/name_t07: CompileTimeError
-Language/Classes/Setters/parameter_t01: MissingCompileTimeError
-Language/Classes/Setters/parameter_t02: MissingCompileTimeError
-Language/Classes/Setters/parameter_t03: MissingCompileTimeError
-Language/Classes/Setters/parameter_t04: MissingCompileTimeError
-Language/Classes/Setters/parameter_t05: MissingCompileTimeError
-Language/Classes/Setters/parameter_t06: MissingCompileTimeError
-Language/Classes/Setters/parameter_t07: MissingCompileTimeError
-Language/Classes/Setters/parameter_t08: MissingCompileTimeError
-Language/Classes/Setters/static_setter_t05: RuntimeError
-Language/Classes/Setters/static_setter_t06: DartkCrash
-Language/Classes/Setters/syntax_t01: RuntimeError
-Language/Classes/Setters/syntax_t03: MissingCompileTimeError
-Language/Classes/Setters/syntax_t04: RuntimeError
-Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
-Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
-Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: RuntimeError
-Language/Classes/Superclasses/superclass_of_itself_t01: MissingCompileTimeError
-Language/Classes/Superclasses/superclass_of_itself_t02: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t01: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t02: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t03: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t05: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t07: Crash
-Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t02: MissingCompileTimeError
-Language/Classes/Superinterfaces/itself_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/type_variable_as_superinterface_t01: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t02: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t03: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
-Language/Classes/declarations_t02: MissingCompileTimeError
-Language/Classes/declarations_t03: MissingCompileTimeError
-Language/Classes/declarations_t04: MissingCompileTimeError
-Language/Classes/declarations_t06: MissingCompileTimeError
-Language/Classes/declarations_t08: MissingCompileTimeError
-Language/Classes/declarations_t33: MissingCompileTimeError
-Language/Classes/definition_t23: RuntimeError
-Language/Classes/same_name_member_and_class_t01: MissingCompileTimeError
-Language/Classes/same_name_member_and_class_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t01: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t02: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t05: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t06: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t08: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t09: MissingCompileTimeError
-Language/Enums/restrictions_t01: Crash
-Language/Enums/restrictions_t02: MissingCompileTimeError
-Language/Enums/restrictions_t03: MissingCompileTimeError
-Language/Enums/restrictions_t04: MissingCompileTimeError
-Language/Enums/restrictions_t05: MissingCompileTimeError
-Language/Enums/restrictions_t06: MissingCompileTimeError
-Language/Enums/restrictions_t07: MissingCompileTimeError
-Language/Enums/restrictions_t08: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t04: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t05: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t23: DartkCrash
-Language/Expressions/Assignment/expression_assignment_failed_t03: RuntimeError
-Language/Expressions/Assignment/expression_assignment_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t01: RuntimeError
-Language/Expressions/Assignment/no_such_method_t02: RuntimeError
-Language/Expressions/Assignment/no_such_method_t03: RuntimeError
-Language/Expressions/Assignment/no_such_method_t04: RuntimeError
-Language/Expressions/Assignment/no_such_method_t05: RuntimeError
-Language/Expressions/Assignment/no_such_method_t06: RuntimeError
-Language/Expressions/Assignment/no_such_method_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t08: RuntimeError
-Language/Expressions/Assignment/no_such_method_t09: RuntimeError
-Language/Expressions/Assignment/static_type_t05: RuntimeError
-Language/Expressions/Assignment/static_type_t06: RuntimeError
-Language/Expressions/Assignment/static_warning_t03/none: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t01: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t02: RuntimeError
-Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Await_Expressions/syntax_t06: Crash
-Language/Expressions/Conditional/syntax_t04: MissingCompileTimeError
-Language/Expressions/Constants/bitwise_operators_t02: Crash
-Language/Expressions/Constants/bitwise_operators_t03: Crash
-Language/Expressions/Constants/bitwise_operators_t04: Crash
-Language/Expressions/Constants/bitwise_operators_t05: Crash
-Language/Expressions/Constants/bitwise_operators_t06: Crash
-Language/Expressions/Constants/constant_constructor_t03: MissingCompileTimeError
-Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
-Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/equals_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/exception_t03: Crash
-Language/Expressions/Constants/exception_t04: MissingCompileTimeError
-Language/Expressions/Constants/identical_t02: Crash
-Language/Expressions/Constants/identical_t03: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t03: Crash
-Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t03: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t04: Crash
-Language/Expressions/Constants/literal_string_t05: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t04: MissingCompileTimeError
-Language/Expressions/Constants/math_operators_t02: Crash
-Language/Expressions/Constants/math_operators_t03: Crash
-Language/Expressions/Constants/math_operators_t04: Crash
-Language/Expressions/Constants/math_operators_t05: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t06: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t07: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t08: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t09: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t10: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t11: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t12: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t13: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t14: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t15: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t17: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t18: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t20: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t21: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t31: Crash
-Language/Expressions/Constants/static_constant_t02: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t03: Crash
-Language/Expressions/Constants/static_constant_t04: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/static_method_t02: Crash
-Language/Expressions/Constants/string_length_t02: MissingCompileTimeError
-Language/Expressions/Constants/string_length_t03: MissingCompileTimeError
-Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t01: Crash
-Language/Expressions/Constants/top_level_function_t02: Crash
-Language/Expressions/Constants/top_level_function_t04: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t05: MissingCompileTimeError
-Language/Expressions/Function_Expressions/syntax_t03: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t02: DartkCrash
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t03: DartkCrash
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/same_name_arguments_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t02: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t03: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t04: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t05: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t06: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t12: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_static_t02: Crash
-Language/Expressions/Identifier_Reference/syntax_built_in_t01: CompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/undeclared_identifier_t04: RuntimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t03: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t05: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t06: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t07: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/exception_t01: Crash
-Language/Expressions/Instance_Creation/New/evaluation_t01: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t02: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t06: RuntimeError
-Language/Expressions/Instance_Creation/New/syntax_t02: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t03: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t05: DartkCrash
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t04: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t01: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t02: Crash
-Language/Expressions/Maps/constant_map_key_value_t01: Crash
-Language/Expressions/Maps/constant_map_key_value_t03: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_t01: Crash
-Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_type_t01: MissingCompileTimeError
-Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t04: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t17: RuntimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t07: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t08: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t03: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t04: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t03: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Numbers/extend_or_implement_double_t06: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t21: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t25: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t26: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t27: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t29: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t06: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Postfix_Expressions/syntax_t08: DartkCrash
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: RuntimeError
-Language/Expressions/This/placement_t04: MissingCompileTimeError
-Language/Expressions/Throw/no_catch_clause_t01: Crash
-Language/Expressions/Throw/no_catch_clause_t02: Crash
-Language/Expressions/Throw/no_catch_clause_t03: Crash
-Language/Expressions/Throw/no_catch_clause_t04: Crash
-Language/Expressions/Throw/no_catch_clause_t05: Crash
-Language/Expressions/Throw/no_catch_clause_t06: Crash
-Language/Expressions/Throw/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Cast/evaluation_t04: RuntimeError
-Language/Expressions/Type_Cast/evaluation_t05: RuntimeError
-Language/Expressions/Type_Cast/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Test/evaluation_t03: RuntimeError
-Language/Expressions/Type_Test/evaluation_t04: RuntimeError
-Language/Expressions/Unary_Expressions/syntax_t06: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t08: MissingCompileTimeError
-Language/Expressions/Unary_Expressions/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t07: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t08: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t10: DartkCrash
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t11: DartkCrash
-Language/Functions/Formal_Parameters/declare_as_constant_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t05: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/syntax_t06: DartkCrash
-Language/Functions/Formal_Parameters/syntax_t13: DartkCrash
-Language/Functions/Function_Declarations/external_function_t01: MissingCompileTimeError
-Language/Functions/Function_Declarations/external_function_t02: MissingCompileTimeError
-Language/Functions/ctor_modifier_t03: MissingCompileTimeError
-Language/Functions/ctor_modifier_t04: MissingCompileTimeError
-Language/Functions/ctor_modifier_t09: MissingCompileTimeError
-Language/Functions/ctor_modifier_t10: MissingCompileTimeError
-Language/Functions/ctor_modifier_t15: MissingCompileTimeError
-Language/Functions/ctor_modifier_t16: MissingCompileTimeError
-Language/Functions/setter_modifier_t01: MissingCompileTimeError
-Language/Functions/setter_modifier_t02: MissingCompileTimeError
-Language/Functions/setter_modifier_t03: MissingCompileTimeError
-Language/Functions/setter_modifier_t04: MissingCompileTimeError
-Language/Functions/setter_modifier_t05: MissingCompileTimeError
-Language/Functions/setter_modifier_t06: MissingCompileTimeError
-Language/Functions/syntax_t05: MissingCompileTimeError
-Language/Functions/syntax_t31: MissingCompileTimeError
-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
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t02: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t03: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Exports/invalid_uri_t03: DartkCrash
-Language/Libraries_and_Scripts/Exports/reexport_t01: Pass
-Language/Functions/Formal_Parameters/Optional_Formals/syntax_t14: Pass
-Language/Libraries_and_Scripts/Imports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t07: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t08: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t16: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t17: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t27: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t02/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t05: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t10: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t12/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t15/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t17: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t19: RuntimeError
-Language/Libraries_and_Scripts/Imports/syntax_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t04: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t11: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t13: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t18: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t20: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t21: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t32: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/syntax_t41: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t01: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t02: Timeout
-Language/Libraries_and_Scripts/Parts/compilation_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t08: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t09: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t10: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t11: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/static_warning_t01: RuntimeError
-Language/Libraries_and_Scripts/Parts/syntax_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/syntax_t05: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t07: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t08: DartkCrash
-Language/Libraries_and_Scripts/Scripts/syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t06: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t08: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t10: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t14: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Crash
-Language/Libraries_and_Scripts/Scripts/top_level_main_t02: Crash
-Language/Libraries_and_Scripts/definition_syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/private_access_t03: RuntimeError
-Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t04: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t05: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t06: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t08: Crash
-Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t02: DartkCrash
-Language/Mixins/Mixin_Application/wrong_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t04: Crash
-Language/Mixins/Mixin_Application/wrong_type_t05: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t06: Crash
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t02: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t03: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t04: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t07: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t08: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t09: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t10: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t06: RuntimeError
-Language/Overview/Privacy/private_and_public_t09: RuntimeError
-Language/Overview/Privacy/private_and_public_t10: RuntimeError
-Language/Overview/Privacy/private_and_public_t19: RuntimeError
-Language/Overview/Privacy/private_and_public_t20: RuntimeError
-Language/Overview/Scoping/conflicting_names_t04: DartkCrash
-Language/Overview/Scoping/conflicting_names_t11: DartkCrash
-Language/Overview/Scoping/conflicting_names_t16: Crash
-Language/Overview/Scoping/conflicting_names_t17: Crash
-Language/Overview/Scoping/conflicting_names_t18: Crash
-Language/Overview/Scoping/conflicting_names_t25: Crash
-Language/Overview/Scoping/conflicting_names_t26: Crash
-Language/Overview/Scoping/conflicting_names_t27: Crash
-Language/Overview/Scoping/conflicting_names_t31: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t32: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t33: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t34: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t35: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t37: Crash
-Language/Overview/Scoping/conflicting_names_t38: Crash
-Language/Overview/Scoping/conflicting_names_t39: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t40: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t41: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t44: Crash
-Language/Overview/Scoping/hiding_declaration_t16: Crash
-Language/Overview/Scoping/hiding_declaration_t28: DartkCrash
-Language/Reference/Lexical_Rules/Comments/documentation_t02: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t03: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t04: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t05: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t06: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t10: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t11: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t03: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t04: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t05: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t06: Crash
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t01: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t05: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t06: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t07: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t08: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t09: MissingCompileTimeError
-Language/Statements/Break/label_t11: DartkCrash
-Language/Statements/Break/label_t12: DartkCrash
-Language/Statements/Continue/async_loops_t10: DartkCrash
-Language/Statements/Continue/label_t03: DartkCrash
-Language/Statements/Continue/label_t06: MissingCompileTimeError
-Language/Statements/Continue/label_t08: MissingCompileTimeError
-Language/Statements/Continue/label_t09: MissingCompileTimeError
-Language/Statements/Continue/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t11: MissingCompileTimeError
-Language/Statements/Continue/label_t14: DartkCrash
-Language/Statements/Continue/label_t17: DartkCrash
-Language/Statements/Do/execution_t04: Crash
-Language/Statements/For/Asynchronous_For_in/execution_t04: RuntimeError
-Language/Statements/For/Asynchronous_For_in/syntax_t02: MissingCompileTimeError
-Language/Statements/For/syntax_t07: RuntimeError
-Language/Statements/For/syntax_t09: MissingCompileTimeError
-Language/Statements/For/syntax_t12: MissingCompileTimeError
-Language/Statements/For/syntax_t13: MissingCompileTimeError
-Language/Statements/For/syntax_t16: MissingCompileTimeError
-Language/Statements/For/syntax_t19: MissingCompileTimeError
-Language/Statements/For/syntax_t20: MissingCompileTimeError
-Language/Statements/If/execution_t03: Crash
-Language/Statements/Labels/namespace_t01: DartkCrash
-Language/Statements/Labels/scope_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t01: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t03: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t06: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t11: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t20: MissingCompileTimeError
-Language/Statements/Rethrow/on_catch_clause_t01: Crash
-Language/Statements/Rethrow/on_catch_clause_t02: Crash
-Language/Statements/Return/generator_function_t01: MissingCompileTimeError
-Language/Statements/Return/generator_function_t02: MissingCompileTimeError
-Language/Statements/Return/generator_function_t03: MissingCompileTimeError
-Language/Statements/Return/generator_function_t04: MissingCompileTimeError
-Language/Statements/Return/generator_function_t05: MissingCompileTimeError
-Language/Statements/Return/generator_function_t06: MissingCompileTimeError
-Language/Statements/Return/generator_function_t07: MissingCompileTimeError
-Language/Statements/Return/generator_function_t08: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t01: MissingCompileTimeError
-Language/Statements/Switch/expressions_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t03: MissingCompileTimeError
-Language/Statements/Switch/expressions_t04: MissingCompileTimeError
-Language/Statements/Switch/labels_constants_t01: MissingCompileTimeError
-Language/Statements/Switch/syntax_t16: MissingCompileTimeError
-Language/Statements/Switch/syntax_t17: MissingCompileTimeError
-Language/Statements/Try/malformed_type_t04: RuntimeError
-Language/Statements/Try/syntax_t06: MissingCompileTimeError
-Language/Statements/Try/syntax_t13: MissingCompileTimeError
-Language/Statements/Try/syntax_t15: Crash
-Language/Statements/While/execution_t03: Crash
-Language/Statements/Yield_and_Yield_Each/Yield/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/static_type_t02: Crash
-Language/Types/Static_Types/malformed_type_t01: RuntimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t01: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t04: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t09: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t10: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t11: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t12: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t13: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t14: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t15: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t16: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t17: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t02: MissingCompileTimeError
-Language/Variables/constant_initialization_t01: MissingCompileTimeError
-Language/Variables/constant_initialization_t02: MissingCompileTimeError
-Language/Variables/constant_variable_t03: RuntimeError
-Language/Variables/constant_variable_t04: RuntimeError
-Language/Variables/constant_variable_t05: MissingCompileTimeError
-Language/Variables/constant_variable_t06: MissingCompileTimeError
-Language/Variables/constant_variable_t07: MissingCompileTimeError
-Language/Variables/constant_variable_t08: MissingCompileTimeError
-Language/Variables/constant_variable_t10: RuntimeError
-Language/Variables/local_variable_t01: MissingCompileTimeError
-Language/Variables/local_variable_t04: MissingCompileTimeError
-Language/Variables/local_variable_t05: MissingCompileTimeError
-Language/Variables/syntax_t04: MissingCompileTimeError
-Language/Variables/syntax_t05: MissingCompileTimeError
-Language/Variables/syntax_t08: MissingCompileTimeError
-Language/Variables/syntax_t12: MissingCompileTimeError
-Language/Variables/syntax_t13: MissingCompileTimeError
-Language/Variables/syntax_t14: MissingCompileTimeError
-LibTest/async/Future/catchError_A03_t05: Crash
-LibTest/async/Future/then_A05_t01: Crash
-LibTest/async/Stream/Stream.fromFutures_A01_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A01_t02: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t02: DartkCrash
-LibTest/async/Stream/asBroadcastStream_A03_t02: Crash
-LibTest/async/Stream/asBroadcastStream_A03_t03: Crash
-LibTest/async/Zone/bindBinaryCallback_A01_t01: Crash
-LibTest/async/Zone/bindCallback_A01_t01: Crash
-LibTest/async/Zone/bindUnaryCallback_A01_t01: Crash
-LibTest/async/Zone/current_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t01: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t03: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t05: Crash
-LibTest/async/Zone/parent_A01_t01: Crash
-LibTest/core/Invocation/isAccessor_A01_t01: RuntimeError
-LibTest/core/Invocation/isAccessor_A01_t02: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t02: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t01: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t02: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t02: RuntimeError
-LibTest/core/Invocation/memberName_A01_t01: RuntimeError
-LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
-LibTest/core/Invocation/positionalArguments_A01_t01: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t03: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t04: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t05: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t06: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t07: RuntimeError
-
-###############################################################################
-# Dartk Entries
-###############################################################################
-
-[ $compiler == dartk || $compiler == dartkp ]
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t01: Crash
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t03: Crash
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/syntax_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t01: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t03: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t04: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t05: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t06: DartkCrash
+Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t02: RuntimeError # Dartk Issue 28566
 Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/redirection_t03: MissingCompileTimeError
 Language/Classes/Constructors/Generative_Constructors/redirection_t07: MissingCompileTimeError
@@ -1443,8 +160,6 @@
 Language/Expressions/Assignment/super_assignment_failed_t01: RuntimeError
 Language/Expressions/Assignment/super_assignment_failed_t02: RuntimeError
 Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
 Language/Expressions/Await_Expressions/syntax_t06: Crash
 Language/Expressions/Conditional/syntax_t04: MissingCompileTimeError
 Language/Expressions/Constants/bitwise_operators_t02: Crash
@@ -1458,6 +173,8 @@
 Language/Expressions/Constants/depending_on_itself_t03: Crash
 Language/Expressions/Constants/equals_expression_t02: MissingCompileTimeError
 Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
+Language/Expressions/Constants/exception_t01: Crash
+Language/Expressions/Constants/exception_t02: Crash
 Language/Expressions/Constants/exception_t03: Crash
 Language/Expressions/Constants/exception_t04: MissingCompileTimeError
 Language/Expressions/Constants/identical_t02: Crash
@@ -1522,8 +239,12 @@
 Language/Expressions/Identifier_Reference/built_in_identifier_t08: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/built_in_identifier_t09: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/built_in_identifier_t10: MissingCompileTimeError
+Language/Expressions/Identifier_Reference/built_in_identifier_t35: Pass # OK, Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t36: Pass # OK, Issue 25732
+Language/Expressions/Identifier_Reference/built_in_identifier_t37: Pass # OK, Issue 25732
 Language/Expressions/Identifier_Reference/built_in_not_dynamic_t01: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/built_in_not_dynamic_t12: MissingCompileTimeError
+Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: Pass # OK, Issue 25732
 Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError
 Language/Expressions/Identifier_Reference/evaluation_static_t02: Crash
 Language/Expressions/Identifier_Reference/syntax_built_in_t01: CompileTimeError
@@ -1549,10 +270,14 @@
 Language/Expressions/Instance_Creation/Const/deferred_type_t01: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/deferred_type_t02: MissingCompileTimeError
 Language/Expressions/Instance_Creation/Const/exception_t01: Crash
+Language/Expressions/Instance_Creation/Const/parameterized_type_t01: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/parameterized_type_t02: MissingCompileTimeError
 Language/Expressions/Instance_Creation/New/evaluation_t01: RuntimeError
 Language/Expressions/Instance_Creation/New/evaluation_t02: RuntimeError
 Language/Expressions/Instance_Creation/New/evaluation_t06: RuntimeError
-Language/Expressions/Instance_Creation/New/syntax_t02: DartkCrash
+Language/Expressions/Instance_Creation/New/evaluation_t12: RuntimeError # Dartk Issue 28564
+Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError # Kernel Issue 28335 (deferred libraries)
+Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError # Kernel Issue 28335 (deferred libraries)
 Language/Expressions/Instance_Creation/New/type_t03: DartkCrash
 Language/Expressions/Instance_Creation/New/type_t05: DartkCrash
 Language/Expressions/Instance_Creation/malformed_or_malbounded_t02: MissingCompileTimeError
@@ -1568,7 +293,9 @@
 Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t02: DartkCrash
 Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t03: DartkCrash
 Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t04: DartkCrash
+Language/Expressions/Method_Invocation/Ordinary_Invocation/evaluation_t07: RuntimeError # Dartk Issue 28562
 Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t17: RuntimeError
+Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t18: RuntimeError # Dartk Issue 28562
 Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t02: DartkCrash
 Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t03: DartkCrash
 Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t07: DartkCrash
@@ -1605,30 +332,29 @@
 Language/Expressions/Type_Cast/syntax_t02: MissingCompileTimeError
 Language/Expressions/Type_Test/evaluation_t03: RuntimeError
 Language/Expressions/Type_Test/evaluation_t04: RuntimeError
+Language/Expressions/Type_Test/evaluation_t10: RuntimeError # Kernel Issue 28335 (deferred libraries)
 Language/Expressions/Unary_Expressions/syntax_t06: DartkCrash
 Language/Expressions/Unary_Expressions/syntax_t07: DartkCrash
 Language/Expressions/Unary_Expressions/syntax_t08: MissingCompileTimeError
 Language/Expressions/Unary_Expressions/syntax_t09: MissingCompileTimeError
+Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError # Dartk Issue 28565
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/name_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Optional_Formals/name_t02: MissingCompileTimeError
+Language/Functions/Formal_Parameters/Optional_Formals/syntax_t14: Pass
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t03: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t04: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t06: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t07: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t08: MissingCompileTimeError
 Language/Functions/Formal_Parameters/Required_Formals/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t10: DartkCrash
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t11: DartkCrash
 Language/Functions/Formal_Parameters/declare_as_constant_t01: MissingCompileTimeError
 Language/Functions/Formal_Parameters/declare_as_constant_t02: MissingCompileTimeError
 Language/Functions/Formal_Parameters/declare_as_constant_t03: MissingCompileTimeError
 Language/Functions/Formal_Parameters/declare_as_constant_t04: MissingCompileTimeError
 Language/Functions/Formal_Parameters/declare_as_constant_t05: MissingCompileTimeError
 Language/Functions/Formal_Parameters/declare_as_constant_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/syntax_t06: DartkCrash
-Language/Functions/Formal_Parameters/syntax_t13: DartkCrash
 Language/Functions/Function_Declarations/external_function_t01: MissingCompileTimeError
 Language/Functions/Function_Declarations/external_function_t02: MissingCompileTimeError
 Language/Functions/ctor_modifier_t03: MissingCompileTimeError
@@ -1654,14 +380,14 @@
 Language/Interfaces/Superinterfaces/superinterface_of_itself_t01: MissingCompileTimeError
 Language/Interfaces/Superinterfaces/superinterface_of_itself_t02: MissingCompileTimeError
 Language/Interfaces/Superinterfaces/superinterface_of_itself_t03: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/implicit_hide_t01: DartkCrash
+Language/Libraries_and_Scripts/Exports/invalid_uri_t02: Pass # OK
 Language/Libraries_and_Scripts/Exports/invalid_uri_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t02: DartkCrash
+Language/Libraries_and_Scripts/Exports/reexport_t01: Pass
+Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
+Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError # Kernel Issue 28335 (deferred libraries)
 Language/Libraries_and_Scripts/Imports/invalid_uri_deferred_t02: CompileTimeError
 Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t07: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t08: DartkCrash
+Language/Libraries_and_Scripts/Imports/invalid_uri_t02: Pass # OK
 Language/Libraries_and_Scripts/Imports/namespace_changes_t16: RuntimeError
 Language/Libraries_and_Scripts/Imports/namespace_changes_t17: RuntimeError
 Language/Libraries_and_Scripts/Imports/namespace_changes_t27: CompileTimeError
@@ -1673,17 +399,9 @@
 Language/Libraries_and_Scripts/Imports/same_name_t15/01: MissingRuntimeError
 Language/Libraries_and_Scripts/Imports/same_name_t17: MissingCompileTimeError
 Language/Libraries_and_Scripts/Imports/same_name_t19: RuntimeError
-Language/Libraries_and_Scripts/Imports/syntax_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t04: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t11: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t13: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t18: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t20: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t21: DartkCrash
+Language/Libraries_and_Scripts/Imports/static_type_t01: Skip # No support for deferred libraries.
 Language/Libraries_and_Scripts/Imports/syntax_t32: MissingCompileTimeError
 Language/Libraries_and_Scripts/Imports/syntax_t41: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t01: DartkCrash
 Language/Libraries_and_Scripts/Parts/compilation_t02: Timeout
 Language/Libraries_and_Scripts/Parts/compilation_t07: MissingCompileTimeError
 Language/Libraries_and_Scripts/Parts/compilation_t08: DartkCrash
@@ -1692,9 +410,7 @@
 Language/Libraries_and_Scripts/Parts/compilation_t11: MissingCompileTimeError
 Language/Libraries_and_Scripts/Parts/static_warning_t01: RuntimeError
 Language/Libraries_and_Scripts/Parts/syntax_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/syntax_t05: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t07: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t08: DartkCrash
+Language/Libraries_and_Scripts/Parts/syntax_t06: Pass # OK
 Language/Libraries_and_Scripts/Scripts/syntax_t05: MissingCompileTimeError
 Language/Libraries_and_Scripts/Scripts/syntax_t06: MissingCompileTimeError
 Language/Libraries_and_Scripts/Scripts/syntax_t07: MissingCompileTimeError
@@ -1714,6 +430,21 @@
 Language/Libraries_and_Scripts/definition_syntax_t10: MissingCompileTimeError
 Language/Libraries_and_Scripts/definition_syntax_t29: MissingCompileTimeError
 Language/Libraries_and_Scripts/private_access_t03: RuntimeError
+Language/Metadata/before_export_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_import_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_library_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t02: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t03: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t04: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t05: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t06: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t07: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t08: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_param_t09: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_typedef_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_variable_t01: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
+Language/Metadata/before_variable_t02: RuntimeError  # Issue 28434: Kernel IR misses these annotations.
 Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
 Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
 Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
@@ -1743,8 +474,6 @@
 Language/Overview/Privacy/private_and_public_t10: RuntimeError
 Language/Overview/Privacy/private_and_public_t19: RuntimeError
 Language/Overview/Privacy/private_and_public_t20: RuntimeError
-Language/Overview/Scoping/conflicting_names_t04: DartkCrash
-Language/Overview/Scoping/conflicting_names_t11: DartkCrash
 Language/Overview/Scoping/conflicting_names_t16: Crash
 Language/Overview/Scoping/conflicting_names_t17: Crash
 Language/Overview/Scoping/conflicting_names_t18: Crash
@@ -1801,7 +530,6 @@
 Language/Statements/Continue/label_t14: DartkCrash
 Language/Statements/Continue/label_t17: DartkCrash
 Language/Statements/Do/execution_t04: Crash
-Language/Statements/For/Asynchronous_For_in/execution_t04: RuntimeError
 Language/Statements/For/Asynchronous_For_in/syntax_t02: MissingCompileTimeError
 Language/Statements/For/syntax_t07: RuntimeError
 Language/Statements/For/syntax_t09: MissingCompileTimeError
@@ -1813,6 +541,7 @@
 Language/Statements/If/execution_t03: Crash
 Language/Statements/Labels/namespace_t01: DartkCrash
 Language/Statements/Labels/scope_t05: MissingCompileTimeError
+Language/Statements/Labels/syntax_t03: Pass # OK
 Language/Statements/Local_Function_Declaration/reference_before_declaration_t01: MissingCompileTimeError
 Language/Statements/Local_Function_Declaration/reference_before_declaration_t03: MissingCompileTimeError
 Language/Statements/Local_Function_Declaration/syntax_t05: MissingCompileTimeError
@@ -1836,8 +565,10 @@
 Language/Statements/Switch/expressions_t03: MissingCompileTimeError
 Language/Statements/Switch/expressions_t04: MissingCompileTimeError
 Language/Statements/Switch/labels_constants_t01: MissingCompileTimeError
+Language/Statements/Switch/syntax_t02: Pass # OK
 Language/Statements/Switch/syntax_t16: MissingCompileTimeError
 Language/Statements/Switch/syntax_t17: MissingCompileTimeError
+Language/Statements/Try/catch_scope_t01: RuntimeError # Dartk Issue 28410
 Language/Statements/Try/malformed_type_t04: RuntimeError
 Language/Statements/Try/syntax_t06: MissingCompileTimeError
 Language/Statements/Try/syntax_t13: MissingCompileTimeError
@@ -1849,7 +580,7 @@
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: MissingCompileTimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: MissingCompileTimeError
 Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/static_type_t02: Crash
+Language/Types/Static_Types/deferred_type_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
 Language/Types/Static_Types/malformed_type_t01: RuntimeError
 Language/Types/Type_Declarations/Typedef/param_default_value_t02: MissingCompileTimeError
 Language/Types/Type_Declarations/Typedef/param_default_value_t03: MissingCompileTimeError
@@ -1880,6 +611,8 @@
 Language/Variables/final_or_static_initialization_t01: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t02: MissingCompileTimeError
 Language/Variables/final_or_static_initialization_t03: MissingCompileTimeError
+Language/Variables/final_t01/01: MissingRuntimeError # Dartk Issue 28566
+Language/Variables/final_t02/01: MissingRuntimeError # Dartk Issue 28566
 Language/Variables/final_t04: MissingCompileTimeError
 Language/Variables/final_t05: MissingCompileTimeError
 Language/Variables/final_t06: MissingCompileTimeError
@@ -1893,25 +626,7 @@
 Language/Variables/syntax_t12: MissingCompileTimeError
 Language/Variables/syntax_t13: MissingCompileTimeError
 Language/Variables/syntax_t14: MissingCompileTimeError
-LibTest/async/Future/catchError_A03_t05: Crash
-LibTest/async/Future/then_A05_t01: Crash
-LibTest/async/Stream/Stream.fromFutures_A01_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A01_t02: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t02: DartkCrash
-LibTest/async/Stream/asBroadcastStream_A03_t02: Crash
-LibTest/async/Stream/asBroadcastStream_A03_t03: Crash
-LibTest/async/Zone/bindBinaryCallback_A01_t01: Crash
-LibTest/async/Zone/bindCallback_A01_t01: Crash
-LibTest/async/Zone/bindUnaryCallback_A01_t01: Crash
-LibTest/async/Zone/current_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t01: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t03: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t05: Crash
-LibTest/async/Zone/parent_A01_t01: Crash
+LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: Skip # No support for deferred libraries.
 LibTest/core/Invocation/isAccessor_A01_t01: RuntimeError
 LibTest/core/Invocation/isAccessor_A01_t02: RuntimeError
 LibTest/core/Invocation/isGetter_A01_t01: RuntimeError
@@ -1923,21 +638,39 @@
 LibTest/core/Invocation/memberName_A01_t01: RuntimeError
 LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
 LibTest/core/Invocation/positionalArguments_A01_t01: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t03: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t04: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t05: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t06: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t07: RuntimeError
+LibTest/isolate/Isolate/spawnUri_A01_t06: Skip
+
+[ ($compiler == dartk || $compiler == dartkp) && $mode == debug ]
+Language/Classes/Constructors/Constant_Constructors/syntax_t03: Crash
+Language/Classes/Instance_Variables/constant_t01: Crash
+Language/Expressions/Lists/constant_list_t01: Crash
+Language/Libraries_and_Scripts/Scripts/top_level_main_t05: Crash
+Language/Statements/Switch/syntax_t16: Crash
+Language/Statements/Switch/syntax_t17: Crash
+Language/Statements/Yield_and_Yield_Each/Yield/location_t02: Crash
+Language/Statements/Yield_and_Yield_Each/Yield/location_t04: Crash
+Language/Statements/Yield_and_Yield_Each/Yield/location_t06: Crash
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: Crash
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: Crash
+Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: Crash
 
 # dartk: JIT failures
-[ $compiler == dartk && $runtime == vm ]
+[ $compiler == dartk ]
 Language/Classes/Getters/syntax_t06: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t01: MissingCompileTimeError
 Language/Expressions/Constants/depending_on_itself_t02: MissingCompileTimeError
-Language/Expressions/Constants/exception_t01: Crash
-Language/Expressions/Constants/exception_t02: Crash
 Language/Expressions/Constants/static_method_t03: MissingCompileTimeError
+Language/Expressions/Instance_Creation/Const/canonicalized_t05: RuntimeError
+Language/Expressions/Object_Identity/string_t01: RuntimeError
+Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
+Language/Libraries_and_Scripts/Imports/static_type_t01/01: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/02: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/03: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/04: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/05: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/06: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01/07: Pass
+Language/Libraries_and_Scripts/Imports/static_type_t01: RuntimeError
 Language/Metadata/before_class_t01: RuntimeError
 Language/Metadata/before_ctor_t01: RuntimeError
 Language/Metadata/before_ctor_t02: RuntimeError
@@ -1967,10 +700,15 @@
 Language/Statements/Local_Variable_Declaration/syntax_t06: CompileTimeError
 Language/Statements/Local_Variable_Declaration/syntax_t18: CompileTimeError
 Language/Statements/Local_Variable_Declaration/syntax_t19: CompileTimeError
-LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError
+
+# dartk: JIT failures (debug)
+[ $compiler == dartk && $mode == debug ]
+Language/Overview/Scoping/conflicting_names_t43: Crash
+Language/Overview/Scoping/hiding_declaration_t11: Crash
+Language/Overview/Scoping/hiding_declaration_t12: Crash
 
 # dartk: precompilation failures
-[ $compiler == dartkp && $runtime == dart_precompiled ]
+[ $compiler == dartkp ]
 Language/Classes/Constructors/Factories/redirecting_to_itself_t01: MissingCompileTimeError
 Language/Classes/Constructors/Factories/redirecting_to_itself_t02: MissingCompileTimeError
 Language/Classes/Constructors/Factories/redirecting_to_itself_t03: MissingCompileTimeError
@@ -2061,804 +799,6 @@
 Language/Statements/Try/syntax_t12: MissingCompileTimeError
 Language/Variables/final_t03: MissingCompileTimeError
 
-###############################################################################
-# VM Entries
-###############################################################################
-
-# dartk: Shared JIT & Precompiled failures
-[ ($compiler == dartk && $runtime == vm) || ($compiler == dartkp && $runtime == dart_precompiled) ]
-Language/Classes/Constructors/Constant_Constructors/initializer_not_a_constant_t03: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t01: Crash
-Language/Classes/Constructors/Constant_Constructors/invalid_constant_initializer_t03: Crash
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/non_final_instance_variable_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/potentially_constant_expression_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t01: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/superinitializer_t02: MissingCompileTimeError
-Language/Classes/Constructors/Constant_Constructors/syntax_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/const_modifier_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/default_value_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/name_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/execution_of_an_initializer_t02: RuntimeError # Dartk Issue 28566
-Language/Classes/Constructors/Generative_Constructors/execution_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t05: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/execution_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/formal_parameter_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t12: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializing_formals_execution_t02: RuntimeError # Dartk Issue 28566
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t01: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t02: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t03: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t04: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t05: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/initializing_other_function_t06: DartkCrash
-Language/Classes/Constructors/Generative_Constructors/redirection_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t07: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/redirection_t09: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t01: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t02: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t04: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t05: Crash
-Language/Classes/Constructors/Generative_Constructors/superclass_constructor_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t02: MissingCompileTimeError
-Language/Classes/Getters/syntax_t03: MissingCompileTimeError
-Language/Classes/Getters/syntax_t04: MissingCompileTimeError
-Language/Classes/Getters/syntax_t05: MissingCompileTimeError
-Language/Classes/Getters/syntax_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_or_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_0_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t05: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t07: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t09: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t10: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t11: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t12: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t13: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t14: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t15: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t16: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t17: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_1_t18: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/arity_2_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t01: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t02: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t03: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t06: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/optional_parameter_t08: MissingCompileTimeError
-Language/Classes/Instance_Methods/Operators/syntax_t04: MissingCompileTimeError
-Language/Classes/Instance_Methods/same_name_setter_t01: CompileTimeError
-Language/Classes/Instance_Variables/constant_t01: MissingCompileTimeError
-Language/Classes/Setters/name_t01: CompileTimeError
-Language/Classes/Setters/name_t02: CompileTimeError
-Language/Classes/Setters/name_t07: CompileTimeError
-Language/Classes/Setters/parameter_t01: MissingCompileTimeError
-Language/Classes/Setters/parameter_t02: MissingCompileTimeError
-Language/Classes/Setters/parameter_t03: MissingCompileTimeError
-Language/Classes/Setters/parameter_t04: MissingCompileTimeError
-Language/Classes/Setters/parameter_t05: MissingCompileTimeError
-Language/Classes/Setters/parameter_t06: MissingCompileTimeError
-Language/Classes/Setters/parameter_t07: MissingCompileTimeError
-Language/Classes/Setters/parameter_t08: MissingCompileTimeError
-Language/Classes/Setters/static_setter_t05: RuntimeError
-Language/Classes/Setters/static_setter_t06: DartkCrash
-Language/Classes/Setters/syntax_t01: RuntimeError
-Language/Classes/Setters/syntax_t03: MissingCompileTimeError
-Language/Classes/Setters/syntax_t04: RuntimeError
-Language/Classes/Static_Methods/declaration_t01: MissingCompileTimeError
-Language/Classes/Static_Methods/same_name_method_and_setter_t01: CompileTimeError
-Language/Classes/Superclasses/Inheritance_and_Overriding/inheritance_t03: RuntimeError
-Language/Classes/Superclasses/superclass_of_itself_t01: MissingCompileTimeError
-Language/Classes/Superclasses/superclass_of_itself_t02: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t01: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t02: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t03: MissingCompileTimeError
-Language/Classes/Superclasses/wrong_superclass_t05: DartkCrash
-Language/Classes/Superclasses/wrong_superclass_t07: Crash
-Language/Classes/Superclasses/wrong_superclass_t08: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/dynamic_type_t02: MissingCompileTimeError
-Language/Classes/Superinterfaces/itself_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/type_variable_as_superinterface_t01: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t01: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t02: DartkCrash
-Language/Classes/Superinterfaces/wrong_type_t03: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t04: MissingCompileTimeError
-Language/Classes/Superinterfaces/wrong_type_t05: MissingCompileTimeError
-Language/Classes/declarations_t02: MissingCompileTimeError
-Language/Classes/declarations_t03: MissingCompileTimeError
-Language/Classes/declarations_t04: MissingCompileTimeError
-Language/Classes/declarations_t06: MissingCompileTimeError
-Language/Classes/declarations_t08: MissingCompileTimeError
-Language/Classes/declarations_t33: MissingCompileTimeError
-Language/Classes/definition_t23: RuntimeError
-Language/Classes/same_name_member_and_class_t01: MissingCompileTimeError
-Language/Classes/same_name_member_and_class_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t01: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t02: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t03: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t05: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t06: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t08: MissingCompileTimeError
-Language/Classes/same_name_type_variable_t09: MissingCompileTimeError
-Language/Enums/restrictions_t01: Crash
-Language/Enums/restrictions_t02: MissingCompileTimeError
-Language/Enums/restrictions_t03: MissingCompileTimeError
-Language/Enums/restrictions_t04: MissingCompileTimeError
-Language/Enums/restrictions_t05: MissingCompileTimeError
-Language/Enums/restrictions_t06: MissingCompileTimeError
-Language/Enums/restrictions_t07: MissingCompileTimeError
-Language/Enums/restrictions_t08: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t04: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t05: DartkCrash
-Language/Expressions/Assignable_Expressions/syntax_t23: DartkCrash
-Language/Expressions/Assignment/expression_assignment_failed_t03: RuntimeError
-Language/Expressions/Assignment/expression_assignment_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t01: RuntimeError
-Language/Expressions/Assignment/no_such_method_t02: RuntimeError
-Language/Expressions/Assignment/no_such_method_t03: RuntimeError
-Language/Expressions/Assignment/no_such_method_t04: RuntimeError
-Language/Expressions/Assignment/no_such_method_t05: RuntimeError
-Language/Expressions/Assignment/no_such_method_t06: RuntimeError
-Language/Expressions/Assignment/no_such_method_t07: RuntimeError
-Language/Expressions/Assignment/no_such_method_t08: RuntimeError
-Language/Expressions/Assignment/no_such_method_t09: RuntimeError
-Language/Expressions/Assignment/static_type_t05: RuntimeError
-Language/Expressions/Assignment/static_type_t06: RuntimeError
-Language/Expressions/Assignment/static_warning_t03/none: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t01: RuntimeError
-Language/Expressions/Assignment/super_assignment_failed_t02: RuntimeError
-Language/Expressions/Assignment/super_assignment_value_t02: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t06: RuntimeError
-Language/Expressions/Await_Expressions/evaluation_throws_t07: RuntimeError
-Language/Expressions/Await_Expressions/syntax_t06: Crash
-Language/Expressions/Conditional/syntax_t04: MissingCompileTimeError
-Language/Expressions/Constants/bitwise_operators_t02: Crash
-Language/Expressions/Constants/bitwise_operators_t03: Crash
-Language/Expressions/Constants/bitwise_operators_t04: Crash
-Language/Expressions/Constants/bitwise_operators_t05: Crash
-Language/Expressions/Constants/bitwise_operators_t06: Crash
-Language/Expressions/Constants/constant_constructor_t03: MissingCompileTimeError
-Language/Expressions/Constants/constant_list_t02: MissingCompileTimeError
-Language/Expressions/Constants/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t03: Crash
-Language/Expressions/Constants/equals_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/equals_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/exception_t03: Crash
-Language/Expressions/Constants/exception_t04: MissingCompileTimeError
-Language/Expressions/Constants/identical_t02: Crash
-Language/Expressions/Constants/identical_t03: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t03: Crash
-Language/Expressions/Constants/identifier_denotes_a_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/identifier_denotes_a_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t02: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t03: MissingCompileTimeError
-Language/Expressions/Constants/literal_string_t04: Crash
-Language/Expressions/Constants/literal_string_t05: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t02: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t03: MissingCompileTimeError
-Language/Expressions/Constants/logical_expression_t04: MissingCompileTimeError
-Language/Expressions/Constants/math_operators_t02: Crash
-Language/Expressions/Constants/math_operators_t03: Crash
-Language/Expressions/Constants/math_operators_t04: Crash
-Language/Expressions/Constants/math_operators_t05: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t06: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t07: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t08: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t09: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t10: MissingCompileTimeError
-Language/Expressions/Constants/no_other_constant_expressions_t11: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t12: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t13: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t14: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t15: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t17: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t18: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t20: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t21: Crash
-Language/Expressions/Constants/no_other_constant_expressions_t31: Crash
-Language/Expressions/Constants/static_constant_t02: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t03: Crash
-Language/Expressions/Constants/static_constant_t04: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t06: MissingCompileTimeError
-Language/Expressions/Constants/static_constant_t07: MissingCompileTimeError
-Language/Expressions/Constants/static_method_t02: Crash
-Language/Expressions/Constants/string_length_t02: MissingCompileTimeError
-Language/Expressions/Constants/string_length_t03: MissingCompileTimeError
-Language/Expressions/Constants/ternary_operator_t02: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t01: Crash
-Language/Expressions/Constants/top_level_function_t02: Crash
-Language/Expressions/Constants/top_level_function_t04: MissingCompileTimeError
-Language/Expressions/Constants/top_level_function_t05: MissingCompileTimeError
-Language/Expressions/Function_Expressions/syntax_t03: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t02: DartkCrash
-Language/Expressions/Function_Invocation/Actual_Argument_List_Evaluation/syntax_t03: DartkCrash
-Language/Expressions/Function_Invocation/Binding_Actuals_to_Formals/same_name_arguments_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t02: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t03: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t04: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t05: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t06: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/async_and_generator_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t09: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_identifier_t10: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t12: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t15: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_static_t02: Crash
-Language/Expressions/Identifier_Reference/syntax_built_in_t01: CompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t07: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/syntax_t08: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/undeclared_identifier_t04: RuntimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t03: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t05: DartkCrash
-Language/Expressions/Instance_Creation/Const/accessibility_t06: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/accessibility_t07: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/arguments_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_name_t04: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/constant_constructor_same_name_as_class_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t01: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/deferred_type_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/exception_t01: Crash
-Language/Expressions/Instance_Creation/New/evaluation_t01: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t02: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t06: RuntimeError
-Language/Expressions/Instance_Creation/New/evaluation_t12: RuntimeError # Dartk Issue 28564
-Language/Expressions/Instance_Creation/New/evaluation_t19: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Expressions/Instance_Creation/New/syntax_t02: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t03: DartkCrash
-Language/Expressions/Instance_Creation/New/type_t05: DartkCrash
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t02: MissingCompileTimeError
-Language/Expressions/Instance_Creation/malformed_or_malbounded_t04: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t01: MissingCompileTimeError
-Language/Expressions/Lists/constant_list_t02: Crash
-Language/Expressions/Maps/constant_map_key_value_t01: Crash
-Language/Expressions/Maps/constant_map_key_value_t03: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_t01: Crash
-Language/Expressions/Maps/constant_map_t02: MissingCompileTimeError
-Language/Expressions/Maps/constant_map_type_t01: MissingCompileTimeError
-Language/Expressions/Maps/key_value_equals_operator_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Cascaded_Invocations/syntax_t04: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/evaluation_t07: RuntimeError # Dartk Issue 28562
-Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t17: RuntimeError
-Language/Expressions/Method_Invocation/Ordinary_Invocation/method_lookup_failed_t18: RuntimeError # Dartk Issue 28562
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t07: DartkCrash
-Language/Expressions/Method_Invocation/Ordinary_Invocation/syntax_t08: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t01: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t02: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t03: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/getter_lookup_failed_t04: RuntimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t02: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t03: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t02: DartkCrash
-Language/Expressions/Method_Invocation/Super_Invocation/syntax_t03: DartkCrash
-Language/Expressions/Numbers/extend_or_implement_double_t06: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t21: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t25: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t26: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t27: MissingCompileTimeError
-Language/Expressions/Numbers/syntax_t29: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t06: MissingCompileTimeError
-Language/Expressions/Postfix_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Postfix_Expressions/syntax_t08: DartkCrash
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t01: RuntimeError
-Language/Expressions/Property_Extraction/Super_Getter_Access_and_Method_Closurization/no_such_method_t02: RuntimeError
-Language/Expressions/This/placement_t04: MissingCompileTimeError
-Language/Expressions/Throw/no_catch_clause_t01: Crash
-Language/Expressions/Throw/no_catch_clause_t02: Crash
-Language/Expressions/Throw/no_catch_clause_t03: Crash
-Language/Expressions/Throw/no_catch_clause_t04: Crash
-Language/Expressions/Throw/no_catch_clause_t05: Crash
-Language/Expressions/Throw/no_catch_clause_t06: Crash
-Language/Expressions/Throw/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Cast/evaluation_t04: RuntimeError
-Language/Expressions/Type_Cast/evaluation_t05: RuntimeError
-Language/Expressions/Type_Cast/syntax_t02: MissingCompileTimeError
-Language/Expressions/Type_Test/evaluation_t03: RuntimeError
-Language/Expressions/Type_Test/evaluation_t04: RuntimeError
-Language/Expressions/Type_Test/evaluation_t10: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Expressions/Unary_Expressions/syntax_t06: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t07: DartkCrash
-Language/Expressions/Unary_Expressions/syntax_t08: MissingCompileTimeError
-Language/Expressions/Unary_Expressions/syntax_t09: MissingCompileTimeError
-Language/Functions/External_Functions/not_connected_to_a_body_t01: RuntimeError # Dartk Issue 28565
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/default_value_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Optional_Formals/name_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t07: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t08: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t09: MissingCompileTimeError
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t10: DartkCrash
-Language/Functions/Formal_Parameters/Required_Formals/syntax_t11: DartkCrash
-Language/Functions/Formal_Parameters/declare_as_constant_t01: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t02: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t03: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t04: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t05: MissingCompileTimeError
-Language/Functions/Formal_Parameters/declare_as_constant_t06: MissingCompileTimeError
-Language/Functions/Formal_Parameters/syntax_t06: DartkCrash
-Language/Functions/Formal_Parameters/syntax_t13: DartkCrash
-Language/Functions/Function_Declarations/external_function_t01: MissingCompileTimeError
-Language/Functions/Function_Declarations/external_function_t02: MissingCompileTimeError
-Language/Functions/ctor_modifier_t03: MissingCompileTimeError
-Language/Functions/ctor_modifier_t04: MissingCompileTimeError
-Language/Functions/ctor_modifier_t09: MissingCompileTimeError
-Language/Functions/ctor_modifier_t10: MissingCompileTimeError
-Language/Functions/ctor_modifier_t15: MissingCompileTimeError
-Language/Functions/ctor_modifier_t16: MissingCompileTimeError
-Language/Functions/setter_modifier_t01: MissingCompileTimeError
-Language/Functions/setter_modifier_t02: MissingCompileTimeError
-Language/Functions/setter_modifier_t03: MissingCompileTimeError
-Language/Functions/setter_modifier_t04: MissingCompileTimeError
-Language/Functions/setter_modifier_t05: MissingCompileTimeError
-Language/Functions/setter_modifier_t06: MissingCompileTimeError
-Language/Functions/syntax_t05: MissingCompileTimeError
-Language/Functions/syntax_t31: MissingCompileTimeError
-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
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t02: MissingCompileTimeError
-Language/Interfaces/Superinterfaces/superinterface_of_itself_t03: MissingCompileTimeError
-Language/Libraries_and_Scripts/Exports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Exports/invalid_uri_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Libraries_and_Scripts/Imports/deferred_import_t02: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Libraries_and_Scripts/Imports/implicit_hide_t01: DartkCrash
-Language/Libraries_and_Scripts/Imports/implicit_hide_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/invalid_uri_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t07: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t08: DartkCrash
-Language/Libraries_and_Scripts/Imports/namespace_changes_t16: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t17: RuntimeError
-Language/Libraries_and_Scripts/Imports/namespace_changes_t27: CompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t02/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t05: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t10: RuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t12/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t15/01: MissingRuntimeError
-Language/Libraries_and_Scripts/Imports/same_name_t17: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/same_name_t19: RuntimeError
-Language/Libraries_and_Scripts/Imports/syntax_t02: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t03: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t04: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t11: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t13: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t18: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t20: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t21: DartkCrash
-Language/Libraries_and_Scripts/Imports/syntax_t32: MissingCompileTimeError
-Language/Libraries_and_Scripts/Imports/syntax_t41: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t01: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t02: Timeout
-Language/Libraries_and_Scripts/Parts/compilation_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/compilation_t08: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t09: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t10: DartkCrash
-Language/Libraries_and_Scripts/Parts/compilation_t11: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/static_warning_t01: RuntimeError
-Language/Libraries_and_Scripts/Parts/syntax_t01: MissingCompileTimeError
-Language/Libraries_and_Scripts/Parts/syntax_t05: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t07: DartkCrash
-Language/Libraries_and_Scripts/Parts/syntax_t08: DartkCrash
-Language/Libraries_and_Scripts/Scripts/syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t06: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t07: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t08: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t10: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/syntax_t14: MissingCompileTimeError
-Language/Libraries_and_Scripts/Scripts/top_level_main_t01: Crash
-Language/Libraries_and_Scripts/Scripts/top_level_main_t02: Crash
-Language/Libraries_and_Scripts/definition_syntax_t05: MissingCompileTimeError
-Language/Libraries_and_Scripts/private_access_t03: RuntimeError
-Language/Mixins/Mixin_Application/deferred_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/syntax_t15: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t02: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t04: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t05: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t06: DartkCrash
-Language/Mixins/Mixin_Application/wrong_mixin_type_t07: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_mixin_type_t08: Crash
-Language/Mixins/Mixin_Application/wrong_type_t01: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t02: DartkCrash
-Language/Mixins/Mixin_Application/wrong_type_t03: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t04: Crash
-Language/Mixins/Mixin_Application/wrong_type_t05: MissingCompileTimeError
-Language/Mixins/Mixin_Application/wrong_type_t06: Crash
-Language/Mixins/declaring_constructor_t01: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t02: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t03: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t04: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t07: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t08: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t09: MissingCompileTimeError
-Language/Mixins/declaring_constructor_t10: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t06: RuntimeError
-Language/Overview/Privacy/private_and_public_t09: RuntimeError
-Language/Overview/Privacy/private_and_public_t10: RuntimeError
-Language/Overview/Privacy/private_and_public_t19: RuntimeError
-Language/Overview/Privacy/private_and_public_t20: RuntimeError
-Language/Overview/Scoping/conflicting_names_t04: DartkCrash
-Language/Overview/Scoping/conflicting_names_t11: DartkCrash
-Language/Overview/Scoping/conflicting_names_t16: Crash
-Language/Overview/Scoping/conflicting_names_t17: Crash
-Language/Overview/Scoping/conflicting_names_t18: Crash
-Language/Overview/Scoping/conflicting_names_t25: Crash
-Language/Overview/Scoping/conflicting_names_t26: Crash
-Language/Overview/Scoping/conflicting_names_t27: Crash
-Language/Overview/Scoping/conflicting_names_t31: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t32: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t33: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t34: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t35: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t37: Crash
-Language/Overview/Scoping/conflicting_names_t38: Crash
-Language/Overview/Scoping/conflicting_names_t39: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t40: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t41: MissingCompileTimeError
-Language/Overview/Scoping/conflicting_names_t44: Crash
-Language/Overview/Scoping/hiding_declaration_t16: Crash
-Language/Overview/Scoping/hiding_declaration_t28: DartkCrash
-Language/Reference/Lexical_Rules/Comments/documentation_t02: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t03: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t04: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t05: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t06: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t10: Crash
-Language/Reference/Lexical_Rules/Comments/documentation_t11: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t03: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t04: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t05: Crash
-Language/Reference/Lexical_Rules/Comments/multi_line_t06: Crash
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/Reserved_Words/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t01: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t02: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t03: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t04: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t05: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t06: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t07: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t08: MissingCompileTimeError
-Language/Reference/Lexical_Rules/whitespace_t09: MissingCompileTimeError
-Language/Statements/Break/label_t11: DartkCrash
-Language/Statements/Break/label_t12: DartkCrash
-Language/Statements/Continue/async_loops_t10: DartkCrash
-Language/Statements/Continue/label_t03: DartkCrash
-Language/Statements/Continue/label_t06: MissingCompileTimeError
-Language/Statements/Continue/label_t08: MissingCompileTimeError
-Language/Statements/Continue/label_t09: MissingCompileTimeError
-Language/Statements/Continue/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t11: MissingCompileTimeError
-Language/Statements/Continue/label_t14: DartkCrash
-Language/Statements/Continue/label_t17: DartkCrash
-Language/Statements/Do/execution_t04: Crash
-Language/Statements/For/Asynchronous_For_in/execution_t04: RuntimeError
-Language/Statements/For/Asynchronous_For_in/syntax_t02: MissingCompileTimeError
-Language/Statements/For/syntax_t07: RuntimeError
-Language/Statements/For/syntax_t09: MissingCompileTimeError
-Language/Statements/For/syntax_t12: MissingCompileTimeError
-Language/Statements/For/syntax_t13: MissingCompileTimeError
-Language/Statements/For/syntax_t16: MissingCompileTimeError
-Language/Statements/For/syntax_t19: MissingCompileTimeError
-Language/Statements/For/syntax_t20: MissingCompileTimeError
-Language/Statements/If/execution_t03: Crash
-Language/Statements/Labels/namespace_t01: DartkCrash
-Language/Statements/Labels/scope_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t01: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/reference_before_declaration_t03: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t05: MissingCompileTimeError
-Language/Statements/Local_Function_Declaration/syntax_t06: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t11: MissingCompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t20: MissingCompileTimeError
-Language/Statements/Rethrow/on_catch_clause_t01: Crash
-Language/Statements/Rethrow/on_catch_clause_t02: Crash
-Language/Statements/Return/generator_function_t01: MissingCompileTimeError
-Language/Statements/Return/generator_function_t02: MissingCompileTimeError
-Language/Statements/Return/generator_function_t03: MissingCompileTimeError
-Language/Statements/Return/generator_function_t04: MissingCompileTimeError
-Language/Statements/Return/generator_function_t05: MissingCompileTimeError
-Language/Statements/Return/generator_function_t06: MissingCompileTimeError
-Language/Statements/Return/generator_function_t07: MissingCompileTimeError
-Language/Statements/Return/generator_function_t08: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t01: MissingCompileTimeError
-Language/Statements/Switch/equal_operator_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t01: MissingCompileTimeError
-Language/Statements/Switch/expressions_t02: MissingCompileTimeError
-Language/Statements/Switch/expressions_t03: MissingCompileTimeError
-Language/Statements/Switch/expressions_t04: MissingCompileTimeError
-Language/Statements/Switch/labels_constants_t01: MissingCompileTimeError
-Language/Statements/Switch/syntax_t16: MissingCompileTimeError
-Language/Statements/Switch/syntax_t17: MissingCompileTimeError
-Language/Statements/Try/catch_scope_t01: RuntimeError # Dartk Issue 28410
-Language/Statements/Try/malformed_type_t04: RuntimeError
-Language/Statements/Try/syntax_t06: MissingCompileTimeError
-Language/Statements/Try/syntax_t13: MissingCompileTimeError
-Language/Statements/Try/syntax_t15: Crash
-Language/Statements/While/execution_t03: Crash
-Language/Statements/Yield_and_Yield_Each/Yield/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t02: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t04: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/location_t06: MissingCompileTimeError
-Language/Statements/Yield_and_Yield_Each/Yield_Each/static_type_t02: Crash
-Language/Types/Static_Types/deferred_type_t01: RuntimeError # Kernel Issue 28335 (deferred libraries)
-Language/Types/Static_Types/malformed_type_t01: RuntimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/param_default_value_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t01: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t02: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t03: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t04: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t08: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t09: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t10: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t11: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t12: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t13: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t14: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t15: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t16: MissingCompileTimeError
-Language/Types/Type_Declarations/Typedef/self_reference_t17: MissingCompileTimeError
-Language/Types/Type_Void/syntax_t02: MissingCompileTimeError
-Language/Variables/constant_initialization_t01: MissingCompileTimeError
-Language/Variables/constant_initialization_t02: MissingCompileTimeError
-Language/Variables/constant_variable_t03: RuntimeError
-Language/Variables/constant_variable_t04: RuntimeError
-Language/Variables/constant_variable_t05: MissingCompileTimeError
-Language/Variables/constant_variable_t06: MissingCompileTimeError
-Language/Variables/constant_variable_t07: MissingCompileTimeError
-Language/Variables/constant_variable_t08: MissingCompileTimeError
-Language/Variables/constant_variable_t10: RuntimeError
-Language/Variables/final_t01/01: MissingRuntimeError # Dartk Issue 28566
-Language/Variables/final_t02/01: MissingRuntimeError # Dartk Issue 28566
-Language/Libraries_and_Scripts/Exports/invalid_uri_t02: Pass # OK
-Language/Libraries_and_Scripts/Imports/invalid_uri_t02: Pass # OK
-Language/Libraries_and_Scripts/Parts/syntax_t06: Pass # OK
-Language/Statements/Labels/syntax_t03: Pass # OK
-Language/Statements/Switch/syntax_t02: Pass # OK
-Language/Expressions/Identifier_Reference/built_in_identifier_t35: Pass # OK, Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t36: Pass # OK, Issue 25732
-Language/Expressions/Identifier_Reference/built_in_identifier_t37: Pass # OK, Issue 25732
-Language/Expressions/Identifier_Reference/built_in_not_dynamic_t14: Pass # OK, Issue 25732
-Language/Variables/local_variable_t01: MissingCompileTimeError
-Language/Variables/local_variable_t04: MissingCompileTimeError
-Language/Variables/local_variable_t05: MissingCompileTimeError
-Language/Variables/syntax_t04: MissingCompileTimeError
-Language/Variables/syntax_t05: MissingCompileTimeError
-Language/Variables/syntax_t08: MissingCompileTimeError
-Language/Variables/syntax_t12: MissingCompileTimeError
-Language/Variables/syntax_t13: MissingCompileTimeError
-Language/Variables/syntax_t14: MissingCompileTimeError
-LibTest/async/Future/catchError_A03_t05: Crash
-LibTest/async/Future/then_A05_t01: Crash
-LibTest/async/Stream/Stream.fromFutures_A01_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A01_t02: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t01: DartkCrash
-LibTest/async/Stream/Stream.fromFutures_A02_t02: DartkCrash
-LibTest/async/Stream/asBroadcastStream_A03_t02: Crash
-LibTest/async/Stream/asBroadcastStream_A03_t03: Crash
-LibTest/async/Zone/bindBinaryCallback_A01_t01: Crash
-LibTest/async/Zone/bindCallback_A01_t01: Crash
-LibTest/async/Zone/bindUnaryCallback_A01_t01: Crash
-LibTest/async/Zone/current_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t01: Crash
-LibTest/async/Zone/handleUncaughtError_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t01: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t03: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t04: Crash
-LibTest/async/Zone/inSameErrorZone_A01_t05: Crash
-LibTest/async/Zone/parent_A01_t01: Crash
-LibTest/core/Invocation/isAccessor_A01_t01: RuntimeError
-LibTest/core/Invocation/isAccessor_A01_t02: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isGetter_A01_t02: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t01: RuntimeError
-LibTest/core/Invocation/isMethod_A01_t02: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t01: RuntimeError
-LibTest/core/Invocation/isSetter_A01_t02: RuntimeError
-LibTest/core/Invocation/memberName_A01_t01: RuntimeError
-LibTest/core/Invocation/namedArguments_A01_t01: RuntimeError
-LibTest/core/Invocation/positionalArguments_A01_t01: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t02: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t03: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t04: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t05: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t06: RuntimeError
-LibTest/isolate/Isolate/spawn_A02_t07: RuntimeError
-
-# dartk: JIT failures
-[ $compiler == dartk && $runtime == vm ]
-Language/Classes/Getters/syntax_t06: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t01: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t02: MissingCompileTimeError
-Language/Expressions/Constants/static_method_t03: MissingCompileTimeError
-Language/Expressions/Instance_Creation/Const/canonicalized_t05: RuntimeError
-Language/Expressions/Object_Identity/string_t01: RuntimeError
-Language/Expressions/Strings/adjacent_strings_t02: RuntimeError
-Language/Libraries_and_Scripts/Imports/static_type_t01: RuntimeError
-
-# These tests should throw RuntimeError but they Pass instead.
-Language/Libraries_and_Scripts/Imports/static_type_t01/01: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/02: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/03: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/04: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/05: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/06: Pass
-Language/Libraries_and_Scripts/Imports/static_type_t01/07: Pass
-Language/Metadata/before_class_t01: RuntimeError
-Language/Metadata/before_ctor_t01: RuntimeError
-Language/Metadata/before_ctor_t02: RuntimeError
-Language/Metadata/before_factory_t01: RuntimeError
-Language/Metadata/before_function_t01: RuntimeError
-Language/Metadata/before_function_t02: RuntimeError
-Language/Metadata/before_function_t03: RuntimeError
-Language/Metadata/before_function_t04: RuntimeError
-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/compilation_t01: MissingCompileTimeError
-Language/Metadata/compilation_t02: MissingCompileTimeError
-Language/Metadata/compilation_t03: MissingCompileTimeError
-Language/Metadata/compilation_t04: MissingCompileTimeError
-Language/Metadata/compilation_t08: MissingCompileTimeError
-Language/Metadata/compilation_t09: MissingCompileTimeError
-Language/Metadata/compilation_t10: MissingCompileTimeError
-Language/Metadata/compilation_t11: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t04: CompileTimeError
-Language/Overview/Scoping/conflicting_names_t43: MissingCompileTimeError
-Language/Statements/Labels/scope_t01: CompileTimeError
-Language/Statements/Labels/scope_t07: CompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t05: CompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t06: CompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t18: CompileTimeError
-Language/Statements/Local_Variable_Declaration/syntax_t19: CompileTimeError
-LibTest/isolate/Isolate/spawnUri_A02_t04: RuntimeError
-
-# dartk: JIT failures (debug)
-[ $compiler == dartk && $runtime == vm && $mode == debug ]
-
-# dartk: precompilation failures
-[ $compiler == dartkp && $runtime == dart_precompiled ]
-Language/Classes/Constructors/Factories/redirecting_to_itself_t01: MissingCompileTimeError
-Language/Classes/Constructors/Factories/redirecting_to_itself_t02: MissingCompileTimeError
-Language/Classes/Constructors/Factories/redirecting_to_itself_t03: MissingCompileTimeError
-Language/Classes/Constructors/Factories/redirecting_to_itself_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializer_for_a_variable_t01: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializer_for_a_variable_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t06: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t08: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t13: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/initializers_t14: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/many_initializers_t01: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/many_initializers_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/many_initializers_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/many_initializers_t04: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/not_an_instance_variable_t01: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/not_an_instance_variable_t02: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/not_an_instance_variable_t03: MissingCompileTimeError
-Language/Classes/Constructors/Generative_Constructors/not_an_instance_variable_t04: MissingCompileTimeError
-Language/Classes/Getters/syntax_t06: Crash
-Language/Classes/same_name_member_and_class_t02: MissingCompileTimeError
-Language/Classes/same_name_member_and_class_t04: MissingCompileTimeError
-Language/Expressions/Additive_Expressions/syntax_t15: MissingCompileTimeError
-Language/Expressions/Additive_Expressions/syntax_t16: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t17: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t21: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t22: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t24: MissingCompileTimeError
-Language/Expressions/Assignable_Expressions/syntax_t25: MissingCompileTimeError
-Language/Expressions/Assignment/prefix_object_t01: MissingCompileTimeError
-Language/Expressions/Assignment/prefix_object_t02: MissingCompileTimeError
-Language/Expressions/Bitwise_Expressions/syntax_t02: MissingCompileTimeError
-Language/Expressions/Conditional/syntax_t02: MissingCompileTimeError
-Language/Expressions/Conditional/syntax_t03: MissingCompileTimeError
-Language/Expressions/Constants/depending_on_itself_t01: Crash
-Language/Expressions/Constants/depending_on_itself_t02: Crash
-Language/Expressions/Constants/exception_t01: Crash
-Language/Expressions/Constants/exception_t02: Crash
-Language/Expressions/Constants/static_method_t03: Crash
-Language/Expressions/Equality/syntax_t02: MissingCompileTimeError
-Language/Expressions/Function_Invocation/Unqualified_Invocation/prefix_object_invocation_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_prefix_t01: MissingCompileTimeError
-Language/Expressions/Identifier_Reference/evaluation_type_parameter_t02: MissingCompileTimeError
-Language/Expressions/Logical_Boolean_Expressions/syntax_t02: MissingCompileTimeError
-Language/Expressions/Logical_Boolean_Expressions/syntax_t03: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t01: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t04: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t05: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t06: MissingCompileTimeError
-Language/Expressions/Method_Invocation/Super_Invocation/invocation_t07: MissingCompileTimeError
-Language/Expressions/Multiplicative_Expressions/syntax_t26: MissingCompileTimeError
-Language/Expressions/Relational_Expressions/syntax_t24: MissingCompileTimeError
-Language/Expressions/Shift/syntax_t08: MissingCompileTimeError
-Language/Expressions/This/definition_t05: MissingCompileTimeError
-Language/Expressions/This/placement_t01: MissingCompileTimeError
-Language/Expressions/This/placement_t03: MissingCompileTimeError
-Language/Expressions/This/placement_t05: MissingCompileTimeError
-Language/Expressions/This/placement_t06: MissingCompileTimeError
-Language/Expressions/This/placement_t07: MissingCompileTimeError
-Language/Expressions/This/placement_t08: MissingCompileTimeError
-Language/Overview/Privacy/private_and_public_t04: RuntimeError
-Language/Overview/Scoping/conflicting_names_t43: Crash
-Language/Overview/Scoping/hiding_declaration_t11: Crash
-Language/Overview/Scoping/hiding_declaration_t12: Crash
-Language/Statements/Break/label_t01: MissingCompileTimeError
-Language/Statements/Break/label_t02: MissingCompileTimeError
-Language/Statements/Break/label_t05: MissingCompileTimeError
-Language/Statements/Break/label_t06: MissingCompileTimeError
-Language/Statements/Break/label_t07: MissingCompileTimeError
-Language/Statements/Break/label_t08: MissingCompileTimeError
-Language/Statements/Break/label_t09: MissingCompileTimeError
-Language/Statements/Break/label_t10: MissingCompileTimeError
-Language/Statements/Continue/label_t01: MissingCompileTimeError
-Language/Statements/Continue/label_t02: MissingCompileTimeError
-Language/Statements/Continue/label_t04: MissingCompileTimeError
-Language/Statements/Continue/label_t05: MissingCompileTimeError
-Language/Statements/Continue/label_t15: MissingCompileTimeError
-Language/Statements/Continue/label_t16: MissingCompileTimeError
-Language/Statements/Labels/scope_t01: RuntimeError
-Language/Statements/Labels/scope_t02: MissingCompileTimeError
-Language/Statements/Labels/scope_t07: RuntimeError
-Language/Statements/Local_Variable_Declaration/syntax_t05: RuntimeError
-Language/Statements/Local_Variable_Declaration/syntax_t06: RuntimeError
-Language/Statements/Local_Variable_Declaration/syntax_t18: RuntimeError
-Language/Statements/Local_Variable_Declaration/syntax_t19: RuntimeError
-Language/Statements/Return/generative_constructor_t01: MissingCompileTimeError
-Language/Statements/Return/generative_constructor_t02: MissingCompileTimeError
-Language/Statements/Return/generative_constructor_t03: MissingCompileTimeError
-Language/Statements/Try/syntax_t12: MissingCompileTimeError
-Language/Variables/final_t03: MissingCompileTimeError
-
 # dartk: precompilation failures (debug)
-[ $compiler == dartkp && $runtime == dart_precompiled && $mode == debug ]
+[ $compiler == dartkp && $mode == debug ]
+Language/Functions/External_Functions/not_connected_to_a_body_t01: Crash
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index d3add31..4748e65 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -63,7 +63,7 @@
     // 2. Some code was refactored, and there are more methods.
     // Either situation could be problematic, but in situation 2, it is often
     // acceptable to increase [expectedMethodCount] a little.
-    int expectedMethodCount = 476;
+    int expectedMethodCount = 477;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 97ad29f..14cb278 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -183,6 +183,9 @@
         buildNamedFunctionType(null, null, null);
         buildInterfaceType(null, null);
       }''',
+  'functionTypeTest': r'functionTypeTest(f, t) {}',
+  'functionTypeCast': r'functionTypeCast(f, t) { return f; }',
+  'functionTypeCheck': r'functionTypeCheck(f, t) { return f; }',
   'getFallThroughError': 'getFallThroughError() {}',
   'getIsolateAffinityTag': 'getIsolateAffinityTag(_) {}',
   'getRuntimeTypeArgument':
diff --git a/tests/html/html.status b/tests/html/html.status
index 5ac5e09..0735b89 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -431,6 +431,3 @@
 custom/js_custom_test: Fail # mirrors not supported
 custom/mirrors_test: Fail # mirrors not supported
 mirrors_js_typed_interop_test: Fail # mirrors not supported
-
-# These are raw dart:js tests that fail due to bugs in the CPS IR:
-js_test/Dart_functions: RuntimeError # Tree-shaking an escaping closure #25720
diff --git a/tests/language/language_kernel.status b/tests/language/language_kernel.status
index 414115c..4d58159 100644
--- a/tests/language/language_kernel.status
+++ b/tests/language/language_kernel.status
@@ -6,753 +6,11 @@
 abstract_beats_arguments_test: RuntimeError
 abstract_runtime_error_test/01: RuntimeError
 abstract_runtime_error_test/02: RuntimeError
-application_negative_test: Crash
-arg_param_trailing_comma_test/107: MissingCompileTimeError
-arg_param_trailing_comma_test/112: DartkCrash
-arg_param_trailing_comma_test/115: DartkCrash
-async_test/constructor2: DartkCrash
-arg_param_trailing_comma_test/121: DartkCrash
-arg_param_trailing_comma_test/124: DartkCrash
-arg_param_trailing_comma_test/14: DartkCrash
-arg_param_trailing_comma_test/171: DartkCrash
-arg_param_trailing_comma_test/174: DartkCrash
-arg_param_trailing_comma_test/17: DartkCrash
-arg_param_trailing_comma_test/180: DartkCrash
-arg_param_trailing_comma_test/183: DartkCrash
-arg_param_trailing_comma_test/193: DartkCrash
-arg_param_trailing_comma_test/196: DartkCrash
-arg_param_trailing_comma_test/202: DartkCrash
-arg_param_trailing_comma_test/205: DartkCrash
-arg_param_trailing_comma_test/31: DartkCrash
-arg_param_trailing_comma_test/34: DartkCrash
-arg_param_trailing_comma_test/40: DartkCrash
-arg_param_trailing_comma_test/43: DartkCrash
-arg_param_trailing_comma_test/53: DartkCrash
-arg_param_trailing_comma_test/56: DartkCrash
-arg_param_trailing_comma_test/5: DartkCrash
-arg_param_trailing_comma_test/62: DartkCrash
-arg_param_trailing_comma_test/65: DartkCrash
-arg_param_trailing_comma_test/79: DartkCrash
-arg_param_trailing_comma_test/82: DartkCrash
-arg_param_trailing_comma_test/88: DartkCrash
-arg_param_trailing_comma_test/8: DartkCrash
-arg_param_trailing_comma_test/91: DartkCrash
-arg_param_trailing_comma_test/none: RuntimeError
-assignable_expression_test/02: MissingCompileTimeError
-assignable_expression_test/03: MissingCompileTimeError
-assignable_expression_test/12: MissingCompileTimeError
-assignable_expression_test/13: MissingCompileTimeError
-assignable_expression_test/22: MissingCompileTimeError
-assignable_expression_test/23: MissingCompileTimeError
-assignable_expression_test/32: MissingCompileTimeError
-assignable_expression_test/33: MissingCompileTimeError
-assignable_expression_test/42: MissingCompileTimeError
-assignable_expression_test/43: MissingCompileTimeError
-assignable_expression_test/50: MissingCompileTimeError
-async_await_catch_regression_test: RuntimeError
-async_await_syntax_test/a01b: MissingCompileTimeError
-async_await_syntax_test/a01c: MissingCompileTimeError
-async_await_syntax_test/a05f: MissingCompileTimeError
-async_await_syntax_test/a05g: MissingCompileTimeError
-async_await_syntax_test/a05h: MissingCompileTimeError
-async_await_syntax_test/a06b: MissingCompileTimeError
-async_await_syntax_test/a12e: MissingCompileTimeError
-async_await_syntax_test/a12f: MissingCompileTimeError
-async_await_syntax_test/b00a: DartkCrash
-async_await_syntax_test/b00b: DartkCrash
-async_await_syntax_test/b00c: DartkCrash
-async_await_syntax_test/b01b: MissingCompileTimeError
-async_await_syntax_test/b01c: MissingCompileTimeError
-async_await_syntax_test/b10b: MissingCompileTimeError
-async_await_syntax_test/b12e: MissingCompileTimeError
-async_await_syntax_test/b12f: MissingCompileTimeError
-async_await_syntax_test/c01b: MissingCompileTimeError
-async_await_syntax_test/c01c: MissingCompileTimeError
-async_await_syntax_test/c11a: MissingCompileTimeError
-async_await_syntax_test/c11b: MissingCompileTimeError
-async_await_syntax_test/d01b: MissingCompileTimeError
-async_await_syntax_test/d01c: MissingCompileTimeError
-async_await_syntax_test/e1: MissingCompileTimeError
-async_await_syntax_test/e2: MissingCompileTimeError
-async_await_syntax_test/e3: MissingCompileTimeError
-async_await_test: Crash
-async_finally_rethrow_test: RuntimeError
-async_return_types_test/return_value_sync_star: MissingCompileTimeError
-async_star_cancel_and_throw_in_finally_test: RuntimeError
-async_star_pause_test: Crash
-async_star_test: Crash
-async_test/constructor3: MissingCompileTimeError
-async_test/setter1: MissingCompileTimeError
-asyncstar_throw_in_catch_test: RuntimeError
-await_backwards_compatibility_test/await1: MissingCompileTimeError
-await_exceptions_test: RuntimeError
-await_test: RuntimeError
-bad_constructor_test/05: CompileTimeError
-bad_initializer1_negative_test: Crash
-black_listed_test/13: MissingCompileTimeError
-body_less_constructor_wrong_arg_negative_test: Crash
-built_in_identifier_illegal_test/01: MissingCompileTimeError
-built_in_identifier_illegal_test/04: MissingCompileTimeError
-built_in_identifier_illegal_test/05: MissingCompileTimeError
-built_in_identifier_illegal_test/06: MissingCompileTimeError
-built_in_identifier_illegal_test/07: MissingCompileTimeError
-built_in_identifier_illegal_test/08: MissingCompileTimeError
-built_in_identifier_illegal_test/10: MissingCompileTimeError
-built_in_identifier_illegal_test/12: MissingCompileTimeError
-built_in_identifier_illegal_test/13: MissingCompileTimeError
-built_in_identifier_illegal_test/15: MissingCompileTimeError
-built_in_identifier_illegal_test/16: MissingCompileTimeError
-built_in_identifier_illegal_test/17: MissingCompileTimeError
-built_in_identifier_illegal_test/18: MissingCompileTimeError
-built_in_identifier_illegal_test/19: MissingCompileTimeError
-built_in_identifier_illegal_test/20: MissingCompileTimeError
-built_in_identifier_test/01: CompileTimeError
-call_nonexistent_static_test/01: RuntimeError
-call_nonexistent_static_test/04: RuntimeError
-call_nonexistent_static_test/06: RuntimeError
-class_cycle2_test/01: MissingCompileTimeError
-class_cycle2_test/02: MissingCompileTimeError
-class_cycle_test/00: MissingCompileTimeError
-class_cycle_test/01: MissingCompileTimeError
-compile_time_constant10_test/01: Crash
-compile_time_constant10_test/02: Crash
-compile_time_constant13_test/02: Crash
-compile_time_constant13_test/03: MissingCompileTimeError
-compile_time_constant13_test/04: Crash
-compile_time_constant13_test/05: Crash
-compile_time_constant_arguments_test/01: MissingCompileTimeError
-compile_time_constant_arguments_test/02: MissingCompileTimeError
-compile_time_constant_arguments_test/03: MissingCompileTimeError
-compile_time_constant_arguments_test/04: MissingCompileTimeError
-compile_time_constant_arguments_test/05: MissingCompileTimeError
-compile_time_constant_arguments_test/06: MissingCompileTimeError
-compile_time_constant_c_test/02: MissingCompileTimeError
-compile_time_constant_c_test/03: MissingCompileTimeError
-compile_time_constant_p_test/01: Crash
-compile_time_constant_r_test/01: Crash
-compile_time_constant_r_test/02: Crash
-compile_time_constant_r_test/03: Crash
-compile_time_constant_test/01: MissingCompileTimeError
-compile_time_constant_test/02: Crash
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-conditional_method_invocation_test/11: MissingCompileTimeError
-conditional_property_access_test/09: MissingCompileTimeError
-conditional_property_assignment_test/20: MissingCompileTimeError
-conditional_property_assignment_test/21: MissingCompileTimeError
-conditional_property_assignment_test/22: MissingCompileTimeError
-const_conditional_test/01: MissingCompileTimeError
-const_conditional_test/02: MissingCompileTimeError
-const_conditional_test/03: MissingCompileTimeError
-const_conditional_test/04: MissingCompileTimeError
-const_conditional_test/05: MissingCompileTimeError
-const_conditional_test/06: MissingCompileTimeError
-const_conditional_test/07: MissingCompileTimeError
-const_conditional_test/08: MissingCompileTimeError
-const_conditional_test/09: MissingCompileTimeError
-const_conditional_test/10: MissingCompileTimeError
-const_constructor_mixin2_test/01: MissingCompileTimeError
-const_constructor_mixin3_test/01: MissingCompileTimeError
-const_constructor_mixin_test/01: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError
-const_constructor_super_test/01: MissingCompileTimeError
-const_constructor_super_test/02: Crash
-const_constructor_syntax_test/01: MissingCompileTimeError
-const_constructor_syntax_test/02: MissingCompileTimeError
-const_constructor_syntax_test/03: MissingCompileTimeError
-const_constructor_syntax_test/04: MissingCompileTimeError
-const_constructor_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/03: MissingCompileTimeError
-const_factory_with_body_test/01: MissingCompileTimeError
-const_for_in_variable_test/01: MissingCompileTimeError
-const_instance_field_test/01: MissingCompileTimeError
-const_map2_test/00: MissingCompileTimeError
-const_map3_test/00: MissingCompileTimeError
-const_optional_args_negative_test: Fail
-const_switch2_test/01: MissingCompileTimeError
-const_syntax_test/01: MissingCompileTimeError
-const_syntax_test/02: MissingCompileTimeError
-const_syntax_test/03: MissingCompileTimeError
-const_syntax_test/04: MissingCompileTimeError
-const_syntax_test/05: MissingCompileTimeError
-const_syntax_test/06: MissingCompileTimeError
-const_syntax_test/07: MissingCompileTimeError
-const_syntax_test/10: Crash
-const_syntax_test/11: MissingCompileTimeError
-const_syntax_test/12: MissingCompileTimeError
-const_types_test/09: MissingCompileTimeError
-const_types_test/10: MissingCompileTimeError
-const_types_test/11: MissingCompileTimeError
-const_types_test/12: MissingCompileTimeError
-const_types_test/16: MissingCompileTimeError
-const_types_test/17: MissingCompileTimeError
-const_types_test/18: MissingCompileTimeError
-const_types_test/19: MissingCompileTimeError
-const_types_test/20: MissingCompileTimeError
-const_types_test/21: MissingCompileTimeError
-const_types_test/22: MissingCompileTimeError
-const_types_test/23: MissingCompileTimeError
-const_types_test/24: MissingCompileTimeError
-const_types_test/25: MissingCompileTimeError
-const_types_test/26: MissingCompileTimeError
-const_types_test/27: MissingCompileTimeError
-const_types_test/28: MissingCompileTimeError
-const_types_test/29: MissingCompileTimeError
-const_types_test/30: MissingCompileTimeError
-const_types_test/41: MissingCompileTimeError
-constant_locals_test/01: MissingCompileTimeError
-constant_locals_test/02: MissingCompileTimeError
-constant_locals_test/03: MissingCompileTimeError
-constant_locals_test/04: MissingCompileTimeError
-constant_locals_test/05: MissingCompileTimeError
-constructor10_test/00: Crash
-constructor10_test/01: Crash
-constructor10_test/02: Crash
-constructor_duplicate_initializers_test/03: MissingCompileTimeError
-constructor_redirect2_test/01: MissingCompileTimeError
-constructor_redirect_test/01: MissingCompileTimeError
-covariant_test/00c: RuntimeError
-covariant_test/02: MissingCompileTimeError
-covariant_test/08: MissingCompileTimeError
-covariant_test/12: MissingCompileTimeError
-covariant_test/14: MissingCompileTimeError
-covariant_test/16: MissingCompileTimeError
-covariant_test/19: MissingCompileTimeError
-covariant_test/20c: RuntimeError
-covariant_test/22: MissingCompileTimeError
-covariant_test/28: MissingCompileTimeError
-covariant_test/32: MissingCompileTimeError
-covariant_test/34: MissingCompileTimeError
-covariant_test/36: MissingCompileTimeError
-covariant_test/39: MissingCompileTimeError
-covariant_test/40: RuntimeError
-covariant_test/40b: RuntimeError
-covariant_test/40c: RuntimeError
-covariant_test/42: RuntimeError
-covariant_test/46: MissingCompileTimeError
-covariant_test/46b: MissingCompileTimeError
-covariant_test/48: RuntimeError
-covariant_test/52: RuntimeError
-covariant_test/54: RuntimeError
-covariant_test/56: RuntimeError
-covariant_test/59: MissingCompileTimeError
-covariant_test/none: RuntimeError
-custom_await_stack_trace_test: RuntimeError
-cyclic_class_member_test/01: MissingCompileTimeError
-cyclic_constructor_test/01: MissingCompileTimeError
-cyclic_typedef_test/01: MissingCompileTimeError
-cyclic_typedef_test/02: MissingCompileTimeError
-cyclic_typedef_test/03: MissingCompileTimeError
-cyclic_typedef_test/04: MissingCompileTimeError
-cyclic_typedef_test/05: MissingCompileTimeError
-cyclic_typedef_test/06: MissingCompileTimeError
-cyclic_typedef_test/07: MissingCompileTimeError
-cyclic_typedef_test/08: MissingCompileTimeError
-cyclic_typedef_test/09: MissingCompileTimeError
-cyclic_typedef_test/10: MissingCompileTimeError
-cyclic_typedef_test/11: MissingCompileTimeError
-deferred_duplicate_prefix1_test/01: MissingCompileTimeError
-deferred_duplicate_prefix2_test/01: MissingCompileTimeError
-deferred_duplicate_prefix3_test/01: MissingCompileTimeError
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/01: MissingCompileTimeError
-deferred_load_constants_test/02: MissingCompileTimeError
-deferred_load_constants_test/03: MissingCompileTimeError
-deferred_load_constants_test/04: MissingCompileTimeError
-deferred_load_constants_test/05: MissingCompileTimeError
-deferred_no_prefix_test/01: MissingCompileTimeError
-duplicate_export_negative_test: DartkCrash
-dynamic2_test/00: MissingCompileTimeError
-dynamic2_test/01: MissingCompileTimeError
-dynamic_prefix_core_test/01: RuntimeError
-enum_private_test/02: RuntimeError
-enum_syntax_test/06: MissingCompileTimeError
-enum_syntax_test/11: DartkCrash
-enum_syntax_test/20: Crash
-enum_syntax_test/21: MissingCompileTimeError
-enum_syntax_test/22: Crash
-enum_syntax_test/30: MissingCompileTimeError
-export_ambiguous_main_negative_test: Crash
-export_double_same_main_test: Crash
-export_main_test: Crash
-export_private_test/01: MissingCompileTimeError
-extend_type_parameter2_negative_test: DartkCrash
-extend_type_parameter_negative_test: DartkCrash
-external_test/11: MissingCompileTimeError
-external_test/12: MissingCompileTimeError
-external_test/21: MissingCompileTimeError
-external_test/22: MissingCompileTimeError
-external_test/23: MissingCompileTimeError
-external_test/24: MissingCompileTimeError
-external_test/25: MissingCompileTimeError
-external_test/30: MissingCompileTimeError
-external_test/31: MissingCompileTimeError
-factory2_negative_test: DartkCrash
-factory_negative_test: DartkCrash
-factory_redirection_test/07: MissingCompileTimeError
-field_decl_missing_var_type_test/01: MissingCompileTimeError
-final_initializer_instance_reference_test/01: MissingCompileTimeError
-final_is_not_const_test/01: MissingCompileTimeError
-final_super_field_set_test/01: RuntimeError
-final_syntax_test/01: MissingCompileTimeError
-final_syntax_test/02: MissingCompileTimeError
-final_syntax_test/03: MissingCompileTimeError
-final_syntax_test/04: MissingCompileTimeError
-first_class_types_literals_test/08: RuntimeError
-function_subtype0_test: RuntimeError
-function_subtype1_test: RuntimeError
-function_syntax_test/00: MissingCompileTimeError
-function_syntax_test/01: MissingCompileTimeError
-function_syntax_test/22: MissingCompileTimeError
-function_syntax_test/64: MissingCompileTimeError
-function_syntax_test/67: MissingCompileTimeError
-function_syntax_test/68: MissingCompileTimeError
-function_syntax_test/69: MissingCompileTimeError
-function_syntax_test/71: MissingCompileTimeError
-function_syntax_test/73: MissingCompileTimeError
-function_syntax_test/74: MissingCompileTimeError
-function_type/function_type*: DartkCrash # Issue 27969
-function_type_alias5_test/00: MissingCompileTimeError
-function_type_alias5_test/01: MissingCompileTimeError
-function_type_alias5_test/02: MissingCompileTimeError
-function_type_alias6_test/00: MissingCompileTimeError
-function_type_alias7_test/00: MissingCompileTimeError
-function_type_alias7_test/01: DartkCrash
-function_type_alias7_test/02: MissingCompileTimeError
-function_type_alias9_test/00: MissingCompileTimeError
-function_type_parameter2_negative_test: Crash
-function_type_parameter_negative_test: Crash
-generic_constructor_mixin3_test: Crash
-generic_field_mixin2_test: RuntimeError
-generic_field_mixin3_test: RuntimeError
-generic_field_mixin5_test: RuntimeError
-generic_field_mixin_test: RuntimeError
-generic_function_typedef2_test: DartkCrash # Issue 27969
-generic_function_typedef_test: DartkCrash # Issue 27969
-generic_local_functions_test: DartkCrash
-generic_metadata_test/02: MissingCompileTimeError
-generic_metadata_test/03: MissingCompileTimeError
-generic_methods_generic_function_parameter_test: DartkCrash
-getter_parameters_test/01: MissingCompileTimeError
-getter_parameters_test/03: MissingCompileTimeError
-getter_parameters_test/04: MissingCompileTimeError
-hidden_import_test/01: DartkCrash
-hidden_import_test/02: DartkCrash
-hidden_import_test/none: DartkCrash
-if_null_assignment_behavior_test/09: RuntimeError
-if_null_assignment_behavior_test/10: RuntimeError
-if_null_assignment_behavior_test/15: RuntimeError
-implicit_scope_test: Crash
-import_combinators_test: RuntimeError
-import_private_test/01: DartkCrash
-initializing_formal_capture_test: RuntimeError
-inst_field_initializer1_negative_test: Fail
-instanceof3_test: RuntimeError
-interface2_negative_test: Fail
-interface_cycle_test/01: MissingCompileTimeError
-interface_cycle_test/02: MissingCompileTimeError
-invocation_mirror_test: RuntimeError
-is_malformed_type_test/94: RuntimeError
-is_malformed_type_test/95: RuntimeError
-is_malformed_type_test/96: RuntimeError
-is_malformed_type_test/97: RuntimeError
-is_malformed_type_test/98: RuntimeError
-is_malformed_type_test/99: RuntimeError
-is_not_class4_negative_test: Fail
-isnot_malformed_type_test: RuntimeError
-label6_negative_test: DartkCrash
-large_class_declaration_test: SkipSlow  # KernelVM Issue 28312
-library_ambiguous_test/00: MissingRuntimeError
-library_ambiguous_test/04: MissingRuntimeError
-library_ambiguous_test/05: MissingCompileTimeError
-list_literal2_negative_test: Fail
-list_literal_negative_test: DartkCrash
-malformed2_test/00: RuntimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: Crash
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_inheritance_test/07: DartkCrash
-malformed_inheritance_test/08: DartkCrash
-malformed_inheritance_test/09: MissingCompileTimeError
-malformed_inheritance_test/10: MissingCompileTimeError
-malformed_inheritance_test/11: DartkCrash
-malformed_inheritance_test/12: DartkCrash
-map_literal2_negative_test: Fail
-map_literal_negative_test: DartkCrash
-metadata_test: CompileTimeError
-method_name_test: CompileTimeError
-missing_const_constructor_test/02: MissingCompileTimeError
-missing_const_constructor_test/03: MissingCompileTimeError
-missing_const_constructor_test/04: Crash
-missing_const_constructor_test/05: MissingCompileTimeError
-missing_const_constructor_test/06: MissingCompileTimeError
-missing_part_of_tag_test/01: MissingCompileTimeError
-mixin_black_listed_test/08: DartkCrash
-mixin_cyclic_test/01: MissingCompileTimeError
-mixin_cyclic_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/01: MissingCompileTimeError
-mixin_illegal_constructor_test/02: MissingCompileTimeError
-mixin_illegal_constructor_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/04: MissingCompileTimeError
-mixin_illegal_constructor_test/05: MissingCompileTimeError
-mixin_illegal_constructor_test/06: MissingCompileTimeError
-mixin_illegal_constructor_test/07: MissingCompileTimeError
-mixin_illegal_constructor_test/08: MissingCompileTimeError
-mixin_illegal_constructor_test/09: MissingCompileTimeError
-mixin_illegal_constructor_test/10: MissingCompileTimeError
-mixin_illegal_constructor_test/11: MissingCompileTimeError
-mixin_illegal_constructor_test/12: MissingCompileTimeError
-mixin_illegal_cycles_test/01: MissingCompileTimeError
-mixin_illegal_cycles_test/02: MissingCompileTimeError
-mixin_illegal_cycles_test/03: MissingCompileTimeError
-mixin_illegal_cycles_test/04: MissingCompileTimeError
-mixin_illegal_cycles_test/05: MissingCompileTimeError
-mixin_illegal_cycles_test/06: MissingCompileTimeError
-mixin_illegal_object_test/01: MissingCompileTimeError
-mixin_illegal_object_test/02: MissingCompileTimeError
-mixin_illegal_syntax_test/00: DartkCrash
-mixin_invalid_inheritance1_test/01: Crash
-mixin_invalid_inheritance1_test/02: Crash
-mixin_invalid_inheritance1_test/03: Crash
-mixin_invalid_inheritance2_test/01: MissingCompileTimeError
-mixin_invalid_inheritance2_test/02: MissingCompileTimeError
-mixin_invalid_inheritance2_test/03: DartkCrash
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin2_test: RuntimeError
-mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
-mixin_of_mixin_test/03: RuntimeError
-mixin_of_mixin_test/14: RuntimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
-mixin_super_test: RuntimeError
-mixin_type_parameters_errors_test/01: DartkCrash
-mixin_type_parameters_errors_test/02: DartkCrash
-mixin_type_parameters_errors_test/05: DartkCrash
-multiline_newline_test/01: RuntimeError
-multiline_newline_test/02: RuntimeError
-multiline_newline_test/03: RuntimeError
-multiline_newline_test/04: MissingCompileTimeError
-multiline_newline_test/05: MissingCompileTimeError
-multiline_newline_test/06: MissingCompileTimeError
-named_constructor_test/01: MissingRuntimeError
-named_constructor_test/02: DartkCrash
-named_constructor_test/04: DartkCrash
-named_constructor_test/05: DartkCrash
-named_constructor_test/06: DartkCrash
-named_constructor_test/07: DartkCrash
-named_constructor_test/08: DartkCrash
-named_constructor_test/09: DartkCrash
-named_constructor_test/10: DartkCrash
-named_parameters_aggregated_test/01: MissingCompileTimeError
-named_parameters_aggregated_test/03: MissingCompileTimeError
-named_parameters_aggregated_test/04: MissingCompileTimeError
-named_parameters_default_eq_test/01: MissingCompileTimeError
-named_parameters_default_eq_test/02: MissingCompileTimeError
-new_expression1_negative_test: DartkCrash
-no_main_test/01: Crash
-number_identifier_test/02: MissingCompileTimeError
-number_identifier_test/04: MissingCompileTimeError
-on_catch_malformed_type_test: RuntimeError
-parameter_initializer1_negative_test: DartkCrash
-parameter_initializer2_negative_test: DartkCrash
-parameter_initializer3_negative_test: DartkCrash
-parameter_initializer4_negative_test: DartkCrash
-parameter_initializer6_negative_test: Fail
-part2_test: RuntimeError
-prefix13_negative_test: Fail
-prefix15_negative_test: Fail
-private_access_test/05: RuntimeError
-private_access_test/06: RuntimeError
-private_super_constructor_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
-redirecting_factory_infinite_steps_test/02: Crash
-redirecting_factory_long_test: RuntimeError
-regress_13494_test: RuntimeError
-regress_20394_test/01: MissingCompileTimeError
-regress_22438_test: RuntimeError
-regress_22445_test: RuntimeError
-regress_22579_test: RuntimeError
-regress_23498_test: RuntimeError
-regress_23500_test/01: RuntimeError
-regress_23500_test/02: RuntimeError
-regress_23500_test/none: RuntimeError
-regress_26855_test/0: DartkCrash
-regress_27617_test/1: MissingCompileTimeError
-regress_27957_test: RuntimeError
-regress_28217_test/01: MissingCompileTimeError
-regress_28217_test/none: MissingCompileTimeError
-reify_typevar_static_test/00: MissingCompileTimeError
-scope_variable_test/01: MissingCompileTimeError
-setter0_test: RuntimeError
-setter4_test: CompileTimeError
-setter_override_test/01: RuntimeError
-setter_override_test/02: RuntimeError
-setter_override_test/none: RuntimeError
-source_self_negative_test: DartkCrash
-static_final_field2_test/02: MissingCompileTimeError
-static_parameter_test/01: MissingCompileTimeError
-static_parameter_test/02: MissingCompileTimeError
-static_parameter_test/03: MissingCompileTimeError
-static_parameter_test/04: MissingCompileTimeError
-static_parameter_test/05: MissingCompileTimeError
-static_parameter_test/06: MissingCompileTimeError
-static_parameter_test/07: MissingCompileTimeError
-static_parameter_test/08: MissingCompileTimeError
-static_parameter_test/09: MissingCompileTimeError
-static_parameter_test/10: MissingCompileTimeError
-static_parameter_test/11: MissingCompileTimeError
-static_parameter_test/12: MissingCompileTimeError
-super_call3_test/02: Crash
-super_conditional_operator_test/01: MissingCompileTimeError
-super_conditional_operator_test/02: MissingCompileTimeError
-super_conditional_operator_test/03: MissingCompileTimeError
-super_conditional_operator_test/04: MissingCompileTimeError
-super_conditional_operator_test/05: MissingCompileTimeError
-super_conditional_operator_test/06: MissingCompileTimeError
-super_conditional_operator_test/07: MissingCompileTimeError
-super_conditional_operator_test/08: MissingCompileTimeError
-super_conditional_operator_test/09: MissingCompileTimeError
-super_conditional_operator_test/10: MissingCompileTimeError
-super_conditional_operator_test/11: MissingCompileTimeError
-super_conditional_operator_test/12: MissingCompileTimeError
-super_conditional_operator_test/13: MissingCompileTimeError
-super_conditional_operator_test/14: MissingCompileTimeError
-super_conditional_operator_test/15: MissingCompileTimeError
-super_conditional_operator_test/16: MissingCompileTimeError
-super_conditional_operator_test/17: MissingCompileTimeError
-super_conditional_operator_test/18: MissingCompileTimeError
-super_no_such_method1_test/01: RuntimeError
-super_no_such_method2_test/01: RuntimeError
-super_no_such_method3_test/01: RuntimeError
-super_no_such_method4_test/01: RuntimeError
-super_no_such_method5_test/01: RuntimeError
-switch1_negative_test: Fail
-switch4_negative_test: DartkCrash
-switch_bad_case_test/01: MissingCompileTimeError
-switch_bad_case_test/02: MissingCompileTimeError
-switch_case_test/00: MissingCompileTimeError
-switch_case_test/01: MissingCompileTimeError
-switch_case_test/02: MissingCompileTimeError
-switch_label_test: DartkCrash
-sync_generator2_test/01: MissingCompileTimeError
-sync_generator2_test/02: MissingCompileTimeError
-sync_generator2_test/03: MissingCompileTimeError
-sync_generator2_test/04: MissingCompileTimeError
-sync_generator2_test/05: MissingCompileTimeError
-sync_generator2_test/06: MissingCompileTimeError
-sync_generator2_test/09: Crash
-sync_generator2_test/11: MissingCompileTimeError
-sync_generator2_test/20: MissingCompileTimeError
-sync_generator2_test/30: MissingCompileTimeError
-sync_generator2_test/40: MissingCompileTimeError
-sync_generator2_test/41: MissingCompileTimeError
-sync_generator2_test/51: MissingCompileTimeError
-sync_generator2_test/52: MissingCompileTimeError
-syntax_test/02: MissingCompileTimeError
-syntax_test/03: MissingCompileTimeError
-syntax_test/27: MissingCompileTimeError
-syntax_test/50: MissingCompileTimeError
-syntax_test/51: MissingCompileTimeError
-syntax_test/64: MissingCompileTimeError
-syntax_test/65: MissingCompileTimeError
-this_conditional_operator_test/01: MissingCompileTimeError
-toplevel_collision1_test/00: DartkCrash
-toplevel_collision1_test/01: DartkCrash
-toplevel_collision1_test/02: DartkCrash
-try_catch2_test: DartkCrash
-try_catch3_test: DartkCrash
-try_catch_syntax_test/01: MissingCompileTimeError
-try_catch_syntax_test/07: MissingCompileTimeError
-try_catch_syntax_test/09: MissingCompileTimeError
-try_catch_syntax_test/10: MissingCompileTimeError
-try_catch_syntax_test/11: MissingCompileTimeError
-try_catch_syntax_test/12: MissingCompileTimeError
-try_catch_syntax_test/16: Crash
-try_catch_syntax_test/17: Crash
-type_variable_conflict2_test/01: RuntimeError
-type_variable_conflict_test/01: MissingCompileTimeError
-type_variable_conflict_test/02: MissingCompileTimeError
-type_variable_conflict_test/03: MissingCompileTimeError
-type_variable_conflict_test/04: MissingCompileTimeError
-type_variable_conflict_test/05: MissingCompileTimeError
-type_variable_conflict_test/06: MissingCompileTimeError
-type_variable_scope3_test/00: MissingCompileTimeError
-vm/closure_memory_retention_test: Crash, Timeout
-vm/debug_break_enabled_vm_test/01: CompileTimeError
-vm/debug_break_enabled_vm_test/none: CompileTimeError
-vm/regress_27201_test: CompileTimeError
-vm/regress_28325_test: RuntimeError
-
-# dartk: JIT failures
-[ $compiler == dartk && $runtime == vm ]
-config_import_corelib_test: RuntimeError
-const_evaluation_test/01: RuntimeError
-const_syntax_test/08: MissingCompileTimeError
-const_syntax_test/09: MissingCompileTimeError
-deferred_constraints_constants_test/constructor1: MissingCompileTimeError
-deferred_constraints_constants_test/constructor2: MissingCompileTimeError
-deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
-deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
-deferred_constraints_constants_test/metadata1: MissingCompileTimeError
-deferred_constraints_constants_test/metadata2: MissingCompileTimeError
-deferred_constraints_constants_test/metadata3: MissingCompileTimeError
-deferred_constraints_constants_test/reference1: MissingCompileTimeError
-deferred_constraints_constants_test/reference2: MissingCompileTimeError
-final_syntax_test/09: Crash
-getter_declaration_negative_test: Fail
-getter_parameters_test/02: MissingCompileTimeError
-hello_dart_test: Crash
-instance_creation_in_function_annotation_test: RuntimeError
-label_test: CompileTimeError
-redirecting_factory_reflection_test: Crash
-ref_before_declaration_test/00: MissingCompileTimeError
-ref_before_declaration_test/01: MissingCompileTimeError
-ref_before_declaration_test/02: MissingCompileTimeError
-ref_before_declaration_test/03: MissingCompileTimeError
-ref_before_declaration_test/04: MissingCompileTimeError
-ref_before_declaration_test/05: MissingCompileTimeError
-ref_before_declaration_test/06: MissingCompileTimeError
-ref_before_declaration_test/07: MissingCompileTimeError
-setter_declaration2_negative_test: Fail
-setter_declaration_negative_test: Fail
-super_call4_test: RuntimeError
-super_getter_setter_test: RuntimeError
-try_catch_syntax_test/05: MissingCompileTimeError
-vm/lazy_deopt_vm_test: Timeout
-vm/optimized_stacktrace_test: Skip # Issue 28788
-ct_const2_test: Pass, Crash # Flaky
-
-# dartk: precompilation failures
-[ $compiler == dartkp && $runtime == dart_precompiled ]
-assignable_expression_test/01: MissingCompileTimeError
-assignable_expression_test/11: MissingCompileTimeError
-assignable_expression_test/21: MissingCompileTimeError
-assignable_expression_test/31: MissingCompileTimeError
-assignable_expression_test/41: MissingCompileTimeError
-config_import_corelib_test: RuntimeError
-const_syntax_test/08: Crash
-const_syntax_test/09: Crash
-constructor_duplicate_initializers_test/01: MissingCompileTimeError
-constructor_duplicate_initializers_test/02: MissingCompileTimeError
-constructor_return_test/01: MissingCompileTimeError
-constructor_return_test/02: MissingCompileTimeError
-constructor_return_test/03: MissingCompileTimeError
-constructor_return_test/04: MissingCompileTimeError
-constructor_return_test/05: MissingCompileTimeError
-factory_redirection3_cyclic_test/01: MissingCompileTimeError
-factory_redirection_test/04: MissingCompileTimeError
-final_syntax_test/09: MissingCompileTimeError
-getter_declaration_negative_test: Crash
-getter_no_setter2_test/02: MissingCompileTimeError
-getter_no_setter_test/02: MissingCompileTimeError
-getter_parameters_test/02: Crash
-if_null_assignment_behavior_test/29: MissingCompileTimeError
-if_null_assignment_behavior_test/30: MissingCompileTimeError
-illegal_initializer_test/01: MissingCompileTimeError
-illegal_initializer_test/02: MissingCompileTimeError
-illegal_initializer_test/03: MissingCompileTimeError
-illegal_initializer_test/04: MissingCompileTimeError
-illegal_invocation_test/01: MissingCompileTimeError
-label_test: RuntimeError
-main_not_a_function_test/01: Crash
-prefix_assignment_test/01: MissingCompileTimeError
-prefix_assignment_test/02: MissingCompileTimeError
-prefix_identifier_reference_test/01: MissingCompileTimeError
-prefix_identifier_reference_test/02: MissingCompileTimeError
-prefix_identifier_reference_test/03: MissingCompileTimeError
-prefix_identifier_reference_test/04: MissingCompileTimeError
-prefix_identifier_reference_test/05: MissingCompileTimeError
-prefix_unqualified_invocation_test/01: MissingCompileTimeError
-prefix_unqualified_invocation_test/02: MissingCompileTimeError
-ref_before_declaration_test/00: Crash
-ref_before_declaration_test/01: Crash
-ref_before_declaration_test/02: Crash
-ref_before_declaration_test/03: Crash
-ref_before_declaration_test/04: Crash
-ref_before_declaration_test/05: Crash
-ref_before_declaration_test/06: Crash
-ref_before_declaration_test/07: Crash
-ref_before_declaration_test/none: Crash
-regress_23038_test/01: MissingCompileTimeError
-setter_declaration2_negative_test: Crash
-setter_declaration_negative_test: Crash
-this_test/01: MissingCompileTimeError
-this_test/02: MissingCompileTimeError
-this_test/03: MissingCompileTimeError
-this_test/04: MissingCompileTimeError
-this_test/05: MissingCompileTimeError
-this_test/06: MissingCompileTimeError
-this_test/07: MissingCompileTimeError
-this_test/08: MissingCompileTimeError
-try_catch_syntax_test/05: Crash
-try_catch_syntax_test/13: MissingCompileTimeError
-try_catch_syntax_test/14: MissingCompileTimeError
-try_catch_syntax_test/15: MissingCompileTimeError
-type_variable_conflict2_test/02: MissingCompileTimeError
-type_variable_conflict2_test/06: MissingCompileTimeError
-type_variable_conflict2_test/08: MissingCompileTimeError
-type_variable_conflict2_test/10: MissingCompileTimeError
-unsupported_operators_test/01: MissingCompileTimeError
-unsupported_operators_test/02: MissingCompileTimeError
-unsupported_operators_test/03: MissingCompileTimeError
-unsupported_operators_test/04: MissingCompileTimeError
-
-###############################################################################
-# VM Entries
-###############################################################################
-
-# dartk: Shared JIT & Precompilation failures
-[ ($compiler == dartk && $runtime == vm) || ($compiler == dartkp && $runtime == dart_precompiled) ]
-abstract_beats_arguments_test: RuntimeError
-abstract_runtime_error_test/01: RuntimeError
-abstract_runtime_error_test/02: RuntimeError
 accessor_conflict_export2_test: RuntimeError
 accessor_conflict_export_test: RuntimeError
 accessor_conflict_import2_test: RuntimeError
 application_negative_test: Crash
 arg_param_trailing_comma_test/107: MissingCompileTimeError
-arg_param_trailing_comma_test/112: DartkCrash
-arg_param_trailing_comma_test/115: DartkCrash
-arg_param_trailing_comma_test/121: DartkCrash
-arg_param_trailing_comma_test/124: DartkCrash
-arg_param_trailing_comma_test/14: DartkCrash
-arg_param_trailing_comma_test/17: DartkCrash
-arg_param_trailing_comma_test/171: DartkCrash
-arg_param_trailing_comma_test/174: DartkCrash
-arg_param_trailing_comma_test/180: DartkCrash
-arg_param_trailing_comma_test/183: DartkCrash
-arg_param_trailing_comma_test/193: DartkCrash
-arg_param_trailing_comma_test/196: DartkCrash
-arg_param_trailing_comma_test/202: DartkCrash
-arg_param_trailing_comma_test/205: DartkCrash
-arg_param_trailing_comma_test/31: DartkCrash
-arg_param_trailing_comma_test/34: DartkCrash
-arg_param_trailing_comma_test/40: DartkCrash
-arg_param_trailing_comma_test/43: DartkCrash
-arg_param_trailing_comma_test/5: DartkCrash
-arg_param_trailing_comma_test/53: DartkCrash
-arg_param_trailing_comma_test/56: DartkCrash
-arg_param_trailing_comma_test/62: DartkCrash
-arg_param_trailing_comma_test/65: DartkCrash
-arg_param_trailing_comma_test/79: DartkCrash
-arg_param_trailing_comma_test/8: DartkCrash
-arg_param_trailing_comma_test/82: DartkCrash
-arg_param_trailing_comma_test/88: DartkCrash
-arg_param_trailing_comma_test/91: DartkCrash
 arg_param_trailing_comma_test/none: RuntimeError
 assignable_expression_test/02: MissingCompileTimeError
 assignable_expression_test/03: MissingCompileTimeError
@@ -765,7 +23,6 @@
 assignable_expression_test/42: MissingCompileTimeError
 assignable_expression_test/43: MissingCompileTimeError
 assignable_expression_test/50: MissingCompileTimeError
-async_await_catch_regression_test: RuntimeError
 async_await_syntax_test/a01b: MissingCompileTimeError
 async_await_syntax_test/a01c: MissingCompileTimeError
 async_await_syntax_test/a05f: MissingCompileTimeError
@@ -791,17 +48,12 @@
 async_await_syntax_test/e1: MissingCompileTimeError
 async_await_syntax_test/e2: MissingCompileTimeError
 async_await_syntax_test/e3: MissingCompileTimeError
-async_await_test: Crash
-async_finally_rethrow_test: RuntimeError
 async_return_types_test/return_value_sync_star: MissingCompileTimeError
-async_star_cancel_and_throw_in_finally_test: RuntimeError
 async_star_pause_test: Crash
-async_star_test: Crash
+async_test/constructor2: DartkCrash
 async_test/constructor3: MissingCompileTimeError
 async_test/setter1: MissingCompileTimeError
-asyncstar_throw_in_catch_test: RuntimeError
 await_backwards_compatibility_test/await1: MissingCompileTimeError
-await_exceptions_test: RuntimeError
 await_test: RuntimeError
 bad_constructor_test/05: CompileTimeError
 bad_initializer1_negative_test: Crash
@@ -866,6 +118,7 @@
 conditional_property_assignment_test/20: MissingCompileTimeError
 conditional_property_assignment_test/21: MissingCompileTimeError
 conditional_property_assignment_test/22: MissingCompileTimeError
+config_import_corelib_test: RuntimeError
 config_import_test: RuntimeError
 const_conditional_test/01: MissingCompileTimeError
 const_conditional_test/02: MissingCompileTimeError
@@ -894,6 +147,7 @@
 const_error_multiply_initialized_test/03: MissingCompileTimeError
 const_error_multiply_initialized_test/04: RuntimeError
 const_factory_with_body_test/01: MissingCompileTimeError
+const_for_in_variable_test/01: MissingCompileTimeError
 const_instance_field_test/01: MissingCompileTimeError
 const_map2_test/00: MissingCompileTimeError
 const_map3_test/00: MissingCompileTimeError
@@ -910,10 +164,14 @@
 const_syntax_test/10: Crash
 const_syntax_test/11: MissingCompileTimeError
 const_syntax_test/12: MissingCompileTimeError
+const_types_test/07: MissingCompileTimeError
+const_types_test/08: MissingCompileTimeError
 const_types_test/09: MissingCompileTimeError
 const_types_test/10: MissingCompileTimeError
 const_types_test/11: MissingCompileTimeError
 const_types_test/12: MissingCompileTimeError
+const_types_test/14: MissingCompileTimeError
+const_types_test/15: MissingCompileTimeError
 const_types_test/16: MissingCompileTimeError
 const_types_test/17: MissingCompileTimeError
 const_types_test/18: MissingCompileTimeError
@@ -935,6 +193,7 @@
 constant_locals_test/03: MissingCompileTimeError
 constant_locals_test/04: MissingCompileTimeError
 constant_locals_test/05: MissingCompileTimeError
+constant_type_literal_test/01: MissingCompileTimeError
 constructor10_test/00: Crash
 constructor10_test/01: Crash
 constructor10_test/02: Crash
@@ -969,7 +228,6 @@
 covariant_test/56: RuntimeError
 covariant_test/59: MissingCompileTimeError
 covariant_test/none: RuntimeError
-custom_await_stack_trace_test: RuntimeError
 cyclic_class_member_test/01: MissingCompileTimeError
 cyclic_constructor_test/01: MissingCompileTimeError
 cyclic_type_test/00: RuntimeError
@@ -1039,7 +297,9 @@
 deferred_not_loaded_check_test: RuntimeError
 deferred_only_constant_test: RuntimeError
 deferred_optimized_test: RuntimeError
+deferred_redirecting_factory_test: RuntimeError
 deferred_regression_22995_test: RuntimeError
+deferred_regression_28678_test: RuntimeError
 deferred_shadow_load_library_test: RuntimeError
 deferred_shared_and_unshared_classes_test: RuntimeError
 deferred_static_seperate_test: RuntimeError
@@ -1053,7 +313,7 @@
 dynamic2_test/01: MissingCompileTimeError
 dynamic_prefix_core_test/01: RuntimeError
 enum_private_test/02: RuntimeError
-enum_syntax_test/11: DartkCrash
+enum_syntax_test/06: MissingCompileTimeError
 enum_syntax_test/20: Crash
 enum_syntax_test/21: MissingCompileTimeError
 enum_syntax_test/22: Crash
@@ -1069,8 +329,11 @@
 external_test/12: MissingCompileTimeError
 external_test/13: MissingRuntimeError
 external_test/20: MissingRuntimeError
+external_test/21: MissingCompileTimeError
 external_test/22: MissingCompileTimeError
 external_test/23: MissingCompileTimeError
+external_test/24: MissingCompileTimeError
+external_test/25: MissingCompileTimeError
 external_test/30: MissingCompileTimeError
 external_test/31: MissingCompileTimeError
 factory2_negative_test: DartkCrash
@@ -1080,6 +343,10 @@
 final_initializer_instance_reference_test/01: MissingCompileTimeError
 final_is_not_const_test/01: MissingCompileTimeError
 final_super_field_set_test/01: RuntimeError
+final_syntax_test/01: MissingCompileTimeError
+final_syntax_test/02: MissingCompileTimeError
+final_syntax_test/03: MissingCompileTimeError
+final_syntax_test/04: MissingCompileTimeError
 first_class_types_literals_test/08: RuntimeError
 for2_test: RuntimeError
 for_variable_capture_test: RuntimeError
@@ -1103,6 +370,7 @@
 function_syntax_test/71: MissingCompileTimeError
 function_syntax_test/73: MissingCompileTimeError
 function_syntax_test/74: MissingCompileTimeError
+function_type/function_type*: DartkCrash # Issue 27969
 function_type_alias2_test: RuntimeError
 function_type_alias3_test: RuntimeError
 function_type_alias4_test: RuntimeError
@@ -1123,6 +391,8 @@
 generic_field_mixin4_test: RuntimeError
 generic_field_mixin5_test: RuntimeError
 generic_field_mixin_test: RuntimeError
+generic_function_typedef2_test: DartkCrash # Issue 27969
+generic_function_typedef_test: DartkCrash # Issue 27969
 generic_local_functions_test: DartkCrash
 generic_metadata_test/02: MissingCompileTimeError
 generic_metadata_test/03: MissingCompileTimeError
@@ -1133,15 +403,12 @@
 getter_parameters_test/03: MissingCompileTimeError
 getter_parameters_test/04: MissingCompileTimeError
 getter_setter_in_lib_test: RuntimeError
-hidden_import_test/01: DartkCrash
-hidden_import_test/02: DartkCrash
-hidden_import_test/none: DartkCrash
 if_null_assignment_behavior_test/09: RuntimeError
 if_null_assignment_behavior_test/10: RuntimeError
 if_null_assignment_behavior_test/15: RuntimeError
 implicit_scope_test: Crash
 import_combinators_test: RuntimeError
-import_private_test/01: DartkCrash
+import_private_test/01: MissingCompileTimeError
 initializing_formal_capture_test: RuntimeError
 initializing_formal_final_test: RuntimeError
 inst_field_initializer1_negative_test: Fail
@@ -1161,6 +428,7 @@
 isnot_malformed_type_test: RuntimeError
 issue_1751477_test: RuntimeError
 label6_negative_test: DartkCrash
+large_class_declaration_test: SkipSlow  # KernelVM Issue 28312
 library_ambiguous_test/00: MissingRuntimeError
 library_ambiguous_test/04: MissingRuntimeError
 library_ambiguous_test/05: MissingCompileTimeError
@@ -1168,7 +436,7 @@
 library_env_test/has_no_io_support: RuntimeError
 list_literal2_negative_test: Fail
 list_literal4_test: RuntimeError
-list_literal_negative_test: DartkCrash
+main_not_a_function_test/01: Crash
 malformed2_test/00: RuntimeError
 malformed_inheritance_test/01: MissingCompileTimeError
 malformed_inheritance_test/03: Crash
@@ -1183,7 +451,7 @@
 map_literal2_negative_test: Fail
 map_literal3_test: RuntimeError
 map_literal6_test: RuntimeError
-map_literal_negative_test: DartkCrash
+metadata_test: CompileTimeError
 method_name_test: CompileTimeError
 method_override_test: RuntimeError
 missing_const_constructor_test/02: MissingCompileTimeError
@@ -1218,6 +486,7 @@
 mixin_illegal_cycles_test/06: MissingCompileTimeError
 mixin_illegal_object_test/01: MissingCompileTimeError
 mixin_illegal_object_test/02: MissingCompileTimeError
+mixin_illegal_syntax_test/00: DartkCrash
 mixin_invalid_inheritance1_test/01: Crash
 mixin_invalid_inheritance1_test/02: Crash
 mixin_invalid_inheritance1_test/03: Crash
@@ -1247,32 +516,22 @@
 multiline_newline_test/01: RuntimeError
 multiline_newline_test/02: RuntimeError
 multiline_newline_test/03: RuntimeError
+multiline_newline_test/04: MissingCompileTimeError
+multiline_newline_test/05: MissingCompileTimeError
+multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/none: RuntimeError
 named_constructor_test/01: MissingRuntimeError
-named_constructor_test/02: DartkCrash
-named_constructor_test/04: DartkCrash
-named_constructor_test/05: DartkCrash
-named_constructor_test/06: DartkCrash
-named_constructor_test/07: DartkCrash
-named_constructor_test/08: DartkCrash
-named_constructor_test/09: DartkCrash
-named_constructor_test/10: DartkCrash
 named_parameters_aggregated_test/01: MissingCompileTimeError
 named_parameters_aggregated_test/03: MissingCompileTimeError
 named_parameters_aggregated_test/04: MissingCompileTimeError
 named_parameters_default_eq_test/01: MissingCompileTimeError
 named_parameters_default_eq_test/02: MissingCompileTimeError
-new_expression1_negative_test: DartkCrash
 no_main_test/01: Crash
 not_enough_positional_arguments_test/02: MissingRuntimeError  # Dartk Issue 28301
 not_enough_positional_arguments_test/05: MissingRuntimeError  # Dartk Issue 28301
 number_identifier_test/02: MissingCompileTimeError
 number_identifier_test/04: MissingCompileTimeError
 on_catch_malformed_type_test: RuntimeError
-parameter_initializer1_negative_test: DartkCrash
-parameter_initializer2_negative_test: DartkCrash
-parameter_initializer3_negative_test: DartkCrash
-parameter_initializer4_negative_test: DartkCrash
 parameter_initializer6_negative_test: Fail
 part2_test: RuntimeError
 prefix13_negative_test: Fail
@@ -1289,17 +548,14 @@
 regress_20394_test/01: MissingCompileTimeError
 regress_22438_test: RuntimeError
 regress_22443_test: RuntimeError  # Deferred Loading Issue 28335
-regress_22445_test: RuntimeError
-regress_22579_test: RuntimeError
 regress_23408_test: RuntimeError  # Deferred Loading Issue 28335
-regress_23498_test: RuntimeError
-regress_23500_test/01: RuntimeError
-regress_23500_test/02: RuntimeError
-regress_23500_test/none: RuntimeError
-regress_26855_test/0: DartkCrash
+regress_27617_test/1: MissingCompileTimeError
 regress_27957_test: RuntimeError
+regress_28217_test/01: MissingCompileTimeError
+regress_28217_test/none: MissingCompileTimeError
 regress_28278_test: RuntimeError  # Mirrors Issue
 reify_typevar_static_test/00: MissingCompileTimeError
+runtime_type_function_test: RuntimeError
 scope_variable_test/01: MissingCompileTimeError
 script1_negative_test: Fail
 script2_negative_test: Fail
@@ -1376,11 +632,6 @@
 syntax_test/64: MissingCompileTimeError
 syntax_test/65: MissingCompileTimeError
 this_conditional_operator_test/01: MissingCompileTimeError
-toplevel_collision1_test/00: DartkCrash
-toplevel_collision1_test/01: DartkCrash
-toplevel_collision1_test/02: DartkCrash
-try_catch2_test: DartkCrash
-try_catch3_test: DartkCrash
 try_catch_on_syntax_test/10: MissingRuntimeError  # Dartk Issue 28410
 try_catch_on_syntax_test/11: MissingRuntimeError  # Dartk Issue 28410
 try_catch_syntax_test/01: MissingCompileTimeError
@@ -1400,17 +651,41 @@
 type_variable_conflict_test/06: MissingCompileTimeError
 type_variable_function_type_test: RuntimeError
 type_variable_scope3_test/00: MissingCompileTimeError
+vm/causal_async_exception_stack_test: RuntimeError
+vm/debug_break_enabled_vm_test/01: CompileTimeError
+vm/debug_break_enabled_vm_test/none: CompileTimeError
+vm/regress_27201_test: CompileTimeError
+vm/regress_27671_test: RuntimeError
+vm/regress_28325_test: RuntimeError
 vm/type_cast_vm_test: RuntimeError
 vm/type_vm_test: RuntimeError
 
+# dartk: JIT & AOT failures (debug)
+[ ($compiler == dartk || $compiler == dartkp) && $mode == debug ]
+async_await_syntax_test/a05g: Crash
+async_await_syntax_test/a05h: Crash
+async_await_syntax_test/b10b: Crash
+async_await_syntax_test/c11a: Crash
+async_await_syntax_test/c11b: Crash
+const_instance_field_test/01: Crash
+list_literal2_negative_test: Crash
+switch1_negative_test: Crash
+type_parameter_test/04: Crash
+type_parameter_test/05: Crash
+
+# Triaged checked mode failures
+[ ($compiler == dartk || $compiler == dartkp) && $checked ]
+language/regress_22728_test: Fail # Dartk Issue 28498
+
 # dartk: JIT failures
-[ $compiler == dartk && $runtime == vm ]
+[ $compiler == dartk ]
 const_evaluation_test/01: RuntimeError
 const_locals_test: RuntimeError
+const_string_test: RuntimeError  # Dartk Issue 28306
 const_syntax_test/08: MissingCompileTimeError
 const_syntax_test/09: MissingCompileTimeError
 constructor_named_arguments_test/01: Crash  # Dartk Issue 28301
-const_string_test: RuntimeError  # Dartk Issue 28306
+ct_const2_test: Pass, Crash # Flaky
 deferred_constraints_constants_test/constructor1: MissingCompileTimeError
 deferred_constraints_constants_test/constructor2: MissingCompileTimeError
 deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
@@ -1420,6 +695,7 @@
 deferred_constraints_constants_test/metadata3: MissingCompileTimeError
 deferred_constraints_constants_test/reference1: MissingCompileTimeError
 deferred_constraints_constants_test/reference2: MissingCompileTimeError
+disassemble_test: Pass, Crash  # Multitest via multiple VMOptions! Hits assert "kind() != RawScript::kKernelTag". Issue 28790
 final_syntax_test/09: Crash
 getter_declaration_negative_test: Fail
 getter_parameters_test/02: MissingCompileTimeError
@@ -1427,8 +703,8 @@
 instance_creation_in_function_annotation_test: RuntimeError
 label_test: CompileTimeError
 library_env_test/has_no_mirror_support: RuntimeError
-main_not_a_function_test/01: Crash
 redirecting_factory_reflection_test: Crash
+redirecting_factory_reflection_test: RuntimeError
 ref_before_declaration_test/00: MissingCompileTimeError
 ref_before_declaration_test/01: MissingCompileTimeError
 ref_before_declaration_test/02: MissingCompileTimeError
@@ -1442,25 +718,42 @@
 super_call4_test: RuntimeError
 super_getter_setter_test: RuntimeError
 try_catch_syntax_test/05: MissingCompileTimeError
-vm/lazy_deopt_vm_test: Timeout
+vm/lazy_deopt_vm_test: Pass, Slow
+vm/lazy_deopt_vm_test: Pass, Timeout
+vm/optimized_stacktrace_test: Skip # Issue 28788
 
 # dartk: JIT failures (debug)
-[ $compiler == dartk && $runtime == vm && $mode == debug ]
+[ $compiler == dartk && $mode == debug ]
+constructor_duplicate_initializers_test/03: Crash
+deopt_inlined_function_lazy_test: Timeout
+hello_dart_test: Crash  # error: expected: cls.is_type_finalized()
 not_enough_positional_arguments_test/02: Crash  # Dartk Issue 28301
 not_enough_positional_arguments_test/05: Crash  # Dartk Issue 28301
+ref_before_declaration_test/00: Crash
+ref_before_declaration_test/01: Crash
+ref_before_declaration_test/02: Crash
+ref_before_declaration_test/03: Crash
+ref_before_declaration_test/04: Crash
+ref_before_declaration_test/05: Crash
+ref_before_declaration_test/06: Crash
+ref_before_declaration_test/07: Crash
+ref_before_declaration_test/none: Crash
+try_catch_syntax_test/05: Crash
 
 # dartk: precompilation failures
-[ $compiler == dartkp && $runtime == dart_precompiled ]
+[ $compiler == dartkp ]
 assignable_expression_test/01: MissingCompileTimeError
 assignable_expression_test/11: MissingCompileTimeError
 assignable_expression_test/21: MissingCompileTimeError
 assignable_expression_test/31: MissingCompileTimeError
 assignable_expression_test/41: MissingCompileTimeError
+bad_raw_string_test/03: Skip # Issue 28680
+bad_raw_string_test/none: Skip # Issue 28680
 const_syntax_test/08: Crash
 const_syntax_test/09: Crash
+constructor_duplicate_final_test/03: MissingCompileTimeError
 constructor_duplicate_initializers_test/01: MissingCompileTimeError
 constructor_duplicate_initializers_test/02: MissingCompileTimeError
-constructor_duplicate_final_test/03: MissingCompileTimeError
 constructor_return_test/01: MissingCompileTimeError
 constructor_return_test/02: MissingCompileTimeError
 constructor_return_test/03: MissingCompileTimeError
@@ -1481,7 +774,6 @@
 illegal_initializer_test/04: MissingCompileTimeError
 illegal_invocation_test/01: MissingCompileTimeError
 label_test: RuntimeError
-main_not_a_function_test/01: Crash
 prefix_assignment_test/01: MissingCompileTimeError
 prefix_assignment_test/02: MissingCompileTimeError
 prefix_identifier_reference_test/01: MissingCompileTimeError
@@ -1515,6 +807,7 @@
 try_catch_syntax_test/13: MissingCompileTimeError
 try_catch_syntax_test/14: MissingCompileTimeError
 try_catch_syntax_test/15: MissingCompileTimeError
+type_variable_conflict2_test/02: MissingCompileTimeError
 type_variable_conflict2_test/06: MissingCompileTimeError
 type_variable_conflict2_test/08: MissingCompileTimeError
 type_variable_conflict2_test/10: MissingCompileTimeError
@@ -1524,1198 +817,8 @@
 unsupported_operators_test/04: MissingCompileTimeError
 
 # dartk: precompilation failures (debug)
-[ $compiler == dartkp && $runtime == dart_precompiled && $mode == debug ]
+[ $compiler == dartkp && $mode == debug ]
+external_test/13: Crash
+final_syntax_test/09: Crash
 constructor_named_arguments_test/01: Crash  # Dartk Issue 28301
 not_enough_positional_arguments_test/05: Crash  # Dartk Issue 28301
-
-# New failures after respecting VMOptions in test files
-[ $compiler == dartk || $compiler == dartkp ]
-abstract_beats_arguments_test: RuntimeError
-abstract_runtime_error_test/01: RuntimeError
-abstract_runtime_error_test/02: RuntimeError
-application_negative_test: Crash
-arg_param_trailing_comma_test/107: MissingCompileTimeError
-arg_param_trailing_comma_test/112: DartkCrash
-arg_param_trailing_comma_test/115: DartkCrash
-arg_param_trailing_comma_test/121: DartkCrash
-arg_param_trailing_comma_test/124: DartkCrash
-arg_param_trailing_comma_test/14: DartkCrash
-arg_param_trailing_comma_test/17: DartkCrash
-arg_param_trailing_comma_test/171: DartkCrash
-arg_param_trailing_comma_test/174: DartkCrash
-arg_param_trailing_comma_test/180: DartkCrash
-arg_param_trailing_comma_test/183: DartkCrash
-arg_param_trailing_comma_test/193: DartkCrash
-arg_param_trailing_comma_test/196: DartkCrash
-arg_param_trailing_comma_test/202: DartkCrash
-arg_param_trailing_comma_test/205: DartkCrash
-arg_param_trailing_comma_test/31: DartkCrash
-arg_param_trailing_comma_test/34: DartkCrash
-arg_param_trailing_comma_test/40: DartkCrash
-arg_param_trailing_comma_test/43: DartkCrash
-arg_param_trailing_comma_test/5: DartkCrash
-arg_param_trailing_comma_test/53: DartkCrash
-arg_param_trailing_comma_test/56: DartkCrash
-arg_param_trailing_comma_test/62: DartkCrash
-arg_param_trailing_comma_test/65: DartkCrash
-arg_param_trailing_comma_test/79: DartkCrash
-arg_param_trailing_comma_test/8: DartkCrash
-arg_param_trailing_comma_test/82: DartkCrash
-arg_param_trailing_comma_test/88: DartkCrash
-arg_param_trailing_comma_test/91: DartkCrash
-arg_param_trailing_comma_test/none: RuntimeError
-assignable_expression_test/02: MissingCompileTimeError
-assignable_expression_test/03: MissingCompileTimeError
-assignable_expression_test/12: MissingCompileTimeError
-assignable_expression_test/13: MissingCompileTimeError
-assignable_expression_test/22: MissingCompileTimeError
-assignable_expression_test/23: MissingCompileTimeError
-assignable_expression_test/32: MissingCompileTimeError
-assignable_expression_test/33: MissingCompileTimeError
-assignable_expression_test/42: MissingCompileTimeError
-assignable_expression_test/43: MissingCompileTimeError
-assignable_expression_test/50: MissingCompileTimeError
-async_await_catch_regression_test: RuntimeError
-async_await_syntax_test/a01b: MissingCompileTimeError
-async_await_syntax_test/a01c: MissingCompileTimeError
-async_await_syntax_test/a05f: MissingCompileTimeError
-async_await_syntax_test/a05g: MissingCompileTimeError
-async_await_syntax_test/a05h: MissingCompileTimeError
-async_await_syntax_test/a06b: MissingCompileTimeError
-async_await_syntax_test/a12e: MissingCompileTimeError
-async_await_syntax_test/a12f: MissingCompileTimeError
-async_await_syntax_test/b00a: DartkCrash
-async_await_syntax_test/b00b: DartkCrash
-async_await_syntax_test/b00c: DartkCrash
-async_await_syntax_test/b01b: MissingCompileTimeError
-async_await_syntax_test/b01c: MissingCompileTimeError
-async_await_syntax_test/b10b: MissingCompileTimeError
-async_await_syntax_test/b12e: MissingCompileTimeError
-async_await_syntax_test/b12f: MissingCompileTimeError
-async_await_syntax_test/c01b: MissingCompileTimeError
-async_await_syntax_test/c01c: MissingCompileTimeError
-async_await_syntax_test/c11a: MissingCompileTimeError
-async_await_syntax_test/c11b: MissingCompileTimeError
-async_await_syntax_test/d01b: MissingCompileTimeError
-async_await_syntax_test/d01c: MissingCompileTimeError
-async_await_syntax_test/e1: MissingCompileTimeError
-async_await_syntax_test/e2: MissingCompileTimeError
-async_await_syntax_test/e3: MissingCompileTimeError
-async_await_test: Crash
-async_finally_rethrow_test: RuntimeError
-async_return_types_test/return_value_sync_star: MissingCompileTimeError
-async_star_cancel_and_throw_in_finally_test: RuntimeError
-async_star_pause_test: Crash
-async_star_test: Crash
-async_test/constructor3: MissingCompileTimeError
-async_test/setter1: MissingCompileTimeError
-asyncstar_throw_in_catch_test: RuntimeError
-await_backwards_compatibility_test/await1: MissingCompileTimeError
-await_exceptions_test: RuntimeError
-await_test: RuntimeError
-bad_constructor_test/05: CompileTimeError
-bad_initializer1_negative_test: Crash
-black_listed_test/13: MissingCompileTimeError
-body_less_constructor_wrong_arg_negative_test: Crash
-built_in_identifier_illegal_test/01: MissingCompileTimeError
-built_in_identifier_illegal_test/04: MissingCompileTimeError
-built_in_identifier_illegal_test/05: MissingCompileTimeError
-built_in_identifier_illegal_test/06: MissingCompileTimeError
-built_in_identifier_illegal_test/07: MissingCompileTimeError
-built_in_identifier_illegal_test/08: MissingCompileTimeError
-built_in_identifier_illegal_test/10: MissingCompileTimeError
-built_in_identifier_illegal_test/12: MissingCompileTimeError
-built_in_identifier_illegal_test/13: MissingCompileTimeError
-built_in_identifier_illegal_test/15: MissingCompileTimeError
-built_in_identifier_illegal_test/16: MissingCompileTimeError
-built_in_identifier_illegal_test/17: MissingCompileTimeError
-built_in_identifier_illegal_test/18: MissingCompileTimeError
-built_in_identifier_illegal_test/19: MissingCompileTimeError
-built_in_identifier_illegal_test/20: MissingCompileTimeError
-built_in_identifier_test/01: CompileTimeError
-call_nonexistent_static_test/01: RuntimeError
-call_nonexistent_static_test/04: RuntimeError
-call_nonexistent_static_test/06: RuntimeError
-class_cycle2_test/01: MissingCompileTimeError
-class_cycle2_test/02: MissingCompileTimeError
-class_cycle_test/00: MissingCompileTimeError
-class_cycle_test/01: MissingCompileTimeError
-compile_time_constant10_test/01: Crash
-compile_time_constant10_test/02: Crash
-compile_time_constant13_test/02: Crash
-compile_time_constant13_test/03: MissingCompileTimeError
-compile_time_constant13_test/04: Crash
-compile_time_constant13_test/05: Crash
-compile_time_constant_arguments_test/01: MissingCompileTimeError
-compile_time_constant_arguments_test/02: MissingCompileTimeError
-compile_time_constant_arguments_test/03: MissingCompileTimeError
-compile_time_constant_arguments_test/04: MissingCompileTimeError
-compile_time_constant_arguments_test/05: MissingCompileTimeError
-compile_time_constant_arguments_test/06: MissingCompileTimeError
-compile_time_constant_c_test/02: MissingCompileTimeError
-compile_time_constant_c_test/03: MissingCompileTimeError
-compile_time_constant_p_test/01: Crash
-compile_time_constant_r_test/01: Crash
-compile_time_constant_r_test/02: Crash
-compile_time_constant_r_test/03: Crash
-compile_time_constant_test/01: MissingCompileTimeError
-compile_time_constant_test/02: Crash
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-conditional_method_invocation_test/11: MissingCompileTimeError
-conditional_property_access_test/09: MissingCompileTimeError
-conditional_property_assignment_test/20: MissingCompileTimeError
-conditional_property_assignment_test/21: MissingCompileTimeError
-conditional_property_assignment_test/22: MissingCompileTimeError
-const_conditional_test/01: MissingCompileTimeError
-const_conditional_test/02: MissingCompileTimeError
-const_conditional_test/03: MissingCompileTimeError
-const_conditional_test/04: MissingCompileTimeError
-const_conditional_test/05: MissingCompileTimeError
-const_conditional_test/06: MissingCompileTimeError
-const_conditional_test/07: MissingCompileTimeError
-const_conditional_test/08: MissingCompileTimeError
-const_conditional_test/09: MissingCompileTimeError
-const_conditional_test/10: MissingCompileTimeError
-const_constructor_mixin2_test/01: MissingCompileTimeError
-const_constructor_mixin3_test/01: MissingCompileTimeError
-const_constructor_mixin_test/01: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError
-const_constructor_super_test/01: MissingCompileTimeError
-const_constructor_super_test/02: Crash
-const_constructor_syntax_test/01: MissingCompileTimeError
-const_constructor_syntax_test/02: MissingCompileTimeError
-const_constructor_syntax_test/03: MissingCompileTimeError
-const_constructor_syntax_test/04: MissingCompileTimeError
-const_constructor_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/03: MissingCompileTimeError
-const_factory_with_body_test/01: MissingCompileTimeError
-const_instance_field_test/01: MissingCompileTimeError
-const_map2_test/00: MissingCompileTimeError
-const_map3_test/00: MissingCompileTimeError
-const_optional_args_negative_test: Fail
-const_switch2_test/01: MissingCompileTimeError
-const_syntax_test/01: MissingCompileTimeError
-const_syntax_test/02: MissingCompileTimeError
-const_syntax_test/03: MissingCompileTimeError
-const_syntax_test/04: MissingCompileTimeError
-const_syntax_test/05: MissingCompileTimeError
-const_syntax_test/06: MissingCompileTimeError
-const_syntax_test/07: MissingCompileTimeError
-const_syntax_test/10: Crash
-const_syntax_test/11: MissingCompileTimeError
-const_syntax_test/12: MissingCompileTimeError
-const_types_test/09: MissingCompileTimeError
-const_types_test/10: MissingCompileTimeError
-const_types_test/11: MissingCompileTimeError
-const_types_test/12: MissingCompileTimeError
-const_types_test/16: MissingCompileTimeError
-const_types_test/17: MissingCompileTimeError
-const_types_test/18: MissingCompileTimeError
-const_types_test/19: MissingCompileTimeError
-const_types_test/20: MissingCompileTimeError
-const_types_test/21: MissingCompileTimeError
-const_types_test/22: MissingCompileTimeError
-const_types_test/23: MissingCompileTimeError
-const_types_test/24: MissingCompileTimeError
-const_types_test/25: MissingCompileTimeError
-const_types_test/26: MissingCompileTimeError
-const_types_test/27: MissingCompileTimeError
-const_types_test/28: MissingCompileTimeError
-const_types_test/29: MissingCompileTimeError
-const_types_test/30: MissingCompileTimeError
-const_types_test/41: MissingCompileTimeError
-constant_locals_test/01: MissingCompileTimeError
-constant_locals_test/02: MissingCompileTimeError
-constant_locals_test/03: MissingCompileTimeError
-constant_locals_test/04: MissingCompileTimeError
-constant_locals_test/05: MissingCompileTimeError
-constructor10_test/00: Crash
-constructor10_test/01: Crash
-constructor10_test/02: Crash
-constructor_duplicate_initializers_test/03: MissingCompileTimeError
-constructor_redirect2_test/01: MissingCompileTimeError
-constructor_redirect_test/01: MissingCompileTimeError
-covariant_test/00c: RuntimeError
-covariant_test/02: MissingCompileTimeError
-covariant_test/08: MissingCompileTimeError
-covariant_test/12: MissingCompileTimeError
-covariant_test/14: MissingCompileTimeError
-covariant_test/16: MissingCompileTimeError
-covariant_test/19: MissingCompileTimeError
-covariant_test/20c: RuntimeError
-covariant_test/22: MissingCompileTimeError
-covariant_test/28: MissingCompileTimeError
-covariant_test/32: MissingCompileTimeError
-covariant_test/34: MissingCompileTimeError
-covariant_test/36: MissingCompileTimeError
-covariant_test/39: MissingCompileTimeError
-covariant_test/40: RuntimeError
-covariant_test/40b: RuntimeError
-covariant_test/40c: RuntimeError
-covariant_test/42: RuntimeError
-covariant_test/46: MissingCompileTimeError
-covariant_test/46b: MissingCompileTimeError
-covariant_test/48: RuntimeError
-covariant_test/52: RuntimeError
-covariant_test/54: RuntimeError
-covariant_test/56: RuntimeError
-covariant_test/59: MissingCompileTimeError
-covariant_test/none: RuntimeError
-custom_await_stack_trace_test: RuntimeError
-cyclic_class_member_test/01: MissingCompileTimeError
-cyclic_constructor_test/01: MissingCompileTimeError
-cyclic_typedef_test/01: MissingCompileTimeError
-cyclic_typedef_test/02: MissingCompileTimeError
-cyclic_typedef_test/03: MissingCompileTimeError
-cyclic_typedef_test/04: MissingCompileTimeError
-cyclic_typedef_test/05: MissingCompileTimeError
-cyclic_typedef_test/06: MissingCompileTimeError
-cyclic_typedef_test/07: MissingCompileTimeError
-cyclic_typedef_test/08: MissingCompileTimeError
-cyclic_typedef_test/09: MissingCompileTimeError
-cyclic_typedef_test/10: MissingCompileTimeError
-cyclic_typedef_test/11: MissingCompileTimeError
-deferred_duplicate_prefix1_test/01: MissingCompileTimeError
-deferred_duplicate_prefix2_test/01: MissingCompileTimeError
-deferred_duplicate_prefix3_test/01: MissingCompileTimeError
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/01: MissingCompileTimeError
-deferred_load_constants_test/02: MissingCompileTimeError
-deferred_load_constants_test/03: MissingCompileTimeError
-deferred_load_constants_test/04: MissingCompileTimeError
-deferred_load_constants_test/05: MissingCompileTimeError
-deferred_no_prefix_test/01: MissingCompileTimeError
-duplicate_export_negative_test: DartkCrash
-dynamic2_test/00: MissingCompileTimeError
-dynamic2_test/01: MissingCompileTimeError
-dynamic_prefix_core_test/01: RuntimeError
-enum_private_test/02: RuntimeError
-enum_syntax_test/11: DartkCrash
-enum_syntax_test/20: Crash
-enum_syntax_test/21: MissingCompileTimeError
-enum_syntax_test/22: Crash
-enum_syntax_test/30: MissingCompileTimeError
-export_ambiguous_main_negative_test: Crash
-export_double_same_main_test: Crash
-export_main_test: Crash
-export_private_test/01: MissingCompileTimeError
-extend_type_parameter2_negative_test: DartkCrash
-extend_type_parameter_negative_test: DartkCrash
-external_test/11: MissingCompileTimeError
-external_test/12: MissingCompileTimeError
-external_test/22: MissingCompileTimeError
-external_test/23: MissingCompileTimeError
-external_test/30: MissingCompileTimeError
-external_test/31: MissingCompileTimeError
-factory2_negative_test: DartkCrash
-factory_negative_test: DartkCrash
-factory_redirection_test/07: MissingCompileTimeError
-field_decl_missing_var_type_test/01: MissingCompileTimeError
-final_initializer_instance_reference_test/01: MissingCompileTimeError
-final_is_not_const_test/01: MissingCompileTimeError
-final_super_field_set_test/01: RuntimeError
-first_class_types_literals_test/08: RuntimeError
-function_subtype0_test: RuntimeError
-function_subtype1_test: RuntimeError
-function_syntax_test/00: MissingCompileTimeError
-function_syntax_test/01: MissingCompileTimeError
-function_syntax_test/22: MissingCompileTimeError
-function_syntax_test/64: MissingCompileTimeError
-function_syntax_test/67: MissingCompileTimeError
-function_syntax_test/68: MissingCompileTimeError
-function_syntax_test/69: MissingCompileTimeError
-function_syntax_test/71: MissingCompileTimeError
-function_syntax_test/73: MissingCompileTimeError
-function_syntax_test/74: MissingCompileTimeError
-function_type_alias5_test/00: MissingCompileTimeError
-function_type_alias5_test/01: MissingCompileTimeError
-function_type_alias5_test/02: MissingCompileTimeError
-function_type_alias6_test/00: MissingCompileTimeError
-function_type_alias7_test/00: MissingCompileTimeError
-function_type_alias7_test/01: DartkCrash
-function_type_alias7_test/02: MissingCompileTimeError
-function_type_alias9_test/00: MissingCompileTimeError
-function_type_parameter2_negative_test: Crash
-function_type_parameter_negative_test: Crash
-generic_constructor_mixin3_test: Crash
-generic_field_mixin2_test: RuntimeError
-generic_field_mixin3_test: RuntimeError
-generic_field_mixin5_test: RuntimeError
-generic_field_mixin_test: RuntimeError
-generic_local_functions_test: DartkCrash
-generic_metadata_test/02: MissingCompileTimeError
-generic_metadata_test/03: MissingCompileTimeError
-generic_methods_generic_function_parameter_test: DartkCrash
-getter_parameters_test/01: MissingCompileTimeError
-getter_parameters_test/03: MissingCompileTimeError
-getter_parameters_test/04: MissingCompileTimeError
-hidden_import_test/01: DartkCrash
-hidden_import_test/02: DartkCrash
-hidden_import_test/none: DartkCrash
-if_null_assignment_behavior_test/09: RuntimeError
-if_null_assignment_behavior_test/10: RuntimeError
-if_null_assignment_behavior_test/15: RuntimeError
-implicit_scope_test: Crash
-import_combinators_test: RuntimeError
-import_private_test/01: DartkCrash
-initializing_formal_capture_test: RuntimeError
-inst_field_initializer1_negative_test: Fail
-instanceof3_test: RuntimeError
-interface2_negative_test: Fail
-interface_cycle_test/01: MissingCompileTimeError
-interface_cycle_test/02: MissingCompileTimeError
-invocation_mirror_test: RuntimeError
-is_malformed_type_test/94: RuntimeError
-is_malformed_type_test/95: RuntimeError
-is_malformed_type_test/96: RuntimeError
-is_malformed_type_test/97: RuntimeError
-is_malformed_type_test/98: RuntimeError
-is_malformed_type_test/99: RuntimeError
-is_not_class4_negative_test: Fail
-isnot_malformed_type_test: RuntimeError
-label6_negative_test: DartkCrash
-library_ambiguous_test/00: MissingRuntimeError
-library_ambiguous_test/04: MissingRuntimeError
-library_ambiguous_test/05: MissingCompileTimeError
-list_literal2_negative_test: Fail
-list_literal_negative_test: DartkCrash
-malformed2_test/00: RuntimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: Crash
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_inheritance_test/07: DartkCrash
-malformed_inheritance_test/08: DartkCrash
-malformed_inheritance_test/09: MissingCompileTimeError
-malformed_inheritance_test/10: MissingCompileTimeError
-malformed_inheritance_test/11: DartkCrash
-malformed_inheritance_test/12: DartkCrash
-map_literal2_negative_test: Fail
-map_literal_negative_test: DartkCrash
-method_name_test: CompileTimeError
-missing_const_constructor_test/02: MissingCompileTimeError
-missing_const_constructor_test/03: MissingCompileTimeError
-missing_const_constructor_test/04: Crash
-missing_const_constructor_test/05: MissingCompileTimeError
-missing_const_constructor_test/06: MissingCompileTimeError
-missing_part_of_tag_test/01: MissingCompileTimeError
-mixin_black_listed_test/08: DartkCrash
-mixin_cyclic_test/01: MissingCompileTimeError
-mixin_cyclic_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/01: MissingCompileTimeError
-mixin_illegal_constructor_test/02: MissingCompileTimeError
-mixin_illegal_constructor_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/04: MissingCompileTimeError
-mixin_illegal_constructor_test/05: MissingCompileTimeError
-mixin_illegal_constructor_test/06: MissingCompileTimeError
-mixin_illegal_constructor_test/07: MissingCompileTimeError
-mixin_illegal_constructor_test/08: MissingCompileTimeError
-mixin_illegal_constructor_test/09: MissingCompileTimeError
-mixin_illegal_constructor_test/10: MissingCompileTimeError
-mixin_illegal_constructor_test/11: MissingCompileTimeError
-mixin_illegal_constructor_test/12: MissingCompileTimeError
-mixin_illegal_cycles_test/01: MissingCompileTimeError
-mixin_illegal_cycles_test/02: MissingCompileTimeError
-mixin_illegal_cycles_test/03: MissingCompileTimeError
-mixin_illegal_cycles_test/04: MissingCompileTimeError
-mixin_illegal_cycles_test/05: MissingCompileTimeError
-mixin_illegal_cycles_test/06: MissingCompileTimeError
-mixin_illegal_object_test/01: MissingCompileTimeError
-mixin_illegal_object_test/02: MissingCompileTimeError
-mixin_invalid_inheritance1_test/01: Crash
-mixin_invalid_inheritance1_test/02: Crash
-mixin_invalid_inheritance1_test/03: Crash
-mixin_invalid_inheritance2_test/01: MissingCompileTimeError
-mixin_invalid_inheritance2_test/02: MissingCompileTimeError
-mixin_invalid_inheritance2_test/03: DartkCrash
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin2_test: RuntimeError
-mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
-mixin_of_mixin_test/03: RuntimeError
-mixin_of_mixin_test/14: RuntimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
-mixin_super_test: RuntimeError
-mixin_type_parameters_errors_test/01: DartkCrash
-mixin_type_parameters_errors_test/02: DartkCrash
-mixin_type_parameters_errors_test/05: DartkCrash
-multiline_newline_test/01: RuntimeError
-multiline_newline_test/02: RuntimeError
-multiline_newline_test/03: RuntimeError
-named_constructor_test/01: MissingRuntimeError
-named_constructor_test/02: DartkCrash
-named_constructor_test/04: DartkCrash
-named_constructor_test/05: DartkCrash
-named_constructor_test/06: DartkCrash
-named_constructor_test/07: DartkCrash
-named_constructor_test/08: DartkCrash
-named_constructor_test/09: DartkCrash
-named_constructor_test/10: DartkCrash
-named_parameters_aggregated_test/01: MissingCompileTimeError
-named_parameters_aggregated_test/03: MissingCompileTimeError
-named_parameters_aggregated_test/04: MissingCompileTimeError
-named_parameters_default_eq_test/01: MissingCompileTimeError
-named_parameters_default_eq_test/02: MissingCompileTimeError
-new_expression1_negative_test: DartkCrash
-no_main_test/01: Crash
-number_identifier_test/02: MissingCompileTimeError
-number_identifier_test/04: MissingCompileTimeError
-on_catch_malformed_type_test: RuntimeError
-parameter_initializer1_negative_test: DartkCrash
-parameter_initializer2_negative_test: DartkCrash
-parameter_initializer3_negative_test: DartkCrash
-parameter_initializer4_negative_test: DartkCrash
-parameter_initializer6_negative_test: Fail
-part2_test: RuntimeError
-prefix13_negative_test: Fail
-prefix15_negative_test: Fail
-private_access_test/05: RuntimeError
-private_access_test/06: RuntimeError
-private_super_constructor_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
-redirecting_factory_infinite_steps_test/02: Crash
-redirecting_factory_long_test: RuntimeError
-regress_13494_test: RuntimeError
-regress_20394_test/01: MissingCompileTimeError
-regress_22438_test: RuntimeError
-regress_22445_test: RuntimeError
-regress_22579_test: RuntimeError
-regress_23498_test: RuntimeError
-regress_23500_test/01: RuntimeError
-regress_23500_test/02: RuntimeError
-regress_23500_test/none: RuntimeError
-regress_26855_test/0: DartkCrash
-regress_27957_test: RuntimeError
-reify_typevar_static_test/00: MissingCompileTimeError
-scope_variable_test/01: MissingCompileTimeError
-setter0_test: RuntimeError
-setter4_test: CompileTimeError
-setter_override_test/01: RuntimeError
-setter_override_test/02: RuntimeError
-setter_override_test/none: RuntimeError
-source_self_negative_test: DartkCrash
-static_final_field2_test/02: MissingCompileTimeError
-static_parameter_test/01: MissingCompileTimeError
-static_parameter_test/02: MissingCompileTimeError
-static_parameter_test/03: MissingCompileTimeError
-static_parameter_test/04: MissingCompileTimeError
-static_parameter_test/05: MissingCompileTimeError
-static_parameter_test/06: MissingCompileTimeError
-static_parameter_test/07: MissingCompileTimeError
-static_parameter_test/08: MissingCompileTimeError
-static_parameter_test/09: MissingCompileTimeError
-static_parameter_test/10: MissingCompileTimeError
-static_parameter_test/11: MissingCompileTimeError
-static_parameter_test/12: MissingCompileTimeError
-super_call3_test/02: Crash
-super_conditional_operator_test/01: MissingCompileTimeError
-super_conditional_operator_test/02: MissingCompileTimeError
-super_conditional_operator_test/03: MissingCompileTimeError
-super_conditional_operator_test/04: MissingCompileTimeError
-super_conditional_operator_test/05: MissingCompileTimeError
-super_conditional_operator_test/06: MissingCompileTimeError
-super_conditional_operator_test/07: MissingCompileTimeError
-super_conditional_operator_test/08: MissingCompileTimeError
-super_conditional_operator_test/09: MissingCompileTimeError
-super_conditional_operator_test/10: MissingCompileTimeError
-super_conditional_operator_test/11: MissingCompileTimeError
-super_conditional_operator_test/12: MissingCompileTimeError
-super_conditional_operator_test/13: MissingCompileTimeError
-super_conditional_operator_test/14: MissingCompileTimeError
-super_conditional_operator_test/15: MissingCompileTimeError
-super_conditional_operator_test/16: MissingCompileTimeError
-super_conditional_operator_test/17: MissingCompileTimeError
-super_conditional_operator_test/18: MissingCompileTimeError
-super_no_such_method1_test/01: RuntimeError
-super_no_such_method2_test/01: RuntimeError
-super_no_such_method3_test/01: RuntimeError
-super_no_such_method4_test/01: RuntimeError
-super_no_such_method5_test/01: RuntimeError
-switch1_negative_test: Fail
-switch4_negative_test: DartkCrash
-switch_bad_case_test/01: MissingCompileTimeError
-switch_bad_case_test/02: MissingCompileTimeError
-switch_case_test/00: MissingCompileTimeError
-switch_case_test/01: MissingCompileTimeError
-switch_case_test/02: MissingCompileTimeError
-switch_label_test: DartkCrash
-sync_generator2_test/01: MissingCompileTimeError
-sync_generator2_test/02: MissingCompileTimeError
-sync_generator2_test/03: MissingCompileTimeError
-sync_generator2_test/04: MissingCompileTimeError
-sync_generator2_test/05: MissingCompileTimeError
-sync_generator2_test/06: MissingCompileTimeError
-sync_generator2_test/09: Crash
-sync_generator2_test/11: MissingCompileTimeError
-sync_generator2_test/20: MissingCompileTimeError
-sync_generator2_test/30: MissingCompileTimeError
-sync_generator2_test/40: MissingCompileTimeError
-sync_generator2_test/41: MissingCompileTimeError
-sync_generator2_test/51: MissingCompileTimeError
-sync_generator2_test/52: MissingCompileTimeError
-syntax_test/02: MissingCompileTimeError
-syntax_test/03: MissingCompileTimeError
-syntax_test/27: MissingCompileTimeError
-syntax_test/50: MissingCompileTimeError
-syntax_test/51: MissingCompileTimeError
-syntax_test/64: MissingCompileTimeError
-syntax_test/65: MissingCompileTimeError
-this_conditional_operator_test/01: MissingCompileTimeError
-toplevel_collision1_test/00: DartkCrash
-toplevel_collision1_test/01: DartkCrash
-toplevel_collision1_test/02: DartkCrash
-try_catch2_test: DartkCrash
-try_catch3_test: DartkCrash
-try_catch_syntax_test/01: MissingCompileTimeError
-try_catch_syntax_test/07: MissingCompileTimeError
-try_catch_syntax_test/09: MissingCompileTimeError
-try_catch_syntax_test/10: MissingCompileTimeError
-try_catch_syntax_test/11: MissingCompileTimeError
-try_catch_syntax_test/12: MissingCompileTimeError
-try_catch_syntax_test/16: Crash
-try_catch_syntax_test/17: Crash
-type_variable_conflict2_test/01: RuntimeError
-type_variable_conflict_test/01: MissingCompileTimeError
-type_variable_conflict_test/02: MissingCompileTimeError
-type_variable_conflict_test/03: MissingCompileTimeError
-type_variable_conflict_test/04: MissingCompileTimeError
-type_variable_conflict_test/05: MissingCompileTimeError
-type_variable_conflict_test/06: MissingCompileTimeError
-type_variable_scope3_test/00: MissingCompileTimeError
-vm/regress_27671_test: RuntimeError
-
-# New failures after respecting VMOptions in test files
-[ $compiler == dartk && $runtime == vm && $mode == debug]
-hello_dart_test: Crash  # error: expected: cls.is_type_finalized()
-
-# New failures after respecting VMOptions in test files
-[ $compiler == dartk && $runtime == vm ]
-const_evaluation_test/01: RuntimeError
-const_syntax_test/08: MissingCompileTimeError
-const_syntax_test/09: MissingCompileTimeError
-deferred_constraints_constants_test/constructor1: MissingCompileTimeError
-deferred_constraints_constants_test/constructor2: MissingCompileTimeError
-deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
-deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
-deferred_constraints_constants_test/metadata1: MissingCompileTimeError
-deferred_constraints_constants_test/metadata2: MissingCompileTimeError
-deferred_constraints_constants_test/metadata3: MissingCompileTimeError
-deferred_constraints_constants_test/reference1: MissingCompileTimeError
-deferred_constraints_constants_test/reference2: MissingCompileTimeError
-final_syntax_test/09: Crash
-getter_declaration_negative_test: Fail
-getter_parameters_test/02: MissingCompileTimeError
-hello_dart_test: Crash
-disassemble_test: Pass, Crash  # Multitest via multiple VMOptions! Hits assert "kind() != RawScript::kKernelTag". Issue 28790
-instance_creation_in_function_annotation_test: RuntimeError
-label_test: CompileTimeError
-redirecting_factory_reflection_test: Crash
-ref_before_declaration_test/00: MissingCompileTimeError
-ref_before_declaration_test/01: MissingCompileTimeError
-ref_before_declaration_test/02: MissingCompileTimeError
-ref_before_declaration_test/03: MissingCompileTimeError
-ref_before_declaration_test/04: MissingCompileTimeError
-ref_before_declaration_test/05: MissingCompileTimeError
-ref_before_declaration_test/06: MissingCompileTimeError
-ref_before_declaration_test/07: MissingCompileTimeError
-setter_declaration2_negative_test: Fail
-setter_declaration_negative_test: Fail
-super_call4_test: RuntimeError
-super_getter_setter_test: RuntimeError
-try_catch_syntax_test/05: MissingCompileTimeError
-vm/lazy_deopt_vm_test: Timeout
-
-# Failures during Gardening shift: To be triaged!
-[ $compiler == dartk || $compiler == dartkp ]
-abstract_beats_arguments_test: RuntimeError
-abstract_runtime_error_test/01: RuntimeError
-abstract_runtime_error_test/02: RuntimeError
-application_negative_test: Crash
-arg_param_trailing_comma_test/107: MissingCompileTimeError
-arg_param_trailing_comma_test/112: DartkCrash
-arg_param_trailing_comma_test/115: DartkCrash
-arg_param_trailing_comma_test/121: DartkCrash
-arg_param_trailing_comma_test/124: DartkCrash
-arg_param_trailing_comma_test/14: DartkCrash
-arg_param_trailing_comma_test/17: DartkCrash
-arg_param_trailing_comma_test/171: DartkCrash
-arg_param_trailing_comma_test/174: DartkCrash
-arg_param_trailing_comma_test/180: DartkCrash
-arg_param_trailing_comma_test/183: DartkCrash
-arg_param_trailing_comma_test/193: DartkCrash
-arg_param_trailing_comma_test/196: DartkCrash
-arg_param_trailing_comma_test/202: DartkCrash
-arg_param_trailing_comma_test/205: DartkCrash
-arg_param_trailing_comma_test/31: DartkCrash
-arg_param_trailing_comma_test/34: DartkCrash
-arg_param_trailing_comma_test/40: DartkCrash
-arg_param_trailing_comma_test/43: DartkCrash
-arg_param_trailing_comma_test/5: DartkCrash
-arg_param_trailing_comma_test/53: DartkCrash
-arg_param_trailing_comma_test/56: DartkCrash
-arg_param_trailing_comma_test/62: DartkCrash
-arg_param_trailing_comma_test/65: DartkCrash
-arg_param_trailing_comma_test/79: DartkCrash
-arg_param_trailing_comma_test/8: DartkCrash
-arg_param_trailing_comma_test/82: DartkCrash
-arg_param_trailing_comma_test/88: DartkCrash
-arg_param_trailing_comma_test/91: DartkCrash
-arg_param_trailing_comma_test/none: RuntimeError
-assignable_expression_test/02: MissingCompileTimeError
-assignable_expression_test/03: MissingCompileTimeError
-assignable_expression_test/12: MissingCompileTimeError
-assignable_expression_test/13: MissingCompileTimeError
-assignable_expression_test/22: MissingCompileTimeError
-assignable_expression_test/23: MissingCompileTimeError
-assignable_expression_test/32: MissingCompileTimeError
-assignable_expression_test/33: MissingCompileTimeError
-assignable_expression_test/42: MissingCompileTimeError
-assignable_expression_test/43: MissingCompileTimeError
-assignable_expression_test/50: MissingCompileTimeError
-async_await_catch_regression_test: RuntimeError
-async_await_syntax_test/a01b: MissingCompileTimeError
-async_await_syntax_test/a01c: MissingCompileTimeError
-async_await_syntax_test/a05f: MissingCompileTimeError
-async_await_syntax_test/a05g: MissingCompileTimeError
-async_await_syntax_test/a05h: MissingCompileTimeError
-async_await_syntax_test/a06b: MissingCompileTimeError
-async_await_syntax_test/a12e: MissingCompileTimeError
-async_await_syntax_test/a12f: MissingCompileTimeError
-async_await_syntax_test/b00a: DartkCrash
-async_await_syntax_test/b00b: DartkCrash
-async_await_syntax_test/b00c: DartkCrash
-async_await_syntax_test/b01b: MissingCompileTimeError
-async_await_syntax_test/b01c: MissingCompileTimeError
-async_await_syntax_test/b10b: MissingCompileTimeError
-async_await_syntax_test/b12e: MissingCompileTimeError
-async_await_syntax_test/b12f: MissingCompileTimeError
-async_await_syntax_test/c01b: MissingCompileTimeError
-async_await_syntax_test/c01c: MissingCompileTimeError
-async_await_syntax_test/c11a: MissingCompileTimeError
-async_await_syntax_test/c11b: MissingCompileTimeError
-async_await_syntax_test/d01b: MissingCompileTimeError
-async_await_syntax_test/d01c: MissingCompileTimeError
-async_await_syntax_test/e1: MissingCompileTimeError
-async_await_syntax_test/e2: MissingCompileTimeError
-async_await_syntax_test/e3: MissingCompileTimeError
-async_await_test: Crash
-async_finally_rethrow_test: RuntimeError
-async_return_types_test/return_value_sync_star: MissingCompileTimeError
-async_star_cancel_and_throw_in_finally_test: RuntimeError
-async_star_pause_test: Crash
-async_star_test: Crash
-async_test/constructor3: MissingCompileTimeError
-async_test/setter1: MissingCompileTimeError
-asyncstar_throw_in_catch_test: RuntimeError
-await_backwards_compatibility_test/await1: MissingCompileTimeError
-await_exceptions_test: RuntimeError
-await_test: RuntimeError
-bad_constructor_test/05: CompileTimeError
-bad_initializer1_negative_test: Crash
-black_listed_test/13: MissingCompileTimeError
-body_less_constructor_wrong_arg_negative_test: Crash
-built_in_identifier_illegal_test/01: MissingCompileTimeError
-built_in_identifier_illegal_test/04: MissingCompileTimeError
-built_in_identifier_illegal_test/05: MissingCompileTimeError
-built_in_identifier_illegal_test/06: MissingCompileTimeError
-built_in_identifier_illegal_test/07: MissingCompileTimeError
-built_in_identifier_illegal_test/08: MissingCompileTimeError
-built_in_identifier_illegal_test/10: MissingCompileTimeError
-built_in_identifier_illegal_test/12: MissingCompileTimeError
-built_in_identifier_illegal_test/13: MissingCompileTimeError
-built_in_identifier_illegal_test/15: MissingCompileTimeError
-built_in_identifier_illegal_test/16: MissingCompileTimeError
-built_in_identifier_illegal_test/17: MissingCompileTimeError
-built_in_identifier_illegal_test/18: MissingCompileTimeError
-built_in_identifier_illegal_test/19: MissingCompileTimeError
-built_in_identifier_illegal_test/20: MissingCompileTimeError
-built_in_identifier_test/01: CompileTimeError
-call_nonexistent_static_test/01: RuntimeError
-call_nonexistent_static_test/04: RuntimeError
-call_nonexistent_static_test/06: RuntimeError
-class_cycle2_test/01: MissingCompileTimeError
-class_cycle2_test/02: MissingCompileTimeError
-class_cycle_test/00: MissingCompileTimeError
-class_cycle_test/01: MissingCompileTimeError
-compile_time_constant10_test/01: Crash
-compile_time_constant10_test/02: Crash
-compile_time_constant13_test/02: Crash
-compile_time_constant13_test/03: MissingCompileTimeError
-compile_time_constant13_test/04: Crash
-compile_time_constant13_test/05: Crash
-compile_time_constant_arguments_test/01: MissingCompileTimeError
-compile_time_constant_arguments_test/02: MissingCompileTimeError
-compile_time_constant_arguments_test/03: MissingCompileTimeError
-compile_time_constant_arguments_test/04: MissingCompileTimeError
-compile_time_constant_arguments_test/05: MissingCompileTimeError
-compile_time_constant_arguments_test/06: MissingCompileTimeError
-compile_time_constant_c_test/02: MissingCompileTimeError
-compile_time_constant_c_test/03: MissingCompileTimeError
-compile_time_constant_p_test/01: Crash
-compile_time_constant_r_test/01: Crash
-compile_time_constant_r_test/02: Crash
-compile_time_constant_r_test/03: Crash
-compile_time_constant_test/01: MissingCompileTimeError
-compile_time_constant_test/02: Crash
-conditional_import_string_test: RuntimeError
-conditional_import_test: RuntimeError
-conditional_method_invocation_test/11: MissingCompileTimeError
-conditional_property_access_test/09: MissingCompileTimeError
-conditional_property_assignment_test/20: MissingCompileTimeError
-conditional_property_assignment_test/21: MissingCompileTimeError
-conditional_property_assignment_test/22: MissingCompileTimeError
-const_conditional_test/01: MissingCompileTimeError
-const_conditional_test/02: MissingCompileTimeError
-const_conditional_test/03: MissingCompileTimeError
-const_conditional_test/04: MissingCompileTimeError
-const_conditional_test/05: MissingCompileTimeError
-const_conditional_test/06: MissingCompileTimeError
-const_conditional_test/07: MissingCompileTimeError
-const_conditional_test/08: MissingCompileTimeError
-const_conditional_test/09: MissingCompileTimeError
-const_conditional_test/10: MissingCompileTimeError
-const_constructor_mixin2_test/01: MissingCompileTimeError
-const_constructor_mixin3_test/01: MissingCompileTimeError
-const_constructor_mixin_test/01: MissingCompileTimeError
-const_constructor_nonconst_field_test/01: MissingCompileTimeError
-const_constructor_super_test/01: MissingCompileTimeError
-const_constructor_super_test/02: Crash
-const_constructor_syntax_test/01: MissingCompileTimeError
-const_constructor_syntax_test/02: MissingCompileTimeError
-const_constructor_syntax_test/03: MissingCompileTimeError
-const_constructor_syntax_test/04: MissingCompileTimeError
-const_constructor_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/01: MissingCompileTimeError
-const_error_multiply_initialized_test/03: MissingCompileTimeError
-const_factory_with_body_test/01: MissingCompileTimeError
-const_instance_field_test/01: MissingCompileTimeError
-const_map2_test/00: MissingCompileTimeError
-const_map3_test/00: MissingCompileTimeError
-const_optional_args_negative_test: Fail
-const_switch2_test/01: MissingCompileTimeError
-const_syntax_test/01: MissingCompileTimeError
-const_syntax_test/02: MissingCompileTimeError
-const_syntax_test/03: MissingCompileTimeError
-const_syntax_test/04: MissingCompileTimeError
-const_syntax_test/05: MissingCompileTimeError
-const_syntax_test/06: MissingCompileTimeError
-const_syntax_test/07: MissingCompileTimeError
-const_syntax_test/10: Crash
-const_syntax_test/11: MissingCompileTimeError
-const_syntax_test/12: MissingCompileTimeError
-const_types_test/09: MissingCompileTimeError
-const_types_test/10: MissingCompileTimeError
-const_types_test/11: MissingCompileTimeError
-const_types_test/12: MissingCompileTimeError
-const_types_test/16: MissingCompileTimeError
-const_types_test/17: MissingCompileTimeError
-const_types_test/18: MissingCompileTimeError
-const_types_test/19: MissingCompileTimeError
-const_types_test/20: MissingCompileTimeError
-const_types_test/21: MissingCompileTimeError
-const_types_test/22: MissingCompileTimeError
-const_types_test/23: MissingCompileTimeError
-const_types_test/24: MissingCompileTimeError
-const_types_test/25: MissingCompileTimeError
-const_types_test/26: MissingCompileTimeError
-const_types_test/27: MissingCompileTimeError
-const_types_test/28: MissingCompileTimeError
-const_types_test/29: MissingCompileTimeError
-const_types_test/30: MissingCompileTimeError
-const_types_test/41: MissingCompileTimeError
-constant_locals_test/01: MissingCompileTimeError
-constant_locals_test/02: MissingCompileTimeError
-constant_locals_test/03: MissingCompileTimeError
-constant_locals_test/04: MissingCompileTimeError
-constant_locals_test/05: MissingCompileTimeError
-constructor10_test/00: Crash
-constructor10_test/01: Crash
-constructor10_test/02: Crash
-constructor_duplicate_initializers_test/03: MissingCompileTimeError
-constructor_redirect2_test/01: MissingCompileTimeError
-constructor_redirect_test/01: MissingCompileTimeError
-covariant_test/00c: RuntimeError
-covariant_test/02: MissingCompileTimeError
-covariant_test/08: MissingCompileTimeError
-covariant_test/12: MissingCompileTimeError
-covariant_test/14: MissingCompileTimeError
-covariant_test/16: MissingCompileTimeError
-covariant_test/19: MissingCompileTimeError
-covariant_test/20c: RuntimeError
-covariant_test/22: MissingCompileTimeError
-covariant_test/28: MissingCompileTimeError
-covariant_test/32: MissingCompileTimeError
-covariant_test/34: MissingCompileTimeError
-covariant_test/36: MissingCompileTimeError
-covariant_test/39: MissingCompileTimeError
-covariant_test/40: RuntimeError
-covariant_test/40b: RuntimeError
-covariant_test/40c: RuntimeError
-covariant_test/42: RuntimeError
-covariant_test/46: MissingCompileTimeError
-covariant_test/46b: MissingCompileTimeError
-covariant_test/48: RuntimeError
-covariant_test/52: RuntimeError
-covariant_test/54: RuntimeError
-covariant_test/56: RuntimeError
-covariant_test/59: MissingCompileTimeError
-covariant_test/none: RuntimeError
-custom_await_stack_trace_test: RuntimeError
-cyclic_class_member_test/01: MissingCompileTimeError
-cyclic_constructor_test/01: MissingCompileTimeError
-cyclic_typedef_test/01: MissingCompileTimeError
-cyclic_typedef_test/02: MissingCompileTimeError
-cyclic_typedef_test/03: MissingCompileTimeError
-cyclic_typedef_test/04: MissingCompileTimeError
-cyclic_typedef_test/05: MissingCompileTimeError
-cyclic_typedef_test/06: MissingCompileTimeError
-cyclic_typedef_test/07: MissingCompileTimeError
-cyclic_typedef_test/08: MissingCompileTimeError
-cyclic_typedef_test/09: MissingCompileTimeError
-cyclic_typedef_test/10: MissingCompileTimeError
-cyclic_typedef_test/11: MissingCompileTimeError
-deferred_duplicate_prefix1_test/01: MissingCompileTimeError
-deferred_duplicate_prefix2_test/01: MissingCompileTimeError
-deferred_duplicate_prefix3_test/01: MissingCompileTimeError
-deferred_inheritance_constraints_test/extends: MissingCompileTimeError
-deferred_inheritance_constraints_test/implements: MissingCompileTimeError
-deferred_inheritance_constraints_test/mixin: MissingCompileTimeError
-deferred_load_constants_test/01: MissingCompileTimeError
-deferred_load_constants_test/02: MissingCompileTimeError
-deferred_load_constants_test/03: MissingCompileTimeError
-deferred_load_constants_test/04: MissingCompileTimeError
-deferred_load_constants_test/05: MissingCompileTimeError
-deferred_no_prefix_test/01: MissingCompileTimeError
-duplicate_export_negative_test: DartkCrash
-dynamic2_test/00: MissingCompileTimeError
-dynamic2_test/01: MissingCompileTimeError
-dynamic_prefix_core_test/01: RuntimeError
-enum_private_test/02: RuntimeError
-enum_syntax_test/11: DartkCrash
-enum_syntax_test/20: Crash
-enum_syntax_test/21: MissingCompileTimeError
-enum_syntax_test/22: Crash
-enum_syntax_test/30: MissingCompileTimeError
-export_ambiguous_main_negative_test: Crash
-export_double_same_main_test: Crash
-export_main_test: Crash
-export_private_test/01: MissingCompileTimeError
-extend_type_parameter2_negative_test: DartkCrash
-extend_type_parameter_negative_test: DartkCrash
-external_test/11: MissingCompileTimeError
-external_test/12: MissingCompileTimeError
-external_test/22: MissingCompileTimeError
-external_test/23: MissingCompileTimeError
-external_test/30: MissingCompileTimeError
-external_test/31: MissingCompileTimeError
-factory2_negative_test: DartkCrash
-factory_negative_test: DartkCrash
-factory_redirection_test/07: MissingCompileTimeError
-field_decl_missing_var_type_test/01: MissingCompileTimeError
-final_initializer_instance_reference_test/01: MissingCompileTimeError
-final_is_not_const_test/01: MissingCompileTimeError
-final_super_field_set_test/01: RuntimeError
-first_class_types_literals_test/08: RuntimeError
-function_subtype0_test: RuntimeError
-function_subtype1_test: RuntimeError
-function_syntax_test/00: MissingCompileTimeError
-function_syntax_test/01: MissingCompileTimeError
-function_syntax_test/22: MissingCompileTimeError
-function_syntax_test/64: MissingCompileTimeError
-function_syntax_test/67: MissingCompileTimeError
-function_syntax_test/68: MissingCompileTimeError
-function_syntax_test/69: MissingCompileTimeError
-function_syntax_test/71: MissingCompileTimeError
-function_syntax_test/73: MissingCompileTimeError
-function_syntax_test/74: MissingCompileTimeError
-function_type_alias5_test/00: MissingCompileTimeError
-function_type_alias5_test/01: MissingCompileTimeError
-function_type_alias5_test/02: MissingCompileTimeError
-function_type_alias6_test/00: MissingCompileTimeError
-function_type_alias7_test/00: MissingCompileTimeError
-function_type_alias7_test/01: DartkCrash
-function_type_alias7_test/02: MissingCompileTimeError
-function_type_alias9_test/00: MissingCompileTimeError
-function_type_parameter2_negative_test: Crash
-function_type_parameter_negative_test: Crash
-generic_constructor_mixin3_test: Crash
-generic_field_mixin2_test: RuntimeError
-generic_field_mixin3_test: RuntimeError
-generic_field_mixin5_test: RuntimeError
-generic_field_mixin_test: RuntimeError
-generic_local_functions_test: DartkCrash
-generic_metadata_test/02: MissingCompileTimeError
-generic_metadata_test/03: MissingCompileTimeError
-generic_methods_generic_function_parameter_test: DartkCrash
-getter_parameters_test/01: MissingCompileTimeError
-getter_parameters_test/03: MissingCompileTimeError
-getter_parameters_test/04: MissingCompileTimeError
-hidden_import_test/01: DartkCrash
-hidden_import_test/02: DartkCrash
-hidden_import_test/none: DartkCrash
-if_null_assignment_behavior_test/09: RuntimeError
-if_null_assignment_behavior_test/10: RuntimeError
-if_null_assignment_behavior_test/15: RuntimeError
-implicit_scope_test: Crash
-import_combinators_test: RuntimeError
-import_private_test/01: DartkCrash
-initializing_formal_capture_test: RuntimeError
-inst_field_initializer1_negative_test: Fail
-instanceof3_test: RuntimeError
-interface2_negative_test: Fail
-interface_cycle_test/01: MissingCompileTimeError
-interface_cycle_test/02: MissingCompileTimeError
-invocation_mirror_test: RuntimeError
-is_malformed_type_test/94: RuntimeError
-is_malformed_type_test/95: RuntimeError
-is_malformed_type_test/96: RuntimeError
-is_malformed_type_test/97: RuntimeError
-is_malformed_type_test/98: RuntimeError
-is_malformed_type_test/99: RuntimeError
-is_not_class4_negative_test: Fail
-isnot_malformed_type_test: RuntimeError
-label6_negative_test: DartkCrash
-library_ambiguous_test/00: MissingRuntimeError
-library_ambiguous_test/04: MissingRuntimeError
-library_ambiguous_test/05: MissingCompileTimeError
-list_literal2_negative_test: Fail
-list_literal_negative_test: DartkCrash
-malformed2_test/00: RuntimeError
-malformed_inheritance_test/01: MissingCompileTimeError
-malformed_inheritance_test/03: Crash
-malformed_inheritance_test/05: MissingCompileTimeError
-malformed_inheritance_test/07: DartkCrash
-malformed_inheritance_test/08: DartkCrash
-malformed_inheritance_test/09: MissingCompileTimeError
-malformed_inheritance_test/10: MissingCompileTimeError
-malformed_inheritance_test/11: DartkCrash
-malformed_inheritance_test/12: DartkCrash
-map_literal2_negative_test: Fail
-map_literal_negative_test: DartkCrash
-method_name_test: CompileTimeError
-missing_const_constructor_test/02: MissingCompileTimeError
-missing_const_constructor_test/03: MissingCompileTimeError
-missing_const_constructor_test/04: Crash
-missing_const_constructor_test/05: MissingCompileTimeError
-missing_const_constructor_test/06: MissingCompileTimeError
-missing_part_of_tag_test/01: MissingCompileTimeError
-mixin_black_listed_test/08: DartkCrash
-mixin_cyclic_test/01: MissingCompileTimeError
-mixin_cyclic_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/01: MissingCompileTimeError
-mixin_forwarding_constructor4_test/02: MissingCompileTimeError
-mixin_forwarding_constructor4_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/01: MissingCompileTimeError
-mixin_illegal_constructor_test/02: MissingCompileTimeError
-mixin_illegal_constructor_test/03: MissingCompileTimeError
-mixin_illegal_constructor_test/04: MissingCompileTimeError
-mixin_illegal_constructor_test/05: MissingCompileTimeError
-mixin_illegal_constructor_test/06: MissingCompileTimeError
-mixin_illegal_constructor_test/07: MissingCompileTimeError
-mixin_illegal_constructor_test/08: MissingCompileTimeError
-mixin_illegal_constructor_test/09: MissingCompileTimeError
-mixin_illegal_constructor_test/10: MissingCompileTimeError
-mixin_illegal_constructor_test/11: MissingCompileTimeError
-mixin_illegal_constructor_test/12: MissingCompileTimeError
-mixin_illegal_cycles_test/01: MissingCompileTimeError
-mixin_illegal_cycles_test/02: MissingCompileTimeError
-mixin_illegal_cycles_test/03: MissingCompileTimeError
-mixin_illegal_cycles_test/04: MissingCompileTimeError
-mixin_illegal_cycles_test/05: MissingCompileTimeError
-mixin_illegal_cycles_test/06: MissingCompileTimeError
-mixin_illegal_object_test/01: MissingCompileTimeError
-mixin_illegal_object_test/02: MissingCompileTimeError
-mixin_invalid_inheritance1_test/01: Crash
-mixin_invalid_inheritance1_test/02: Crash
-mixin_invalid_inheritance1_test/03: Crash
-mixin_invalid_inheritance2_test/01: MissingCompileTimeError
-mixin_invalid_inheritance2_test/02: MissingCompileTimeError
-mixin_invalid_inheritance2_test/03: DartkCrash
-mixin_issue10216_2_test: RuntimeError
-mixin_mixin2_test: RuntimeError
-mixin_mixin3_test: RuntimeError
-mixin_mixin4_test: RuntimeError
-mixin_mixin5_test: RuntimeError
-mixin_mixin6_test: RuntimeError
-mixin_mixin7_test: RuntimeError
-mixin_mixin_bound2_test: RuntimeError
-mixin_mixin_bound_test: RuntimeError
-mixin_mixin_test: RuntimeError
-mixin_of_mixin_test/03: RuntimeError
-mixin_of_mixin_test/14: RuntimeError
-mixin_super_constructor_named_test/01: MissingCompileTimeError
-mixin_super_constructor_positionals_test/01: MissingCompileTimeError
-mixin_super_test: RuntimeError
-mixin_type_parameters_errors_test/01: DartkCrash
-mixin_type_parameters_errors_test/02: DartkCrash
-mixin_type_parameters_errors_test/05: DartkCrash
-multiline_newline_test/01: RuntimeError
-multiline_newline_test/02: RuntimeError
-multiline_newline_test/03: RuntimeError
-named_constructor_test/01: MissingRuntimeError
-named_constructor_test/02: DartkCrash
-named_constructor_test/04: DartkCrash
-named_constructor_test/05: DartkCrash
-named_constructor_test/06: DartkCrash
-named_constructor_test/07: DartkCrash
-named_constructor_test/08: DartkCrash
-named_constructor_test/09: DartkCrash
-named_constructor_test/10: DartkCrash
-named_parameters_aggregated_test/01: MissingCompileTimeError
-named_parameters_aggregated_test/03: MissingCompileTimeError
-named_parameters_aggregated_test/04: MissingCompileTimeError
-named_parameters_default_eq_test/01: MissingCompileTimeError
-named_parameters_default_eq_test/02: MissingCompileTimeError
-new_expression1_negative_test: DartkCrash
-no_main_test/01: Crash
-number_identifier_test/02: MissingCompileTimeError
-number_identifier_test/04: MissingCompileTimeError
-on_catch_malformed_type_test: RuntimeError
-parameter_initializer1_negative_test: DartkCrash
-parameter_initializer2_negative_test: DartkCrash
-parameter_initializer3_negative_test: DartkCrash
-parameter_initializer4_negative_test: DartkCrash
-parameter_initializer6_negative_test: Fail
-part2_test: RuntimeError
-prefix13_negative_test: Fail
-prefix15_negative_test: Fail
-private_access_test/05: RuntimeError
-private_access_test/06: RuntimeError
-private_super_constructor_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/01: MissingCompileTimeError
-redirecting_factory_default_values_test/02: MissingCompileTimeError
-redirecting_factory_infinite_steps_test/02: Crash
-redirecting_factory_long_test: RuntimeError
-regress_13494_test: RuntimeError
-regress_20394_test/01: MissingCompileTimeError
-regress_22438_test: RuntimeError
-regress_22445_test: RuntimeError
-regress_22579_test: RuntimeError
-regress_23498_test: RuntimeError
-regress_23500_test/01: RuntimeError
-regress_23500_test/02: RuntimeError
-regress_23500_test/none: RuntimeError
-regress_26855_test/0: DartkCrash
-regress_27957_test: RuntimeError
-reify_typevar_static_test/00: MissingCompileTimeError
-runtime_type_function_test: RuntimeError
-scope_variable_test/01: MissingCompileTimeError
-setter0_test: RuntimeError
-setter4_test: CompileTimeError
-setter_override_test/01: RuntimeError
-setter_override_test/02: RuntimeError
-setter_override_test/none: RuntimeError
-source_self_negative_test: DartkCrash
-static_final_field2_test/02: MissingCompileTimeError
-static_parameter_test/01: MissingCompileTimeError
-static_parameter_test/02: MissingCompileTimeError
-static_parameter_test/03: MissingCompileTimeError
-static_parameter_test/04: MissingCompileTimeError
-static_parameter_test/05: MissingCompileTimeError
-static_parameter_test/06: MissingCompileTimeError
-static_parameter_test/07: MissingCompileTimeError
-static_parameter_test/08: MissingCompileTimeError
-static_parameter_test/09: MissingCompileTimeError
-static_parameter_test/10: MissingCompileTimeError
-static_parameter_test/11: MissingCompileTimeError
-static_parameter_test/12: MissingCompileTimeError
-super_call3_test/02: Crash
-super_conditional_operator_test/01: MissingCompileTimeError
-super_conditional_operator_test/02: MissingCompileTimeError
-super_conditional_operator_test/03: MissingCompileTimeError
-super_conditional_operator_test/04: MissingCompileTimeError
-super_conditional_operator_test/05: MissingCompileTimeError
-super_conditional_operator_test/06: MissingCompileTimeError
-super_conditional_operator_test/07: MissingCompileTimeError
-super_conditional_operator_test/08: MissingCompileTimeError
-super_conditional_operator_test/09: MissingCompileTimeError
-super_conditional_operator_test/10: MissingCompileTimeError
-super_conditional_operator_test/11: MissingCompileTimeError
-super_conditional_operator_test/12: MissingCompileTimeError
-super_conditional_operator_test/13: MissingCompileTimeError
-super_conditional_operator_test/14: MissingCompileTimeError
-super_conditional_operator_test/15: MissingCompileTimeError
-super_conditional_operator_test/16: MissingCompileTimeError
-super_conditional_operator_test/17: MissingCompileTimeError
-super_conditional_operator_test/18: MissingCompileTimeError
-super_no_such_method1_test/01: RuntimeError
-super_no_such_method2_test/01: RuntimeError
-super_no_such_method3_test/01: RuntimeError
-super_no_such_method4_test/01: RuntimeError
-super_no_such_method5_test/01: RuntimeError
-switch1_negative_test: Fail
-switch4_negative_test: DartkCrash
-switch_bad_case_test/01: MissingCompileTimeError
-switch_bad_case_test/02: MissingCompileTimeError
-switch_case_test/00: MissingCompileTimeError
-switch_case_test/01: MissingCompileTimeError
-switch_case_test/02: MissingCompileTimeError
-switch_label_test: DartkCrash
-sync_generator2_test/01: MissingCompileTimeError
-sync_generator2_test/02: MissingCompileTimeError
-sync_generator2_test/03: MissingCompileTimeError
-sync_generator2_test/04: MissingCompileTimeError
-sync_generator2_test/05: MissingCompileTimeError
-sync_generator2_test/06: MissingCompileTimeError
-sync_generator2_test/09: Crash
-sync_generator2_test/11: MissingCompileTimeError
-sync_generator2_test/20: MissingCompileTimeError
-sync_generator2_test/30: MissingCompileTimeError
-sync_generator2_test/40: MissingCompileTimeError
-sync_generator2_test/41: MissingCompileTimeError
-sync_generator2_test/51: MissingCompileTimeError
-sync_generator2_test/52: MissingCompileTimeError
-syntax_test/02: MissingCompileTimeError
-syntax_test/03: MissingCompileTimeError
-syntax_test/27: MissingCompileTimeError
-syntax_test/50: MissingCompileTimeError
-syntax_test/51: MissingCompileTimeError
-syntax_test/64: MissingCompileTimeError
-syntax_test/65: MissingCompileTimeError
-this_conditional_operator_test/01: MissingCompileTimeError
-toplevel_collision1_test/00: DartkCrash
-toplevel_collision1_test/01: DartkCrash
-toplevel_collision1_test/02: DartkCrash
-try_catch2_test: DartkCrash
-try_catch3_test: DartkCrash
-try_catch_syntax_test/01: MissingCompileTimeError
-try_catch_syntax_test/07: MissingCompileTimeError
-try_catch_syntax_test/09: MissingCompileTimeError
-try_catch_syntax_test/10: MissingCompileTimeError
-try_catch_syntax_test/11: MissingCompileTimeError
-try_catch_syntax_test/12: MissingCompileTimeError
-try_catch_syntax_test/16: Crash
-try_catch_syntax_test/17: Crash
-type_variable_conflict2_test/01: RuntimeError
-type_variable_conflict_test/01: MissingCompileTimeError
-type_variable_conflict_test/02: MissingCompileTimeError
-type_variable_conflict_test/03: MissingCompileTimeError
-type_variable_conflict_test/04: MissingCompileTimeError
-type_variable_conflict_test/05: MissingCompileTimeError
-type_variable_conflict_test/06: MissingCompileTimeError
-type_variable_scope3_test/00: MissingCompileTimeError
-
-[ $compiler == dartk ]
-redirecting_factory_reflection_test: RuntimeError
-
-[ $compiler == dartkp ]
-bad_raw_string_test/none: Skip # Issue 28680
-bad_raw_string_test/03: Skip # Issue 28680
-
-# Triaged checked mode failures
-[ ($compiler == dartk || $compiler == dartkp) && $checked ]
-language/regress_22728_test: Fail # Dartk Issue 28498
diff --git a/tests/language/vm/causal_async_exception_stack_test.dart b/tests/language/vm/causal_async_exception_stack_test.dart
index d08ae9d..58c1938 100644
--- a/tests/language/vm/causal_async_exception_stack_test.dart
+++ b/tests/language/vm/causal_async_exception_stack_test.dart
@@ -27,6 +27,7 @@
   // Test async and async*.
   try {
     await foo();
+    fail("Did not throw");
   } catch (e, st) {
     expect(st.toString(), stringContainsInOrder([
         'thrower', '.dart:8',
@@ -69,7 +70,7 @@
     expect(st.toString(), stringContainsInOrder([
            'thrower', '.dart:8',
            '<asynchronous suspension>',
-           'main', '.dart:67',
+           'main', '.dart:68',
            ]));
   }
-}
\ No newline at end of file
+}
diff --git a/tests/language_strong/covariant_subtyping_tearoff1_test.dart b/tests/language_strong/covariant_subtyping_tearoff1_test.dart
new file mode 100644
index 0000000..404b4bb
--- /dev/null
+++ b/tests/language_strong/covariant_subtyping_tearoff1_test.dart
@@ -0,0 +1,19 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+class Foo<T> {
+  dynamic method(T x) {}
+}
+
+typedef dynamic TakeNum(num x);
+
+main() {
+  Foo<int> intFoo = new Foo<int>();
+  Foo<num> numFoo = intFoo;
+  TakeNum f = numFoo.method;
+  Expect.throws(() => f(2.5));
+  dynamic f2 = numFoo.method;
+  Expect.throws(() => f2(2.5));
+}
diff --git a/tests/language_strong/covariant_subtyping_tearoff2_test.dart b/tests/language_strong/covariant_subtyping_tearoff2_test.dart
new file mode 100644
index 0000000..306d83d
--- /dev/null
+++ b/tests/language_strong/covariant_subtyping_tearoff2_test.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+class Implementation {
+  dynamic method(int x) {}
+}
+
+abstract class Interface<T> {
+  dynamic method(T x);
+}
+
+class Subclass extends Implementation implements Interface<int> {}
+
+typedef dynamic TakeNum(num x);
+
+main() {
+  Subclass subclass = new Subclass();
+  Interface<int> intInterface = subclass;
+  Interface<num> numInterface = intInterface;
+  TakeNum f = numInterface.method;
+  Expect.throws(() => f(2.5));
+  dynamic f2 = f;
+  Expect.throws(() => f2(2.5));
+}
diff --git a/tests/language_strong/covariant_subtyping_tearoff3_test.dart b/tests/language_strong/covariant_subtyping_tearoff3_test.dart
new file mode 100644
index 0000000..3e1109b
--- /dev/null
+++ b/tests/language_strong/covariant_subtyping_tearoff3_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+class Implementation {
+  dynamic method(int x) {}
+}
+
+abstract class Interface1<T> {
+  dynamic method(T x);
+}
+
+abstract class Interface2<T> {
+  dynamic method(T x);
+}
+
+class Subclass extends Implementation
+    implements Interface1<int>, Interface2<int> {}
+
+typedef dynamic TakeNum(num x);
+
+main() {
+  Subclass subclass = new Subclass();
+
+  Interface1<int> intInterface1 = subclass;
+  Interface1<num> numInterface1 = intInterface1;
+  TakeNum f1 = numInterface1.method;
+  Expect.throws(() => f1(2.5));
+  dynamic f1dynamic = f1;
+  Expect.throws(() => f1dynamic(2.5));
+
+  Interface2<int> intInterface2 = subclass;
+  Interface2<num> numInterface2 = intInterface2;
+  TakeNum f2 = numInterface2.method;
+  Expect.throws(() => f2(2.5));
+  dynamic f2dynamic = f2;
+  Expect.throws(() => f2dynamic(2.5));
+}
diff --git a/tests/language_strong/covariant_subtyping_unsafe_call1_test.dart b/tests/language_strong/covariant_subtyping_unsafe_call1_test.dart
index 79fced2..b5d4884 100644
--- a/tests/language_strong/covariant_subtyping_unsafe_call1_test.dart
+++ b/tests/language_strong/covariant_subtyping_unsafe_call1_test.dart
@@ -4,7 +4,7 @@
 import 'package:expect/expect.dart';
 
 class Foo<T> {
-  method(T x) {}
+  dynamic method(T x) {}
 }
 
 main() {
diff --git a/tests/language_strong/covariant_subtyping_unsafe_call2_test.dart b/tests/language_strong/covariant_subtyping_unsafe_call2_test.dart
index ea59203..5e45c37 100644
--- a/tests/language_strong/covariant_subtyping_unsafe_call2_test.dart
+++ b/tests/language_strong/covariant_subtyping_unsafe_call2_test.dart
@@ -4,11 +4,11 @@
 import 'package:expect/expect.dart';
 
 class Implementation {
-  method(int x) {}
+  dynamic method(int x) {}
 }
 
 abstract class Interface<T> {
-  method(T x);
+  dynamic method(T x);
 }
 
 class Subclass extends Implementation implements Interface<int> {}
diff --git a/tests/language_strong/covariant_subtyping_unsafe_call3_test.dart b/tests/language_strong/covariant_subtyping_unsafe_call3_test.dart
new file mode 100644
index 0000000..71143e6
--- /dev/null
+++ b/tests/language_strong/covariant_subtyping_unsafe_call3_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+class Implementation {
+  dynamic method(int x) {}
+}
+
+abstract class Interface1<T> {
+  dynamic method(T x);
+}
+
+abstract class Interface2<T> {
+  dynamic method(T x);
+}
+
+class Subclass extends Implementation
+    implements Interface1<int>, Interface2<int> {}
+
+main() {
+  Subclass subclass = new Subclass();
+
+  Interface1<int> intInterface1 = subclass;
+  Interface1<num> numInterface1 = intInterface1;
+  Expect.throws(() => numInterface1.method(2.5));
+
+  Interface2<int> intInterface2 = subclass;
+  Interface2<num> numInterface2 = intInterface2;
+  Expect.throws(() => numInterface2.method(2.5));
+}
diff --git a/tests/language_strong/interface_inherit_field_test.dart b/tests/language_strong/interface_inherit_field_test.dart
index c1f685a..354b1ea 100644
--- a/tests/language_strong/interface_inherit_field_test.dart
+++ b/tests/language_strong/interface_inherit_field_test.dart
@@ -5,11 +5,11 @@
 // Test that it is legal to override a field with a field in an interface.
 
 abstract class IA {
-  final int foo;
+  final int foo; /// static warning
 }
 
 abstract class IB implements IA {
-  final int foo;
+  final int foo; /// static warning
 }
 
 class B implements IB {
diff --git a/tests/language_strong/super_setter_test.dart b/tests/language_strong/super_setter_test.dart
index 7683d78..4a9792f 100644
--- a/tests/language_strong/super_setter_test.dart
+++ b/tests/language_strong/super_setter_test.dart
@@ -10,7 +10,7 @@
   String value_;
 
   String get value { return value_; }
-  String set value(String newValue) {
+  String set value(String newValue) { /// static warning
     value_ = 'Base:$newValue';
   }
 }
@@ -19,7 +19,7 @@
 class Derived extends Base {
   Derived() : super() {}
 
-  String set value(String newValue) {
+  String set value(String newValue) { /// static warning
     super.value = 'Derived:$newValue';
   }
   String get value { return super.value; }
diff --git a/tests/language_strong/tearoff_dynamic_test.dart b/tests/language_strong/tearoff_dynamic_test.dart
new file mode 100644
index 0000000..9d324d6
--- /dev/null
+++ b/tests/language_strong/tearoff_dynamic_test.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
+// for 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:expect/expect.dart';
+
+class Foo {
+  dynamic method(int x) {}
+}
+
+main() {
+  Foo foo = new Foo();
+
+  dynamic dynamicMethod1 = foo.method;
+  Expect.throws(() => dynamicMethod1(2.5));
+
+  dynamic dynamicMethod2 = (foo as dynamic).method;
+  Expect.throws(() => dynamicMethod2(2.5));
+}
diff --git a/tests/language_strong/try_catch4_test.dart b/tests/language_strong/try_catch4_test.dart
index 9d39f11..c71b6d2 100644
--- a/tests/language_strong/try_catch4_test.dart
+++ b/tests/language_strong/try_catch4_test.dart
@@ -13,11 +13,11 @@
   var b = false;
   var entered = false;
   while (true) {
-    if (entered) return b;
+    if (entered) return b; /// static warning
     b = 8 == a; // This expression should not be GVN'ed.
     try {
       a = 8;
-      return;
+      return; /// static warning
     } finally {
       b = 8 == a;
       entered = true;
@@ -32,12 +32,12 @@
   var b = false;
   var entered = false;
   while (true) {
-    if (entered) return b;
+    if (entered) return b; /// static warning
     b = 8 == a; // This expression should not be GVN'ed.
     try {
       a = 8;
       doThrow();
-      return;
+      return; /// static warning
     } catch(e) {
       b = 8 == a;
       entered = true;
@@ -50,14 +50,14 @@
   var b = false;
   var entered = false;
   while (true) {
-    if (entered) return b;
+    if (entered) return b; /// static warning
     b = 8 == a; // This expression should not be GVN'ed.
     try {
       doThrow();
     } catch(e) {
       a = 8;
       entered = true;
-      return;
+      return; /// static warning
     } finally {
       b = 8 == a;
       entered = true;
diff --git a/tests/language_strong/try_catch5_test.dart b/tests/language_strong/try_catch5_test.dart
index 5aa16e9..2b6d862 100644
--- a/tests/language_strong/try_catch5_test.dart
+++ b/tests/language_strong/try_catch5_test.dart
@@ -13,12 +13,12 @@
   var b = false;
   var entered = false;
   while (true) {
-    if (entered) return b;
+    if (entered) return b; /// static warning
     b = 8 == a; // This expression should not be GVN'ed.
     try {
       try {
         a = 8;
-        return;
+        return; /// static warning
       } finally {
         b = 8 == a;
         entered = true;
diff --git a/tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.dart b/tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.dart
index 256b9f8..b621efc 100644
--- a/tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.dart
+++ b/tests/lib_strong/html/custom/constructor_calls_created_synchronously_test.dart
@@ -55,7 +55,7 @@
         extendsTag: 'section');
     var fancy = document.createElement('section', 'fancy-section');
     expect(fancy is FancySection, true, reason: 'fancy-section was registered');
-    expect(fancy.wasCreated, true, reason: 'FancySection ctor was called');
+    expect((fancy as FancySection).wasCreated, true, reason: 'FancySection ctor was called');
   });
 }
 
diff --git a/tests/lib_strong/html/custom/document_register_basic_test.dart b/tests/lib_strong/html/custom/document_register_basic_test.dart
index 33f07ba..95b71f8 100644
--- a/tests/lib_strong/html/custom/document_register_basic_test.dart
+++ b/tests/lib_strong/html/custom/document_register_basic_test.dart
@@ -39,7 +39,7 @@
   BadC.created() : super.created();
 }
 
-class BadF implements HtmlElement {
+class BadF implements HtmlElement { /// compile-time error
   static final tag = 'x-tag-f';
   factory BadF() => new Element.tag(tag);
 }
@@ -100,7 +100,7 @@
     var parsedFoo = container.firstChild;
 
     expect(parsedFoo is Foo, isTrue);
-    expect(parsedFoo.tagName, "X-FOO");
+    expect((parsedFoo as Foo).tagName, "X-FOO");
 
     // Ensuring the wrapper is retained
     var someProperty = new Expando();
@@ -134,9 +134,9 @@
         treeSanitizer: new NullTreeSanitizer());
     upgradeCustomElements(container);
     expect(container.firstChild is Bar, isTrue);
-    expect(container.firstChild.tagName, "X-BAR");
+    expect((container.firstChild as Bar).tagName, "X-BAR");
     expect(container.lastChild is Bar, isTrue);
-    expect(container.lastChild.tagName, "X-BAR");
+    expect((container.lastChild as Bar).tagName, "X-BAR");
 
     // Constructors shouldn't interfere with each other
     expect((new Foo()).tagName, "X-FOO");
diff --git a/tests/lib_strong/html/custom/element_upgrade_test.dart b/tests/lib_strong/html/custom/element_upgrade_test.dart
index a1f071b..6fd9def 100644
--- a/tests/lib_strong/html/custom/element_upgrade_test.dart
+++ b/tests/lib_strong/html/custom/element_upgrade_test.dart
@@ -44,13 +44,13 @@
   test('created gets proxied', () {
     var element = document.createElement(FooElement.tag);
     expect(element is FooElement, isTrue);
-    expect(element.initializedField, 666);
+    expect((element as FooElement).initializedField, 666);
     expect(element.text, 'constructed');
 
     js.context.callMethod('validateIsFoo', [element]);
 
-    expect(element.doSomething(), 'didSomething');
-    expect(element.fooCreated, true);
+    expect((element as FooElement).doSomething(), 'didSomething');
+    expect((element as FooElement).fooCreated, true);
   });
 
   test('dart constructor works', () {
@@ -71,7 +71,7 @@
 
   test('cannot upgrade interfaces', () {
     expect(() {
-      upgrader.upgrade(new HtmlElementInterface());
+      upgrader.upgrade(new HtmlElementInterface()); /// compile-time error
     }, throws);
   });
 
@@ -115,7 +115,7 @@
   });
 }
 
-class HtmlElementInterface implements HtmlElement {
+class HtmlElementInterface implements HtmlElement { /// compile-time error
   HtmlElementInterface.created();
 }
 
diff --git a/tests/lib_strong/html/debugger_test.dart b/tests/lib_strong/html/debugger_test.dart
new file mode 100644
index 0000000..37384fe
--- /dev/null
+++ b/tests/lib_strong/html/debugger_test.dart
@@ -0,0 +1,8816 @@
+/// Debugger custom formatter tests.
+/// If the tests fail, paste the expected output into the [expectedGolden]
+/// string literal in this file and audit the diff to ensure changes are
+/// expected.
+///
+/// Currently only DDC supports debugging objects with custom formatters
+/// but it is reasonable to add support to Dart2JS in the future.
+@JS()
+library debugger_test;
+
+import 'dart:html';
+import 'package:js/js.dart';
+import 'package:js/js_util.dart' as js_util;
+
+import 'package:expect/minitest.dart';
+
+import 'dart:_debugger' as _debugger;
+
+class TestClass {
+  String name = 'test class';
+  int date;
+  static List<int> foo = [1, 2, 3, 4];
+  static String greeting = 'Hello world';
+  static Object bar = new Object();
+
+  static exampleStaticMethod(x) => x * 2;
+
+  TestClass(this.date);
+
+  String nameAndDate() => '$name on day $date';
+
+  int last(List<int> list) => list.last;
+
+  void addOne(String name) {
+    name = '${name}1';
+  }
+
+  get someInt => 42;
+  get someString => "Hello world";
+  get someObject => this;
+
+  Object returnObject() => bar;
+}
+
+class TestGenericClass<X, Y> {
+  TestGenericClass(this.x);
+  X x;
+}
+
+@JS('Object.getOwnPropertyNames')
+external List getOwnPropertyNames(obj);
+
+@JS('devtoolsFormatters')
+external List get _devtoolsFormatters;
+List get devtoolsFormatters => _devtoolsFormatters;
+
+@JS('JSON.stringify')
+external stringify(value, [Function replacer, int space]);
+
+// TODO(jacobr): this is only valid if the legacy library loader is used.
+// We need a solution that works with all library loaders.
+@JS('dart_library.import')
+external importDartLibrary(String path);
+
+// Replacer normalizes file names that could vary depending on the test runner.
+// styles.
+replacer(String key, value) {
+  // The values for keys with name 'object' may be arbitrary Dart nested
+  // Objects so are not safe to stringify.
+  if (key == 'object') return '<OBJECT>';
+  if (value is String) {
+    if (value.contains('dart_sdk.js')) return '<DART_SDK>';
+    if (new RegExp(r'[.](js|dart|html)').hasMatch(value)) return '<FILE>';
+  }
+  return value;
+}
+
+String format(value) {
+  // Avoid double-escaping strings.
+  if (value is String) return value;
+  return stringify(value, replacer, 4);
+}
+
+class FormattedObject {
+  FormattedObject(this.object, this.config);
+
+  Object object;
+  Object config;
+}
+
+/// Extract all object tags from a json ml expression to enable
+/// calling the custom formatter on the extracted object tag.
+List<FormattedObject> extractNestedFormattedObjects(json) {
+  var ret = <FormattedObject>[];
+  if (json is String || json is bool || json is num) return ret;
+  if (json is List) {
+    for (var e in json) {
+      ret.addAll(extractNestedFormattedObjects(e));
+    }
+    return ret;
+  }
+
+  for (var name in getOwnPropertyNames(json)) {
+    if (name == 'object') {
+      // Found a nested formatted object.
+      ret.add(new FormattedObject(js_util.getProperty(json, 'object'),
+          js_util.getProperty(json, 'config')));
+      return ret;
+    }
+    ret.addAll(extractNestedFormattedObjects(js_util.getProperty(json, name)));
+  }
+  return ret;
+}
+
+main() {
+  if (devtoolsFormatters == null) {
+    print("Warning: no devtools custom formatters specified. Skipping tests.");
+    return;
+  }
+  var _devtoolsFormatter = devtoolsFormatters.first;
+
+  var actual = new StringBuffer();
+
+  // Accumulate the entire expected custom formatted data as a single
+  // massive string buffer so it is simple to update expectations when
+  // modifying the formatting code.
+  // Otherwise a small formatting change would result in tweaking lots
+  // of expectations.
+  // The verify golden match test cases does the final comparison of golden
+  // to expected output.
+  addGolden(String name, value) {
+    actual.write('Test: $name\n'
+        'Value:\n'
+        '${format(value)}\n'
+        '-----------------------------------\n');
+  }
+
+  addFormatterGoldens(String name, object, [config]) {
+    addGolden(
+        '$name formatting header', _devtoolsFormatter.header(object, config));
+    addGolden('$name formatting body', _devtoolsFormatter.body(object, config));
+  }
+
+  // Include goldens for the nested [[class]] definition field.
+  addNestedFormatterGoldens(String name, obj) {
+    addGolden('$name instance header', _devtoolsFormatter.header(obj, null));
+    var body = _devtoolsFormatter.body(obj, null);
+    addGolden('$name instance body', body);
+
+    var nestedObjects = extractNestedFormattedObjects(body);
+    var clazz = nestedObjects.last;
+    // By convention assume last nested object is the [[class]] definition
+    // describing the object's static members and inheritance hierarchy
+    addFormatterGoldens('$name definition', clazz.object, clazz.config);
+  }
+
+  // Include goldens for the nested [[class]] definition field.
+  addAllNestedFormatterGoldens(String name, obj) {
+    addGolden('$name header', _devtoolsFormatter.header(obj, null));
+    var body = _devtoolsFormatter.body(obj, null);
+    addGolden('$name body', body);
+
+    var nestedObjects = extractNestedFormattedObjects(body);
+    var i = 0;
+    for (var nested in nestedObjects) {
+      addFormatterGoldens('$name child $i', nested.object, nested.config);
+      i++;
+    }
+  }
+
+  group('Iterable formatting', () {
+    var list = ['foo', 'bar', 'baz'];
+    var iterable = list.map((x) => x * 5);
+    addFormatterGoldens('List<String>', list);
+
+    var listOfObjects = <Object>[42, 'bar', true];
+
+    addNestedFormatterGoldens('List<Object>', listOfObjects);
+
+    var largeList = <int>[];
+    for (var i = 0; i < 200; ++i) {
+      largeList.add(i * 10);
+    }
+    addNestedFormatterGoldens('List<int> large', largeList);
+
+    addNestedFormatterGoldens('Iterable', iterable);
+
+    var s = new Set()..add("foo")..add(42)..add(true);
+    addNestedFormatterGoldens('Set', s);
+  });
+
+  group('Map formatting', () {
+    Map<String, int> foo = new Map();
+    foo = {'1': 2, 'x': 4, '5': 6};
+
+    addFormatterGoldens('Map<String, int>', foo);
+    test('hasBody', () {
+      expect(_devtoolsFormatter.hasBody(foo, null), isTrue);
+    });
+
+    Map<dynamic, dynamic> dynamicMap = new Map();
+    dynamicMap = {1: 2, 'x': 4, true: "truthy"};
+
+    addNestedFormatterGoldens('Map<dynamic, dynamic>', dynamicMap);
+  });
+
+  group('Function formatting', () {
+    adder(int a, int b) => a + b;
+
+    addFormatterGoldens('Function', adder);
+
+    test('hasBody', () {
+      expect(_devtoolsFormatter.hasBody(adder, null), isTrue);
+    });
+
+    addEventListener(String name, bool callback(Event e)) => null;
+
+    addFormatterGoldens('Function with functon arguments', addEventListener);
+
+    // Closure
+    addGolden('dart:html method', window.addEventListener);
+
+    // Get a reference to the JS constructor for a Dart class.
+    // This tracks a regression bug where overly verbose and confusing output
+    // was shown for this case.
+    var testClass = new TestClass(17);
+    var dartConstructor = js_util.getProperty(
+        js_util.getProperty(testClass, '__proto__'), 'constructor');
+    addFormatterGoldens('Raw reference to dart constructor', dartConstructor);
+  });
+
+  group('Object formatting', () {
+    var object = new Object();
+    addFormatterGoldens('Object', object);
+    test('hasBody', () {
+      expect(_devtoolsFormatter.hasBody(object, null), isTrue);
+    });
+  });
+
+  group('Type formatting', () {
+    addFormatterGoldens('Type TestClass', TestClass);
+    addFormatterGoldens('Type HttpRequest', HttpRequest);
+  });
+
+  group('JS interop object formatting', () {
+    var object = js_util.newObject();
+    js_util.setProperty(object, 'foo', 'bar');
+    // Make sure we don't apply the Dart custom formatter to JS interop objects.
+    expect(_devtoolsFormatter.header(object, null), isNull);
+  });
+
+  group('Module formatting', () {
+    var moduleNames = _debugger.getModuleNames();
+    var testModuleName = "lib/html/debugger_test";
+    expect(moduleNames.contains(testModuleName), isTrue);
+
+    addAllNestedFormatterGoldens(
+        'Test library Module', _debugger.getModuleLibraries(testModuleName));
+  });
+
+  group('StackTrace formatting', () {
+    StackTrace stack;
+    try {
+      throw new Error();
+    } catch (exception, stackTrace) {
+      stack = stackTrace;
+    }
+    addFormatterGoldens('StackTrace', stack);
+    test('hasBody', () {
+      expect(_devtoolsFormatter.hasBody(stack, null), isTrue);
+    });
+  });
+
+  group('Class formatting', () {
+    addNestedFormatterGoldens('TestClass', new TestClass(17));
+    addNestedFormatterGoldens('MouseEvent', new MouseEvent("click"));
+    // This is a good class to test as it has statics and a deep inheritance heirarchy
+    addNestedFormatterGoldens('HttpRequest', new HttpRequest());
+  });
+
+  test('verify golden match', () {
+    // Warning: all other test groups must have run for this test to be meaningful
+    print("Actual:##############\n$actual\n#################");
+
+    expect(actual.toString().trim(), equals(expectedGolden().trim()));
+  });
+}
+
+/// The golden custom formatter output is placed at the bottom of the file
+/// to simplify replacing the  golden data when the custom formatter code is
+/// changed.
+///
+/// This value is placed in a function rather than a field to avoid a recursive
+/// program that prints itself issue as the golden includes the formatter output
+/// for this library
+String expectedGolden() => r"""Test: List<String> formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JSArray<String> length 3"
+]
+-----------------------------------
+Test: List<String> formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "0: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "foo"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "1: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "bar"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "2: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "baz"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: List<Object> instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JSArray<Object> length 3"
+]
+-----------------------------------
+Test: List<Object> instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "0: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "42"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "1: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "bar"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "2: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: List<Object> definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JSArray<Object> implements List<Object>, JSIndexable<Object>"
+]
+-----------------------------------
+Test: List<Object> definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "markFixedList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "markUnmodifiableList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "add: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "addAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "any: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "asMap: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "checkGrowable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "checkMutable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "clear: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "contains: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "elementAt: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "every: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "expand: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fillRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "firstWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fold: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "forEach: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "indexOf: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "insert: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "insertAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "join: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastIndexOf: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "map: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "reduce: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "remove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeAt: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeLast: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "replaceRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "retainWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "shuffle: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "singleWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "skip: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "skipWhile: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "sort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "sublist: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "take: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "takeWhile: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "toList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "toSet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "where: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_get: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_removeWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_set: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: List<int> large instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JSArray<int> length 200"
+]
+-----------------------------------
+Test: List<int> large instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: List<int> large definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JSArray<int> implements List<int>, JSIndexable<int>"
+]
+-----------------------------------
+Test: List<int> large definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "markFixedList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "markUnmodifiableList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "add: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "addAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "any: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "asMap: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "checkGrowable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "checkMutable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "clear: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "contains: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "elementAt: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "every: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "expand: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fillRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "firstWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fold: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "forEach: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "indexOf: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "insert: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "insertAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "join: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastIndexOf: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lastWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "map: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "reduce: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "remove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeAt: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeLast: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "removeWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "replaceRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "retainWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setRange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "shuffle: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "singleWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "skip: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "skipWhile: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "sort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "sublist: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "take: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "takeWhile: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "toList: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "toSet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "where: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_get: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_removeWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_set: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Iterable instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "MappedListIterable<String, String> length 3"
+]
+-----------------------------------
+Test: Iterable instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "0: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "foofoofoofoofoo"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "1: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "barbarbarbarbar"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "2: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "bazbazbazbazbaz"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Iterable definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "MappedListIterable<String, String>"
+]
+-----------------------------------
+Test: Iterable definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "elementAt: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Set instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "_LinkedHashSet length 3"
+]
+-----------------------------------
+Test: Set instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "0: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "foo"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "1: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "42"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "2: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "true"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Set definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "_LinkedHashSet implements LinkedHashSet"
+]
+-----------------------------------
+Test: Set definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_deleteTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_isNumericElement: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_isStringElement: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newHashTable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_setTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "add: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "contains: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "forEach: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "lookup: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "remove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_add: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_addHashTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_computeHashCode: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_contains: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_filterWhere: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_findBucketIndex: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_getBucket: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_getTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_lookup: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_modified: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newLinkedCell: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newSet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_remove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_removeHashTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_unlinkCell: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_unsupported: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Map<String, int> formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JsLinkedHashMap<String, int> length 3"
+]
+-----------------------------------
+Test: Map<String, int> formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "0: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "1: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "2: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Map<dynamic, dynamic> instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JsLinkedHashMap<Object, Object> length 3"
+]
+-----------------------------------
+Test: Map<dynamic, dynamic> instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "0: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "1: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "2: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Map<dynamic, dynamic> definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "JsLinkedHashMap<Object, Object> implements LinkedHashMap<Object, Object>, InternalMap<Object, Object>"
+]
+-----------------------------------
+Test: Map<dynamic, dynamic> definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_isNumericKey: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_isStringKey: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "addAll: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "clear: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "containsKey: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "containsValue: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "forEach: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalComputeHashCode: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalContainsKey: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalFindBucketIndex: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalGet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalRemove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "internalSet: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "putIfAbsent: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "remove: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_addHashTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_containsTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_deleteTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_get: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_getBucket: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_getTableBucket: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_getTableCell: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_modified: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newHashTable: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_newLinkedCell: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_removeHashTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_set: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_setTableEntry: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_unlinkCell: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Function formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "(int, int) -> int"
+]
+-----------------------------------
+Test: Function formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "signature: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "(int, int) -> int"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "JavaScript Function: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "skipDart"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Function with functon arguments formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "(String, (Event) -> bool) -> dynamic"
+]
+-----------------------------------
+Test: Function with functon arguments formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "signature: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "(String, (Event) -> bool) -> dynamic"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "JavaScript Function: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "skipDart"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: dart:html method
+Value:
+null
+-----------------------------------
+Test: Raw reference to dart constructor formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "TestClass"
+]
+-----------------------------------
+Test: Raw reference to dart constructor formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    }
+]
+-----------------------------------
+Test: Object formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "Object"
+]
+-----------------------------------
+Test: Object formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "runtimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Type TestClass formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "TestClass"
+]
+-----------------------------------
+Test: Type TestClass formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    }
+]
+-----------------------------------
+Test: Type HttpRequest formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "HttpRequest"
+]
+-----------------------------------
+Test: Type HttpRequest formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    }
+]
+-----------------------------------
+Test: Test library Module header
+Value:
+null
+-----------------------------------
+Test: Test library Module body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": ""
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: Test library Module child 0 formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "<FILE>"
+]
+-----------------------------------
+Test: Test library Module child 0 formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "TestClass: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "TestGenericClass: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "devtoolsFormatters: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "replacer: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "format: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "FormattedObject: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "extractNestedFormattedObjects: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "main: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "expectedGolden: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: StackTrace formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "StackTrace"
+]
+-----------------------------------
+Test: StackTrace formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;color: rgb(196, 26, 22);"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "Error"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<DART_SDK>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "<FILE>"
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: TestClass instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "TestClass"
+]
+-----------------------------------
+Test: TestClass instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "date: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "17"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "name: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "test class"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "someInt: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "42"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "someObject: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "someString: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "Hello world"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: TestClass definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "TestClass"
+]
+-----------------------------------
+Test: TestClass definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "exampleStaticMethod: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "addOne: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "last: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "nameAndDate: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "returnObject: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: MouseEvent instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "MouseEvent"
+]
+-----------------------------------
+Test: MouseEvent instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "altKey: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "button: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "buttons: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "client: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "ctrlKey: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "dataTransfer: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "null"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "fromElement: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "layer: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "metaKey: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "movement: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "offset: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "<Exception thrown> Unsupported operation: offsetX is only supported on elements"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "page: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "region: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "null"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "relatedTarget: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "screen: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "shiftKey: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "toElement: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_clientX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_clientY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_get_relatedTarget: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_layerX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_layerY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_movementX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_movementY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_pageX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_pageY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_screenX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_screenY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_webkitMovementX: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "null"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_webkitMovementY: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "null"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: MouseEvent definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "MouseEvent"
+]
+-----------------------------------
+Test: MouseEvent definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_create_1: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_create_2: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_initMouseEvent: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_initMouseEvent_1: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: HttpRequest instance header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "HttpRequest"
+]
+-----------------------------------
+Test: HttpRequest instance body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "onReadyStateChange: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "readyState: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "response: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "responseHeaders: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseText: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseType: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "responseUrl: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "responseXml: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "status: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "statusText: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "timeout: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "0"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "upload: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "withCredentials: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                "false"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": "color: rgb(136, 19, 145); margin-right: -13px"
+                },
+                "_get_response: "
+            ],
+            [
+                "span",
+                {
+                    "style": "margin-left: 13px"
+                },
+                ""
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+Test: HttpRequest definition formatting header
+Value:
+[
+    "span",
+    {
+        "style": "background-color: #d9edf7;"
+    },
+    "HttpRequest"
+]
+-----------------------------------
+Test: HttpRequest definition formatting body
+Value:
+[
+    "ol",
+    {
+        "style": "list-style-type: none;padding-left: 0px;margin-top: 0px;margin-bottom: 0px;margin-left: 12px;"
+    },
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Static members]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getString: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "postFormData: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "request: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "requestCrossOrigin: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "_create_1: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {},
+            [
+                "span",
+                {
+                    "style": ""
+                },
+                "[[Instance Methods]]"
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "abort: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getAllResponseHeaders: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "getResponseHeader: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "open: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "overrideMimeType: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "send: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "setRequestHeader: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "none"
+                    }
+                }
+            ]
+        ]
+    ],
+    [
+        "li",
+        {
+            "style": "padding-left: 13px;"
+        },
+        [
+            "span",
+            {
+                "style": "color: rgb(136, 19, 145); margin-right: -13px"
+            },
+            "[[base class]]: "
+        ],
+        [
+            "span",
+            {
+                "style": "margin-left: 13px"
+            },
+            [
+                "object",
+                {
+                    "object": "<OBJECT>",
+                    "config": {
+                        "name": "asClass"
+                    }
+                }
+            ]
+        ]
+    ]
+]
+-----------------------------------
+""";
diff --git a/tools/VERSION b/tools/VERSION
index 36dec5b..a5691e7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 23
 PATCH 0
-PRERELEASE 2
+PRERELEASE 3
 PRERELEASE_PATCH 0
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index e82c72c..8450a07 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -43,7 +43,17 @@
 # True, and return the return code.
 def RunCommand(command, always_silent=False):
   try:
-    subprocess.check_output(command, stderr=subprocess.STDOUT)
+    # Dart IO respects the following environment variables to configure the
+    # HttpClient proxy: https://api.dartlang.org/stable/1.22.1/dart-io/HttpClient/findProxyFromEnvironment.html
+    # We strip these to avoid problems with pub build and transformers.
+    no_http_proxy_env = os.environ.copy()
+    no_http_proxy_env.pop('http_proxy', None)
+    no_http_proxy_env.pop('HTTP_PROXY', None)
+    no_http_proxy_env.pop('https_proxy', None)
+    no_http_proxy_env.pop('HTTPS_PROXY', None)
+    subprocess.check_output(command,
+                            stderr=subprocess.STDOUT,
+                            env=no_http_proxy_env)
     return 0
   except subprocess.CalledProcessError as e:
     if not always_silent:
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 0954757..33a06fb 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -13,7 +13,7 @@
 import 'package:analyzer/analyzer.dart';
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:path/path.dart' as path;
-import 'package:front_end/src/fasta/bin/compile_platform.dart' as
+import 'package:front_end/src/fasta/compile_platform.dart' as
     compile_platform;
 
 Future main(List<String> argv) async {
@@ -26,8 +26,6 @@
 
     final repositoryDir = path.relative(path.dirname(path.dirname(base)));
     final sdkExample = path.relative(path.join(repositoryDir, 'sdk'));
-    final packagesExample = path.relative(
-        path.join(repositoryDir, '.packages'));
     final patchExample = path.relative(
         path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patch'));
     final outExample = path.relative(path.join(repositoryDir, 'out', 'DebugX64',
@@ -52,7 +50,6 @@
   // Copy and patch libraries.dart and version
   var libContents = new File(path.join(sdkLibIn, '_internal',
       'sdk_library_metadata', 'lib', 'libraries.dart')).readAsStringSync();
-  var patchedLibContents = libContents;
   if (mode == 'vm') {
     libContents = libContents.replaceAll(
         ' libraries = const {',
@@ -101,7 +98,7 @@
     // TODO(jmesserly): analyzer does not handle the default case of
     // "both platforms" correctly, and treats it as being supported on neither.
     // So instead we skip explicitly marked as either VM or dart2js libs.
-    if (mode == 'ddc' ? libary.isVmLibrary : library.isDart2JsLibrary) {
+    if (mode == 'ddc' ? library.isVmLibrary : library.isDart2JsLibrary) {
       continue;
     }
 
@@ -203,7 +200,7 @@
   final capturedLines = <String>[];
   try {
     await runZoned(() async {
-      await compile_platform.main(<String>[
+      await compile_platform.mainEntryPoint(<String>[
         '--packages',
         new Uri.file(packagesFile).toString(),
         new Uri.directory(outDir).toString(),
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index d156801..cf49269 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -372,7 +372,7 @@
       new _TestOptionSpecification(
           'write_test_outcome_log',
           'Write the outcome of all tests executed to a '
-          '"${TestUtils.flakyFileName()}" file.',
+          '"${TestUtils.testOutcomeFileName()}" file.',
           ['--write-test-outcome-log'],
           [],
           false,
diff --git a/tools/testing/dart/test_runner.dart b/tools/testing/dart/test_runner.dart
index 9df2b25..292416e 100644
--- a/tools/testing/dart/test_runner.dart
+++ b/tools/testing/dart/test_runner.dart
@@ -1792,7 +1792,7 @@
       hasNonUtf8 = true;
       String malformed = UTF8.decode(data, allowMalformed: true);
       data..clear()
-          ..addAll(malformed.codeUnits)
+          ..addAll(UTF8.encode(malformed))
           ..addAll("""
 
   *****************************************************************************
diff --git a/utils/kernel-service/kernel-service.dart b/utils/kernel-service/kernel-service.dart
index 284970c..f181237 100644
--- a/utils/kernel-service/kernel-service.dart
+++ b/utils/kernel-service/kernel-service.dart
@@ -21,7 +21,6 @@
 library runtime.tools.kernel_service;
 
 import 'dart:async';
-import 'dart:convert';
 import 'dart:io';
 import 'dart:isolate';
 import 'dart:typed_data';
@@ -35,7 +34,6 @@
 import 'package:front_end/src/fasta/ticker.dart' show Ticker;
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
-import 'package:front_end/src/fasta/ast_kind.dart' show AstKind;
 import 'package:front_end/src/fasta/errors.dart' show InputError;
 
 const bool verbose = const bool.fromEnvironment('DFE_VERBOSE');
@@ -118,13 +116,12 @@
   final Ticker ticker = new Ticker(isVerbose: verbose);
   final DillTarget dillTarget = new DillTarget(ticker, uriTranslator);
   dillTarget.read(new Uri.directory(sdkPath).resolve('platform.dill'));
-  final KernelTarget kernelTarget =
-      new KernelTarget(dillTarget, uriTranslator);
+  final KernelTarget kernelTarget = new KernelTarget(dillTarget, uriTranslator);
   try {
     kernelTarget.read(fileName);
     await dillTarget.writeOutline(null);
     program = await kernelTarget.writeOutline(null);
-    program = await kernelTarget.writeProgram(null, AstKind.Kernel);
+    program = await kernelTarget.writeProgram(null);
     if (kernelTarget.errors.isNotEmpty) {
       return new CompilationError(kernelTarget.errors
           .map((err) => err.toString())