diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index 9079b82..fe96224 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -22,14 +22,14 @@
   if (options.shouldBatch) {
     BatchRunner.runAsBatch(args, (List<String> args) {
       CommandLineOptions options = CommandLineOptions.parse(args);
-      _runAnalyzer(options);
+      return _runAnalyzer(options, false);
     });
   } else {
     _runAnalyzer(options);
   }
 }
 
-void _runAnalyzer(CommandLineOptions options) {
+_runAnalyzer(CommandLineOptions options, [bool async = true]) {
   int startTime = JavaSystem.currentTimeMillis();
   if (!options.machineFormat) {
     stdout.writeln("Analyzing ${options.sourceFiles}...");
@@ -41,17 +41,21 @@
   if (!new File(sourcePath).existsSync()) {
     print('File not found: $sourcePath');
     exitCode = ErrorSeverity.ERROR.ordinal;
-    return;
+    return ErrorSeverity.ERROR;
   }
   // check that file is Dart file
   if (!AnalysisEngine.isDartFileName(sourcePath)) {
     print('$sourcePath is not a Dart file');
     exitCode = ErrorSeverity.ERROR.ordinal;
-    return;
+    return ErrorSeverity.ERROR;
   }
   // do analyze
   AnalyzerImpl analyzer = new AnalyzerImpl(sourcePath, options, startTime);
-  analyzer.analyze();
+  if (async) {
+    return analyzer.analyzeAsync();
+  } else {
+    return analyzer.analyzeSync();
+  }
 }
 
 typedef ErrorSeverity BatchRunnerHandler(List<String> args);
@@ -89,8 +93,6 @@
         args.addAll(lineArgs);
         args.remove('-b');
         args.remove('--batch');
-        // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
-        args.remove('-batch');
       }
       // analyze single set of arguments
       try {
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 38942e3..fc9cfa1 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -52,7 +52,8 @@
 ///
 /// If [name] is passed, it's used in error messages as the name of the code
 /// being parsed.
-CompilationUnit parseCompilationUnit(String contents, {String name}) {
+CompilationUnit parseCompilationUnit(String contents,
+    {String name, bool suppressErrors: false}) {
   if (name == null) name = '<unknown source>';
   var source = new StringSource(contents, name);
   var errorCollector = new _ErrorCollector();
@@ -63,7 +64,7 @@
   var unit = parser.parseCompilationUnit(token);
   unit.lineInfo = new LineInfo(scanner.lineStarts);
 
-  if (errorCollector.hasErrors) throw errorCollector.group;
+  if (errorCollector.hasErrors && !suppressErrors) throw errorCollector.group;
 
   return unit;
 }
diff --git a/pkg/analyzer/lib/src/analyzer_impl.dart b/pkg/analyzer/lib/src/analyzer_impl.dart
index 69685d2..efc97a1 100644
--- a/pkg/analyzer/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer/lib/src/analyzer_impl.dart
@@ -10,15 +10,18 @@
 
 import 'package:path/path.dart' as pathos;
 
-import 'generated/java_io.dart';
+import 'generated/ast.dart';
 import 'generated/engine.dart';
+import 'generated/element.dart';
 import 'generated/error.dart';
-import 'generated/source_io.dart';
+import 'generated/java_io.dart';
 import 'generated/sdk.dart';
 import 'generated/sdk_io.dart';
-import 'generated/element.dart';
+import 'generated/source_io.dart';
 import '../options.dart';
 
+import 'dart:collection';
+
 import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
 import 'package:analyzer/src/error_formatter.dart';
 
@@ -38,6 +41,7 @@
   ContentCache contentCache = new ContentCache();
   SourceFactory sourceFactory;
   AnalysisContext context;
+  Source librarySource;
 
   /// All [Source]s references by the analyzed library.
   final Set<Source> sources = new Set<Source>();
@@ -45,6 +49,9 @@
   /// All [AnalysisErrorInfo]s in the analyzed library.
   final List<AnalysisErrorInfo> errorInfos = new List<AnalysisErrorInfo>();
 
+  /// [HashMap] between sources and analysis error infos.
+  final HashMap<Source, AnalysisErrorInfo> sourceErrorsMap = new HashMap<Source, AnalysisErrorInfo>();
+
   AnalyzerImpl(this.sourcePath, this.options, this.startTime) {
     if (sdk == null) {
       sdk = new DirectoryBasedDartSdk(new JavaFile(options.dartSdkPath));
@@ -52,9 +59,27 @@
   }
 
   /**
-   * Treats the [sourcePath] as the top level library and analyzes it.
+   * Treats the [sourcePath] as the top level library and analyzes it using a
+   * synchronous algorithm over the analysis engine.
    */
-  void analyze() {
+  ErrorSeverity analyzeSync() {
+    setupForAnalysis();
+    return _analyzeSync();
+  }
+
+  /**
+   * Treats the [sourcePath] as the top level library and analyzes it using a
+   * asynchronous algorithm over the analysis engine.
+   */
+  void analyzeAsync() {
+    setupForAnalysis();
+    _analyzeAsync();
+  }
+
+  /**
+   * Setup local fields such as the analysis context for analysis.
+   */
+  void setupForAnalysis() {
     sources.clear();
     errorInfos.clear();
     if (sourcePath == null) {
@@ -62,34 +87,68 @@
     }
     JavaFile sourceFile = new JavaFile(sourcePath);
     UriKind uriKind = getUriKind(sourceFile);
-    Source librarySource = new FileBasedSource.con2(sourceFile, uriKind);
+    librarySource = new FileBasedSource.con2(sourceFile, uriKind);
 
     // prepare context
     prepareAnalysisContext(sourceFile, librarySource);
-
-    // async perform all tasks in context
-   _analyze();
   }
 
-  void _analyze() {
+  /// The sync version of analysis
+  ErrorSeverity _analyzeSync() {
+    // don't try to analyzer parts
+    var unit = context.parseCompilationUnit(librarySource);
+    var hasLibraryDirective = false;
+    var hasPartOfDirective = false;
+    for (var directive in unit.directives) {
+      if (directive is LibraryDirective) hasLibraryDirective = true;
+      if (directive is PartOfDirective) hasPartOfDirective = true;
+    }
+    if (hasPartOfDirective && !hasLibraryDirective) {
+      print("Only libraries can be analyzed.");
+      print("$sourcePath is a part and can not be analyzed.");
+      return ErrorSeverity.ERROR;
+    }
+    // resolve library
+    var libraryElement = context.computeLibraryElement(librarySource);
+    // prepare source and errors
+    prepareSources(libraryElement);
+    prepareErrors();
+
+    // print errors and performance numbers
+    _printErrorsAndPerf();
+
+    // compute max severity and set exitCode
+    ErrorSeverity status = maxErrorSeverity;
+    if (status == ErrorSeverity.WARNING && options.warningsAreFatal) {
+      status = ErrorSeverity.ERROR;
+    }
+    return status;
+  }
+
+  /// The async version of the analysis
+  void _analyzeAsync() {
     new Future(context.performAnalysisTask).then((AnalysisResult result) {
       List<ChangeNotice> notices = result.changeNotices;
-      // TODO(jwren) change 'notices != null' to 'result.hasMoreWork()' after
-      // next dart translation is landed for the analyzer
-      if (notices != null) {
+      if (result.hasMoreWork) {
         // There is more work, record the set of sources, and then call self
         // again to perform next task
         for (ChangeNotice notice in notices) {
           sources.add(notice.source);
+          sourceErrorsMap[notice.source] = notice;
         }
-        return _analyze();
+        return _analyzeAsync();
       }
       //
       // There are not any more tasks, set error code and print performance
       // numbers.
       //
       // prepare errors
-      prepareErrors();
+      sourceErrorsMap.forEach((k,v) {
+        errorInfos.add(sourceErrorsMap[k]);
+      });
+
+      // print errors and performance numbers
+      _printErrorsAndPerf();
 
       // compute max severity and set exitCode
       ErrorSeverity status = maxErrorSeverity;
@@ -97,38 +156,48 @@
         status = ErrorSeverity.ERROR;
       }
       exitCode = status.ordinal;
-
-      // print errors
-      ErrorFormatter formatter = new ErrorFormatter(stdout, options);
-      formatter.formatErrors(errorInfos);
-
-      // print performance numbers
-      if (options.perf) {
-        int totalTime = JavaSystem.currentTimeMillis() - startTime;
-        int ioTime = PerformanceStatistics.io.result;
-        int scanTime = PerformanceStatistics.scan.result;
-        int parseTime = PerformanceStatistics.parse.result;
-        int resolveTime = PerformanceStatistics.resolve.result;
-        int errorsTime = PerformanceStatistics.errors.result;
-        int hintsTime = PerformanceStatistics.hints.result;
-        int angularTime = PerformanceStatistics.angular.result;
-        stdout.writeln("io:$ioTime");
-        stdout.writeln("scan:$scanTime");
-        stdout.writeln("parse:$parseTime");
-        stdout.writeln("resolve:$resolveTime");
-        stdout.writeln("errors:$errorsTime");
-        stdout.writeln("hints:$hintsTime");
-        stdout.writeln("angular:$angularTime");
-        stdout.writeln("other:${totalTime
-             - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
-             + angularTime)}");
-        stdout.writeln("total:$totalTime");
-      }
     }).catchError((ex, st) {
       AnalysisEngine.instance.logger.logError("${ex}\n${st}");
     });
   }
 
+  _printErrorsAndPerf() {
+    // The following is a hack. We currently print out to stderr to ensure that
+    // when in batch mode we print to stderr, this is because the prints from
+    // batch are made to stderr. The reason that options.shouldBatch isn't used
+    // is because when the argument flags are constructed in BatchRunner and
+    // passed in from batch mode which removes the batch flag to prevent the
+    // "cannot have the batch flag and source file" error message.
+    IOSink sink = options.machineFormat ? stderr : stdout;
+
+    // print errors
+    ErrorFormatter formatter = new ErrorFormatter(sink, options);
+    formatter.formatErrors(errorInfos);
+
+    // print performance numbers
+    if (options.perf) {
+      int totalTime = JavaSystem.currentTimeMillis() - startTime;
+      int ioTime = PerformanceStatistics.io.result;
+      int scanTime = PerformanceStatistics.scan.result;
+      int parseTime = PerformanceStatistics.parse.result;
+      int resolveTime = PerformanceStatistics.resolve.result;
+      int errorsTime = PerformanceStatistics.errors.result;
+      int hintsTime = PerformanceStatistics.hints.result;
+      int angularTime = PerformanceStatistics.angular.result;
+      stdout.writeln("io:$ioTime");
+      stdout.writeln("scan:$scanTime");
+      stdout.writeln("parse:$parseTime");
+      stdout.writeln("resolve:$resolveTime");
+      stdout.writeln("errors:$errorsTime");
+      stdout.writeln("hints:$hintsTime");
+      stdout.writeln("angular:$angularTime");
+      stdout.writeln("other:${totalTime
+          - (ioTime + scanTime + parseTime + resolveTime + errorsTime + hintsTime
+          + angularTime)}");
+      stdout.writeln("total:$totalTime");
+   }
+  }
+
   /// Returns the maximal [ErrorSeverity] of the recorded errors.
   ErrorSeverity get maxErrorSeverity {
     var status = ErrorSeverity.NONE;
@@ -213,6 +282,13 @@
     }
   }
 
+  /// Fills [sources].
+  void prepareSources(LibraryElement library) {
+    var units = new Set<CompilationUnitElement>();
+    var libraries = new Set<LibraryElement>();
+    addLibrarySources(library, libraries, units);
+  }
+
   /// Fills [errorInfos] using [sources].
   void prepareErrors() {
     for (Source source in sources) {
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 58ce80b..ce52c18 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -270,8 +270,10 @@
    * @param arguments the arguments to the constructor being invoked, or `null` if this
    *          annotation is not the invocation of a constructor
    */
-  Annotation(this.atSign, Identifier name, this.period, SimpleIdentifier constructorName, ArgumentList arguments) {
+  Annotation(Token atSign, Identifier name, Token period, SimpleIdentifier constructorName, ArgumentList arguments) {
+    this.atSign = atSign;
     this._name = becomeParentOf(name);
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._arguments = becomeParentOf(arguments);
   }
@@ -402,7 +404,8 @@
    * @param question the token representing the question mark
    * @param identifier the identifier representing the argument being tested
    */
-  ArgumentDefinitionTest(this.question, SimpleIdentifier identifier) {
+  ArgumentDefinitionTest(Token question, SimpleIdentifier identifier) {
+    this.question = question;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -772,8 +775,12 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  AssertStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, this.semicolon) {
+  AssertStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
+    this.semicolon = semicolon;
   }
 
   @override
@@ -852,8 +859,9 @@
    * @param operator the assignment operator being applied
    * @param rightHandSide the expression used to compute the right hand side
    */
-  AssignmentExpression(Expression leftHandSide, this.operator, Expression rightHandSide) {
+  AssignmentExpression(Expression leftHandSide, Token operator, Expression rightHandSide) {
     this._leftHandSide = becomeParentOf(leftHandSide);
+    this.operator = operator;
     this._rightHandSide = becomeParentOf(rightHandSide);
   }
 
@@ -1498,8 +1506,9 @@
    * @param operator the binary operator being applied
    * @param rightOperand the expression used to compute the right operand
    */
-  BinaryExpression(Expression leftOperand, this.operator, Expression rightOperand) {
+  BinaryExpression(Expression leftOperand, Token operator, Expression rightOperand) {
     this._leftOperand = becomeParentOf(leftOperand);
+    this.operator = operator;
     this._rightOperand = becomeParentOf(rightOperand);
   }
 
@@ -1683,9 +1692,11 @@
    * @param statements the statements contained in the block
    * @param rightBracket the right curly bracket
    */
-  Block(this.leftBracket, List<Statement> statements, this.rightBracket) {
+  Block(Token leftBracket, List<Statement> statements, Token rightBracket) {
     this._statements = new NodeList<Statement>(this);
+    this.leftBracket = leftBracket;
     this._statements.addAll(statements);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -1790,7 +1801,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  BooleanLiteral(this.literal, this.value);
+  BooleanLiteral(Token literal, bool value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitBooleanLiteral(this);
@@ -1840,8 +1854,10 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  BreakStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+  BreakStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+    this.keyword = keyword;
     this._label = becomeParentOf(label);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -2032,10 +2048,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the catch block
    */
-  CatchClause(this.onKeyword, TypeName exceptionType, this.catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, this.comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
+  CatchClause(Token onKeyword, TypeName exceptionType, Token catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, Token comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
+    this.onKeyword = onKeyword;
     this.exceptionType = becomeParentOf(exceptionType);
+    this.catchKeyword = catchKeyword;
     this._leftParenthesis = leftParenthesis;
     this._exceptionParameter = becomeParentOf(exceptionParameter);
+    this.comma = comma;
     this._stackTraceParameter = becomeParentOf(stackTraceParameter);
     this._rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
@@ -2232,14 +2251,18 @@
    * @param members the members defined by the class
    * @param rightBracket the right curly bracket
    */
-  ClassDeclaration(Comment comment, List<Annotation> metadata, this.abstractKeyword, this.classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, this.leftBracket, List<ClassMember> members, this.rightBracket) : super(comment, metadata) {
+  ClassDeclaration(Comment comment, List<Annotation> metadata, Token abstractKeyword, Token classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, Token leftBracket, List<ClassMember> members, Token rightBracket) : super(comment, metadata) {
     this._members = new NodeList<ClassMember>(this);
+    this.abstractKeyword = abstractKeyword;
+    this.classKeyword = classKeyword;
     this._name = becomeParentOf(name);
     this.typeParameters = becomeParentOf(typeParameters);
     this._extendsClause = becomeParentOf(extendsClause);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
+    this.leftBracket = leftBracket;
     this._members.addAll(members);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -2486,9 +2509,11 @@
    * @param implementsClause the implements clause for this class
    * @param semicolon the semicolon terminating the declaration
    */
-  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, this.equals, this.abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
+  ClassTypeAlias(Comment comment, List<Annotation> metadata, Token keyword, SimpleIdentifier name, TypeParameterList typeParameters, Token equals, Token abstractKeyword, TypeName superclass, WithClause withClause, ImplementsClause implementsClause, Token semicolon) : super(comment, metadata, keyword, semicolon) {
     this._name = becomeParentOf(name);
     this._typeParameters = becomeParentOf(typeParameters);
+    this.equals = equals;
+    this.abstractKeyword = abstractKeyword;
     this._superclass = becomeParentOf(superclass);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
@@ -2614,7 +2639,9 @@
    * @param keyword the keyword specifying what kind of processing is to be done on the imported
    *          names
    */
-  Combinator(this.keyword);
+  Combinator(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   Token get beginToken => keyword;
@@ -2677,7 +2704,7 @@
   /**
    * The tokens representing the comment.
    */
-  final List<Token> tokens;
+  List<Token> tokens;
 
   /**
    * The type of the comment.
@@ -2697,8 +2724,9 @@
    * @param type the type of the comment
    * @param references the references embedded within the documentation comment
    */
-  Comment(this.tokens, CommentType type, List<CommentReference> references) {
+  Comment(List<Token> tokens, CommentType type, List<CommentReference> references) {
     this._references = new NodeList<CommentReference>(this);
+    this.tokens = tokens;
     this._type = type;
     this._references.addAll(references);
   }
@@ -2797,7 +2825,8 @@
    * @param newKeyword the token representing the 'new' keyword
    * @param identifier the identifier being referenced
    */
-  CommentReference(this.newKeyword, Identifier identifier) {
+  CommentReference(Token newKeyword, Identifier identifier) {
+    this.newKeyword = newKeyword;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -2860,7 +2889,7 @@
   /**
    * The first token in the token stream that was parsed to form this compilation unit.
    */
-  final Token beginToken;
+  Token beginToken;
 
   /**
    * The script tag at the beginning of the compilation unit, or `null` if there is no script
@@ -2882,7 +2911,7 @@
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  final Token endToken;
+  Token endToken;
 
   /**
    * The element associated with this compilation unit, or `null` if the AST structure has not
@@ -2904,12 +2933,14 @@
    * @param declarations the declarations contained in this compilation unit
    * @param endToken the last token in the token stream
    */
-  CompilationUnit(this.beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, this.endToken) {
+  CompilationUnit(Token beginToken, ScriptTag scriptTag, List<Directive> directives, List<CompilationUnitMember> declarations, Token endToken) {
     this._directives = new NodeList<Directive>(this);
     this._declarations = new NodeList<CompilationUnitMember>(this);
+    this.beginToken = beginToken;
     this._scriptTag = becomeParentOf(scriptTag);
     this._directives.addAll(directives);
     this._declarations.addAll(declarations);
+    this.endToken = endToken;
   }
 
   @override
@@ -3071,9 +3102,11 @@
    * @param elseExpression the expression that is executed if the condition evaluates to
    *          `false`
    */
-  ConditionalExpression(Expression condition, this.question, Expression thenExpression, this.colon, Expression elseExpression) {
+  ConditionalExpression(Expression condition, Token question, Expression thenExpression, Token colon, Expression elseExpression) {
     this._condition = becomeParentOf(condition);
+    this.question = question;
     this._thenExpression = becomeParentOf(thenExpression);
+    this.colon = colon;
     this._elseExpression = becomeParentOf(elseExpression);
   }
 
@@ -3257,11 +3290,16 @@
    *          redirected
    * @param body the body of the constructor
    */
-  ConstructorDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.constKeyword, this.factoryKeyword, Identifier returnType, this.period, SimpleIdentifier name, FormalParameterList parameters, this.separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
+  ConstructorDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token constKeyword, Token factoryKeyword, Identifier returnType, Token period, SimpleIdentifier name, FormalParameterList parameters, Token separator, List<ConstructorInitializer> initializers, ConstructorName redirectedConstructor, FunctionBody body) : super(comment, metadata) {
     this._initializers = new NodeList<ConstructorInitializer>(this);
+    this.externalKeyword = externalKeyword;
+    this.constKeyword = constKeyword;
+    this.factoryKeyword = factoryKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.period = period;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
+    this.separator = separator;
     this._initializers.addAll(initializers);
     this._redirectedConstructor = becomeParentOf(redirectedConstructor);
     this._body = becomeParentOf(body);
@@ -3458,8 +3496,11 @@
    * @param equals the token for the equal sign between the field name and the expression
    * @param expression the expression computing the value to which the field will be initialized
    */
-  ConstructorFieldInitializer(this.keyword, this.period, SimpleIdentifier fieldName, this.equals, Expression expression) {
+  ConstructorFieldInitializer(Token keyword, Token period, SimpleIdentifier fieldName, Token equals, Expression expression) {
+    this.keyword = keyword;
+    this.period = period;
     this._fieldName = becomeParentOf(fieldName);
+    this.equals = equals;
     this._expression = becomeParentOf(expression);
   }
 
@@ -3570,8 +3611,9 @@
    * @param period the token for the period before the constructor name
    * @param name the name of the constructor
    */
-  ConstructorName(TypeName type, this.period, SimpleIdentifier name) {
+  ConstructorName(TypeName type, Token period, SimpleIdentifier name) {
     this._type = becomeParentOf(type);
+    this.period = period;
     this._name = becomeParentOf(name);
   }
 
@@ -3679,8 +3721,10 @@
    * @param label the label associated with the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ContinueStatement(this.keyword, SimpleIdentifier label, this.semicolon) {
+  ContinueStatement(Token keyword, SimpleIdentifier label, Token semicolon) {
+    this.keyword = keyword;
     this._label = becomeParentOf(label);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -3772,7 +3816,8 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  DeclaredIdentifier(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+  DeclaredIdentifier(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
     this._identifier = becomeParentOf(identifier);
   }
@@ -3894,8 +3939,10 @@
    * @param separator the token separating the parameter from the default value
    * @param defaultValue the expression computing the default value for the parameter
    */
-  DefaultFormalParameter(NormalFormalParameter parameter, this.kind, this.separator, Expression defaultValue) {
+  DefaultFormalParameter(NormalFormalParameter parameter, ParameterKind kind, Token separator, Expression defaultValue) {
     this._parameter = becomeParentOf(parameter);
+    this.kind = kind;
+    this.separator = separator;
     this._defaultValue = becomeParentOf(defaultValue);
   }
 
@@ -4072,11 +4119,14 @@
    * @param rightParenthesis the right parenthesis
    * @param semicolon the semicolon terminating the statement
    */
-  DoStatement(this.doKeyword, Statement body, this.whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, this.semicolon) {
+  DoStatement(Token doKeyword, Statement body, Token whileKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Token semicolon) {
+    this.doKeyword = doKeyword;
     this._body = becomeParentOf(body);
+    this.whileKeyword = whileKeyword;
     this._leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
     this._rightParenthesis = rightParenthesis;
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4188,7 +4238,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  DoubleLiteral(this.literal, this.value);
+  DoubleLiteral(Token literal, double value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitDoubleLiteral(this);
@@ -4224,7 +4277,9 @@
    *
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  EmptyFunctionBody(this.semicolon);
+  EmptyFunctionBody(Token semicolon) {
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyFunctionBody(this);
@@ -4259,7 +4314,9 @@
    *
    * @param semicolon the semicolon terminating the statement
    */
-  EmptyStatement(this.semicolon);
+  EmptyStatement(Token semicolon) {
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitEmptyStatement(this);
@@ -4517,8 +4574,10 @@
    * @param expression the expression representing the body of the function
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionFunctionBody(this.functionDefinition, Expression expression, this.semicolon) {
+  ExpressionFunctionBody(Token functionDefinition, Expression expression, Token semicolon) {
+    this.functionDefinition = functionDefinition;
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4583,8 +4642,9 @@
    * @param expression the expression that comprises the statement
    * @param semicolon the semicolon terminating the statement
    */
-  ExpressionStatement(Expression expression, this.semicolon) {
+  ExpressionStatement(Expression expression, Token semicolon) {
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4652,7 +4712,8 @@
    * @param keyword the token representing the 'extends' keyword
    * @param superclass the name of the class that is being extended
    */
-  ExtendsClause(this.keyword, TypeName superclass) {
+  ExtendsClause(Token keyword, TypeName superclass) {
+    this.keyword = keyword;
     this._superclass = becomeParentOf(superclass);
   }
 
@@ -4721,8 +4782,10 @@
    * @param fieldList the fields being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  FieldDeclaration(Comment comment, List<Annotation> metadata, this.staticKeyword, VariableDeclarationList fieldList, this.semicolon) : super(comment, metadata) {
+  FieldDeclaration(Comment comment, List<Annotation> metadata, Token staticKeyword, VariableDeclarationList fieldList, Token semicolon) : super(comment, metadata) {
+    this.staticKeyword = staticKeyword;
     this._fieldList = becomeParentOf(fieldList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -4822,8 +4885,11 @@
    * @param parameters the parameters of the function-typed parameter, or `null` if this is
    *          not a function-typed field formal parameter
    */
-  FieldFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, this.thisToken, this.period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+  FieldFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, Token thisToken, Token period, SimpleIdentifier identifier, FormalParameterList parameters) : super(comment, metadata, identifier) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
+    this.thisToken = thisToken;
+    this.period = period;
     this._parameters = becomeParentOf(parameters);
   }
 
@@ -4954,9 +5020,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con1(this.forKeyword, this.leftParenthesis, DeclaredIdentifier loopVariable, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+  ForEachStatement.con1(Token forKeyword, Token leftParenthesis, DeclaredIdentifier loopVariable, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._loopVariable = becomeParentOf(loopVariable);
+    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -4970,9 +5040,13 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForEachStatement.con2(this.forKeyword, this.leftParenthesis, SimpleIdentifier identifier, this.inKeyword, Expression iterator, this.rightParenthesis, Statement body) {
+  ForEachStatement.con2(Token forKeyword, Token leftParenthesis, SimpleIdentifier identifier, Token inKeyword, Expression iterator, Token rightParenthesis, Statement body) {
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._identifier = becomeParentOf(identifier);
+    this.inKeyword = inKeyword;
     this._iterator = becomeParentOf(iterator);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5144,12 +5218,17 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  ForStatement(this.forKeyword, this.leftParenthesis, VariableDeclarationList variableList, Expression initialization, this.leftSeparator, Expression condition, this.rightSeparator, List<Expression> updaters, this.rightParenthesis, Statement body) {
+  ForStatement(Token forKeyword, Token leftParenthesis, VariableDeclarationList variableList, Expression initialization, Token leftSeparator, Expression condition, Token rightSeparator, List<Expression> updaters, Token rightParenthesis, Statement body) {
     this._updaters = new NodeList<Expression>(this);
+    this.forKeyword = forKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._variableList = becomeParentOf(variableList);
     this._initialization = becomeParentOf(initialization);
+    this.leftSeparator = leftSeparator;
     this._condition = becomeParentOf(condition);
+    this.rightSeparator = rightSeparator;
     this._updaters.addAll(updaters);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
@@ -5548,8 +5627,10 @@
    * @param name the name of the function
    * @param functionExpression the function expression being wrapped
    */
-  FunctionDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, TypeName returnType, this.propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+  FunctionDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, TypeName returnType, Token propertyKeyword, SimpleIdentifier name, FunctionExpression functionExpression) : super(comment, metadata) {
+    this.externalKeyword = externalKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.propertyKeyword = propertyKeyword;
     this._name = becomeParentOf(name);
     this._functionExpression = becomeParentOf(functionExpression);
   }
@@ -6331,9 +6412,13 @@
    * @param elseKeyword the token representing the 'else' keyword
    * @param elseStatement the statement that is executed if the condition evaluates to `false`
    */
-  IfStatement(this.ifKeyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement thenStatement, this.elseKeyword, Statement elseStatement) {
+  IfStatement(Token ifKeyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement thenStatement, Token elseKeyword, Statement elseStatement) {
+    this.ifKeyword = ifKeyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
     this._thenStatement = becomeParentOf(thenStatement);
+    this.elseKeyword = elseKeyword;
     this._elseStatement = becomeParentOf(elseStatement);
   }
 
@@ -6437,8 +6522,9 @@
    * @param keyword the token representing the 'implements' keyword
    * @param interfaces the interfaces that are being implemented
    */
-  ImplementsClause(this.keyword, List<TypeName> interfaces) {
+  ImplementsClause(Token keyword, List<TypeName> interfaces) {
     this._interfaces = new NodeList<TypeName>(this);
+    this.keyword = keyword;
     this._interfaces.addAll(interfaces);
   }
 
@@ -6587,7 +6673,8 @@
    * @param combinators the combinators used to control how names are imported
    * @param semicolon the semicolon terminating the directive
    */
-  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, this.asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+  ImportDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, Token asToken, SimpleIdentifier prefix, List<Combinator> combinators, Token semicolon) : super(comment, metadata, keyword, libraryUri, combinators, semicolon) {
+    this.asToken = asToken;
     this._prefix = becomeParentOf(prefix);
   }
 
@@ -6711,7 +6798,8 @@
    * @param index the expression used to compute the index
    * @param rightBracket the right square bracket
    */
-  IndexExpression.forCascade(this.period, Token leftBracket, Expression index, Token rightBracket) {
+  IndexExpression.forCascade(Token period, Token leftBracket, Expression index, Token rightBracket) {
+    this.period = period;
     this._leftBracket = leftBracket;
     this._index = becomeParentOf(index);
     this._rightBracket = rightBracket;
@@ -7020,7 +7108,8 @@
    * @param constructorName the name of the constructor to be invoked
    * @param argumentList the list of arguments to the constructor
    */
-  InstanceCreationExpression(this.keyword, ConstructorName constructorName, ArgumentList argumentList) {
+  InstanceCreationExpression(Token keyword, ConstructorName constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
     this.constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -7100,7 +7189,10 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  IntegerLiteral(this.literal, this.value);
+  IntegerLiteral(Token literal, int value) {
+    this.literal = literal;
+    this.value = value;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitIntegerLiteral(this);
@@ -7163,8 +7255,10 @@
    * @param expression the expression to be evaluated for the value to be converted into a string
    * @param rightBracket the right curly bracket
    */
-  InterpolationExpression(this.leftBracket, Expression expression, this.rightBracket) {
+  InterpolationExpression(Token leftBracket, Expression expression, Token rightBracket) {
+    this.leftBracket = leftBracket;
     this._expression = becomeParentOf(expression);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -7318,8 +7412,10 @@
    * @param notOperator the not operator, or `null` if the sense of the test is not negated
    * @param type the name of the type being tested for
    */
-  IsExpression(Expression expression, this.isOperator, this.notOperator, TypeName type) {
+  IsExpression(Expression expression, Token isOperator, Token notOperator, TypeName type) {
     this._expression = becomeParentOf(expression);
+    this.isOperator = isOperator;
+    this.notOperator = notOperator;
     this._type = becomeParentOf(type);
   }
 
@@ -7400,8 +7496,9 @@
    * @param label the label being applied
    * @param colon the colon that separates the label from whatever follows
    */
-  Label(SimpleIdentifier label, this.colon) {
+  Label(SimpleIdentifier label, Token colon) {
     this._label = becomeParentOf(label);
+    this.colon = colon;
   }
 
   @override
@@ -7544,8 +7641,10 @@
    * @param name the name of the library being defined
    * @param semicolon the semicolon terminating the directive
    */
-  LibraryDirective(Comment comment, List<Annotation> metadata, this.libraryToken, LibraryIdentifier name, this.semicolon) : super(comment, metadata) {
+  LibraryDirective(Comment comment, List<Annotation> metadata, Token libraryToken, LibraryIdentifier name, Token semicolon) : super(comment, metadata) {
+    this.libraryToken = libraryToken;
     this._name = becomeParentOf(name);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -7920,8 +8019,9 @@
    * @param separator the colon that separates the key from the value
    * @param value the expression computing the value that will be associated with the key
    */
-  MapLiteralEntry(Expression key, this.separator, Expression value) {
+  MapLiteralEntry(Expression key, Token separator, Expression value) {
     this._key = becomeParentOf(key);
+    this.separator = separator;
     this._value = becomeParentOf(value);
   }
 
@@ -8050,8 +8150,12 @@
    *          declares a getter
    * @param body the body of the method
    */
-  MethodDeclaration(Comment comment, List<Annotation> metadata, this.externalKeyword, this.modifierKeyword, TypeName returnType, this.propertyKeyword, this.operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+  MethodDeclaration(Comment comment, List<Annotation> metadata, Token externalKeyword, Token modifierKeyword, TypeName returnType, Token propertyKeyword, Token operatorKeyword, SimpleIdentifier name, FormalParameterList parameters, FunctionBody body) : super(comment, metadata) {
+    this.externalKeyword = externalKeyword;
+    this.modifierKeyword = modifierKeyword;
     this._returnType = becomeParentOf(returnType);
+    this.propertyKeyword = propertyKeyword;
+    this.operatorKeyword = operatorKeyword;
     this._name = becomeParentOf(name);
     this._parameters = becomeParentOf(parameters);
     this._body = becomeParentOf(body);
@@ -8241,8 +8345,9 @@
    * @param methodName the name of the method being invoked
    * @param argumentList the list of arguments to the method
    */
-  MethodInvocation(Expression target, this.period, SimpleIdentifier methodName, ArgumentList argumentList) {
+  MethodInvocation(Expression target, Token period, SimpleIdentifier methodName, ArgumentList argumentList) {
     this._target = becomeParentOf(target);
+    this.period = period;
     this._methodName = becomeParentOf(methodName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -8490,9 +8595,11 @@
    * @param combinators the combinators used to control which names are imported or exported
    * @param semicolon the semicolon terminating the directive
    */
-  NamespaceDirective(Comment comment, List<Annotation> metadata, this.keyword, StringLiteral libraryUri, List<Combinator> combinators, this.semicolon) : super(comment, metadata, libraryUri) {
+  NamespaceDirective(Comment comment, List<Annotation> metadata, Token keyword, StringLiteral libraryUri, List<Combinator> combinators, Token semicolon) : super(comment, metadata, libraryUri) {
     this._combinators = new NodeList<Combinator>(this);
+    this.keyword = keyword;
     this._combinators.addAll(combinators);
+    this.semicolon = semicolon;
   }
 
   /**
@@ -8538,7 +8645,10 @@
    * @param keyword the token representing the 'native' keyword
    * @param name the name of the native object that implements the class.
    */
-  NativeClause(this.keyword, this.name);
+  NativeClause(Token keyword, StringLiteral name) {
+    this.keyword = keyword;
+    this.name = name;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitNativeClause(this);
@@ -8568,7 +8678,7 @@
   /**
    * The token representing 'native' that marks the start of the function body.
    */
-  final Token nativeToken;
+  Token nativeToken;
 
   /**
    * The string literal, after the 'native' token.
@@ -8578,7 +8688,7 @@
   /**
    * The token representing the semicolon that marks the end of the function body.
    */
-  final Token semicolon;
+  Token semicolon;
 
   /**
    * Initialize a newly created function body consisting of the 'native' token, a string literal,
@@ -8588,8 +8698,10 @@
    * @param stringLiteral the string literal
    * @param semicolon the token representing the semicolon that marks the end of the function body
    */
-  NativeFunctionBody(this.nativeToken, StringLiteral stringLiteral, this.semicolon) {
+  NativeFunctionBody(Token nativeToken, StringLiteral stringLiteral, Token semicolon) {
+    this.nativeToken = nativeToken;
     this._stringLiteral = becomeParentOf(stringLiteral);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -8915,7 +9027,10 @@
    * @param partUri the URI of the part being included
    * @param semicolon the semicolon terminating the directive
    */
-  PartDirective(Comment comment, List<Annotation> metadata, this.partToken, StringLiteral partUri, this.semicolon) : super(comment, metadata, partUri);
+  PartDirective(Comment comment, List<Annotation> metadata, Token partToken, StringLiteral partUri, Token semicolon) : super(comment, metadata, partUri) {
+    this.partToken = partToken;
+    this.semicolon = semicolon;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitPartDirective(this);
@@ -8972,8 +9087,11 @@
    * @param libraryName the name of the library that the containing compilation unit is part of
    * @param semicolon the semicolon terminating the directive
    */
-  PartOfDirective(Comment comment, List<Annotation> metadata, this.partToken, this.ofToken, LibraryIdentifier libraryName, this.semicolon) : super(comment, metadata) {
+  PartOfDirective(Comment comment, List<Annotation> metadata, Token partToken, Token ofToken, LibraryIdentifier libraryName, Token semicolon) : super(comment, metadata) {
+    this.partToken = partToken;
+    this.ofToken = ofToken;
     this._libraryName = becomeParentOf(libraryName);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -9050,8 +9168,9 @@
    * @param operand the expression computing the operand for the operator
    * @param operator the postfix operator being applied to the operand
    */
-  PostfixExpression(Expression operand, this.operator) {
+  PostfixExpression(Expression operand, Token operator) {
     this._operand = becomeParentOf(operand);
+    this.operator = operator;
   }
 
   @override
@@ -9225,7 +9344,8 @@
    * @param operator the prefix operator being applied to the operand
    * @param operand the expression computing the operand for the operator
    */
-  PrefixExpression(this.operator, Expression operand) {
+  PrefixExpression(Token operator, Expression operand) {
+    this.operator = operator;
     this._operand = becomeParentOf(operand);
   }
 
@@ -9394,8 +9514,9 @@
    * @param period the period used to separate the prefix from the identifier
    * @param identifier the prefix associated with the library in which the identifier is defined
    */
-  PrefixedIdentifier(SimpleIdentifier prefix, this.period, SimpleIdentifier identifier) {
+  PrefixedIdentifier(SimpleIdentifier prefix, Token period, SimpleIdentifier identifier) {
     this._prefix = becomeParentOf(prefix);
+    this.period = period;
     this._identifier = becomeParentOf(identifier);
   }
 
@@ -9513,8 +9634,9 @@
    * @param operator the property access operator
    * @param propertyName the name of the property being accessed
    */
-  PropertyAccess(Expression target, this.operator, SimpleIdentifier propertyName) {
+  PropertyAccess(Expression target, Token operator, SimpleIdentifier propertyName) {
     this._target = becomeParentOf(target);
+    this.operator = operator;
     this._propertyName = becomeParentOf(propertyName);
   }
 
@@ -9659,7 +9781,9 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  RedirectingConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+  RedirectingConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -9732,7 +9856,9 @@
    *
    * @param keyword the token representing the 'rethrow' keyword
    */
-  RethrowExpression(this.keyword);
+  RethrowExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitRethrowExpression(this);
@@ -9783,8 +9909,10 @@
    * @param expression the expression computing the value to be returned
    * @param semicolon the semicolon terminating the statement
    */
-  ReturnStatement(this.keyword, Expression expression, this.semicolon) {
+  ReturnStatement(Token keyword, Expression expression, Token semicolon) {
+    this.keyword = keyword;
     this._expression = becomeParentOf(expression);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -9839,7 +9967,9 @@
    *
    * @param scriptTag the token representing this script tag
    */
-  ScriptTag(this.scriptTag);
+  ScriptTag(Token scriptTag) {
+    this.scriptTag = scriptTag;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitScriptTag(this);
@@ -9930,7 +10060,8 @@
    * @param type the name of the declared type of the parameter
    * @param identifier the name of the parameter being declared
    */
-  SimpleFormalParameter(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+  SimpleFormalParameter(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, SimpleIdentifier identifier) : super(comment, metadata, identifier) {
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
   }
 
@@ -10024,7 +10155,9 @@
    *
    * @param token the token representing the identifier
    */
-  SimpleIdentifier(this.token);
+  SimpleIdentifier(Token token) {
+    this.token = token;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSimpleIdentifier(this);
@@ -10299,7 +10432,8 @@
    * @param literal the token representing the literal
    * @param value the value of the literal
    */
-  SimpleStringLiteral(this.literal, String value) {
+  SimpleStringLiteral(Token literal, String value) {
+    this.literal = literal;
     this._value = StringUtilities.intern(value);
   }
 
@@ -10556,7 +10690,9 @@
    * @param constructorName the name of the constructor that is being invoked
    * @param argumentList the list of arguments to the constructor
    */
-  SuperConstructorInvocation(this.keyword, this.period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+  SuperConstructorInvocation(Token keyword, Token period, SimpleIdentifier constructorName, ArgumentList argumentList) {
+    this.keyword = keyword;
+    this.period = period;
     this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
@@ -10629,7 +10765,9 @@
    *
    * @param keyword the token representing the keyword
    */
-  SuperExpression(this.keyword);
+  SuperExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSuperExpression(this);
@@ -10770,10 +10908,12 @@
    * @param colon the colon separating the keyword or the expression from the statements
    * @param statements the statements that will be executed if this switch member is selected
    */
-  SwitchMember(List<Label> labels, this.keyword, this.colon, List<Statement> statements) {
+  SwitchMember(List<Label> labels, Token keyword, Token colon, List<Statement> statements) {
     this._labels = new NodeList<Label>(this);
     this._statements = new NodeList<Statement>(this);
     this._labels.addAll(labels);
+    this.keyword = keyword;
+    this.colon = colon;
     this._statements.addAll(statements);
   }
 
@@ -10863,10 +11003,15 @@
    * @param members the switch members that can be selected by the expression
    * @param rightBracket the right curly bracket
    */
-  SwitchStatement(this.keyword, this.leftParenthesis, Expression expression, this.rightParenthesis, this.leftBracket, List<SwitchMember> members, this.rightBracket) {
+  SwitchStatement(Token keyword, Token leftParenthesis, Expression expression, Token rightParenthesis, Token leftBracket, List<SwitchMember> members, Token rightBracket) {
     this._members = new NodeList<SwitchMember>(this);
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._expression = becomeParentOf(expression);
+    this.rightParenthesis = rightParenthesis;
+    this.leftBracket = leftBracket;
     this._members.addAll(members);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -10926,7 +11071,7 @@
   /**
    * The components of the literal.
    */
-  final List<Token> components;
+  List<Token> components;
 
   /**
    * Initialize a newly created symbol literal.
@@ -10934,7 +11079,10 @@
    * @param poundSign the token introducing the literal
    * @param components the components of the literal
    */
-  SymbolLiteral(this.poundSign, this.components);
+  SymbolLiteral(Token poundSign, List<Token> components) {
+    this.poundSign = poundSign;
+    this.components = components;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitSymbolLiteral(this);
@@ -10969,7 +11117,9 @@
    *
    * @param keyword the token representing the keyword
    */
-  ThisExpression(this.keyword);
+  ThisExpression(Token keyword) {
+    this.keyword = keyword;
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitThisExpression(this);
@@ -11013,7 +11163,8 @@
    * @param keyword the token representing the 'throw' keyword
    * @param expression the expression computing the exception to be thrown
    */
-  ThrowExpression(this.keyword, Expression expression) {
+  ThrowExpression(Token keyword, Expression expression) {
+    this.keyword = keyword;
     this._expression = becomeParentOf(expression);
   }
 
@@ -11085,8 +11236,9 @@
    * @param variableList the top-level variables being declared
    * @param semicolon the semicolon terminating the declaration
    */
-  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, this.semicolon) : super(comment, metadata) {
+  TopLevelVariableDeclaration(Comment comment, List<Annotation> metadata, VariableDeclarationList variableList, Token semicolon) : super(comment, metadata) {
     this._variableList = becomeParentOf(variableList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -11172,10 +11324,12 @@
    * @param finallyKeyword the token representing the 'finally' keyword
    * @param finallyBlock the finally block contained in the try statement
    */
-  TryStatement(this.tryKeyword, Block body, List<CatchClause> catchClauses, this.finallyKeyword, Block finallyBlock) {
+  TryStatement(Token tryKeyword, Block body, List<CatchClause> catchClauses, Token finallyKeyword, Block finallyBlock) {
     this._catchClauses = new NodeList<CatchClause>(this);
+    this.tryKeyword = tryKeyword;
     this._body = becomeParentOf(body);
     this._catchClauses.addAll(catchClauses);
+    this.finallyKeyword = finallyKeyword;
     this._finallyBlock = becomeParentOf(finallyBlock);
   }
 
@@ -11276,7 +11430,10 @@
    * @param keyword the token representing the 'typedef' keyword
    * @param semicolon the semicolon terminating the declaration
    */
-  TypeAlias(Comment comment, List<Annotation> metadata, this.keyword, this.semicolon) : super(comment, metadata);
+  TypeAlias(Comment comment, List<Annotation> metadata, Token keyword, Token semicolon) : super(comment, metadata) {
+    this.keyword = keyword;
+    this.semicolon = semicolon;
+  }
 
   @override
   Token get endToken => semicolon;
@@ -11316,9 +11473,11 @@
    * @param arguments the type arguments associated with the type
    * @param rightBracket the right bracket
    */
-  TypeArgumentList(this.leftBracket, List<TypeName> arguments, this.rightBracket) {
+  TypeArgumentList(Token leftBracket, List<TypeName> arguments, Token rightBracket) {
     this._arguments = new NodeList<TypeName>(this);
+    this.leftBracket = leftBracket;
     this._arguments.addAll(arguments);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11472,8 +11631,9 @@
    * @param keyword the token representing the 'extends' keyword
    * @param bound the name of the upper bound for legal arguments
    */
-  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.keyword, TypeName bound) : super(comment, metadata) {
+  TypeParameter(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token keyword, TypeName bound) : super(comment, metadata) {
     this._name = becomeParentOf(name);
+    this.keyword = keyword;
     this._bound = becomeParentOf(bound);
   }
 
@@ -11547,7 +11707,7 @@
   /**
    * The left angle bracket.
    */
-  final Token leftBracket;
+  Token leftBracket;
 
   /**
    * The type parameters in the list.
@@ -11557,7 +11717,7 @@
   /**
    * The right angle bracket.
    */
-  final Token rightBracket;
+  Token rightBracket;
 
   /**
    * Initialize a newly created list of type parameters.
@@ -11566,9 +11726,11 @@
    * @param typeParameters the type parameters in the list
    * @param rightBracket the right angle bracket
    */
-  TypeParameterList(this.leftBracket, List<TypeParameter> typeParameters, this.rightBracket) {
+  TypeParameterList(Token leftBracket, List<TypeParameter> typeParameters, Token rightBracket) {
     this._typeParameters = new NodeList<TypeParameter>(this);
+    this.leftBracket = leftBracket;
     this._typeParameters.addAll(typeParameters);
+    this.rightBracket = rightBracket;
   }
 
   @override
@@ -11622,7 +11784,8 @@
    * @param typeArguments the type argument associated with this literal, or `null` if no type
    *          arguments were declared
    */
-  TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
+  TypedLiteral(Token constKeyword, TypeArgumentList typeArguments) {
+    this.constKeyword = constKeyword;
     this.typeArguments = becomeParentOf(typeArguments);
   }
 
@@ -11739,8 +11902,9 @@
    * @param equals the equal sign separating the variable name from the initial value
    * @param initializer the expression used to compute the initial value for the variable
    */
-  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, this.equals, Expression initializer) : super(comment, metadata) {
+  VariableDeclaration(Comment comment, List<Annotation> metadata, SimpleIdentifier name, Token equals, Expression initializer) : super(comment, metadata) {
     this._name = becomeParentOf(name);
+    this.equals = equals;
     this._initializer = becomeParentOf(initializer);
   }
 
@@ -11883,8 +12047,9 @@
    * @param type the type of the variables being declared
    * @param variables a list containing the individual variables being declared
    */
-  VariableDeclarationList(Comment comment, List<Annotation> metadata, this.keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
+  VariableDeclarationList(Comment comment, List<Annotation> metadata, Token keyword, TypeName type, List<VariableDeclaration> variables) : super(comment, metadata) {
     this._variables = new NodeList<VariableDeclaration>(this);
+    this.keyword = keyword;
     this._type = becomeParentOf(type);
     this._variables.addAll(variables);
   }
@@ -11977,8 +12142,9 @@
    * @param variableList the fields being declared
    * @param semicolon the semicolon terminating the statement
    */
-  VariableDeclarationStatement(VariableDeclarationList variableList, this.semicolon) {
+  VariableDeclarationStatement(VariableDeclarationList variableList, Token semicolon) {
     this._variableList = becomeParentOf(variableList);
+    this.semicolon = semicolon;
   }
 
   @override
@@ -12055,8 +12221,11 @@
    * @param rightParenthesis the right parenthesis
    * @param body the body of the loop
    */
-  WhileStatement(this.keyword, this.leftParenthesis, Expression condition, this.rightParenthesis, Statement body) {
+  WhileStatement(Token keyword, Token leftParenthesis, Expression condition, Token rightParenthesis, Statement body) {
+    this.keyword = keyword;
+    this.leftParenthesis = leftParenthesis;
     this._condition = becomeParentOf(condition);
+    this.rightParenthesis = rightParenthesis;
     this._body = becomeParentOf(body);
   }
 
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 77901f8..a63eda8 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -206,7 +206,7 @@
   /**
    * The value of the expression.
    */
-  final DartObject value;
+  DartObject value;
 
   /**
    * The errors that should be reported for the expression(s) that were evaluated.
@@ -220,7 +220,8 @@
    * @param value the value of the expression
    * @param errors the errors that should be reported for the expression(s) that were evaluated
    */
-  EvaluationResult(this.value, List<AnalysisError> errors) {
+  EvaluationResult(DartObject value, List<AnalysisError> errors) {
+    this.value = value;
     this._errors = errors;
   }
 
@@ -1126,12 +1127,12 @@
   /**
    * The node against which the error should be reported.
    */
-  final AstNode node;
+  AstNode node;
 
   /**
    * The error code for the error to be generated.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * Initialize a newly created data holder to represent the error with the given code reported
@@ -1140,7 +1141,10 @@
    * @param node the node against which the error should be reported
    * @param errorCode the error code for the error to be generated
    */
-  ErrorResult_ErrorData(this.node, this.errorCode);
+  ErrorResult_ErrorData(AstNode node, ErrorCode errorCode) {
+    this.node = node;
+    this.errorCode = errorCode;
+  }
 }
 
 /**
@@ -1341,14 +1345,16 @@
   /**
    * The value of the expression.
    */
-  final DartObjectImpl value;
+  DartObjectImpl value;
 
   /**
    * Initialize a newly created result to represent the given value.
    *
    * @param value the value of the expression
    */
-  ValidResult(this.value);
+  ValidResult(DartObjectImpl value) {
+    this.value = value;
+  }
 
   @override
   EvaluationResultImpl add(TypeProvider typeProvider, BinaryExpression node, EvaluationResultImpl rightOperand) => rightOperand.addToValid(typeProvider, node, this);
@@ -1786,7 +1792,7 @@
   /**
    * The value of this instance.
    */
-  final bool value;
+  bool value = false;
 
   /**
    * An instance representing the boolean value 'false'.
@@ -1816,7 +1822,9 @@
    *
    * @param value the value of this instance
    */
-  BoolState(this.value);
+  BoolState(bool value) {
+    this.value = value;
+  }
 
   @override
   BoolState convertToBool() => this;
@@ -1907,7 +1915,7 @@
   /**
    * The run-time type of this object.
    */
-  final InterfaceType type;
+  InterfaceType type;
 
   /**
    * The state of the object.
@@ -1920,7 +1928,8 @@
    * @param type the run-time type of this object
    * @param state the state of the object
    */
-  DartObjectImpl(this.type, InstanceState state) {
+  DartObjectImpl(InterfaceType type, InstanceState state) {
+    this.type = type;
     this._state = state;
   }
 
@@ -2356,7 +2365,7 @@
   /**
    * The value of this instance.
    */
-  final double value;
+  double value = 0.0;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -2368,7 +2377,9 @@
    *
    * @param value the value of this instance
    */
-  DoubleState(this.value);
+  DoubleState(double value) {
+    this.value = value;
+  }
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -2844,14 +2855,16 @@
   /**
    * The error code associated with the exception.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * Initialize a newly created exception to have the given error code.
    *
    * @param errorCode the error code associated with the exception
    */
-  EvaluationException(this.errorCode);
+  EvaluationException(ErrorCode errorCode) {
+    this.errorCode = errorCode;
+  }
 }
 
 /**
@@ -3387,7 +3400,7 @@
   /**
    * The value of this instance.
    */
-  final int value;
+  int value = 0;
 
   /**
    * A state that can be used to represent an int whose value is not known.
@@ -3399,7 +3412,9 @@
    *
    * @param value the value of this instance
    */
-  IntState(this.value);
+  IntState(int value) {
+    this.value = value;
+  }
 
   @override
   NumState add(InstanceState rightOperand) {
@@ -4171,7 +4186,7 @@
   /**
    * The value of this instance.
    */
-  final String value;
+  String value;
 
   /**
    * A state that can be used to represent a double whose value is not known.
@@ -4183,7 +4198,9 @@
    *
    * @param value the value of this instance
    */
-  StringState(this.value);
+  StringState(String value) {
+    this.value = value;
+  }
 
   @override
   StringState concatenate(InstanceState rightOperand) {
@@ -4250,14 +4267,16 @@
   /**
    * The value of this instance.
    */
-  final String value;
+  String value;
 
   /**
    * Initialize a newly created state to represent the given value.
    *
    * @param value the value of this instance
    */
-  SymbolState(this.value);
+  SymbolState(String value) {
+    this.value = value;
+  }
 
   @override
   StringState convertToString() {
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9f273be..4cd44d6 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -603,6 +603,8 @@
    * This method is expensive, because resolved AST might be evicted from cache, so parsing and
    * resolving will be performed.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @return the resolved [AstNode], maybe `null` if [Element] is synthetic or
    *         isn't contained in a compilation unit, such as a [LibraryElement].
    */
@@ -847,14 +849,16 @@
   /**
    * The name displayed in the UI for this kind of element.
    */
-  final String displayName;
+  String displayName;
 
   /**
    * Initialize a newly created element kind to have the given display name.
    *
    * @param displayName the name displayed in the UI for this kind of element
    */
-  ElementKind(String name, int ordinal, this.displayName) : super(name, ordinal);
+  ElementKind(String name, int ordinal, String displayName) : super(name, ordinal) {
+    this.displayName = displayName;
+  }
 }
 
 /**
@@ -1750,7 +1754,7 @@
   int get uriEnd;
 
   /**
-   * Return the offset of the URU in the file, or `-1` if this element is synthetic.
+   * Return the offset of the URI in the file, or `-1` if this element is synthetic.
    *
    * @return the offset of the URI
    */
@@ -2563,13 +2567,13 @@
    * The element based on propagated type information, or `null` if the AST structure has not
    * been resolved or if this identifier could not be resolved.
    */
-  final ExecutableElement propagatedElement;
+  ExecutableElement propagatedElement;
 
   /**
    * The element associated with this identifier based on static type information, or `null`
    * if the AST structure has not been resolved or if this identifier could not be resolved.
    */
-  final ExecutableElement staticElement;
+  ExecutableElement staticElement;
 
   /**
    * Create the [AuxiliaryElements] with a static and propagated [ExecutableElement].
@@ -2577,7 +2581,10 @@
    * @param staticElement the static element
    * @param propagatedElement the propagated element
    */
-  AuxiliaryElements(this.staticElement, this.propagatedElement);
+  AuxiliaryElements(ExecutableElement staticElement, ExecutableElement propagatedElement) {
+    this.staticElement = staticElement;
+    this.propagatedElement = propagatedElement;
+  }
 }
 
 /**
@@ -3661,7 +3668,7 @@
   /**
    * The element representing the field, variable, or constructor being used as an annotation.
    */
-  final Element element;
+  Element element;
 
   /**
    * An empty array of annotations.
@@ -3695,7 +3702,9 @@
    * @param element the element representing the field, variable, or constructor being used as an
    *          annotation
    */
-  ElementAnnotationImpl(this.element);
+  ElementAnnotationImpl(Element element) {
+    this.element = element;
+  }
 
   @override
   bool get isDeprecated {
@@ -3796,8 +3805,9 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  ElementImpl(String name, this.nameOffset) {
+  ElementImpl(String name, int nameOffset) {
     this._name = StringUtilities.intern(name);
+    this.nameOffset = nameOffset;
   }
 
   @override
@@ -4945,7 +4955,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The scripts contained in or referenced from script tags in the HTML file.
@@ -4969,7 +4979,9 @@
    * @param context the analysis context in which the HTML file is defined
    * @param name the name of this element
    */
-  HtmlElementImpl(this.context, String name) : super(name, -1);
+  HtmlElementImpl(AnalysisContext context, String name) : super(name, -1) {
+    this.context = context;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitHtmlElement(this);
@@ -5205,7 +5217,7 @@
   /**
    * The analysis context in which this library is defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The compilation unit that defines this library.
@@ -5244,7 +5256,9 @@
    * @param context the analysis context in which the library is defined
    * @param name the name of this element
    */
-  LibraryElementImpl(this.context, LibraryIdentifier name) : super.forNode(name);
+  LibraryElementImpl(AnalysisContext context, LibraryIdentifier name) : super.forNode(name) {
+    this.context = context;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitLibraryElement(this);
@@ -5869,7 +5883,7 @@
   /**
    * The analysis context in which the multiply defined elements are defined.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * The name of the conflicting elements.
@@ -5879,7 +5893,7 @@
   /**
    * A list containing all of the elements that conflict.
    */
-  final List<Element> conflictingElements;
+  List<Element> conflictingElements;
 
   /**
    * Initialize a newly created element to represent a list of conflicting elements.
@@ -5887,8 +5901,10 @@
    * @param context the analysis context in which the multiply defined elements are defined
    * @param conflictingElements the elements that conflict
    */
-  MultiplyDefinedElementImpl(this.context, this.conflictingElements) {
+  MultiplyDefinedElementImpl(AnalysisContext context, List<Element> conflictingElements) {
+    this.context = context;
     _name = conflictingElements[0].name;
+    this.conflictingElements = conflictingElements;
   }
 
   @override
@@ -6595,7 +6611,7 @@
  */
 abstract class UriReferencedElementImpl extends ElementImpl implements UriReferencedElement {
   /**
-   * The offset of the URU in the file, may be `-1` if synthetic.
+   * The offset of the URI in the file, may be `-1` if synthetic.
    */
   int uriOffset = -1;
 
@@ -6752,16 +6768,19 @@
  * Information about Angular application.
  */
 class AngularApplication {
-  final Source entryPoint;
+  Source entryPoint;
 
   Set<Source> _librarySources;
 
-  final List<AngularElement> elements;
+  List<AngularElement> elements;
 
-  final List<Source> elementSources;
+  List<Source> elementSources;
 
-  AngularApplication(this.entryPoint, Set<Source> librarySources, this.elements, this.elementSources) {
+  AngularApplication(Source entryPoint, Set<Source> librarySources, List<AngularElement> elements, List<Source> elementSources) {
+    this.entryPoint = entryPoint;
     this._librarySources = librarySources;
+    this.elements = elements;
+    this.elementSources = elementSources;
   }
 
   /**
@@ -7111,7 +7130,7 @@
   /**
    * The type of the property
    */
-  final DartType type;
+  DartType type;
 
   /**
    * Initialize a newly created Angular scope property to have the given name.
@@ -7120,7 +7139,9 @@
    * @param nameOffset the offset of the name of this element in the file that contains the
    *          declaration of this element
    */
-  AngularScopePropertyElementImpl(String name, int nameOffset, this.type) : super(name, nameOffset);
+  AngularScopePropertyElementImpl(String name, int nameOffset, DartType type) : super(name, nameOffset) {
+    this.type = type;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularScopePropertyElement(this);
@@ -7172,12 +7193,12 @@
   /**
    * The HTML template URI.
    */
-  final String templateUri;
+  String templateUri;
 
   /**
    * The offset of the [templateUri] in the [getSource].
    */
-  final int templateUriOffset;
+  int templateUriOffset = 0;
 
   /**
    * The HTML template source.
@@ -7187,7 +7208,10 @@
   /**
    * Initialize a newly created Angular view.
    */
-  AngularViewElementImpl(this.templateUri, this.templateUriOffset) : super(null, -1);
+  AngularViewElementImpl(String templateUri, int templateUriOffset) : super(null, -1) {
+    this.templateUri = templateUri;
+    this.templateUriOffset = templateUriOffset;
+  }
 
   @override
   accept(ElementVisitor visitor) => visitor.visitAngularViewElement(this);
@@ -7223,11 +7247,14 @@
  * Combination of [AngularTagSelectorElementImpl] and [HasAttributeSelectorElementImpl].
  */
 class IsTagHasAttributeSelectorElementImpl extends AngularSelectorElementImpl {
-  final String tagName;
+  String tagName;
 
-  final String attributeName;
+  String attributeName;
 
-  IsTagHasAttributeSelectorElementImpl(this.tagName, this.attributeName) : super(null, -1);
+  IsTagHasAttributeSelectorElementImpl(String tagName, String attributeName) : super(null, -1) {
+    this.tagName = tagName;
+    this.attributeName = attributeName;
+  }
 
   @override
   bool apply(XmlTagNode node) => node.tag == tagName && node.getAttribute(attributeName) != null;
@@ -9501,7 +9528,7 @@
   /**
    * The name of this type, or `null` if the type does not have a name.
    */
-  final String name;
+  String name;
 
   /**
    * An empty array of types.
@@ -9514,8 +9541,9 @@
    * @param element the element representing the declaration of the type
    * @param name the name of the type
    */
-  TypeImpl(Element element, this.name) {
+  TypeImpl(Element element, String name) {
     this._element = element;
+    this.name = name;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 9fa7af5..be82258 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -212,6 +212,8 @@
    * have a documentation comment associated with it. This can be a long-running operation if the
    * information needed to access the comment is not cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param element the element whose documentation comment is to be returned
    * @return the element's documentation comment
    * @throws AnalysisException if the documentation comment could not be determined because the
@@ -224,7 +226,7 @@
    * are not already known then the source will be analyzed in order to determine the errors
    * associated with it.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose errors are to be returned
    * @return all of the errors associated with the given source
@@ -241,7 +243,7 @@
    * libraries that are defined in it (via script tags) that also need to have a model built for
    * them.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source defining the HTML file whose element model is to be returned
    * @return the element model corresponding to the HTML file defined by the given source
@@ -255,7 +257,7 @@
    * Return the kind of the given source, computing it's kind if it is not already known. Return
    * [SourceKind#UNKNOWN] if the source is not contained in this context.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose kind is to be returned
    * @return the kind of the given source
@@ -269,6 +271,8 @@
    * for a library can long-running, depending on the size of the library and the number of
    * libraries that are imported into it that also need to have a model built for them.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param source the source defining the library whose element model is to be returned
    * @return the element model corresponding to the library defined by the given source
    * @throws AnalysisException if the element model could not be determined because the analysis
@@ -283,7 +287,7 @@
    * known it will be created. The line information is used to map offsets from the beginning of the
    * source to line and column pairs.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source whose line information is to be returned
    * @return the line information for the given source
@@ -603,7 +607,7 @@
    * Parse a single source to produce an AST structure. The resulting AST structure may or may not
    * be resolved, and may have a slightly different structure depending upon whether it is resolved.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the source to be parsed
    * @return the AST structure representing the content of the source
@@ -616,7 +620,7 @@
    * may not be resolved, and may have a slightly different structure depending upon whether it is
    * resolved.
    *
-   * <b>Note:</b> This method cannot be used in an async environment
+   * <b>Note:</b> This method cannot be used in an async environment.
    *
    * @param source the HTML source to be parsed
    * @return the parse result (not `null`)
@@ -855,17 +859,17 @@
   /**
    * The number of milliseconds required to determine which task was to be performed.
    */
-  final int getTime;
+  int getTime = 0;
 
   /**
    * The name of the class of the task that was performed.
    */
-  final String taskClassName;
+  String taskClassName;
 
   /**
    * The number of milliseconds required to perform the task.
    */
-  final int performTime;
+  int performTime = 0;
 
   /**
    * Initialize a newly created analysis result to have the given values.
@@ -875,8 +879,11 @@
    * @param taskClassName the name of the class of the task that was performed
    * @param performTime the number of milliseconds required to perform the task
    */
-  AnalysisResult(List<ChangeNotice> notices, this.getTime, this.taskClassName, this.performTime) {
+  AnalysisResult(List<ChangeNotice> notices, int getTime, String taskClassName, int performTime) {
     this._notices = notices;
+    this.getTime = getTime;
+    this.taskClassName = taskClassName;
+    this.performTime = performTime;
   }
 
   /**
@@ -1377,11 +1384,6 @@
   static final DataDescriptor<List<Source>> CONTAINING_LIBRARIES = new DataDescriptor<List<Source>>("DartEntry.CONTAINING_LIBRARIES");
 
   /**
-   * The data descriptor representing the errors reported during the resolution of directives.
-   */
-  static final DataDescriptor<List<AnalysisError>> DIRECTIVE_ERRORS = new DataDescriptor<List<AnalysisError>>("DartEntry.DIRECTIVE_ERRORS");
-
-  /**
    * The data descriptor representing the library element for the library. This data is only
    * available for Dart files that are the defining compilation unit of a library.
    */
@@ -1528,6 +1530,15 @@
   bool hasInvalidData(DataDescriptor descriptor);
 
   /**
+   * Return `true` if this entry has an AST structure that can be resolved (even if it needs
+   * to be copied).
+   *
+   * @return `true` if the method [DartEntryImpl#getResolvableCompilationUnit] will
+   *         return a non-`null` result
+   */
+  bool get hasResolvableCompilationUnit;
+
+  /**
    * Return `true` if this data is safe to use in refactoring.
    */
   bool get isRefactoringSafe;
@@ -1630,17 +1641,6 @@
   List<Source> _includedParts = Source.EMPTY_ARRAY;
 
   /**
-   * The state of the cached directive errors.
-   */
-  CacheState _directiveErrorsState = CacheState.INVALID;
-
-  /**
-   * The errors produced while resolving the directives, or an empty array if the errors are not
-   * currently cached.
-   */
-  List<AnalysisError> _directiveErrors = AnalysisError.NO_ERRORS;
-
-  /**
    * The list of libraries that contain this compilation unit. The list will be empty if there are
    * no known libraries that contain this compilation unit.
    */
@@ -1737,7 +1737,6 @@
     List<AnalysisError> errors = new List<AnalysisError>();
     ListUtilities.addAll(errors, _scanErrors);
     ListUtilities.addAll(errors, _parseErrors);
-    ListUtilities.addAll(errors, _directiveErrors);
     DartEntryImpl_ResolutionState state = _resolutionState;
     while (state != null) {
       ListUtilities.addAll(errors, state._resolutionErrors);
@@ -1822,9 +1821,7 @@
 
   @override
   CacheState getState(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return _directiveErrorsState;
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       return _elementState;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return _exportedLibrariesState;
@@ -1886,8 +1883,6 @@
       return _angularErrors;
     } else if (identical(descriptor, DartEntry.CONTAINING_LIBRARIES)) {
       return new List.from(_containingLibraries);
-    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return _directiveErrors;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       return _element;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -1955,9 +1950,7 @@
 
   @override
   bool hasInvalidData(DataDescriptor descriptor) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      return identical(_directiveErrorsState, CacheState.INVALID);
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       return identical(_elementState, CacheState.INVALID);
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
       return identical(_exportedLibrariesState, CacheState.INVALID);
@@ -2001,6 +1994,22 @@
   }
 
   @override
+  bool get hasResolvableCompilationUnit {
+    if (identical(_parsedUnitState, CacheState.VALID)) {
+      return true;
+    }
+    DartEntryImpl_ResolutionState state = _resolutionState;
+    while (state != null) {
+      if (identical(state._resolvedUnitState, CacheState.VALID)) {
+        return true;
+      }
+      state = state._nextState;
+    }
+    ;
+    return false;
+  }
+
+  @override
   void invalidateAllInformation() {
     super.invalidateAllInformation();
     _scanErrors = AnalysisError.NO_ERRORS;
@@ -2014,6 +2023,12 @@
     _parsedUnit = null;
     _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.INVALID;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.INVALID;
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.INVALID;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.INVALID;
     _discardCachedResolutionInformation();
   }
 
@@ -2056,59 +2071,6 @@
   }
 
   /**
-   * Record that an error occurred while attempting to resolve the directives in the source
-   * represented by this entry.
-   */
-  void recordDependencyError() {
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.ERROR;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.ERROR;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.ERROR;
-    _directiveErrors = AnalysisError.NO_ERRORS;
-    _directiveErrorsState = CacheState.ERROR;
-  }
-
-  /**
-   * Record that the information related to resolving dependencies for the associated source is
-   * about to be computed by the current thread.
-   */
-  void recordDependencyInProcess() {
-    if (_exportedLibrariesState != CacheState.VALID) {
-      _exportedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_importedLibrariesState != CacheState.VALID) {
-      _importedLibrariesState = CacheState.IN_PROCESS;
-    }
-    if (_includedPartsState != CacheState.VALID) {
-      _includedPartsState = CacheState.IN_PROCESS;
-    }
-    if (_directiveErrorsState != CacheState.VALID) {
-      _directiveErrorsState = CacheState.IN_PROCESS;
-    }
-  }
-
-  /**
-   * Record that an in-process dependency resolution has stopped without recording results because
-   * the results were invalidated before they could be recorded.
-   */
-  void recordDependencyNotInProcess() {
-    if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
-      _exportedLibrariesState = CacheState.INVALID;
-    }
-    if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
-      _importedLibrariesState = CacheState.INVALID;
-    }
-    if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
-      _includedPartsState = CacheState.INVALID;
-    }
-    if (identical(_directiveErrorsState, CacheState.IN_PROCESS)) {
-      _directiveErrorsState = CacheState.INVALID;
-    }
-  }
-
-  /**
    * Record that an error occurred while attempting to scan or parse the entry represented by this
    * entry. This will set the state of all information, including any resolution-based information,
    * as being in error.
@@ -2121,7 +2083,12 @@
     _parsedUnit = null;
     _parsedUnitAccessed = false;
     _parsedUnitState = CacheState.ERROR;
-    recordDependencyError();
+    _exportedLibraries = Source.EMPTY_ARRAY;
+    _exportedLibrariesState = CacheState.ERROR;
+    _importedLibraries = Source.EMPTY_ARRAY;
+    _importedLibrariesState = CacheState.ERROR;
+    _includedParts = Source.EMPTY_ARRAY;
+    _includedPartsState = CacheState.ERROR;
     recordResolutionError();
   }
 
@@ -2139,6 +2106,15 @@
     if (_parsedUnitState != CacheState.VALID) {
       _parsedUnitState = CacheState.IN_PROCESS;
     }
+    if (_exportedLibrariesState != CacheState.VALID) {
+      _exportedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_importedLibrariesState != CacheState.VALID) {
+      _importedLibrariesState = CacheState.IN_PROCESS;
+    }
+    if (_includedPartsState != CacheState.VALID) {
+      _includedPartsState = CacheState.IN_PROCESS;
+    }
   }
 
   /**
@@ -2158,6 +2134,15 @@
     if (identical(_parsedUnitState, CacheState.IN_PROCESS)) {
       _parsedUnitState = CacheState.INVALID;
     }
+    if (identical(_exportedLibrariesState, CacheState.IN_PROCESS)) {
+      _exportedLibrariesState = CacheState.INVALID;
+    }
+    if (identical(_importedLibrariesState, CacheState.IN_PROCESS)) {
+      _importedLibrariesState = CacheState.INVALID;
+    }
+    if (identical(_includedPartsState, CacheState.IN_PROCESS)) {
+      _includedPartsState = CacheState.INVALID;
+    }
   }
 
   /**
@@ -2295,10 +2280,7 @@
 
   @override
   void setState(DataDescriptor descriptor, CacheState state) {
-    if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      _directiveErrors = updatedValue(state, _directiveErrors, null);
-      _directiveErrorsState = state;
-    } else if (identical(descriptor, DartEntry.ELEMENT)) {
+    if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = updatedValue(state, _element, null);
       _elementState = state;
     } else if (identical(descriptor, DartEntry.EXPORTED_LIBRARIES)) {
@@ -2375,9 +2357,6 @@
   void setValue(DataDescriptor descriptor, Object value) {
     if (identical(descriptor, DartEntry.ANGULAR_ERRORS)) {
       _angularErrors = value == null ? AnalysisError.NO_ERRORS : (value as List<AnalysisError>);
-    } else if (identical(descriptor, DartEntry.DIRECTIVE_ERRORS)) {
-      _directiveErrors = value as List<AnalysisError>;
-      _directiveErrorsState = CacheState.VALID;
     } else if (identical(descriptor, DartEntry.ELEMENT)) {
       _element = value as LibraryElement;
       _elementState = CacheState.VALID;
@@ -2467,8 +2446,6 @@
     _exportedLibraries = other._exportedLibraries;
     _importedLibrariesState = other._importedLibrariesState;
     _importedLibraries = other._importedLibraries;
-    _directiveErrorsState = other._directiveErrorsState;
-    _directiveErrors = other._directiveErrors;
     _containingLibraries = new List<Source>.from(other._containingLibraries);
     _resolutionState.copyFrom(other._resolutionState);
     _elementState = other._elementState;
@@ -2482,7 +2459,7 @@
   }
 
   @override
-  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_directiveErrorsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
+  bool get hasErrorState => super.hasErrorState || identical(_scanErrorsState, CacheState.ERROR) || identical(_tokenStreamState, CacheState.ERROR) || identical(_sourceKindState, CacheState.ERROR) || identical(_parsedUnitState, CacheState.ERROR) || identical(_parseErrorsState, CacheState.ERROR) || identical(_importedLibrariesState, CacheState.ERROR) || identical(_exportedLibrariesState, CacheState.ERROR) || identical(_includedPartsState, CacheState.ERROR) || identical(_elementState, CacheState.ERROR) || identical(_publicNamespaceState, CacheState.ERROR) || identical(_clientServerState, CacheState.ERROR) || identical(_launchableState, CacheState.ERROR) || _resolutionState.hasErrorState;
 
   @override
   void writeOn(JavaStringBuilder builder) {
@@ -2506,8 +2483,6 @@
     builder.append(_importedLibrariesState);
     builder.append("; includedParts = ");
     builder.append(_includedPartsState);
-    builder.append("; directiveErrors = ");
-    builder.append(_directiveErrorsState);
     builder.append("; element = ");
     builder.append(_elementState);
     builder.append("; publicNamespace = ");
@@ -2526,14 +2501,6 @@
   void _discardCachedResolutionInformation() {
     _element = null;
     _elementState = CacheState.INVALID;
-    _includedParts = Source.EMPTY_ARRAY;
-    _includedPartsState = CacheState.INVALID;
-    _exportedLibraries = Source.EMPTY_ARRAY;
-    _exportedLibrariesState = CacheState.INVALID;
-    _importedLibraries = Source.EMPTY_ARRAY;
-    _importedLibrariesState = CacheState.INVALID;
-    _directiveErrors = AnalysisError.NO_ERRORS;
-    _directiveErrorsState = CacheState.INVALID;
     _bitmask = 0;
     _clientServerState = CacheState.INVALID;
     _launchableState = CacheState.INVALID;
@@ -3668,7 +3635,7 @@
 }
 
 class AnalysisContentStatisticsImpl_CacheRowImpl implements AnalysisContentStatistics_CacheRow {
-  final String name;
+  String name;
 
   int _errorCount = 0;
 
@@ -3680,7 +3647,9 @@
 
   int _validCount = 0;
 
-  AnalysisContentStatisticsImpl_CacheRowImpl(this.name);
+  AnalysisContentStatisticsImpl_CacheRowImpl(String name) {
+    this.name = name;
+  }
 
   @override
   bool operator ==(Object obj) => obj is AnalysisContentStatisticsImpl_CacheRowImpl && obj.name == name;
@@ -3965,13 +3934,13 @@
   }
 
   @override
-  List<Source> computeExportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  List<Source> computeExportedLibraries(Source source) => _getDartParseData2(source, DartEntry.EXPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
   @override
   HtmlElement computeHtmlElement(Source source) => _getHtmlResolutionData(source, HtmlEntry.ELEMENT, null);
 
   @override
-  List<Source> computeImportedLibraries(Source source) => _getDartDependencyData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
+  List<Source> computeImportedLibraries(Source source) => _getDartParseData2(source, DartEntry.IMPORTED_LIBRARIES, Source.EMPTY_ARRAY);
 
   @override
   SourceKind computeKindOf(Source source) {
@@ -4019,7 +3988,7 @@
       throw new AnalysisException.con2("Internal error: computeResolvableCompilationUnit could not parse ${source.fullName}", dartEntry.exception);
     }
     _cache.put(source, dartCopy);
-    return new ResolvableCompilationUnit(dartCopy.modificationTime, unit);
+    return new ResolvableCompilationUnit.con1(dartCopy.modificationTime, unit);
   }
 
   @override
@@ -4292,35 +4261,6 @@
   }
 
   @override
-  Namespace getPublicNamespace2(Source source) {
-    // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
-    // API of the interface.
-    DartEntry dartEntry = _getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return null;
-    }
-    Namespace namespace = dartEntry.getValue(DartEntry.PUBLIC_NAMESPACE);
-    if (namespace == null) {
-      LibraryElement library = computeLibraryElement(source);
-      if (library == null) {
-        return null;
-      }
-      NamespaceBuilder builder = new NamespaceBuilder();
-      namespace = builder.createPublicNamespaceForLibrary(library);
-      dartEntry = _getReadableDartEntry(source);
-      if (dartEntry == null) {
-        throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
-      }
-      if (identical(dartEntry.getValue(DartEntry.ELEMENT), library)) {
-        DartEntryImpl dartCopy = _getReadableDartEntry(source).writableCopy;
-        dartCopy.setValue(DartEntry.PUBLIC_NAMESPACE, namespace);
-        _cache.put(source, dartCopy);
-      }
-    }
-    return namespace;
-  }
-
-  @override
   List<Source> get refactoringUnsafeSources {
     List<Source> sources = new List<Source>();
     for (MapEntry<Source, SourceEntry> entry in _cache.entrySet()) {
@@ -4869,42 +4809,6 @@
   }
 
   /**
-   * Given a source for a Dart file, return a cache entry in which the state of the data represented
-   * by the given descriptor is either [CacheState#VALID] or [CacheState#ERROR]. This
-   * method assumes that the data can be produced by resolving the directives in the source if they
-   * are not already cached.
-   *
-   * <b>Note:</b> This method cannot be used in an async environment
-   *
-   * @param source the source representing the Dart file
-   * @param dartEntry the cache entry associated with the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @return a cache entry containing the required data
-   * @throws AnalysisException if data could not be returned because the source could not be
-   *           resolved
-   */
-  DartEntry _cacheDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    //
-    // Check to see whether we already have the information being requested.
-    //
-    CacheState state = dartEntry.getState(descriptor);
-    while (state != CacheState.ERROR && state != CacheState.VALID) {
-      //
-      // If not, compute the information. Unless the modification date of the source continues to
-      // change, this loop will eventually terminate.
-      //
-      dartEntry = _cacheDartParseData(source, dartEntry, DartEntry.PARSED_UNIT);
-      CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-      if (unit == null) {
-        throw new AnalysisException.con2("Could not cache Dart dependency data: no parse unit", dartEntry.exception);
-      }
-      dartEntry = new ResolveDartDependenciesTask(this, source, dartEntry.modificationTime, unit).perform(_resultRecorder) as DartEntry;
-      state = dartEntry.getState(descriptor);
-    }
-    return dartEntry;
-  }
-
-  /**
    * Given a source for a Dart file and the library that contains it, return a cache entry in which
    * the state of the data represented by the given descriptor is either [CacheState#VALID] or
    * [CacheState#ERROR]. This method assumes that the data can be produced by generating hints
@@ -4963,7 +4867,7 @@
       // change, this loop will eventually terminate.
       //
       dartEntry = _cacheDartScanData(source, dartEntry, DartEntry.TOKEN_STREAM);
-      dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM)).perform(_resultRecorder) as DartEntry;
+      dartEntry = new ParseDartTask(this, source, dartEntry.modificationTime, dartEntry.getValue(DartEntry.TOKEN_STREAM), dartEntry.getValue(SourceEntry.LINE_INFO)).perform(_resultRecorder) as DartEntry;
       state = dartEntry.getState(descriptor);
     }
     return dartEntry;
@@ -5045,6 +4949,8 @@
    * [CacheState#ERROR]. This method assumes that the data can be produced by verifying the
    * source in the given library if the data is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param unitSource the source representing the Dart file
    * @param librarySource the source representing the library containing the Dart file
    * @param dartEntry the cache entry associated with the Dart file
@@ -5197,7 +5103,7 @@
     SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
     sourceCopy.setState(SourceEntry.CONTENT, CacheState.IN_PROCESS);
     _cache.put(source, sourceCopy);
-    return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false, null);
+    return new AnalysisContextImpl_TaskData(new GetContentTask(this, source), false);
   }
 
   /**
@@ -5209,7 +5115,7 @@
    * @return task data representing the created task
    */
   AnalysisContextImpl_TaskData _createParseDartTask(Source source, DartEntry dartEntry) {
-    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID) {
+    if (dartEntry.getState(DartEntry.TOKEN_STREAM) != CacheState.VALID || dartEntry.getState(SourceEntry.LINE_INFO) != CacheState.VALID) {
       return _createScanDartTask(source, dartEntry);
     }
     Token tokenStream = dartEntry.getValue(DartEntry.TOKEN_STREAM);
@@ -5217,7 +5123,7 @@
     dartCopy.setState(DartEntry.TOKEN_STREAM, CacheState.FLUSHED);
     dartCopy.setState(DartEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream), false, null);
+    return new AnalysisContextImpl_TaskData(new ParseDartTask(this, source, dartCopy.modificationTime, tokenStream, dartEntry.getValue(SourceEntry.LINE_INFO)), false);
   }
 
   /**
@@ -5237,26 +5143,45 @@
     htmlCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
     htmlCopy.setState(HtmlEntry.PARSE_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, htmlCopy);
-    return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false, null);
+    return new AnalysisContextImpl_TaskData(new ParseHtmlTask(this, source, htmlCopy.modificationTime, content), false);
   }
 
   /**
-   * Create a [ResolveDartDependenciesTask] for the given source, marking the exported
-   * libraries as being in-process.
+   * Create a [ResolveAngularComponentTemplateTask] for the given source, marking the angular
+   * errors as being in-process.
    *
-   * @param source the source whose content is to be used to resolve dependencies
-   * @param dartEntry the entry for the source
+   * @param source the source whose content is to be resolved
+   * @param htmlEntry the entry for the source
    * @return task data representing the created task
    */
-  AnalysisContextImpl_TaskData _createResolveDartDependenciesTask(Source source, DartEntry dartEntry) {
-    CompilationUnit unit = dartEntry.anyParsedCompilationUnit;
-    if (unit == null) {
-      return _createParseDartTask(source, dartEntry);
+  AnalysisContextImpl_TaskData _createResolveAngularComponentTemplateTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+      return _createResolveHtmlTask(source, htmlEntry);
     }
-    DartEntryImpl dartCopy = dartEntry.writableCopy;
-    dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.IN_PROCESS);
-    _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ResolveDartDependenciesTask(this, source, dartCopy.modificationTime, unit), false, null);
+    AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
+    AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
+    HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+    htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
+    _cache.put(source, htmlCopy);
+    return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false);
+  }
+
+  /**
+   * Create a [ResolveAngularEntryHtmlTask] for the given source, marking the angular entry as
+   * being in-process.
+   *
+   * @param source the source whose content is to be resolved
+   * @param htmlEntry the entry for the source
+   * @return task data representing the created task
+   */
+  AnalysisContextImpl_TaskData _createResolveAngularEntryHtmlTask(Source source, HtmlEntry htmlEntry) {
+    if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
+      return _createResolveHtmlTask(source, htmlEntry);
+    }
+    HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
+    htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
+    _cache.put(source, htmlCopy);
+    return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false);
   }
 
   /**
@@ -5274,7 +5199,7 @@
     HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
     htmlCopy.setState(HtmlEntry.RESOLVED_UNIT, CacheState.IN_PROCESS);
     _cache.put(source, htmlCopy);
-    return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false, null);
+    return new AnalysisContextImpl_TaskData(new ResolveHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.PARSED_UNIT)), false);
   }
 
   /**
@@ -5294,7 +5219,7 @@
     dartCopy.setState(SourceEntry.CONTENT, CacheState.FLUSHED);
     dartCopy.setState(DartEntry.SCAN_ERRORS, CacheState.IN_PROCESS);
     _cache.put(source, dartCopy);
-    return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false, null);
+    return new AnalysisContextImpl_TaskData(new ScanDartTask(this, source, dartCopy.modificationTime, content), false);
   }
 
   /**
@@ -5349,47 +5274,6 @@
   }
 
   /**
-   * Given a source for a Dart file, return the data represented by the given descriptor that is
-   * associated with that source. This method assumes that the data can be produced by resolving the
-   * directives in the source if they are not already cached.
-   *
-   * @param source the source representing the Dart file
-   * @param dartEntry the cache entry associated with the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @return the requested data about the given source
-   * @throws AnalysisException if data could not be returned because the source could not be parsed
-   */
-  Object _getDartDependencyData(Source source, DartEntry dartEntry, DataDescriptor descriptor) {
-    dartEntry = _cacheDartDependencyData(source, dartEntry, descriptor);
-    return dartEntry.getValue(descriptor);
-  }
-
-  /**
-   * Given a source for a Dart file, return the data represented by the given descriptor that is
-   * associated with that source, or the given default value if the source is not a Dart file. This
-   * method assumes that the data can be produced by resolving the directives in the source if they
-   * are not already cached.
-   *
-   * @param source the source representing the Dart file
-   * @param descriptor the descriptor representing the data to be returned
-   * @param defaultValue the value to be returned if the source is not a Dart file
-   * @return the requested data about the given source
-   * @throws AnalysisException if data could not be returned because the source could not be parsed
-   */
-  Object _getDartDependencyData2(Source source, DataDescriptor descriptor, Object defaultValue) {
-    DartEntry dartEntry = _getReadableDartEntry(source);
-    if (dartEntry == null) {
-      return defaultValue;
-    }
-    try {
-      return _getDartDependencyData(source, dartEntry, descriptor);
-    } on ObsoleteSourceAnalysisException catch (exception) {
-      AnalysisEngine.instance.logger.logInformation2("Could not compute ${descriptor.toString()}", exception);
-      return defaultValue;
-    }
-  }
-
-  /**
    * Given a source for a Dart file and the library that contains it, return the data represented by
    * the given descriptor that is associated with that source. This method assumes that the data can
    * be produced by generating hints for the library if it is not already cached.
@@ -5558,6 +5442,8 @@
    * the given descriptor that is associated with that source. This method assumes that the data can
    * be produced by verifying the source within the given library if it is not already cached.
    *
+   * <b>Note:</b> This method cannot be used in an async environment.
+   *
    * @param unitSource the source representing the Dart file
    * @param librarySource the source representing the library containing the Dart file
    * @param dartEntry the entry representing the Dart file
@@ -5669,7 +5555,7 @@
     // Look for a priority source that needs to be analyzed.
     //
     for (Source source in _priorityOrder) {
-      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, true, hintsEnabled, sdkErrorsEnabled);
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), true, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
@@ -5680,18 +5566,23 @@
     //
     // Look for a non-priority source that needs to be analyzed.
     //
-    Source source = _workManager.nextSource;
-    while (source != null) {
-      AnalysisContextImpl_TaskData taskData = _getNextNondependentAnalysisTask(source, false, hintsEnabled, sdkErrorsEnabled);
+    List<Source> sourcesToRemove = new List<Source>();
+    WorkManager_WorkIterator sources = _workManager.iterator();
+    while (sources.hasNext) {
+      Source source = sources.next();
+      AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), false, hintsEnabled, sdkErrorsEnabled);
       AnalysisTask task = taskData.task;
       if (task != null) {
         return task;
       } else if (taskData.isBlocked) {
         hasBlockedTask = true;
       } else {
-        _workManager.remove(source);
+        sourcesToRemove.add(source);
       }
-      source = _workManager.nextSource;
+    }
+    int count = sourcesToRemove.length;
+    for (int i = 0; i < count; i++) {
+      _workManager.remove(sourcesToRemove[i]);
     }
     //      //
     //      // Look for a non-priority source that needs to be analyzed and was missed by the loop above.
@@ -5706,6 +5597,7 @@
     //        }
     //      }
     if (hasBlockedTask) {
+      // All of the analysis work is blocked waiting for an asynchronous task to complete.
       return WaitForAsyncTask.instance;
     }
     return null;
@@ -5728,7 +5620,7 @@
    */
   AnalysisContextImpl_TaskData _getNextAnalysisTaskForSource(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
     if (sourceEntry == null) {
-      return new AnalysisContextImpl_TaskData(null, false, null);
+      return new AnalysisContextImpl_TaskData(null, false);
     }
     CacheState contentState = sourceEntry.getState(SourceEntry.CONTENT);
     if (identical(contentState, CacheState.INVALID)) {
@@ -5736,7 +5628,10 @@
     } else if (identical(contentState, CacheState.IN_PROCESS)) {
       // We are already in the process of getting the content. There's nothing else we can do with
       // this source until that's complete.
-      return new AnalysisContextImpl_TaskData(null, true, null);
+      return new AnalysisContextImpl_TaskData(null, true);
+    } else if (identical(contentState, CacheState.ERROR)) {
+      // We have done all of the analysis we can for this source because we cannot get its content.
+      return new AnalysisContextImpl_TaskData(null, false);
     }
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
@@ -5754,10 +5649,6 @@
           return _createParseDartTask(source, dartEntry);
         }
       }
-      CacheState exportState = dartEntry.getState(DartEntry.EXPORTED_LIBRARIES);
-      if (identical(exportState, CacheState.INVALID) || (isPriority && identical(exportState, CacheState.FLUSHED))) {
-        return _createResolveDartDependenciesTask(source, dartEntry);
-      }
       List<Source> librariesContaining = dartEntry.getValue(DartEntry.CONTAINING_LIBRARIES);
       for (Source librarySource in librariesContaining) {
         SourceEntry libraryEntry = _cache.get(librarySource);
@@ -5767,7 +5658,7 @@
             DartEntryImpl libraryCopy = libraryEntry.writableCopy;
             libraryCopy.setState(DartEntry.ELEMENT, CacheState.IN_PROCESS);
             _cache.put(librarySource, libraryCopy);
-            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
           }
           CacheState resolvedUnitState = dartEntry.getStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource);
           if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
@@ -5782,7 +5673,7 @@
             dartCopy.setStateInLibrary(DartEntry.RESOLVED_UNIT, librarySource, CacheState.IN_PROCESS);
             _cache.put(source, dartCopy);
             //return new ResolveDartUnitTask(this, source, libraryElement);
-            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false, null);
+            return new AnalysisContextImpl_TaskData(new ResolveDartLibraryTask(this, source, librarySource), false);
           }
           if (sdkErrorsEnabled || !source.isInSystemLibrary) {
             CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
@@ -5792,7 +5683,7 @@
                 DartEntryImpl dartCopy = dartEntry.writableCopy;
                 dartCopy.setStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource, CacheState.IN_PROCESS);
                 _cache.put(source, dartCopy);
-                return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false, null);
+                return new AnalysisContextImpl_TaskData(new GenerateDartErrorsTask(this, source, libraryElement), false);
               }
             }
             if (hintsEnabled) {
@@ -5803,7 +5694,7 @@
                   DartEntryImpl dartCopy = dartEntry.writableCopy;
                   dartCopy.setStateInLibrary(DartEntry.HINTS, librarySource, CacheState.IN_PROCESS);
                   _cache.put(source, dartCopy);
-                  return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false, null);
+                  return new AnalysisContextImpl_TaskData(new GenerateDartHintsTask(this, libraryElement), false);
                 }
               }
             }
@@ -5826,50 +5717,23 @@
       if (identical(resolvedUnitState, CacheState.INVALID) || (isPriority && identical(resolvedUnitState, CacheState.FLUSHED))) {
         return _createResolveHtmlTask(source, htmlEntry);
       }
+      //
       // Angular support
+      //
       if (_options.analyzeAngular) {
-        // try to resolve as an Angular entry point
+        // Try to resolve the HTML as an Angular entry point.
         CacheState angularEntryState = htmlEntry.getState(HtmlEntry.ANGULAR_ENTRY);
         if (identical(angularEntryState, CacheState.INVALID)) {
-          if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return _createResolveHtmlTask(source, htmlEntry);
-          }
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.setState(HtmlEntry.ANGULAR_ENTRY, CacheState.IN_PROCESS);
-          _cache.put(source, htmlCopy);
-          return new AnalysisContextImpl_TaskData(new ResolveAngularEntryHtmlTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT)), false, null);
+          return _createResolveAngularEntryHtmlTask(source, htmlEntry);
         }
-        // try to resolve as an Angular application part
+        // Try to resolve the HTML as an Angular application part.
         CacheState angularErrorsState = htmlEntry.getState(HtmlEntry.ANGULAR_ERRORS);
         if (identical(angularErrorsState, CacheState.INVALID)) {
-          if (htmlEntry.getState(HtmlEntry.RESOLVED_UNIT) != CacheState.VALID) {
-            return _createResolveHtmlTask(source, htmlEntry);
-          }
-          AngularApplication application = htmlEntry.getValue(HtmlEntry.ANGULAR_APPLICATION);
-          // try to resolve as an Angular template
-          AngularComponentElement component = htmlEntry.getValue(HtmlEntry.ANGULAR_COMPONENT);
-          HtmlEntryImpl htmlCopy = htmlEntry.writableCopy;
-          htmlCopy.setState(HtmlEntry.ANGULAR_ERRORS, CacheState.IN_PROCESS);
-          _cache.put(source, htmlCopy);
-          return new AnalysisContextImpl_TaskData(new ResolveAngularComponentTemplateTask(this, source, htmlCopy.modificationTime, htmlCopy.getValue(HtmlEntry.RESOLVED_UNIT), component, application), false, null);
+          return _createResolveAngularComponentTemplateTask(source, htmlEntry);
         }
       }
     }
-    return new AnalysisContextImpl_TaskData(null, false, null);
-  }
-
-  AnalysisContextImpl_TaskData _getNextNondependentAnalysisTask(Source source, bool isPriority, bool hintsEnabled, bool sdkErrorsEnabled) {
-    AnalysisContextImpl_TaskData taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
-    if (taskData.task != null || taskData.isBlocked) {
-      return taskData;
-    }
-    while (taskData.dependentSource != null) {
-      taskData = _getNextAnalysisTaskForSource(source, _cache.get(source), isPriority, hintsEnabled, sdkErrorsEnabled);
-      if (taskData.task != null || taskData.isBlocked) {
-        return taskData;
-      }
-    }
-    return new AnalysisContextImpl_TaskData(null, false, null);
+    return new AnalysisContextImpl_TaskData(null, false);
   }
 
   /**
@@ -6594,6 +6458,7 @@
           throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
         }
       }
+      _removeFromParts(source, dartEntry);
       DartEntryImpl dartCopy = dartEntry.writableCopy;
       if (thrownException == null) {
         if (task.hasPartOfDirective && !task.hasLibraryDirective) {
@@ -6605,8 +6470,21 @@
           dartCopy.containingLibrary = source;
           _workManager.add(source, SourcePriority.LIBRARY);
         }
+        List<Source> newParts = task.includedSources;
+        for (int i = 0; i < newParts.length; i++) {
+          Source partSource = newParts[i];
+          DartEntry partEntry = _getReadableDartEntry(partSource);
+          if (partEntry != null && partEntry != dartEntry) {
+            DartEntryImpl partCopy = partEntry.writableCopy;
+            partCopy.addContainingLibrary(source);
+            _cache.put(partSource, partCopy);
+          }
+        }
         dartCopy.setValue(DartEntry.PARSED_UNIT, task.compilationUnit);
         dartCopy.setValue(DartEntry.PARSE_ERRORS, task.errors);
+        dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
+        dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
+        dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
         _cache.storedAst(source);
         ChangeNoticeImpl notice = _getNotice(source);
         notice.setErrors(dartCopy.allErrors, dartCopy.getValue(SourceEntry.LINE_INFO));
@@ -6908,95 +6786,6 @@
   }
 
   /**
-   * Record the results produced by performing a [ResolveDartDependenciesTask]. If the results
-   * were computed from data that is now out-of-date, then the results will not be recorded.
-   *
-   * @param task the task that was performed
-   * @return an entry containing the computed results
-   * @throws AnalysisException if the results could not be recorded
-   */
-  DartEntry _recordResolveDartDependenciesTaskResults(ResolveDartDependenciesTask task) {
-    Source source = task.source;
-    AnalysisException thrownException = task.exception;
-    DartEntry dartEntry = null;
-    SourceEntry sourceEntry = _cache.get(source);
-    if (sourceEntry == null) {
-      throw new ObsoleteSourceAnalysisException(source);
-    } else if (sourceEntry is! DartEntry) {
-      // This shouldn't be possible because we should never have performed the task if the source
-      // didn't represent a Dart file, but check to be safe.
-      throw new AnalysisException.con1("Internal error: attempting to resolve Dart dependencies in a non-Dart file: ${source.fullName}");
-    }
-    dartEntry = sourceEntry as DartEntry;
-    int sourceTime = getModificationStamp(source);
-    int resultTime = task.modificationTime;
-    if (sourceTime == resultTime) {
-      if (dartEntry.modificationTime != sourceTime) {
-        // The source has changed without the context being notified. Simulate notification.
-        _sourceChanged(source);
-        dartEntry = _getReadableDartEntry(source);
-        if (dartEntry == null) {
-          throw new AnalysisException.con1("A Dart file became a non-Dart file: ${source.fullName}");
-        }
-      }
-      _removeFromParts(source, dartEntry);
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      if (thrownException == null) {
-        List<Source> newParts = task.includedSources;
-        for (int i = 0; i < newParts.length; i++) {
-          Source partSource = newParts[i];
-          DartEntry partEntry = _getReadableDartEntry(partSource);
-          if (partEntry != null && partEntry != dartEntry) {
-            DartEntryImpl partCopy = partEntry.writableCopy;
-            partCopy.addContainingLibrary(source);
-            _cache.put(partSource, partCopy);
-          }
-        }
-        dartCopy.setValue(DartEntry.EXPORTED_LIBRARIES, task.exportedSources);
-        dartCopy.setValue(DartEntry.IMPORTED_LIBRARIES, task.importedSources);
-        dartCopy.setValue(DartEntry.INCLUDED_PARTS, newParts);
-        dartCopy.setValue(DartEntry.DIRECTIVE_ERRORS, task.errors);
-      } else {
-        dartCopy.recordDependencyError();
-      }
-      dartCopy.exception = thrownException;
-      _cache.put(source, dartCopy);
-      dartEntry = dartCopy;
-    } else {
-      _logInformation2("Dependency resolution results discarded for ${_debuggingString(source)}; sourceTime = ${sourceTime}, resultTime = ${resultTime}, cacheTime = ${dartEntry.modificationTime}", thrownException);
-      DartEntryImpl dartCopy = dartEntry.writableCopy;
-      if (thrownException == null || resultTime >= 0) {
-        //
-        // The analysis was performed on out-of-date sources. Mark the cache so that the sources
-        // will be re-analyzed using the up-to-date sources.
-        //
-        //          dartCopy.recordDependencyNotInProcess();
-        _removeFromParts(source, dartEntry);
-        dartCopy.invalidateAllInformation();
-        dartCopy.modificationTime = sourceTime;
-        _cache.removedAst(source);
-        _workManager.add(source, SourcePriority.UNKNOWN);
-      } else {
-        //
-        // We could not determine whether the sources were up-to-date or out-of-date. Mark the
-        // cache so that we won't attempt to re-analyze the sources until there's a good chance
-        // that we'll be able to do so without error.
-        //
-        dartCopy.setState(DartEntry.EXPORTED_LIBRARIES, CacheState.ERROR);
-        dartCopy.setState(DartEntry.IMPORTED_LIBRARIES, CacheState.ERROR);
-        dartCopy.setState(DartEntry.INCLUDED_PARTS, CacheState.ERROR);
-      }
-      dartCopy.exception = thrownException;
-      _cache.put(source, dartCopy);
-      dartEntry = dartCopy;
-    }
-    if (thrownException != null) {
-      throw thrownException;
-    }
-    return dartEntry;
-  }
-
-  /**
    * Record the results produced by performing a [ResolveDartUnitTask]. If the results were
    * computed from data that is now out-of-date, then the results will not be recorded.
    *
@@ -7479,9 +7268,6 @@
   HtmlEntry visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task) => AnalysisContextImpl_this._recordResolveAngularEntryHtmlTaskResults(task);
 
   @override
-  DartEntry visitResolveDartDependenciesTask(ResolveDartDependenciesTask task) => AnalysisContextImpl_this._recordResolveDartDependenciesTaskResults(task);
-
-  @override
   DartEntry visitResolveDartLibraryTask(ResolveDartLibraryTask task) => AnalysisContextImpl_this.recordResolveDartLibraryTaskResults(task);
 
   @override
@@ -7533,7 +7319,7 @@
   /**
    * The task that is to be performed.
    */
-  final AnalysisTask task;
+  AnalysisTask task;
 
   /**
    * A flag indicating whether the associated source is blocked waiting for its contents to be
@@ -7542,20 +7328,14 @@
   bool _blocked = false;
 
   /**
-   * The source that needs to be analyzed before further progress can be made on the associated
-   * source.
-   */
-  final Source dependentSource;
-
-  /**
    * Initialize a newly created data holder.
    *
    * @param task the task that is to be performed
    * @param blocked `true` if the associated source is blocked waiting for its contents to
    *          be loaded
-   * @param dependentSource t
    */
-  AnalysisContextImpl_TaskData(this.task, bool blocked, this.dependentSource) {
+  AnalysisContextImpl_TaskData(AnalysisTask task, bool blocked) {
+    this.task = task;
     this._blocked = blocked;
   }
 
@@ -7577,12 +7357,12 @@
   /**
    * The analysis errors associated with a source, or `null` if there are no errors.
    */
-  final List<AnalysisError> errors;
+  List<AnalysisError> errors;
 
   /**
    * The line information associated with the errors, or `null` if there are no errors.
    */
-  final LineInfo lineInfo;
+  LineInfo lineInfo;
 
   /**
    * Initialize an newly created error info with the errors and line information
@@ -7590,7 +7370,10 @@
    * @param errors the errors as a result of analysis
    * @param lineinfo the line info for the errors
    */
-  AnalysisErrorInfoImpl(this.errors, this.lineInfo);
+  AnalysisErrorInfoImpl(List<AnalysisError> errors, LineInfo lineInfo) {
+    this.errors = errors;
+    this.lineInfo = lineInfo;
+  }
 }
 
 /**
@@ -7686,7 +7469,7 @@
   /**
    * The source for which the result is being reported.
    */
-  final Source source;
+  Source source;
 
   /**
    * The fully resolved AST that changed as a result of the analysis, or `null` if the AST was
@@ -7721,7 +7504,9 @@
    *
    * @param source the source for which the change is being reported
    */
-  ChangeNoticeImpl(this.source);
+  ChangeNoticeImpl(Source source) {
+    this.source = source;
+  }
 
   @override
   List<AnalysisError> get errors => _errors;
@@ -7930,15 +7715,6 @@
   }
 
   @override
-  Namespace getPublicNamespace2(Source source) {
-    if (source.isInSystemLibrary) {
-      return _sdkAnalysisContext.getPublicNamespace2(source);
-    } else {
-      return super.getPublicNamespace2(source);
-    }
-  }
-
-  @override
   CompilationUnit getResolvedCompilationUnit(Source unitSource, LibraryElement library) {
     if (unitSource.isInSystemLibrary) {
       return _sdkAnalysisContext.getResolvedCompilationUnit(unitSource, library);
@@ -8183,13 +7959,13 @@
     return cache;
   }
 
-  final Source librarySource;
+  Source librarySource;
 
-  final Source source;
+  Source source;
 
-  final String oldContents;
+  String oldContents;
 
-  final CompilationUnit resolvedUnit;
+  CompilationUnit resolvedUnit;
 
   String _newContents;
 
@@ -8199,7 +7975,11 @@
 
   int _newLength = 0;
 
-  IncrementalAnalysisCache(this.librarySource, this.source, this.resolvedUnit, this.oldContents, String newContents, int offset, int oldLength, int newLength) {
+  IncrementalAnalysisCache(Source librarySource, Source source, CompilationUnit resolvedUnit, String oldContents, String newContents, int offset, int oldLength, int newLength) {
+    this.librarySource = librarySource;
+    this.source = source;
+    this.resolvedUnit = resolvedUnit;
+    this.oldContents = oldContents;
     this._newContents = newContents;
     this._offset = offset;
     this._oldLength = oldLength;
@@ -8679,9 +8459,6 @@
   Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
 
   @override
-  Namespace getPublicNamespace2(Source source) => _basis.getPublicNamespace2(source);
-
-  @override
   List<Source> get refactoringUnsafeSources {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getRefactoringUnsafeSources");
     _checkThread(instrumentation);
@@ -9027,16 +8804,6 @@
   Namespace getPublicNamespace(LibraryElement library);
 
   /**
-   * Return a namespace containing mappings for all of the public names defined by the library
-   * defined by the given source.
-   *
-   * @param source the source defining the library whose public namespace is to be returned
-   * @return the public namespace corresponding to the library defined by the given source
-   * @throws AnalysisException if the public namespace could not be computed
-   */
-  Namespace getPublicNamespace2(Source source);
-
-  /**
    * Returns a statistics about this context.
    */
   AnalysisContentStatistics get statistics;
@@ -9298,12 +9065,28 @@
  */
 class ResolvableCompilationUnit extends TimestampedData<CompilationUnit> {
   /**
+   * The source of the compilation unit.
+   */
+  Source _source;
+
+  /**
    * Initialize a newly created holder to hold the given values.
    *
    * @param modificationTime the modification time of the source from which the AST was created
    * @param unit the AST that was created from the source
    */
-  ResolvableCompilationUnit(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+  ResolvableCompilationUnit.con1(int modificationTime, CompilationUnit unit) : super(modificationTime, unit);
+
+  /**
+   * Initialize a newly created holder to hold the given values.
+   *
+   * @param modificationTime the modification time of the source from which the AST was created
+   * @param unit the AST that was created from the source
+   * @param source the source of the compilation unit
+   */
+  ResolvableCompilationUnit.con2(int modificationTime, CompilationUnit unit, Source source) : super(modificationTime, unit) {
+    this._source = source;
+  }
 
   /**
    * Return the AST that was created from the source.
@@ -9311,6 +9094,13 @@
    * @return the AST that was created from the source
    */
   CompilationUnit get compilationUnit => data;
+
+  /**
+   * Return the source of the compilation unit.
+   *
+   * @return the source of the compilation unit
+   */
+  Source get source => _source;
 }
 
 /**
@@ -9337,7 +9127,7 @@
 
 /**
  * The enumerated type `Priority` defines the priority levels used to return sources in an
- * optimal order.
+ * optimal order. A smaller ordinal value equates to a higher priority.
  */
 class SourcePriority extends Enum<SourcePriority> {
   /**
@@ -9353,22 +9143,21 @@
   static final SourcePriority LIBRARY = new SourcePriority('LIBRARY', 1);
 
   /**
-   * Used for a Dart source that is known to be a part but whose library has not yet been
-   * resolved.
-   */
-  static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 2);
-
-  /**
    * Used for a Dart source whose kind is unknown.
    */
-  static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 3);
+  static final SourcePriority UNKNOWN = new SourcePriority('UNKNOWN', 2);
+
+  /**
+   * Used for a Dart source that is known to be a part but whose library has not yet been resolved.
+   */
+  static final SourcePriority NORMAL_PART = new SourcePriority('NORMAL_PART', 3);
 
   /**
    * Used for an HTML source.
    */
   static final SourcePriority HTML = new SourcePriority('HTML', 4);
 
-  static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, NORMAL_PART, UNKNOWN, HTML];
+  static final List<SourcePriority> values = [PRIORITY_PART, LIBRARY, UNKNOWN, NORMAL_PART, HTML];
 
   SourcePriority(String name, int ordinal) : super(name, ordinal);
 }
@@ -9381,12 +9170,12 @@
   /**
    * The modification time of the source from which the data was created.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The data that was created from the source.
    */
-  final E data;
+  E data;
 
   /**
    * Initialize a newly created holder to hold the given values.
@@ -9394,7 +9183,10 @@
    * @param modificationTime the modification time of the source from which the data was created
    * @param unit the data that was created from the source
    */
-  TimestampedData(this.modificationTime, this.data);
+  TimestampedData(int modificationTime, E data) {
+    this.modificationTime = modificationTime;
+    this.data = data;
+  }
 }
 
 /**
@@ -9420,14 +9212,14 @@
 
   /**
    * Record that the given source needs to be analyzed. The priority level is used to control when
-   * the source will be analyzed with respect to other sources.
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. If it was previously added with the same priority then it's
+   * position in the queue is unchanged.
    *
    * @param source the source that needs to be analyzed
    * @param priority the priority level of the source
    */
   void add(Source source, SourcePriority priority) {
-    // TODO(brianwilkerson) Optimize the order of the libraries so that libraries that depend on
-    // other libraries get analyzed after the other libraries.
     int queueCount = _workQueues.length;
     int ordinal = priority.ordinal;
     for (int i = 0; i < queueCount; i++) {
@@ -9443,22 +9235,42 @@
   }
 
   /**
-   * Return the next source for which some analysis work needs to be done.
+   * Record that the given source needs to be analyzed. The priority level is used to control when
+   * the source will be analyzed with respect to other sources. If the source was previously added
+   * then it's priority is updated. In either case, it will be analyzed before other sources of the
+   * same priority.
    *
-   * @return the next source for which some analysis work needs to be done
+   * @param source the source that needs to be analyzed
+   * @param priority the priority level of the source
    */
-  Source get nextSource {
+  void addFirst(Source source, SourcePriority priority) {
     int queueCount = _workQueues.length;
+    int ordinal = priority.ordinal;
     for (int i = 0; i < queueCount; i++) {
       List<Source> queue = _workQueues[i];
-      if (!queue.isEmpty) {
-        return queue[0];
+      if (i == ordinal) {
+        queue.remove(source);
+        queue.insert(0, source);
+      } else {
+        queue.remove(source);
       }
     }
-    return null;
   }
 
   /**
+   * Return an iterator that can be used to access the sources to be analyzed in the order in which
+   * they should be analyzed.
+   *
+   * <b>Note:</b> As with other iterators, no sources can be added or removed from this work manager
+   * while the iterator is being used. Unlike some implementations, however, the iterator will not
+   * detect when this requirement has been violated; it might work correctly, it might return the
+   * wrong source, or it might throw an exception.
+   *
+   * @return an iterator that can be used to access the next source to be analyzed
+   */
+  WorkManager_WorkIterator iterator() => new WorkManager_WorkIterator(this);
+
+  /**
    * Record that the given source is fully analyzed.
    *
    * @param source the source that is fully analyzed
@@ -9472,20 +9284,85 @@
 }
 
 /**
+ * Instances of the class `WorkIterator` implement an iterator that returns the sources in a
+ * work manager in the order in which they are to be analyzed.
+ */
+class WorkManager_WorkIterator {
+  final WorkManager WorkManager_this;
+
+  /**
+   * The index of the work queue through which we are currently iterating.
+   */
+  int _queueIndex = 0;
+
+  /**
+   * The index of the next element of the work queue to be returned.
+   */
+  int _index = -1;
+
+  /**
+   * Initialize a newly created iterator to be ready to return the first element in the iteration.
+   */
+  WorkManager_WorkIterator(this.WorkManager_this) {
+    _advance();
+  }
+
+  /**
+   * Return `true` if there is another [Source] available for processing.
+   *
+   * @return `true` if there is another [Source] available for processing
+   */
+  bool get hasNext => _queueIndex < WorkManager_this._workQueues.length;
+
+  /**
+   * Return the next [Source] available for processing and advance so that the returned
+   * source will not be returned again.
+   *
+   * @return the next [Source] available for processing
+   */
+  Source next() {
+    if (!hasNext) {
+      throw new NoSuchElementException();
+    }
+    Source source = WorkManager_this._workQueues[_queueIndex][_index];
+    _advance();
+    return source;
+  }
+
+  /**
+   * Increment the [index] and [queueIndex] so that they are either indicating the
+   * next source to be returned or are indicating that there are no more sources to be returned.
+   */
+  void _advance() {
+    _index++;
+    if (_index >= WorkManager_this._workQueues[_queueIndex].length) {
+      _index = 0;
+      _queueIndex++;
+      while (_queueIndex < WorkManager_this._workQueues.length && WorkManager_this._workQueues[_queueIndex].isEmpty) {
+        _queueIndex++;
+      }
+    }
+  }
+}
+
+/**
  * An [Expression] with optional [AngularFilterNode]s.
  */
 class AngularExpression {
   /**
    * The [Expression] to apply filters to.
    */
-  final Expression expression;
+  Expression expression;
 
   /**
    * The filters to apply.
    */
-  final List<AngularFilterNode> filters;
+  List<AngularFilterNode> filters;
 
-  AngularExpression(this.expression, this.filters);
+  AngularExpression(Expression expression, List<AngularFilterNode> filters) {
+    this.expression = expression;
+    this.filters = filters;
+  }
 
   /**
    * Return the offset of the character immediately following the last character of this node's
@@ -9539,19 +9416,22 @@
   /**
    * The [TokenType#COLON] token.
    */
-  final Token token;
+  Token token;
 
   /**
    * The argument expression.
    */
-  final Expression expression;
+  Expression expression;
 
   /**
    * The optional sub-[Expression]s.
    */
   List<Expression> subExpressions = Expression.EMPTY_ARRAY;
 
-  AngularFilterArgument(this.token, this.expression);
+  AngularFilterArgument(Token token, Expression expression) {
+    this.token = token;
+    this.expression = expression;
+  }
 }
 
 /**
@@ -9561,19 +9441,23 @@
   /**
    * The [TokenType#BAR] token.
    */
-  final Token token;
+  Token token;
 
   /**
    * The name of the filter.
    */
-  final SimpleIdentifier name;
+  SimpleIdentifier name;
 
   /**
    * The arguments for this filter.
    */
-  final List<AngularFilterArgument> arguments;
+  List<AngularFilterArgument> arguments;
 
-  AngularFilterNode(this.token, this.name, this.arguments);
+  AngularFilterNode(Token token, SimpleIdentifier name, List<AngularFilterArgument> arguments) {
+    this.token = token;
+    this.name = name;
+    this.arguments = arguments;
+  }
 }
 
 /**
@@ -10379,9 +10263,11 @@
   /**
    * The expression that is enclosed between the delimiters.
    */
-  final AngularExpression expression;
+  AngularExpression expression;
 
-  AngularXmlExpression(this.expression);
+  AngularXmlExpression(AngularExpression expression) {
+    this.expression = expression;
+  }
 
   @override
   ht.XmlExpression_Reference getReference(int offset) {
@@ -10714,7 +10600,7 @@
   /**
    * The context in which the task is to be performed.
    */
-  final InternalAnalysisContext context;
+  InternalAnalysisContext context;
 
   /**
    * The exception that was thrown while performing this task, or `null` if the task completed
@@ -10727,7 +10613,9 @@
    *
    * @param context the context in which the task is to be performed
    */
-  AnalysisTask(this.context);
+  AnalysisTask(InternalAnalysisContext context) {
+    this.context = context;
+  }
 
   /**
    * Use the given visitor to visit this task.
@@ -10876,15 +10764,6 @@
   E visitResolveAngularEntryHtmlTask(ResolveAngularEntryHtmlTask task);
 
   /**
-   * Visit a [ResolveDartDependenciesTask].
-   *
-   * @param task the task to be visited
-   * @return the result of visiting the task
-   * @throws AnalysisException if the visitor throws an exception for some reason
-   */
-  E visitResolveDartDependenciesTask(ResolveDartDependenciesTask task);
-
-  /**
    * Visit a [ResolveDartLibraryTask].
    *
    * @param task the task to be visited
@@ -10929,12 +10808,12 @@
   /**
    * The source for which errors and warnings are to be produced.
    */
-  final Source source;
+  Source source;
 
   /**
    * The element model for the library containing the source.
    */
-  final LibraryElement libraryElement;
+  LibraryElement libraryElement;
 
   /**
    * The time at which the contents of the source were last modified.
@@ -10953,7 +10832,10 @@
    * @param source the source for which errors and warnings are to be produced
    * @param libraryElement the element model for the library containing the source
    */
-  GenerateDartErrorsTask(InternalAnalysisContext context, this.source, this.libraryElement) : super(context);
+  GenerateDartErrorsTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+    this.source = source;
+    this.libraryElement = libraryElement;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartErrorsTask(this);
@@ -11012,7 +10894,7 @@
   /**
    * The element model for the library being analyzed.
    */
-  final LibraryElement libraryElement;
+  LibraryElement libraryElement;
 
   /**
    * A table mapping the sources that were analyzed to the hints that were generated for the
@@ -11026,7 +10908,9 @@
    * @param context the context in which the task is to be performed
    * @param libraryElement the element model for the library being analyzed
    */
-  GenerateDartHintsTask(InternalAnalysisContext context, this.libraryElement) : super(context);
+  GenerateDartHintsTask(InternalAnalysisContext context, LibraryElement libraryElement) : super(context) {
+    this.libraryElement = libraryElement;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitGenerateDartHintsTask(this);
@@ -11112,7 +10996,7 @@
   /**
    * The source to be read.
    */
-  final Source source;
+  Source source;
 
   /**
    * A flag indicating whether this task is complete.
@@ -11136,10 +11020,11 @@
    * @param source the source to be parsed
    * @param contentData the time-stamped contents of the source
    */
-  GetContentTask(InternalAnalysisContext context, this.source) : super(context) {
+  GetContentTask(InternalAnalysisContext context, Source source) : super(context) {
     if (source == null) {
       throw new IllegalArgumentException("Cannot get contents of null source");
     }
+    this.source = source;
   }
 
   @override
@@ -11195,7 +11080,7 @@
   /**
    * The information used to perform incremental analysis.
    */
-  final IncrementalAnalysisCache cache;
+  IncrementalAnalysisCache cache;
 
   /**
    * The compilation unit that was produced by incrementally updating the existing unit.
@@ -11208,7 +11093,9 @@
    * @param context the context in which the task is to be performed
    * @param cache the incremental analysis cache used to perform the analysis
    */
-  IncrementalAnalysisTask(InternalAnalysisContext context, this.cache) : super(context);
+  IncrementalAnalysisTask(InternalAnalysisContext context, IncrementalAnalysisCache cache) : super(context) {
+    this.cache = cache;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitIncrementalAnalysisTask(this);
@@ -11287,12 +11174,12 @@
   /**
    * The source to be parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The head of the token stream used for parsing.
@@ -11300,14 +11187,19 @@
   Token _tokenStream;
 
   /**
+   * The line information associated with the source.
+   */
+  LineInfo _lineInfo;
+
+  /**
    * The compilation unit that was produced by parsing the source.
    */
   CompilationUnit _unit;
 
   /**
-   * The errors that were produced by scanning and parsing the source.
+   * A flag indicating whether the source contains a 'library' directive.
    */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+  bool _containsLibraryDirective = false;
 
   /**
    * A flag indicating whether the source contains a 'part of' directive.
@@ -11315,9 +11207,29 @@
   bool _containsPartOfDirective = false;
 
   /**
-   * A flag indicating whether the source contains a 'library' directive.
+   * A set containing the sources referenced by 'export' directives.
    */
-  bool _containsLibraryDirective = false;
+  Set<Source> _exportedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'import' directives.
+   */
+  Set<Source> _importedSources = new Set<Source>();
+
+  /**
+   * A set containing the sources referenced by 'part' directives.
+   */
+  Set<Source> _includedSources = new Set<Source>();
+
+  /**
+   * The errors that were produced by scanning and parsing the source.
+   */
+  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
+
+  /**
+   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
+   */
+  static String _DART_EXT_SCHEME = "dart-ext:";
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -11326,9 +11238,13 @@
    * @param source the source to be parsed
    * @param modificationTime the time at which the contents of the source were last modified
    * @param tokenStream the head of the token stream used for parsing
+   * @param lineInfo the line information associated with the source
    */
-  ParseDartTask(InternalAnalysisContext context, this.source, this.modificationTime, Token tokenStream) : super(context) {
+  ParseDartTask(InternalAnalysisContext context, Source source, int modificationTime, Token tokenStream, LineInfo lineInfo) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._tokenStream = tokenStream;
+    this._lineInfo = lineInfo;
   }
 
   @override
@@ -11351,6 +11267,30 @@
   List<AnalysisError> get errors => _errors;
 
   /**
+   * Return an array containing the sources referenced by 'export' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'export' directives
+   */
+  List<Source> get exportedSources => _toArray(_exportedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'import' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'import' directives
+   */
+  List<Source> get importedSources => _toArray(_importedSources);
+
+  /**
+   * Return an array containing the sources referenced by 'part' directives, or an empty array if
+   * the task has not yet been performed or if an exception occurred.
+   *
+   * @return an array containing the sources referenced by 'part' directives
+   */
+  List<Source> get includedSources => _toArray(_includedSources);
+
+  /**
    * Return `true` if the source contains a 'library' directive, or `false` if the task
    * has not yet been performed or if an exception occurred.
    *
@@ -11376,29 +11316,93 @@
 
   @override
   void internalPerform() {
-    RecordingErrorListener errorListener = new RecordingErrorListener();
-    InternalAnalysisContext context = this.context;
     //
     // Then parse the token stream.
     //
     TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
     try {
+      RecordingErrorListener errorListener = new RecordingErrorListener();
       Parser parser = new Parser(source, errorListener);
       parser.parseFunctionBodies = context.analysisOptions.analyzeFunctionBodies;
       _unit = parser.parseCompilationUnit(_tokenStream);
+      _unit.lineInfo = _lineInfo;
       _errors = errorListener.getErrorsForSource(source);
       for (Directive directive in _unit.directives) {
-        if (directive is LibraryDirective) {
+        if (directive is ExportDirective) {
+          Source exportSource = _resolveSource(source, directive, errorListener);
+          if (exportSource != null) {
+            _exportedSources.add(exportSource);
+          }
+        } else if (directive is ImportDirective) {
+          Source importSource = _resolveSource(source, directive, errorListener);
+          if (importSource != null) {
+            _importedSources.add(importSource);
+          }
+        } else if (directive is LibraryDirective) {
           _containsLibraryDirective = true;
+        } else if (directive is PartDirective) {
+          Source partSource = _resolveSource(source, directive, errorListener);
+          if (partSource != null) {
+            _includedSources.add(partSource);
+          }
         } else if (directive is PartOfDirective) {
           _containsPartOfDirective = true;
         }
       }
-      _unit.lineInfo = context.getLineInfo(source);
     } finally {
       timeCounterParse.stop();
     }
   }
+
+  /**
+   * Return the result of resolving the URI of the given URI-based directive against the URI of the
+   * given library, or `null` if the URI is not valid.
+   *
+   * @param librarySource the source representing the library containing the directive
+   * @param directive the directive which URI should be resolved
+   * @param errorListener the error listener to which errors should be reported
+   * @return the result of resolving the URI against the URI of the library
+   */
+  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
+    StringLiteral uriLiteral = directive.uri;
+    if (uriLiteral is StringInterpolation) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
+      return null;
+    }
+    String uriContent = uriLiteral.stringValue.trim();
+    directive.uriContent = uriContent;
+    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
+      return null;
+    }
+    try {
+      String encodedUriContent = Uri.encodeFull(uriContent);
+      parseUriWithException(encodedUriContent);
+      AnalysisContext analysisContext = context;
+      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
+      if (!analysisContext.exists(source)) {
+        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
+      }
+      directive.source = source;
+      return source;
+    } on URISyntaxException catch (exception) {
+      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
+    }
+    return null;
+  }
+
+  /**
+   * Efficiently convert the given set of sources to an array.
+   *
+   * @param sources the set to be converted
+   * @return an array containing all of the sources in the given set
+   */
+  List<Source> _toArray(Set<Source> sources) {
+    int size = sources.length;
+    if (size == 0) {
+      return Source.EMPTY_ARRAY;
+    }
+    return new List.from(sources);
+  }
 }
 
 /**
@@ -11408,12 +11412,12 @@
   /**
    * The source to be parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The contents of the source.
@@ -11458,7 +11462,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ParseHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+  ParseHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._content = content;
   }
 
@@ -11572,12 +11578,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -11614,7 +11620,9 @@
    * @param component the component that uses this HTML template, not `null`
    * @param application the Angular application to resolve in context of
    */
-  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+  ResolveAngularComponentTemplateTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit, AngularComponentElement component, AngularApplication application) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
     this._component = component;
     this._application = application;
@@ -11665,12 +11673,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -11705,7 +11713,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+  ResolveAngularEntryHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
   }
 
@@ -11769,198 +11779,18 @@
 }
 
 /**
- * Instances of the class `ResolveDartDependenciesTask` resolve the import, export, and part
- * directives in a single source.
- */
-class ResolveDartDependenciesTask extends AnalysisTask {
-  /**
-   * The source containing the directives to be resolved.
-   */
-  final Source source;
-
-  /**
-   * The time at which the contents of the source were last modified.
-   */
-  final int modificationTime;
-
-  /**
-   * The compilation unit used to resolve the dependencies.
-   */
-  CompilationUnit _unit;
-
-  /**
-   * A set containing the sources referenced by 'export' directives.
-   */
-  Set<Source> _exportedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'import' directives.
-   */
-  Set<Source> _importedSources = new Set<Source>();
-
-  /**
-   * A set containing the sources referenced by 'part' directives.
-   */
-  Set<Source> _includedSources = new Set<Source>();
-
-  /**
-   * The errors that were produced by resolving the directives.
-   */
-  List<AnalysisError> _errors = AnalysisError.NO_ERRORS;
-
-  /**
-   * The prefix of a URI using the `dart-ext` scheme to reference a native code library.
-   */
-  static String _DART_EXT_SCHEME = "dart-ext:";
-
-  /**
-   * Initialize a newly created task to perform analysis within the given context.
-   *
-   * @param context the context in which the task is to be performed
-   * @param source the source to be parsed
-   * @param modificationTime the time at which the contents of the source were last modified
-   * @param unit the compilation unit used to resolve the dependencies
-   */
-  ResolveDartDependenciesTask(InternalAnalysisContext context, this.source, this.modificationTime, CompilationUnit unit) : super(context) {
-    this._unit = unit;
-  }
-
-  @override
-  accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartDependenciesTask(this);
-
-  /**
-   * Return the errors that were produced by resolving the directives, or an empty array if the task
-   * has not yet been performed or if an exception occurred.
-   *
-   * @return the errors that were produced by resolving the directives.
-   */
-  List<AnalysisError> get errors => _errors;
-
-  /**
-   * Return an array containing the sources referenced by 'export' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'export' directives
-   */
-  List<Source> get exportedSources => _toArray(_exportedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'import' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'import' directives
-   */
-  List<Source> get importedSources => _toArray(_importedSources);
-
-  /**
-   * Return an array containing the sources referenced by 'part' directives, or an empty array if
-   * the task has not yet been performed or if an exception occurred.
-   *
-   * @return an array containing the sources referenced by 'part' directives
-   */
-  List<Source> get includedSources => _toArray(_includedSources);
-
-  @override
-  String get taskDescription {
-    if (source == null) {
-      return "resolve dart dependencies null source";
-    }
-    return "resolve dart dependencies ${source.fullName}";
-  }
-
-  @override
-  void internalPerform() {
-    TimeCounter_TimeCounterHandle timeCounterParse = PerformanceStatistics.parse.start();
-    try {
-      RecordingErrorListener errorListener = new RecordingErrorListener();
-      for (Directive directive in _unit.directives) {
-        if (directive is ExportDirective) {
-          Source exportSource = _resolveSource(source, directive, errorListener);
-          if (exportSource != null) {
-            _exportedSources.add(exportSource);
-          }
-        } else if (directive is ImportDirective) {
-          Source importSource = _resolveSource(source, directive, errorListener);
-          if (importSource != null) {
-            _importedSources.add(importSource);
-          }
-        } else if (directive is PartDirective) {
-          Source partSource = _resolveSource(source, directive, errorListener);
-          if (partSource != null) {
-            _includedSources.add(partSource);
-          }
-        }
-      }
-      _errors = errorListener.errors;
-    } finally {
-      timeCounterParse.stop();
-    }
-  }
-
-  /**
-   * Return the result of resolving the URI of the given URI-based directive against the URI of the
-   * given library, or `null` if the URI is not valid.
-   *
-   * @param librarySource the source representing the library containing the directive
-   * @param directive the directive which URI should be resolved
-   * @param errorListener the error listener to which errors should be reported
-   * @return the result of resolving the URI against the URI of the library
-   */
-  Source _resolveSource(Source librarySource, UriBasedDirective directive, AnalysisErrorListener errorListener) {
-    StringLiteral uriLiteral = directive.uri;
-    if (uriLiteral is StringInterpolation) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_WITH_INTERPOLATION, []));
-      return null;
-    }
-    String uriContent = uriLiteral.stringValue.trim();
-    directive.uriContent = uriContent;
-    if (directive is ImportDirective && uriContent.startsWith(_DART_EXT_SCHEME)) {
-      return null;
-    }
-    try {
-      String encodedUriContent = Uri.encodeFull(uriContent);
-      parseUriWithException(encodedUriContent);
-      AnalysisContext analysisContext = context;
-      Source source = analysisContext.sourceFactory.resolveUri(librarySource, encodedUriContent);
-      if (!analysisContext.exists(source)) {
-        errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.URI_DOES_NOT_EXIST, [uriContent]));
-      }
-      directive.source = source;
-      return source;
-    } on URISyntaxException catch (exception) {
-      errorListener.onError(new AnalysisError.con2(librarySource, uriLiteral.offset, uriLiteral.length, CompileTimeErrorCode.INVALID_URI, [uriContent]));
-    }
-    return null;
-  }
-
-  /**
-   * Efficiently convert the given set of sources to an array.
-   *
-   * @param sources the set to be converted
-   * @return an array containing all of the sources in the given set
-   */
-  List<Source> _toArray(Set<Source> sources) {
-    int size = sources.length;
-    if (size == 0) {
-      return Source.EMPTY_ARRAY;
-    }
-    return new List.from(sources);
-  }
-}
-
-/**
- * Instances of the class `ResolveDartLibraryTask` parse a specific Dart library.
+ * Instances of the class `ResolveDartLibraryTask` resolve a specific Dart library.
  */
 class ResolveDartLibraryTask extends AnalysisTask {
   /**
    * The source representing the file whose compilation unit is to be returned.
    */
-  final Source unitSource;
+  Source unitSource;
 
   /**
    * The source representing the library to be resolved.
    */
-  final Source librarySource;
+  Source librarySource;
 
   /**
    * The library resolver holding information about the libraries that were resolved.
@@ -11974,7 +11804,10 @@
    * @param unitSource the source representing the file whose compilation unit is to be returned
    * @param librarySource the source representing the library to be resolved
    */
-  ResolveDartLibraryTask(InternalAnalysisContext context, this.unitSource, this.librarySource) : super(context);
+  ResolveDartLibraryTask(InternalAnalysisContext context, Source unitSource, Source librarySource) : super(context) {
+    this.unitSource = unitSource;
+    this.librarySource = librarySource;
+  }
 
   @override
   accept(AnalysisTaskVisitor visitor) => visitor.visitResolveDartLibraryTask(this);
@@ -12009,7 +11842,7 @@
   /**
    * The source that is to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The element model for the library containing the source.
@@ -12033,7 +11866,8 @@
    * @param source the source to be parsed
    * @param libraryElement the element model for the library containing the source
    */
-  ResolveDartUnitTask(InternalAnalysisContext context, this.source, LibraryElement libraryElement) : super(context) {
+  ResolveDartUnitTask(InternalAnalysisContext context, Source source, LibraryElement libraryElement) : super(context) {
+    this.source = source;
     this._libraryElement = libraryElement;
   }
 
@@ -12151,12 +11985,12 @@
   /**
    * The source to be resolved.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The HTML unit to be resolved.
@@ -12186,7 +12020,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param unit the HTML unit to be resolved
    */
-  ResolveHtmlTask(InternalAnalysisContext context, this.source, this.modificationTime, ht.HtmlUnit unit) : super(context) {
+  ResolveHtmlTask(InternalAnalysisContext context, Source source, int modificationTime, ht.HtmlUnit unit) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._unit = unit;
   }
 
@@ -12238,12 +12074,12 @@
   /**
    * The source to be scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The time at which the contents of the source were last modified.
    */
-  final int modificationTime;
+  int modificationTime = 0;
 
   /**
    * The contents of the source.
@@ -12273,7 +12109,9 @@
    * @param modificationTime the time at which the contents of the source were last modified
    * @param content the contents of the source
    */
-  ScanDartTask(InternalAnalysisContext context, this.source, this.modificationTime, String content) : super(context) {
+  ScanDartTask(InternalAnalysisContext context, Source source, int modificationTime, String content) : super(context) {
+    this.source = source;
+    this.modificationTime = modificationTime;
     this._content = content;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 3dc1b49..062dd0f 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -45,12 +45,12 @@
   /**
    * The name of the severity used when producing machine output.
    */
-  final String machineCode;
+  String machineCode;
 
   /**
    * The name of the severity used when producing readable output.
    */
-  final String displayName;
+  String displayName;
 
   /**
    * Initialize a newly created severity with the given names.
@@ -58,7 +58,10 @@
    * @param machineCode the name of the severity used when producing machine output
    * @param displayName the name of the severity used when producing readable output
    */
-  ErrorSeverity(String name, int ordinal, this.machineCode, this.displayName) : super(name, ordinal);
+  ErrorSeverity(String name, int ordinal, String machineCode, String displayName) : super(name, ordinal) {
+    this.machineCode = machineCode;
+    this.displayName = displayName;
+  }
 
   /**
    * Return the severity constant that represents the greatest severity.
@@ -376,7 +379,7 @@
   /**
    * The error code associated with the error.
    */
-  final ErrorCode errorCode;
+  ErrorCode errorCode;
 
   /**
    * The localized error message.
@@ -419,7 +422,9 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con1(this.source, this.errorCode, List<Object> arguments) {
+  AnalysisError.con1(Source source, ErrorCode errorCode, List<Object> arguments) {
+    this.source = source;
+    this.errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
   }
 
@@ -432,9 +437,11 @@
    * @param errorCode the error code to be associated with this error
    * @param arguments the arguments used to build the error message
    */
-  AnalysisError.con2(this.source, int offset, int length, this.errorCode, List<Object> arguments) {
+  AnalysisError.con2(Source source, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+    this.source = source;
     this._offset = offset;
     this._length = length;
+    this.errorCode = errorCode;
     this._message = JavaString.format(errorCode.message, arguments);
     String correctionTemplate = errorCode.correction;
     if (correctionTemplate != null) {
@@ -813,7 +820,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -826,7 +833,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HintCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  HintCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -834,7 +843,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HintCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  HintCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction3 = correction;
   }
 
@@ -951,14 +961,16 @@
   /**
    * The severity of this type of error.
    */
-  final ErrorSeverity severity;
+  ErrorSeverity severity;
 
   /**
    * Initialize a newly created error type to have the given severity.
    *
    * @param severity the severity of this type of error
    */
-  ErrorType(String name, int ordinal, this.severity) : super(name, ordinal);
+  ErrorType(String name, int ordinal, ErrorSeverity severity) : super(name, ordinal) {
+    this.severity = severity;
+  }
 
   String get displayName => name.toLowerCase().replaceAll('_', ' ');
 }
@@ -2274,7 +2286,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -2287,7 +2299,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  CompileTimeErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  CompileTimeErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2295,7 +2309,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  CompileTimeErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  CompileTimeErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction2 = correction;
   }
 
@@ -2347,7 +2362,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -2360,7 +2375,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  PubSuggestionCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  PubSuggestionCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -2368,7 +2385,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  PubSuggestionCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  PubSuggestionCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction5 = correction;
   }
 
@@ -3234,7 +3252,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3247,7 +3265,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  StaticWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3255,7 +3275,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  StaticWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction7 = correction;
   }
 
@@ -3321,7 +3342,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3334,7 +3355,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  HtmlWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  HtmlWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3342,7 +3365,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  HtmlWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  HtmlWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction4 = correction;
   }
 
@@ -3649,7 +3673,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -3662,7 +3686,9 @@
    *
    * @param message the message template used to create the message to be displayed for the error
    */
-  StaticTypeWarningCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  StaticTypeWarningCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -3670,7 +3696,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  StaticTypeWarningCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  StaticTypeWarningCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction6 = correction;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 534083b..12d0e2e 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -144,9 +144,11 @@
  * characters.
  */
 class RawXmlExpression extends XmlExpression {
-  final Expression expression;
+  Expression expression;
 
-  RawXmlExpression(this.expression);
+  RawXmlExpression(Expression expression) {
+    this.expression = expression;
+  }
 
   @override
   int get end => expression.end;
@@ -682,7 +684,7 @@
   /**
    * The source being scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The token pointing to the head of the linked list of tokens.
@@ -709,7 +711,8 @@
    *
    * @param source the source being scanned
    */
-  AbstractScanner(this.source) {
+  AbstractScanner(Source source) {
+    this.source = source;
     _tokens = new Token.con1(TokenType.EOF, -1);
     _tokens.setNext(_tokens);
     _tail = _tokens;
@@ -1183,9 +1186,11 @@
    * The lexeme that defines this type of token, or `null` if there is more than one possible
    * lexeme for this type of token.
    */
-  final String lexeme;
+  String lexeme;
 
-  TokenType(String name, int ordinal, this.lexeme) : super(name, ordinal);
+  TokenType(String name, int ordinal, String lexeme) : super(name, ordinal) {
+    this.lexeme = lexeme;
+  }
 }
 
 class TokenType_EOF extends TokenType {
@@ -1201,7 +1206,7 @@
 class XmlAttributeNode extends XmlNode {
   Token _name;
 
-  final Token equals;
+  Token equals;
 
   Token _value;
 
@@ -1215,8 +1220,9 @@
    * @param equals the equals sign or `null` if none
    * @param value the value token (not `null`)
    */
-  XmlAttributeNode(Token name, this.equals, Token value) {
+  XmlAttributeNode(Token name, Token equals, Token value) {
     this._name = name;
+    this.equals = equals;
     this._value = value;
   }
 
@@ -1368,7 +1374,7 @@
   /**
    * The source being parsed.
    */
-  final Source source;
+  Source source;
 
   /**
    * The next token to be parsed.
@@ -1380,7 +1386,9 @@
    *
    * @param source the source being parsed
    */
-  XmlParser(this.source);
+  XmlParser(Source source) {
+    this.source = source;
+  }
 
   /**
    * Create a node representing an attribute.
@@ -1636,7 +1644,7 @@
   /**
    * The starting [TokenType#LT] token (not `null`).
    */
-  final Token nodeStart;
+  Token nodeStart;
 
   /**
    * The [TokenType#TAG] token after the starting '&lt;' (not `null`).
@@ -1653,7 +1661,7 @@
    * `null`). The token may be the same token as [nodeEnd] if there are no child
    * [tagNodes].
    */
-  final Token attributeEnd;
+  Token attributeEnd;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1669,18 +1677,18 @@
    * the stream [TokenType#LT_SLASH] token after the content, or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT].
    */
-  final Token contentEnd;
+  Token contentEnd;
 
   /**
    * The closing [TokenType#TAG] after the child elements or `null` if there is no
    * content and the attributes ended with [TokenType#SLASH_GT]
    */
-  final Token closingTag;
+  Token closingTag;
 
   /**
    * The ending [TokenType#GT] or [TokenType#SLASH_GT] token (not `null`).
    */
-  final Token nodeEnd;
+  Token nodeEnd;
 
   /**
    * The expressions that are embedded in the tag's content.
@@ -1711,10 +1719,15 @@
    * @param nodeEnd the ending [TokenType#GT] or [TokenType#SLASH_GT] token (not
    *          `null`)
    */
-  XmlTagNode(this.nodeStart, Token tag, List<XmlAttributeNode> attributes, this.attributeEnd, List<XmlTagNode> tagNodes, this.contentEnd, this.closingTag, this.nodeEnd) {
+  XmlTagNode(Token nodeStart, Token tag, List<XmlAttributeNode> attributes, Token attributeEnd, List<XmlTagNode> tagNodes, Token contentEnd, Token closingTag, Token nodeEnd) {
+    this.nodeStart = nodeStart;
     this._tag = tag;
     this._attributes = becomeParentOfAll(attributes, ifEmpty: NO_ATTRIBUTES);
+    this.attributeEnd = attributeEnd;
     this._tagNodes = becomeParentOfAll(tagNodes, ifEmpty: NO_TAG_NODES);
+    this.contentEnd = contentEnd;
+    this.closingTag = closingTag;
+    this.nodeEnd = nodeEnd;
   }
 
   @override
@@ -1978,13 +1991,13 @@
   /**
    * The first token in the token stream that was parsed to form this HTML unit.
    */
-  final Token beginToken;
+  Token beginToken;
 
   /**
    * The last token in the token stream that was parsed to form this compilation unit. This token
    * should always have a type of [TokenType.EOF].
    */
-  final Token endToken;
+  Token endToken;
 
   /**
    * The tag nodes contained in the receiver (not `null`, contains no `null`s).
@@ -1999,8 +2012,10 @@
    * @param endToken the last token in the token stream which should be of type
    *          [TokenType.EOF]
    */
-  HtmlUnit(this.beginToken, List<XmlTagNode> tagNodes, this.endToken) {
+  HtmlUnit(Token beginToken, List<XmlTagNode> tagNodes, Token endToken) {
+    this.beginToken = beginToken;
     this._tagNodes = becomeParentOfAll(tagNodes);
+    this.endToken = endToken;
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index faeac7a..7d60cd8 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -36,7 +36,7 @@
   /**
    * The source being removed.
    */
-  final Source source;
+  Source source;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -45,9 +45,10 @@
    * @param context the [AnalysisContext] to remove source in
    * @param source the [Source] to remove from index
    */
-  RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, this.source) {
+  RemoveSourceOperation(IndexStore indexStore, AnalysisContext context, Source source) {
     this._indexStore = indexStore;
     this._context = context;
+    this.source = source;
   }
 
   @override
@@ -610,7 +611,7 @@
   /**
    * The compilation unit being indexed.
    */
-  final CompilationUnit unit;
+  CompilationUnit unit;
 
   /**
    * The element of the compilation unit being indexed.
@@ -629,9 +630,10 @@
    * @param context the context in which compilation unit was resolved
    * @param unit the fully resolved AST structure
    */
-  IndexUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+  IndexUnitOperation(IndexStore indexStore, AnalysisContext context, CompilationUnit unit) {
     this._indexStore = indexStore;
     this._context = context;
+    this.unit = unit;
     this._unitElement = unit.element;
     this._source = _unitElement.source;
   }
@@ -781,7 +783,7 @@
   /**
    * The source container to remove.
    */
-  final SourceContainer container;
+  SourceContainer container;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -790,9 +792,10 @@
    * @param context the [AnalysisContext] to remove container in
    * @param container the [SourceContainer] to remove from index
    */
-  RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, this.container) {
+  RemoveSourcesOperation(IndexStore indexStore, AnalysisContext context, SourceContainer container) {
     this._indexStore = indexStore;
     this._context = context;
+    this.container = container;
   }
 
   @override
@@ -2272,7 +2275,7 @@
   /**
    * The context being removed.
    */
-  final AnalysisContext context;
+  AnalysisContext context;
 
   /**
    * Initialize a newly created operation that will remove the specified resource.
@@ -2280,8 +2283,9 @@
    * @param indexStore the index store against which this operation is being run
    * @param context the [AnalysisContext] to remove
    */
-  RemoveContextOperation(IndexStore indexStore, this.context) {
+  RemoveContextOperation(IndexStore indexStore, AnalysisContext context) {
     this._indexStore = indexStore;
+    this.context = context;
   }
 
   @override
@@ -2317,7 +2321,7 @@
   /**
    * The [HtmlUnit] being indexed.
    */
-  final ht.HtmlUnit unit;
+  ht.HtmlUnit unit;
 
   /**
    * The element of the [HtmlUnit] being indexed.
@@ -2336,9 +2340,10 @@
    * @param context the context in which [HtmlUnit] was resolved
    * @param unit the fully resolved [HtmlUnit]
    */
-  IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, this.unit) {
+  IndexHtmlUnitOperation(IndexStore indexStore, AnalysisContext context, ht.HtmlUnit unit) {
     this._indexStore = indexStore;
     this._context = context;
+    this.unit = unit;
     this._htmlElement = unit.element;
     this._source = _htmlElement.source;
   }
@@ -2386,17 +2391,17 @@
   /**
    * The element containing this location.
    */
-  final Element element;
+  Element element;
 
   /**
    * The offset of this location within the resource containing the element.
    */
-  final int offset;
+  int offset = 0;
 
   /**
    * The length of this location.
    */
-  final int length;
+  int length = 0;
 
   /**
    * Internal field used to hold a key that is referenced at this location.
@@ -2411,10 +2416,13 @@
    * @param offset the offset of this location within the resource containing the element
    * @param length the length of this location
    */
-  Location(this.element, this.offset, this.length) {
+  Location(Element element, int offset, int length) {
     if (element == null) {
       throw new IllegalArgumentException("element location cannot be null");
     }
+    this.element = element;
+    this.offset = offset;
+    this.length = length;
   }
 
   /**
@@ -2440,18 +2448,21 @@
 class GetRelationshipsOperation implements IndexOperation {
   IndexStore _indexStore;
 
-  final Element element;
+  Element element;
 
-  final Relationship relationship;
+  Relationship relationship;
 
-  final RelationshipCallback callback;
+  RelationshipCallback callback;
 
   /**
    * Initialize a newly created operation that will access the locations that have a specified
    * relationship with a specified element.
    */
-  GetRelationshipsOperation(IndexStore indexStore, this.element, this.relationship, this.callback) {
+  GetRelationshipsOperation(IndexStore indexStore, Element element, Relationship relationship, RelationshipCallback callback) {
     this._indexStore = indexStore;
+    this.element = element;
+    this.relationship = relationship;
+    this.callback = callback;
   }
 
   @override
@@ -2475,11 +2486,15 @@
  * [Location] with attached data.
  */
 class LocationWithData<D> extends Location {
-  final D data;
+  D data;
 
-  LocationWithData.con1(Location location, this.data) : super(location.element, location.offset, location.length);
+  LocationWithData.con1(Location location, D data) : super(location.element, location.offset, location.length) {
+    this.data = data;
+  }
 
-  LocationWithData.con2(Element element, int offset, int length, this.data) : super(element, offset, length);
+  LocationWithData.con2(Element element, int offset, int length, D data) : super(element, offset, length) {
+    this.data = data;
+  }
 
   @override
   Location newClone() => new LocationWithData<D>.con2(element, offset, length, data);
diff --git a/pkg/analyzer/lib/src/generated/java_core.dart b/pkg/analyzer/lib/src/generated/java_core.dart
index 4c47b62..a6282eb 100644
--- a/pkg/analyzer/lib/src/generated/java_core.dart
+++ b/pkg/analyzer/lib/src/generated/java_core.dart
@@ -260,6 +260,10 @@
   String toString() => "UnsupportedOperationException";
 }
 
+class NoSuchElementException extends JavaException {
+  String toString() => "NoSuchElementException";
+}
+
 class NumberFormatException extends JavaException {
   String toString() => "NumberFormatException";
 }
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index dd2d982..16a7bc1 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -26,12 +26,12 @@
   /**
    * The documentation comment that was parsed, or `null` if none was given.
    */
-  final Comment comment;
+  Comment comment;
 
   /**
    * The metadata that was parsed.
    */
-  final List<Annotation> metadata;
+  List<Annotation> metadata;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -39,7 +39,10 @@
    * @param comment the documentation comment that was parsed
    * @param metadata the metadata that was parsed
    */
-  CommentAndMetadata(this.comment, this.metadata);
+  CommentAndMetadata(Comment comment, List<Annotation> metadata) {
+    this.comment = comment;
+    this.metadata = metadata;
+  }
 }
 
 /**
@@ -50,12 +53,12 @@
   /**
    * The 'final', 'const' or 'var' keyword, or `null` if none was given.
    */
-  final Token keyword;
+  Token keyword;
 
   /**
    * The type, of `null` if no type was specified.
    */
-  final TypeName type;
+  TypeName type;
 
   /**
    * Initialize a newly created holder with the given data.
@@ -63,7 +66,10 @@
    * @param keyword the 'final', 'const' or 'var' keyword
    * @param type the type
    */
-  FinalConstVarOrType(this.keyword, this.type);
+  FinalConstVarOrType(Token keyword, TypeName type) {
+    this.keyword = keyword;
+    this.type = type;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 6137bf0..9ec0164 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -7671,14 +7671,16 @@
   /**
    * The name of the synthetic identifier.
    */
-  final String name;
+  String name;
 
   /**
    * Initialize a newly created synthetic identifier to have the given name.
    *
    * @param name the name of the synthetic identifier
    */
-  ElementResolver_SyntheticIdentifier(this.name);
+  ElementResolver_SyntheticIdentifier(String name) {
+    this.name = name;
+  }
 
   @override
   accept(AstVisitor visitor) => null;
@@ -8731,7 +8733,7 @@
   /**
    * The source specifying the defining compilation unit of this library.
    */
-  final Source librarySource;
+  Source librarySource;
 
   /**
    * The library element representing this library.
@@ -8786,9 +8788,10 @@
    * @param errorListener the listener to which analysis errors will be reported
    * @param librarySource the source specifying the defining compilation unit of this library
    */
-  Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, this.librarySource) {
+  Library(InternalAnalysisContext analysisContext, AnalysisErrorListener errorListener, Source librarySource) {
     this._analysisContext = analysisContext;
     this._errorListener = errorListener;
+    this.librarySource = librarySource;
     this._libraryElement = analysisContext.getLibraryElement(librarySource) as LibraryElementImpl;
   }
 
@@ -8978,7 +8981,7 @@
    * @param unit the AST structure associated with the defining compilation unit for this library
    */
   void setDefiningCompilationUnit(int modificationStamp, CompilationUnit unit) {
-    _astMap[librarySource] = new ResolvableCompilationUnit(modificationStamp, unit);
+    _astMap[librarySource] = new ResolvableCompilationUnit.con1(modificationStamp, unit);
   }
 
   /**
@@ -9223,7 +9226,7 @@
   /**
    * The analysis context in which the libraries are being analyzed.
    */
-  final InternalAnalysisContext analysisContext;
+  InternalAnalysisContext analysisContext;
 
   /**
    * The listener to which analysis errors will be reported, this error listener is either
@@ -9262,7 +9265,8 @@
    *
    * @param analysisContext the analysis context in which the library is being analyzed
    */
-  LibraryResolver(this.analysisContext) {
+  LibraryResolver(InternalAnalysisContext analysisContext) {
+    this.analysisContext = analysisContext;
     this._errorListener = new RecordingErrorListener();
     _coreLibrarySource = analysisContext.sourceFactory.forUri(DartSdk.DART_CORE);
   }
@@ -10126,7 +10130,7 @@
   /**
    * The conditional analysis error.
    */
-  final AnalysisError analysisError;
+  AnalysisError analysisError;
 
   /**
    * Instantiate a new [ProxyConditionalAnalysisError] with some enclosing element and the
@@ -10135,8 +10139,9 @@
    * @param enclosingElement the enclosing element
    * @param analysisError the conditional analysis error
    */
-  ProxyConditionalAnalysisError(Element enclosingElement, this.analysisError) {
+  ProxyConditionalAnalysisError(Element enclosingElement, AnalysisError analysisError) {
     this._enclosingElement = enclosingElement;
+    this.analysisError = analysisError;
   }
 
   /**
@@ -11471,7 +11476,7 @@
   /**
    * The source representing the compilation unit being visited.
    */
-  final Source source;
+  Source source;
 
   /**
    * The error listener that will be informed of any errors that are found during resolution.
@@ -11486,7 +11491,7 @@
   /**
    * The object used to access the types from the core library.
    */
-  final TypeProvider typeProvider;
+  TypeProvider typeProvider;
 
   /**
    * The scope used to resolve labels for `break` and `continue` statements, or
@@ -11501,11 +11506,13 @@
    * @param source the source representing the compilation unit being visited
    * @param typeProvider the object used to access the types from the core library
    */
-  ScopedVisitor.con1(Library library, this.source, this.typeProvider) {
+  ScopedVisitor.con1(Library library, Source source, TypeProvider typeProvider) {
     this._definingLibrary = library.libraryElement;
+    this.source = source;
     LibraryScope libraryScope = library.libraryScope;
     this._errorListener = libraryScope.errorListener;
     this._nameScope = libraryScope;
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -11518,10 +11525,12 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con2(LibraryElement definingLibrary, this.source, this.typeProvider, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con2(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = new LibraryScope(definingLibrary, errorListener);
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -11535,10 +11544,12 @@
    * @param errorListener the error listener that will be informed of any errors that are found
    *          during resolution
    */
-  ScopedVisitor.con3(LibraryElement definingLibrary, this.source, this.typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
+  ScopedVisitor.con3(LibraryElement definingLibrary, Source source, TypeProvider typeProvider, Scope nameScope, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.source = source;
     this._errorListener = errorListener;
     this._nameScope = nameScope;
+    this.typeProvider = typeProvider;
   }
 
   /**
@@ -15783,7 +15794,7 @@
   /**
    * The scope in which this scope is lexically enclosed.
    */
-  final Scope enclosingScope;
+  Scope enclosingScope;
 
   /**
    * A table mapping names that will be defined in this scope, but right now are not initialized.
@@ -15802,7 +15813,9 @@
    *
    * @param enclosingScope the scope in which this scope is lexically enclosed
    */
-  EnclosedScope(this.enclosingScope);
+  EnclosedScope(Scope enclosingScope) {
+    this.enclosingScope = enclosingScope;
+  }
 
   @override
   AnalysisErrorListener get errorListener => enclosingScope.errorListener;
@@ -16017,7 +16030,7 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  final AnalysisErrorListener errorListener;
+  AnalysisErrorListener errorListener;
 
   /**
    * A list of the namespaces representing the names that are available in this scope from imported
@@ -16032,8 +16045,9 @@
    *          this scope
    * @param errorListener the listener that is to be informed when an error is encountered
    */
-  LibraryImportScope(LibraryElement definingLibrary, this.errorListener) {
+  LibraryImportScope(LibraryElement definingLibrary, AnalysisErrorListener errorListener) {
     this._definingLibrary = definingLibrary;
+    this.errorListener = errorListener;
     _createImportedNamespaces(definingLibrary);
   }
 
@@ -20712,8 +20726,6 @@
       if (executableElt.enclosingElement != null && (executableElt.enclosingElement as ClassElement).type.isObject) {
         continue;
       }
-      // Reference the type of the enclosing class
-      InterfaceType enclosingType = _enclosingClass.type;
       // Check to see if some element is in local enclosing class that matches the name of the
       // required member.
       if (_isMemberInClassOrMixin(executableElt, _enclosingClass)) {
@@ -20724,9 +20736,16 @@
       }
       // First check to see if this element was declared in the superclass chain, in which case
       // there is already a concrete implementation.
-      ExecutableElement elt = membersInheritedFromSuperclasses.get(executableElt.name);
+      ExecutableElement elt = membersInheritedFromSuperclasses.get(memberName);
       // Check to see if an element was found in the superclass chain with the correct name.
       if (elt != null) {
+        // Reference the types, if any are null then continue.
+        InterfaceType enclosingType = _enclosingClass.type;
+        FunctionType concreteType = elt.type;
+        FunctionType requiredMemberType = executableElt.type;
+        if (enclosingType == null || concreteType == null || requiredMemberType == null) {
+          continue;
+        }
         // Some element was found in the superclass chain that matches the name of the required
         // member.
         // If it is not abstract and it is the correct one (types match- the version of this method
@@ -20735,8 +20754,8 @@
         if ((elt is MethodElement && !elt.isAbstract) || (elt is PropertyAccessorElement && !elt.isAbstract)) {
           // Since we are comparing two function types, we need to do the appropriate type
           // substitutions first ().
-          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(elt.type, executableElt.name, enclosingType);
-          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(executableElt.type, executableElt.name, enclosingType);
+          FunctionType foundConcreteFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(concreteType, memberName, enclosingType);
+          FunctionType requiredMemberFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance(requiredMemberType, memberName, enclosingType);
           if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
             continue;
           }
@@ -22100,12 +22119,12 @@
   /**
    * The type of this error.
    */
-  final ErrorType type;
+  ErrorType type;
 
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -22119,7 +22138,10 @@
    * @param type the type of this error
    * @param message the message template used to create the message to be displayed for the error
    */
-  ResolverErrorCode.con1(String name, int ordinal, this.type, this.message) : super(name, ordinal);
+  ResolverErrorCode.con1(String name, int ordinal, ErrorType type, String message) : super(name, ordinal) {
+    this.type = type;
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given type, message and correction.
@@ -22128,7 +22150,9 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ResolverErrorCode.con2(String name, int ordinal, this.type, this.message, String correction) : super(name, ordinal) {
+  ResolverErrorCode.con2(String name, int ordinal, ErrorType type, String message, String correction) : super(name, ordinal) {
+    this.type = type;
+    this.message = message;
     this.correction9 = correction;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index efb01ff..ef03a42 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -163,7 +163,7 @@
   /**
    * The template used to create the message to be displayed for this error.
    */
-  final String message;
+  String message;
 
   /**
    * The template used to create the correction to be displayed for this error, or `null` if
@@ -176,7 +176,9 @@
    *
    * @param message the message template used to create the message to be displayed for this error
    */
-  ScannerErrorCode.con1(String name, int ordinal, this.message) : super(name, ordinal);
+  ScannerErrorCode.con1(String name, int ordinal, String message) : super(name, ordinal) {
+    this.message = message;
+  }
 
   /**
    * Initialize a newly created error code to have the given message and correction.
@@ -184,7 +186,8 @@
    * @param message the template used to create the message to be displayed for the error
    * @param correction the template used to create the correction to be displayed for the error
    */
-  ScannerErrorCode.con2(String name, int ordinal, this.message, String correction) : super(name, ordinal) {
+  ScannerErrorCode.con2(String name, int ordinal, String message, String correction) : super(name, ordinal) {
+    this.message = message;
     this.correction10 = correction;
   }
 
@@ -795,7 +798,7 @@
   /**
    * The source being scanned.
    */
-  final Source source;
+  Source source;
 
   /**
    * The reader used to access the characters in the source.
@@ -865,7 +868,8 @@
    * @param reader the character reader used to read the characters in the source
    * @param errorListener the error listener that will be informed of any errors that are found
    */
-  Scanner(this.source, CharacterReader reader, AnalysisErrorListener errorListener) {
+  Scanner(Source source, CharacterReader reader, AnalysisErrorListener errorListener) {
+    this.source = source;
     this._reader = reader;
     this._errorListener = errorListener;
     _tokens = new Token(TokenType.EOF, -1);
@@ -1927,7 +1931,7 @@
   /**
    * The type of the token.
    */
-  final TokenType type;
+  TokenType type;
 
   /**
    * The offset from the beginning of the file to the first character in the token.
@@ -1950,7 +1954,8 @@
    * @param type the type of the token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  Token(this.type, int offset) {
+  Token(TokenType type, int offset) {
+    this.type = type;
     this.offset = offset;
   }
 
@@ -2198,7 +2203,7 @@
   /**
    * The keyword being represented by this token.
    */
-  final Keyword keyword;
+  Keyword keyword;
 
   /**
    * Initialize a newly created token to represent the given keyword.
@@ -2206,7 +2211,9 @@
    * @param keyword the keyword being represented by this token
    * @param offset the offset from the beginning of the file to the first character in the token
    */
-  KeywordToken(this.keyword, int offset) : super(TokenType.KEYWORD, offset);
+  KeywordToken(Keyword keyword, int offset) : super(TokenType.KEYWORD, offset) {
+    this.keyword = keyword;
+  }
 
   @override
   Token copy() => new KeywordToken(keyword, offset);
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 288677b..446c8ea 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -496,14 +496,16 @@
   /**
    * The single character encoding used to identify this kind of URI.
    */
-  final int encoding;
+  int encoding = 0;
 
   /**
    * Initialize a newly created URI kind to have the given encoding.
    *
    * @param encoding the single character encoding used to identify this kind of URI.
    */
-  UriKind(String name, int ordinal, this.encoding) : super(name, ordinal);
+  UriKind(String name, int ordinal, int encoding) : super(name, ordinal) {
+    this.encoding = encoding;
+  }
 }
 
 /**
@@ -519,13 +521,13 @@
    * The 0-based index of the first character of the source code for this element, relative to the
    * source buffer in which this element is contained.
    */
-  final int offset;
+  int offset = 0;
 
   /**
    * The number of characters of the source code for this element, relative to the source buffer in
    * which this element is contained.
    */
-  final int length;
+  int length = 0;
 
   /**
    * Initialize a newly created source range using the given offset and the given length.
@@ -533,7 +535,10 @@
    * @param offset the given offset
    * @param length the given length
    */
-  SourceRange(this.offset, this.length);
+  SourceRange(int offset, int length) {
+    this.offset = offset;
+    this.length = length;
+  }
 
   /**
    * @return `true` if <code>x</code> is in [offset, offset + length) interval.
@@ -753,12 +758,12 @@
   /**
    * The one-based index of the line containing the character.
    */
-  final int lineNumber;
+  int lineNumber = 0;
 
   /**
    * The one-based index of the column containing the character.
    */
-  final int columnNumber;
+  int columnNumber = 0;
 
   /**
    * Initialize a newly created location to represent the location of the character at the given
@@ -767,7 +772,10 @@
    * @param lineNumber the one-based index of the line containing the character
    * @param columnNumber the one-based index of the column containing the character
    */
-  LineInfo_Location(this.lineNumber, this.columnNumber);
+  LineInfo_Location(int lineNumber, int columnNumber) {
+    this.lineNumber = lineNumber;
+    this.columnNumber = columnNumber;
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/utilities_dart.dart b/pkg/analyzer/lib/src/generated/utilities_dart.dart
index aef7473..a9bddb5 100644
--- a/pkg/analyzer/lib/src/generated/utilities_dart.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_dart.dart
@@ -26,12 +26,14 @@
   /**
    * A flag indicating whether this is an optional parameter.
    */
-  final bool isOptional;
+  bool isOptional = false;
 
   /**
    * Initialize a newly created kind with the given state.
    *
    * @param isOptional `true` if this is an optional parameter
    */
-  ParameterKind(String name, int ordinal, this.isOptional) : super(name, ordinal);
+  ParameterKind(String name, int ordinal, bool isOptional) : super(name, ordinal) {
+    this.isOptional = isOptional;
+  }
 }
\ No newline at end of file
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 9b33aa2..f5d2ae8 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.13.0-dev.7
+version: 0.13.0-dev.9
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index d49726d..7315085 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -23527,9 +23527,11 @@
   /**
    * The listener that is to be informed when an error is encountered.
    */
-  final AnalysisErrorListener errorListener;
+  AnalysisErrorListener errorListener;
 
-  ScopeTest_TestScope(this.errorListener);
+  ScopeTest_TestScope(AnalysisErrorListener errorListener) {
+    this.errorListener = errorListener;
+  }
 
   @override
   Element internalLookup(Identifier identifier, String name, LibraryElement referencingLibrary) => localLookup(name, referencingLibrary);
diff --git a/pkg/barback/CHANGELOG.md b/pkg/barback/CHANGELOG.md
index c355a35..753e5a1 100644
--- a/pkg/barback/CHANGELOG.md
+++ b/pkg/barback/CHANGELOG.md
@@ -4,6 +4,9 @@
   default. When using Barback with pub in verbose mode, these messages will be
   printed.
 
+* Add a `Transform.hasInput` function that returns whether or not a given
+  secondary input exists.
+
 * `Transformer.allowedExtensions` now supports extensions containing multiple
   periods, such as `.dart.js`.
 
@@ -22,3 +25,8 @@
   considered to have failed after it finishes running `apply()`. This means that
   its outputs will not be consumed by future transformers and its primary input
   will not be passed through to the next phase.
+
+* If a transform calls `Transform.getInput`, `Transform.readInput`,
+  `Transform.readInputAsString`, or `Transform.hasInput` on an input that
+  doesn't exist, the transform will be re-run if that input is created in the
+  future.
diff --git a/pkg/barback/lib/src/asset_cascade.dart b/pkg/barback/lib/src/asset_cascade.dart
index b87ca39..74db0d9 100644
--- a/pkg/barback/lib/src/asset_cascade.dart
+++ b/pkg/barback/lib/src/asset_cascade.dart
@@ -48,8 +48,17 @@
   /// one.
   final _loadingSources = new Map<AssetId, CancelableFuture<Asset>>();
 
+  /// The list of phases in this cascade.
+  ///
+  /// This will always contain at least one phase, and the first phase will
+  /// never have any transformers. This ensures that every transformer can
+  /// request inputs from a previous phase.
   final _phases = <Phase>[];
 
+  /// The subscription to the [Phase.onDone] stream of the last [Phase] in
+  /// [_phases].
+  StreamSubscription _phaseOnDoneSubscription;
+
   /// A stream that emits any errors from the cascade or the transformers.
   ///
   /// This emits errors as they're detected. If an error occurs in one part of
@@ -169,9 +178,12 @@
   void updateTransformers(Iterable<Iterable> transformersIterable) {
     var transformers = transformersIterable.toList();
 
+    // Always preserve a single phase with no transformers at the beginning of
+    // the cascade so that [TransformNode]s in the first populated phase will
+    // have something to request assets from.
     for (var i = 0; i < transformers.length; i++) {
-      if (_phases.length > i) {
-        _phases[i].updateTransformers(transformers[i]);
+      if (_phases.length > i + 1) {
+        _phases[i + 1].updateTransformers(transformers[i]);
         continue;
       }
 
@@ -180,12 +192,14 @@
       phase.updateTransformers(transformers[i]);
     }
 
-    if (transformers.length == 0) {
-      _phases.last.updateTransformers([]);
-    } else if (transformers.length < _phases.length) {
-      _phases[transformers.length - 1].removeFollowing();
-      _phases.removeRange(transformers.length, _phases.length);
+    for (var i = transformers.length + 1; i < _phases.length; i++) {
+      _phases[i].remove();
     }
+    _phases.removeRange(transformers.length + 1, _phases.length);
+
+    _phaseOnDoneSubscription.cancel();
+    _phaseOnDoneSubscription = _phases.last.onDone
+        .listen(_onDoneController.add);
   }
 
   /// Force all [LazyTransformer]s' transforms in this cascade to begin
@@ -203,9 +217,8 @@
   /// Add [phase] to the end of [_phases] and watch its streams.
   void _addPhase(Phase phase) {
     _onLogPool.add(phase.onLog);
-    phase.onDone.listen((_) {
-      if (!isDirty) _onDoneController.add(null);
-    });
+    if (_phaseOnDoneSubscription != null) _phaseOnDoneSubscription.cancel();
+    _phaseOnDoneSubscription = phase.onDone.listen(_onDoneController.add);
 
     _phases.add(phase);
   }
diff --git a/pkg/barback/lib/src/base_transform.dart b/pkg/barback/lib/src/base_transform.dart
index ea85f02..c0de0f8 100644
--- a/pkg/barback/lib/src/base_transform.dart
+++ b/pkg/barback/lib/src/base_transform.dart
@@ -110,6 +110,17 @@
   Stream<List<int>> readInput(AssetId id) =>
       futureStream(getInput(id).then((input) => input.read()));
 
+  /// A convenience method to return whether or not an asset exists.
+  ///
+  /// This is equivalent to calling [getInput] and catching an
+  /// [AssetNotFoundException].
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
   /// Consume the primary input so that it doesn't get processed by future
   /// phases or emitted once processing has finished.
   ///
diff --git a/pkg/barback/lib/src/group_runner.dart b/pkg/barback/lib/src/group_runner.dart
index 4ef344f..970d4aa 100644
--- a/pkg/barback/lib/src/group_runner.dart
+++ b/pkg/barback/lib/src/group_runner.dart
@@ -37,15 +37,15 @@
   ///
   /// This is synchronous in order to guarantee that it will emit an event as
   /// soon as [isDirty] flips from `true` to `false`.
-  Stream get onDone => _onDoneController.stream;
-  final _onDoneController = new StreamController.broadcast(sync: true);
+  Stream get onDone => _onDone;
+  Stream _onDone;
 
   /// A stream that emits any new assets emitted by [this].
   ///
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
-  Stream<AssetNode> get onAsset => _onAssetPool.stream;
-  final _onAssetPool = new StreamPool<AssetNode>();
+  Stream<AssetNode> get onAsset => _onAsset;
+  Stream<AssetNode> _onAsset;
 
   /// A stream that emits an event whenever any transforms in this group logs
   /// an entry.
@@ -53,10 +53,13 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   GroupRunner(AssetCascade cascade, this._group, this._location) {
-    _addPhase(new Phase(cascade, _location), _group.phases.first);
-    for (var phase in _group.phases.skip(1)) {
+    _addPhase(new Phase(cascade, _location), []);
+    for (var phase in _group.phases) {
       _addPhase(_phases.last.addPhase(), phase);
     }
+
+    _onAsset = _phases.last.onAsset;
+    _onDone = _phases.last.onDone;
   }
 
   /// Add a phase with [contents] to [this]'s list of phases.
@@ -65,11 +68,7 @@
   /// value.
   void _addPhase(Phase phase, Iterable contents) {
     _phases.add(phase);
-    _onAssetPool.add(phase.onAsset);
     _onLogPool.add(phase.onLog);
-    phase.onDone.listen((_) {
-      if (!isDirty) _onDoneController.add(null);
-    });
     phase.updateTransformers(contents);
   }
 
@@ -88,7 +87,9 @@
 
   /// Removes this group and all sub-phases within it.
   void remove() {
-    _phases.first.remove();
+    for (var phase in _phases) {
+      phase.remove();
+    }
   }
 
   String toString() => "group in phase $_location for $_group";
diff --git a/pkg/barback/lib/src/phase.dart b/pkg/barback/lib/src/phase.dart
index b7245f4..aa7dc78 100644
--- a/pkg/barback/lib/src/phase.dart
+++ b/pkg/barback/lib/src/phase.dart
@@ -91,14 +91,15 @@
   /// propagated as soon as they occur. Only a phase with no [next] phase will
   /// emit assets.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// Whether [this] is dirty and still has more processing to do.
   ///
   /// A phase is considered dirty if any of the previous phases in the same
   /// cascade are dirty, since those phases could emit an asset that this phase
   /// will then need to process.
-  bool get isDirty => (_previous != null && _previous.isDirty) ||
+  bool get isDirty => (previous != null && previous.isDirty) ||
       _inputs.values.any((input) => input.isDirty) ||
       _groups.values.any((group) => group.isDirty);
 
@@ -108,16 +109,13 @@
   final _onLogPool = new StreamPool<LogEntry>.broadcast();
 
   /// The previous phase in the cascade, or null if this is the first phase.
-  final Phase _previous;
+  final Phase previous;
 
-  /// The subscription to [_previous]'s [onDone] stream.
+  /// The subscription to [previous]'s [onDone] stream.
   StreamSubscription _previousOnDoneSubscription;
 
-  /// The phase after this one.
-  ///
-  /// Outputs from this phase will be passed to it.
-  Phase get next => _next;
-  Phase _next;
+  /// The subscription to [previous]'s [onAsset] stream.
+  StreamSubscription<AssetNode> _previousOnAssetSubscription;
 
   /// A map of asset ids to completers for [getInput] requests.
   ///
@@ -140,9 +138,10 @@
   Phase(AssetCascade cascade, String location)
       : this._(cascade, location, 0);
 
-  Phase._(this.cascade, this._location, this._index, [this._previous]) {
-    if (_previous != null) {
-      _previousOnDoneSubscription = _previous.onDone.listen((_) {
+  Phase._(this.cascade, this._location, this._index, [this.previous]) {
+    if (previous != null) {
+      _previousOnAssetSubscription = previous.onAsset.listen(addInput);
+      _previousOnDoneSubscription = previous.onDone.listen((_) {
         if (!isDirty) _onDoneController.add(null);
       });
     }
@@ -205,33 +204,11 @@
     }
   }
 
-  // TODO(nweiz): If the input is available when this is called, it's
+  // TODO(nweiz): If the output is available when this is called, it's
   // theoretically possible for it to become unavailable between the call and
   // the return. If it does so, it won't trigger the rebuilding process. To
   // avoid this, we should have this and the methods it calls take explicit
   // callbacks, as in [AssetNode.whenAvailable].
-  /// Gets the asset node for an input [id].
-  ///
-  /// If [id] is for a generated or transformed asset, this will wait until it
-  /// has been created and return it. This means that the returned asset will
-  /// always be [AssetState.AVAILABLE].
-  /// 
-  /// If the input cannot be found, returns null.
-  Future<AssetNode> getInput(AssetId id) {
-    return syncFuture(() {
-      if (id.package != cascade.package) return cascade.graph.getAssetNode(id);
-      if (_previous != null) return _previous.getOutput(id);
-      if (!_inputs.containsKey(id)) return null;
-
-      var input = _inputs[id].input;
-      return input.whenAvailable((_) => input).catchError((error) {
-        if (error is! AssetNotFoundException || error.id != id) throw error;
-        // Retry in case the input was replaced.
-        return getInput(id);
-      });
-    });
-  }
-
   /// Gets the asset node for an output [id].
   ///
   /// If [id] is for a generated or transformed asset, this will wait until it
@@ -321,23 +298,20 @@
   ///
   /// This may only be called on a phase with no phase following it.
   Phase addPhase() {
-    assert(_next == null);
-    _next = new Phase._(cascade, _location, _index + 1, this);
+    var next = new Phase._(cascade, _location, _index + 1, this);
     for (var output in _outputs.values.toList()) {
       // Remove [output]'s listeners because now they should get the asset from
-      // [_next], rather than this phase. Any transforms consuming [output] will
+      // [next], rather than this phase. Any transforms consuming [output] will
       // be re-run and will consume the output from the new final phase.
       output.removeListeners();
     }
-    return _next;
+    return next;
   }
 
   /// Mark this phase as removed.
   ///
-  /// This will remove all the phase's outputs and all following phases.
+  /// This will remove all the phase's outputs.
   void remove() {
-    if (_previous != null) _previous._next = null;
-    removeFollowing();
     for (var input in _inputs.values.toList()) {
       input.remove();
     }
@@ -349,13 +323,9 @@
     if (_previousOnDoneSubscription != null) {
       _previousOnDoneSubscription.cancel();
     }
-  }
-
-  /// Remove all phases after this one.
-  void removeFollowing() {
-    if (_next == null) return;
-    _next.remove();
-    _next = null;
+    if (_previousOnAssetSubscription != null) {
+      _previousOnAssetSubscription.cancel();
+    }
   }
 
   /// Add [asset] as an output of this phase.
@@ -388,11 +358,7 @@
   /// This should be called after [_handleOutput], so that collisions are
   /// resolved.
   void _emit(AssetNode asset) {
-    if (_next != null) {
-      _next.addInput(asset);
-    } else {
-      _onAssetController.add(asset);
-    }
+    _onAssetController.add(asset);
     _providePendingAsset(asset);
   }
 
diff --git a/pkg/barback/lib/src/phase_input.dart b/pkg/barback/lib/src/phase_input.dart
index c6b3826..db33779 100644
--- a/pkg/barback/lib/src/phase_input.dart
+++ b/pkg/barback/lib/src/phase_input.dart
@@ -50,7 +50,7 @@
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
   Stream<AssetNode> get onAsset => _onAssetPool.stream;
-  final _onAssetPool = new StreamPool<AssetNode>();
+  final _onAssetPool = new StreamPool<AssetNode>.broadcast();
 
   /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => _transforms.any((transform) => transform.isDirty);
diff --git a/pkg/barback/lib/src/phase_output.dart b/pkg/barback/lib/src/phase_output.dart
index 1807156..bb5f176 100644
--- a/pkg/barback/lib/src/phase_output.dart
+++ b/pkg/barback/lib/src/phase_output.dart
@@ -36,7 +36,8 @@
   /// A stream that emits an [AssetNode] each time this output starts forwarding
   /// a new asset.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// The assets for this output.
   ///
diff --git a/pkg/barback/lib/src/transform_logger.dart b/pkg/barback/lib/src/transform_logger.dart
index c3e5c73..5f43a2d 100644
--- a/pkg/barback/lib/src/transform_logger.dart
+++ b/pkg/barback/lib/src/transform_logger.dart
@@ -56,7 +56,15 @@
   /// Otherwise it's associated with the primary input of [transformer].
   /// If present, [span] indicates the location in the input asset that caused
   /// the error.
-  // TODO(sigmund,nweiz): clarify when an error should be logged or thrown.
+  ///
+  /// Logging any errors will cause Barback to consider the transformation to
+  /// have failed, much like throwing an exception. This means that neither the
+  /// primary input nor any outputs emitted by the transformer will be passed on
+  /// to the following phase, and the build will be reported as having failed.
+  ///
+  /// Unlike throwing an exception, this doesn't cause a transformer to stop
+  /// running. This makes it useful in cases where a single input may have
+  /// multiple errors that the user wants to know about.
   void error(String message, {AssetId asset, Span span}) {
     _logFunction(asset, LogLevel.ERROR, message, span);
   }
diff --git a/pkg/barback/lib/src/transform_node.dart b/pkg/barback/lib/src/transform_node.dart
index 4b0a076..e31d5e8 100644
--- a/pkg/barback/lib/src/transform_node.dart
+++ b/pkg/barback/lib/src/transform_node.dart
@@ -40,6 +40,9 @@
   /// The subscription to [primary]'s [AssetNode.onStateChange] stream.
   StreamSubscription _primarySubscription;
 
+  /// The subscription to [phase]'s [Phase.onAsset] stream.
+  StreamSubscription<AssetNode> _phaseSubscription;
+
   /// Whether [this] is dirty and still has more processing to do.
   bool get isDirty => !_state.isDone;
 
@@ -47,10 +50,12 @@
   bool _isLazy;
 
   /// The subscriptions to each input's [AssetNode.onStateChange] stream.
-  var _inputSubscriptions = new Map<AssetId, StreamSubscription>();
+  final _inputSubscriptions = new Map<AssetId, StreamSubscription>();
 
   /// The controllers for the asset nodes emitted by this node.
-  var _outputControllers = new Map<AssetId, AssetNodeController>();
+  final _outputControllers = new Map<AssetId, AssetNodeController>();
+
+  final _missingInputs = new Set<AssetId>();
 
   /// The controller that's used to pass [primary] through [this] if it's not
   /// consumed or overwritten.
@@ -73,7 +78,8 @@
   /// Assets are emitted synchronously to ensure that any changes are thoroughly
   /// propagated as soon as they occur.
   Stream<AssetNode> get onAsset => _onAssetController.stream;
-  final _onAssetController = new StreamController<AssetNode>(sync: true);
+  final _onAssetController =
+      new StreamController<AssetNode>.broadcast(sync: true);
 
   /// A stream that emits an event whenever this transform logs an entry.
   ///
@@ -108,6 +114,10 @@
       }
     });
 
+    _phaseSubscription = phase.previous.onAsset.listen((node) {
+      if (_missingInputs.contains(node.id)) _dirty(primaryChanged: false);
+    });
+
     _process();
   }
 
@@ -127,6 +137,7 @@
     _onAssetController.close();
     _onDoneController.close();
     _primarySubscription.cancel();
+    _phaseSubscription.cancel();
     _clearInputSubscriptions();
     _clearOutputs();
     if (_passThroughController != null) {
@@ -255,11 +266,14 @@
   ///
   /// If an input with [id] cannot be found, throws an [AssetNotFoundException].
   Future<Asset> getInput(AssetId id) {
-    return phase.getInput(id).then((node) {
+    return phase.previous.getOutput(id).then((node) {
       // Throw if the input isn't found. This ensures the transformer's apply
       // is exited. We'll then catch this and report it through the proper
       // results stream.
-      if (node == null) throw new AssetNotFoundException(id);
+      if (node == null) {
+        _missingInputs.add(id);
+        throw new AssetNotFoundException(id);
+      }
 
       _inputSubscriptions.putIfAbsent(node.id, () {
         return node.onStateChange.listen((_) => _dirty(primaryChanged: false));
@@ -383,6 +397,7 @@
 
   /// Cancels all subscriptions to secondary input nodes.
   void _clearInputSubscriptions() {
+    _missingInputs.clear();
     for (var subscription in _inputSubscriptions.values) {
       subscription.cancel();
     }
diff --git a/pkg/barback/test/package_graph/errors_test.dart b/pkg/barback/test/package_graph/errors_test.dart
index 011f69f..02a7675 100644
--- a/pkg/barback/test/package_graph/errors_test.dart
+++ b/pkg/barback/test/package_graph/errors_test.dart
@@ -176,4 +176,22 @@
     expectAsset("app|foo.txt", "failed to load app|nothing");
     buildShouldSucceed();
   });
+
+  test("a transformer that fails due to a missing secondary input is re-run "
+      "when that input appears", () {
+    initGraph({
+      "app|foo.txt": "bar.inc",
+      "app|bar.inc": "bar"
+    }, {"app": [
+      [new ManyToOneTransformer("txt")]
+    ]});
+
+    updateSources(["app|foo.txt"]);
+    expectNoAsset("app|foo.out");
+    buildShouldFail([isMissingInputException("app|bar.inc")]);
+
+    updateSources(["app|bar.inc"]);
+    expectAsset("app|foo.out", "bar");
+    buildShouldSucceed();
+  });
 }
diff --git a/pkg/barback/test/package_graph/transform/transform_test.dart b/pkg/barback/test/package_graph/transform/transform_test.dart
index 747512c..dce5e2c 100644
--- a/pkg/barback/test/package_graph/transform/transform_test.dart
+++ b/pkg/barback/test/package_graph/transform/transform_test.dart
@@ -341,4 +341,45 @@
     expectAsset('app|bar.out', 'spread txt.out');
     buildShouldSucceed();
   });
+
+  group("Transform.hasInput", () {
+    test("returns whether an input exists", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|foo.txt', 'app|bar.txt', 'app|baz.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt',
+          'app|foo.txt: true, app|bar.txt: true, app|baz.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input stops existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+
+      updateSources(['app|foo.txt', 'app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+
+      removeSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    });
+
+    test("re-runs the transformer when an input starts existing", () {
+      initGraph(["app|foo.txt", "app|bar.txt"], {'app': [
+        [new HasInputTransformer(['app|bar.txt'])]
+      ]});
+    
+      updateSources(['app|foo.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: false');
+      buildShouldSucceed();
+    
+      updateSources(['app|bar.txt']);
+      expectAsset('app|foo.txt', 'app|bar.txt: true');
+      buildShouldSucceed();
+    });
+  });
 }
diff --git a/pkg/barback/test/transformer/has_input.dart b/pkg/barback/test/transformer/has_input.dart
new file mode 100644
index 0000000..add3017
--- /dev/null
+++ b/pkg/barback/test/transformer/has_input.dart
@@ -0,0 +1,34 @@
+// 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.
+
+library barback.test.transformer.has_input;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'mock.dart';
+
+/// Overwrites its primary inputs with descriptions of whether various secondary
+/// inputs exist.
+class HasInputTransformer extends MockTransformer {
+  /// The inputs whose existence will be checked.
+  final List<AssetId> inputs;
+
+  HasInputTransformer(Iterable<String> inputs)
+      : inputs = inputs.map((input) => new AssetId.parse(input)).toList();
+
+  Future<bool> doIsPrimary(Asset asset) => new Future.value(true);
+
+  Future doApply(Transform transform) {
+    return Future.wait(inputs.map((input) {
+      return transform.hasInput(input).then((hasInput) => "$input: $hasInput");
+    })).then((results) {
+      transform.addOutput(new Asset.fromString(
+          transform.primaryInput.id, results.join(', ')));
+    });
+  }
+
+  String toString() => "has inputs $inputs";
+}
diff --git a/pkg/barback/test/utils.dart b/pkg/barback/test/utils.dart
index 4d72a2b..7a77f1b 100644
--- a/pkg/barback/test/utils.dart
+++ b/pkg/barback/test/utils.dart
@@ -24,6 +24,7 @@
 export 'transformer/conditionally_consume_primary.dart';
 export 'transformer/create_asset.dart';
 export 'transformer/emit_nothing.dart';
+export 'transformer/has_input.dart';
 export 'transformer/lazy_bad.dart';
 export 'transformer/lazy_many_to_one.dart';
 export 'transformer/lazy_rewrite.dart';
diff --git a/pkg/browser/pubspec.yaml b/pkg/browser/pubspec.yaml
index e51235f..3bf88f1 100644
--- a/pkg/browser/pubspec.yaml
+++ b/pkg/browser/pubspec.yaml
@@ -1,8 +1,8 @@
 name: browser
-version: 0.10.0
+version: 0.10.0+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
  The bootstrap dart.js script for Dart apps running in the browser.
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: ">=1.3.0-dev.4.1 <2.0.0"
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
new file mode 100644
index 0000000..8fabaf6
--- /dev/null
+++ b/pkg/code_transformers/lib/assets.dart
@@ -0,0 +1,99 @@
+// 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.
+
+/// Common methods used by transfomers for dealing with asset IDs.
+library code_transformers.assets;
+
+import 'dart:math' show min, max;
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:source_maps/span.dart' show Span;
+
+/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
+/// is used to resolve relative urls that occur in HTML assets, including
+/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
+/// urls are not resolved unless [source] is Dart file (has a .dart extension).
+// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
+AssetId uriToAssetId(AssetId source, String url, TransformLogger logger,
+    Span span, {bool errorOnAbsolute: true}) {
+  if (url == null || url == '') return null;
+  var uri = Uri.parse(url);
+  var urlBuilder = path.url;
+  if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
+    if (source.extension == '.dart' && uri.scheme == 'package') {
+      var index = uri.path.indexOf('/');
+      if (index != -1) {
+        return new AssetId(uri.path.substring(0, index),
+            'lib${uri.path.substring(index)}');
+      }
+    }
+
+    if (errorOnAbsolute) {
+      logger.error('absolute paths not allowed: "$url"', span: span);
+    }
+    return null;
+  }
+
+  var targetPath = urlBuilder.normalize(
+      urlBuilder.join(urlBuilder.dirname(source.path), url));
+  var segments = urlBuilder.split(targetPath);
+  var sourceSegments = urlBuilder.split(source.path);
+  assert (sourceSegments.length > 0);
+  var topFolder = sourceSegments[0];
+  var entryFolder = topFolder != 'lib' && topFolder != 'asset';
+
+  // Find the first 'packages/'  or 'assets/' segment:
+  var packagesIndex = segments.indexOf('packages');
+  var assetsIndex = segments.indexOf('assets');
+  var index = (packagesIndex >= 0 && assetsIndex >= 0)
+      ? min(packagesIndex, assetsIndex)
+      : max(packagesIndex, assetsIndex);
+  if (index > -1) {
+    if (entryFolder) {
+      // URLs of the form "packages/foo/bar" seen under entry folders (like
+      // web/, test/, example/, etc) are resolved as an asset in another
+      // package. 'packages' can be used anywhere, there is no need to walk up
+      // where the entrypoint file was.
+      return _extractOtherPackageId(index, segments, logger, span);
+    } else if (index == 1 && segments[0] == '..') {
+      // Relative URLs of the form "../../packages/foo/bar" in an asset under
+      // lib/ or asset/ are also resolved as an asset in another package, but we
+      // check that the relative path goes all the way out where the packages
+      // folder lives (otherwise the app would not work in Dartium). Since
+      // [targetPath] has been normalized, "packages" or "assets" should be at
+      // index 1.
+      return _extractOtherPackageId(1, segments, logger, span);
+    } else {
+      var prefix = segments[index];
+      var fixedSegments = [];
+      fixedSegments.addAll(sourceSegments.map((_) => '..'));
+      fixedSegments.addAll(segments.sublist(index));
+      var fixedUrl = urlBuilder.joinAll(fixedSegments);
+      logger.error('Invalid url to reach to another package: $url. Path '
+          'reaching to other packages must first reach up all the '
+          'way to the $prefix folder. For example, try changing the url above '
+          'to: $fixedUrl', span: span);
+      return null;
+    }
+  }
+
+  // Otherwise, resolve as a path in the same package.
+  return new AssetId(source.package, targetPath);
+}
+
+AssetId _extractOtherPackageId(int index, List segments,
+    TransformLogger logger, Span span) {
+  if (index >= segments.length) return null;
+  var prefix = segments[index];
+  if (prefix != 'packages' && prefix != 'assets') return null;
+  var folder = prefix == 'packages' ? 'lib' : 'asset';
+  if (segments.length < index + 3) {
+    logger.error("incomplete $prefix/ path. It should have at least 3 "
+        "segments $prefix/name/path-from-name's-$folder-dir", span: span);
+    return null;
+  }
+  return new AssetId(segments[index + 1],
+      path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
+}
diff --git a/pkg/code_transformers/lib/resolver.dart b/pkg/code_transformers/lib/resolver.dart
index 91ce8c3..faf34db 100644
--- a/pkg/code_transformers/lib/resolver.dart
+++ b/pkg/code_transformers/lib/resolver.dart
@@ -5,6 +5,7 @@
 /// Tools for working with resolved ASTs from Barback transformers.
 library code_transformers.resolver;
 
-export 'src/resolvers.dart';
-export 'src/resolver.dart';
 export 'src/dart_sdk.dart';
+export 'src/entry_point.dart';
+export 'src/resolver.dart';
+export 'src/resolvers.dart';
diff --git a/pkg/code_transformers/lib/src/dart_sdk.dart b/pkg/code_transformers/lib/src/dart_sdk.dart
index 3b79f36..7b6f8e6 100644
--- a/pkg/code_transformers/lib/src/dart_sdk.dart
+++ b/pkg/code_transformers/lib/src/dart_sdk.dart
@@ -5,7 +5,7 @@
 library code_transformers.src.dart_sdk;
 
 import 'dart:convert' as convert;
-import 'dart:io' show Directory, File, Platform, Process;
+import 'dart:io' show File, Platform, Process;
 import 'package:path/path.dart' as path;
 
 
diff --git a/pkg/code_transformers/lib/src/entry_point.dart b/pkg/code_transformers/lib/src/entry_point.dart
new file mode 100644
index 0000000..ee7868e
--- /dev/null
+++ b/pkg/code_transformers/lib/src/entry_point.dart
@@ -0,0 +1,47 @@
+// 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.
+import 'dart:async';
+
+import 'package:analyzer/analyzer.dart' as analyzer;
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:barback/barback.dart';
+
+/// Checks to see if the provided Asset is a Dart entry point.
+///
+/// Assets are considered entry points if they are Dart files located in
+/// web/, test/, benchmark/ or example/ and have a main() function.
+///
+/// Because this only analyzes the primary asset this may return true for files
+/// which are not dart entries if the file does not have a main() but does have
+/// parts or exports.
+Future<bool> isPossibleDartEntry(Asset asset) {
+  if (asset.id.extension != '.dart') return new Future.value(false);
+
+  if (!['benchmark', 'example', 'test', 'web']
+      .any((dir) => asset.id.path.startsWith("$dir/"))) {
+    return new Future.value(false);
+  }
+  return asset.readAsString().then((contents) {
+    return _couldBeEntrypoint(
+        analyzer.parseCompilationUnit(contents, suppressErrors: true));
+  });
+}
+
+bool _couldBeEntrypoint(CompilationUnit compilationUnit) {
+  // Allow two or fewer arguments so that entrypoints intended for use with
+  // [spawnUri] get counted.
+  var hasMain = compilationUnit.declarations.any((node) =>
+      node is FunctionDeclaration &&
+      node.name.name == "main" &&
+      node.functionExpression.parameters.parameters.length <= 2);
+
+  if (hasMain) return true;
+
+  // If it has an export or a part, assume the worst- that the main could be
+  // in there.
+  // We avoid loading those since this can be run from isPrimaryAsset calls
+  // where we do not have access to other sources.
+  return compilationUnit.directives.any((node) =>
+      node is ExportDirective || node is PartDirective);
+}
diff --git a/pkg/code_transformers/lib/src/resolver.dart b/pkg/code_transformers/lib/src/resolver.dart
index b944a4e..fac1aac 100644
--- a/pkg/code_transformers/lib/src/resolver.dart
+++ b/pkg/code_transformers/lib/src/resolver.dart
@@ -14,25 +14,23 @@
 
 /// Class for working with a barback based resolved AST.
 abstract class Resolver {
-  /// The Dart entry point file where parsing begins.
-  AssetId get entryPoint;
-
-  /// Update the status of all the sources referenced by the entryPoint and
-  /// update the resolved library.
+  /// Update the status of all the sources referenced by the entry points and
+  /// update the resolved library. If [entryPoints] is omitted, the primary
+  /// asset of [transform] is used as the only entry point.
   ///
   /// [release] must be called when done handling this Resolver to allow it
   /// to be used by later phases.
-  Future<Resolver> resolve(Transform transform);
+  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]);
 
   /// Release this resolver so it can be updated by following transforms.
   void release();
 
-  /// Gets the resolved Dart library for the entry asset, or null if
-  /// the AST has not been resolved.
+  /// Gets the resolved Dart library for an asset, or null if the AST has not
+  /// been resolved.
   ///
   /// If the AST has not been resolved then this normally means that the
   /// transformer hosting this needs to be in an earlier phase.
-  LibraryElement get entryLibrary;
+  LibraryElement getLibrary(AssetId assetId);
 
   /// Gets all libraries accessible from the entry point, recursively.
   ///
@@ -83,6 +81,10 @@
   /// the element came from the Dart SDK.
   Span getSourceSpan(Element element);
 
+  /// Get a [SourceFile] with the contents of the file that defines [element],
+  /// or null if the element came from the Dart SDK.
+  SourceFile getSourceFile(Element element);
+
   /// Creates a text edit transaction for the given element if it is able
   /// to be edited, returns null otherwise.
   ///
diff --git a/pkg/code_transformers/lib/src/resolver_impl.dart b/pkg/code_transformers/lib/src/resolver_impl.dart
index 9322ccd..f26c072 100644
--- a/pkg/code_transformers/lib/src/resolver_impl.dart
+++ b/pkg/code_transformers/lib/src/resolver_impl.dart
@@ -5,14 +5,19 @@
 library code_transformer.src.resolver_impl;
 
 import 'dart:async';
+import 'package:analyzer/analyzer.dart' show parseCompilationUnit;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk;
 import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
 import 'package:analyzer/src/generated/source.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as native_path;
 import 'package:source_maps/refactor.dart';
 import 'package:source_maps/span.dart' show SourceFile, Span;
@@ -31,17 +36,14 @@
   final Map<AssetId, _AssetBasedSource> sources =
       <AssetId, _AssetBasedSource>{};
 
-  /// The Dart entry point file where parsing begins.
-  final AssetId entryPoint;
-
   final AnalysisContext _context =
       AnalysisEngine.instance.createAnalysisContext();
 
   /// Transform for which this is currently updating, or null when not updating.
   Transform _currentTransform;
 
-  /// The currently resolved library, or null if unresolved.
-  LibraryElement _entryLibrary;
+  /// The currently resolved entry libraries, or null if nothing is resolved.
+  List<LibraryElement> _entryLibraries;
 
   /// Future indicating when this resolver is done in the current phase.
   Future _lastPhaseComplete = new Future.value();
@@ -52,12 +54,9 @@
   /// Handler for all Dart SDK (dart:) sources.
   DirectoryBasedDartSdk _dartSdk;
 
-  /// Creates a resolver that will resolve the Dart code starting at
-  /// [entryPoint].
-  ///
-  /// [sdkDir] is the root directory of the Dart SDK, for resolving dart:
-  /// imports.
-  ResolverImpl(this.entryPoint, String sdkDir, {AnalysisOptions options}) {
+  /// Creates a resolver, where [sdkDir] is the root directory of the Dart SDK,
+  /// for resolving `dart:*` imports.
+  ResolverImpl(String sdkDir, {AnalysisOptions options}) {
     if (options == null) {
       options = new AnalysisOptionsImpl()
         ..cacheSize = 256 // # of sources to cache ASTs for.
@@ -74,16 +73,19 @@
         new _AssetUriResolver(this)]);
   }
 
-  LibraryElement get entryLibrary => _entryLibrary;
+  LibraryElement getLibrary(AssetId assetId) {
+    var source = sources[assetId];
+    return source == null ? null : _context.computeLibraryElement(source);
+  }
 
-  Future<Resolver> resolve(Transform transform) {
+  Future<Resolver> resolve(Transform transform, [List<AssetId> entryPoints]) {
     // Can only have one resolve in progress at a time, so chain the current
     // resolution to be after the last one.
     var phaseComplete = new Completer();
     var future = _lastPhaseComplete.then((_) {
       _currentPhaseComplete = phaseComplete;
-
-      return _performResolve(transform);
+      return _performResolve(transform,
+        entryPoints == null ? [transform.primaryInput.id] : entryPoints);
     }).then((_) => this);
     // Advance the lastPhaseComplete to be done when this phase is all done.
     _lastPhaseComplete = phaseComplete.future;
@@ -97,11 +99,12 @@
     _currentPhaseComplete.complete(null);
     _currentPhaseComplete = null;
 
-    // Clear out the entry lib since it should not be referenced after release.
-    _entryLibrary = null;
+    // Clear out libraries since they should not be referenced after release.
+    _entryLibraries = null;
+    _currentTransform = null;
   }
 
-  Future _performResolve(Transform transform) {
+  Future _performResolve(Transform transform, List<AssetId> entryPoints) {
     if (_currentTransform != null) {
       throw new StateError('Cannot be accessed by concurrent transforms');
     }
@@ -111,6 +114,7 @@
     // and see if it changed, then walk all files accessed by it.
     var visited = new Set<AssetId>();
     var visiting = new FutureGroup();
+    var toUpdate = [];
 
     void processAsset(AssetId assetId) {
       visited.add(assetId);
@@ -121,23 +125,22 @@
           source = new _AssetBasedSource(assetId, this);
           sources[assetId] = source;
         }
-        source.updateContents(contents);
-
-        source.dependentAssets
-            .where((id) => !visited.contains(id))
+        source.updateDependencies(contents);
+        toUpdate.add(new _PendingUpdate(source, contents));
+        source.dependentAssets.where((id) => !visited.contains(id))
             .forEach(processAsset);
-
       }, onError: (e) {
         _context.applyChanges(new ChangeSet()..removedSource(sources[assetId]));
         sources.remove(assetId);
       }));
     }
-    processAsset(entryPoint);
+    entryPoints.forEach(processAsset);
 
     // Once we have all asset sources updated with the new contents then
     // resolve everything.
     return visiting.future.then((_) {
       var changeSet = new ChangeSet();
+      toUpdate.forEach((pending) => pending.apply(changeSet));
       var unreachableAssets = new Set.from(sources.keys).difference(visited);
       for (var unreachable in unreachableAssets) {
         changeSet.removedSource(sources[unreachable]);
@@ -146,13 +149,15 @@
 
       // Update the analyzer context with the latest sources
       _context.applyChanges(changeSet);
-      // Resolve the AST
-      _entryLibrary = _context.computeLibraryElement(sources[entryPoint]);
-      _currentTransform = null;
+      // Force resolve each entry point (the getter will ensure the library is
+      // computed first).
+      _entryLibraries = entryPoints
+          .map((id) => _context.computeLibraryElement(sources[id])).toList();
     });
   }
 
-  Iterable<LibraryElement> get libraries => entryLibrary.visibleLibraries;
+  Iterable<LibraryElement> get libraries =>
+      _entryLibraries.expand((lib) => lib.visibleLibraries).toSet();
 
   LibraryElement getLibraryByName(String libraryName) =>
       libraries.firstWhere((l) => l.name == libraryName, orElse: () => null);
@@ -226,7 +231,7 @@
   }
 
   Span getSourceSpan(Element element) {
-    var sourceFile = _getSourceFile(element);
+    var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
     return sourceFile.span(element.node.offset, element.node.end);
   }
@@ -234,22 +239,27 @@
   TextEditTransaction createTextEditTransaction(Element element) {
     if (element.source is! _AssetBasedSource) return null;
 
+    // Cannot edit unless there is an active transformer.
+    if (_currentTransform == null) return null;
+
     _AssetBasedSource source = element.source;
     // Cannot modify assets in other packages.
-    if (source.assetId.package != entryPoint.package) return null;
+    if (source.assetId.package != _currentTransform.primaryInput.id.package) {
+      return null;
+    }
 
-    var sourceFile = _getSourceFile(element);
+    var sourceFile = getSourceFile(element);
     if (sourceFile == null) return null;
 
     return new TextEditTransaction(source.rawContents, sourceFile);
   }
 
   /// Gets the SourceFile for the source of the element.
-  SourceFile _getSourceFile(Element element) {
+  SourceFile getSourceFile(Element element) {
     var assetId = getSourceAssetId(element);
     if (assetId == null) return null;
 
-    var importUri = _getSourceUri(element, from: entryPoint);
+    var importUri = _getSourceUri(element);
     var spanPath = importUri != null ? importUri.toString() : assetId.path;
     return new SourceFile.text(spanPath, sources[assetId].rawContents);
   }
@@ -275,30 +285,26 @@
 
   _AssetBasedSource(this.assetId, this._resolver);
 
+  /// Update the dependencies of this source. This parses [contents] but avoids
+  /// any analyzer resolution.
+  void updateDependencies(String contents) {
+    if (contents == _contents) return;
+    var unit = parseCompilationUnit(contents, suppressErrors: true);
+    _dependentAssets = unit.directives
+        .where((d) => (d is ImportDirective || d is PartDirective ||
+            d is ExportDirective))
+        .map((d) => _resolve(assetId, d.uri.stringValue, _logger,
+              _getSpan(d, contents)))
+        .where((id) => id != null).toSet();
+  }
+
   /// Update the contents of this file with [contents].
   ///
   /// Returns true if the contents of this asset have changed.
   bool updateContents(String contents) {
     if (contents == _contents) return false;
-    var added = _contents == null;
     _contents = contents;
     ++_revision;
-    // Invalidate the imports so we only parse the AST when needed.
-    _dependentAssets = null;
-
-    if (added) {
-      _resolver._context.applyChanges(new ChangeSet()..addedSource(this));
-    } else {
-      _resolver._context.applyChanges(new ChangeSet()..changedSource(this));
-    }
-
-    var compilationUnit = _resolver._context.parseCompilationUnit(this);
-    _dependentAssets = compilationUnit.directives
-        .where((d) => (d is ImportDirective || d is PartDirective ||
-            d is ExportDirective))
-        .map((d) => _resolve(assetId, d.uri.stringValue,
-            _logger, _getSpan(d)))
-        .where((id) => id != null).toSet();
     return true;
   }
 
@@ -357,13 +363,13 @@
   }
 
   /// For logging errors.
-  Span _getSpan(AstNode node) => _sourceFile.span(node.offset, node.end);
+  Span _getSpan(AstNode node, [String contents]) =>
+      _getSourceFile(contents).span(node.offset, node.end);
   /// For logging errors.
-  SourceFile get _sourceFile {
-    var uri = getSourceUri(_resolver.entryPoint);
+  SourceFile _getSourceFile([String contents]) {
+    var uri = getSourceUri();
     var path = uri != null ? uri.toString() : assetId.path;
-
-    return new SourceFile.text(path, rawContents);
+    return new SourceFile.text(path, contents != null ? contents : rawContents);
   }
 
   /// Gets a URI which would be appropriate for importing this file.
@@ -509,14 +515,7 @@
   // Dart SDK libraries do not have assets.
   if (uri.scheme == 'dart') return null;
 
-  if (uri.host != '' || uri.scheme != '' || path.isAbsolute(url)) {
-    logger.error('absolute paths not allowed: "$url"', span: span);
-    return null;
-  }
-
-  var targetPath = path.normalize(
-      path.join(path.dirname(source.path), url));
-  return new AssetId(source.package, targetPath);
+  return uriToAssetId(source, url, logger, span);
 }
 
 
@@ -574,3 +573,23 @@
    */
   Future<List<E>> get future => _completer.future;
 }
+
+/// A pending update to notify the resolver that a [Source] has been added or
+/// changed. This is used by the `_performResolve` algorithm above to apply all
+/// changes after it first discovers the transitive closure of files that are
+/// reachable from the sources.
+class _PendingUpdate {
+  _AssetBasedSource source;
+  String content;
+
+  _PendingUpdate(this.source, this.content);
+
+  void apply(ChangeSet changeSet) {
+    if (!source.updateContents(content)) return;
+    if (source._revision == 1 && source._contents != null) {
+      changeSet.addedSource(source);
+    } else {
+      changeSet.changedSource(source);
+    }
+  }
+}
diff --git a/pkg/code_transformers/lib/src/resolvers.dart b/pkg/code_transformers/lib/src/resolvers.dart
index b98e587..f7e39b3 100644
--- a/pkg/code_transformers/lib/src/resolvers.dart
+++ b/pkg/code_transformers/lib/src/resolvers.dart
@@ -19,21 +19,23 @@
 /// If multiple transformers rely on a resolved AST they should (ideally) share
 /// the same Resolvers object to minimize re-parsing the AST.
 class Resolvers {
-  final Map<AssetId, ResolverImpl> _resolvers = {};
+  final Map<AssetId, Resolver> _resolvers = {};
   final String dartSdkDirectory;
 
   Resolvers(this.dartSdkDirectory);
 
-  /// Get a resolver for the AST starting from [id].
+  /// Get a resolver for [transform]. If provided, this resolves the code
+  /// starting from each of the assets in [entryPoints]. If not, this resolves
+  /// the code starting from `transform.primaryInput.id` by default.
   ///
   /// [Resolver.release] must be called once it's done being used, or
   /// [ResolverTransformer] should be used to automatically release the
   /// resolver.
-  Future<Resolver> get(Transform transform) {
+  Future<Resolver> get(Transform transform, [List<AssetId> entryPoints]) {
     var id = transform.primaryInput.id;
     var resolver = _resolvers.putIfAbsent(id,
-        () => new ResolverImpl(id, dartSdkDirectory));
-    return resolver.resolve(transform);
+        () => new ResolverImpl(dartSdkDirectory));
+    return resolver.resolve(transform, entryPoints);
   }
 }
 
@@ -45,8 +47,27 @@
   /// The cache of resolvers- must be set from subclass.
   Resolvers resolvers;
 
-  Future apply(Transform transform) {
-    return resolvers.get(transform).then((resolver) {
+  /// This provides a default implementation of `Transformer.apply` that will
+  /// get and release resolvers automatically. Internally this:
+  ///   * Gets a resolver associated with the transform primary input.
+  ///   * Does resolution to the code starting from that input.
+  ///   * Calls [applyResolver].
+  ///   * Then releases the resolver.
+  ///
+  /// Use [applyToEntryPoints] instead if you need to override the entry points
+  /// to run the resolver on.
+  Future apply(Transform transform) => applyToEntryPoints(transform);
+
+  /// Helper function to make it easy to write an `Transformer.apply` method
+  /// that automatically gets and releases the resolver. This is typically used
+  /// as follows:
+  ///
+  ///    Future apply(Transform transform) {
+  ///       var entryPoints = ...; // compute entry points
+  ///       return applyToEntryPoints(transform, entryPoints);
+  ///    }
+  Future applyToEntryPoints(Transform transform, [List<AssetId> entryPoints]) {
+    return resolvers.get(transform, entryPoints).then((resolver) {
       return new Future.value(applyResolver(transform, resolver)).then((_) {
         resolver.release();
       });
diff --git a/pkg/code_transformers/lib/src/test_harness.dart b/pkg/code_transformers/lib/src/test_harness.dart
index db53909..e579a58 100644
--- a/pkg/code_transformers/lib/src/test_harness.dart
+++ b/pkg/code_transformers/lib/src/test_harness.dart
@@ -117,7 +117,7 @@
     }).then((_) {
       // We only check messages when an expectation is provided.
       if (messages == null) return;
-      expect(messages.length, messagesSeen,
+      expect(messagesSeen, messages.length,
           reason: 'less messages than expected');
     });
   }
diff --git a/pkg/code_transformers/lib/tests.dart b/pkg/code_transformers/lib/tests.dart
index bd6886c..9ed8e0b 100644
--- a/pkg/code_transformers/lib/tests.dart
+++ b/pkg/code_transformers/lib/tests.dart
@@ -7,11 +7,14 @@
 library code_transformers.tests;
 
 import 'dart:async' show Future;
+import 'dart:io' show Platform;
 
 import 'package:barback/barback.dart' show Transformer;
+import 'package:path/path.dart' as path;
 import 'package:unittest/unittest.dart';
 
 import 'src/test_harness.dart';
+import 'src/dart_sdk.dart';
 
 /// Defines a test which invokes [applyTransformers].
 testPhases(String testName, List<List<Transformer>> phases,
@@ -38,3 +41,19 @@
   var helper = new TestHelper(phases, inputs, messages)..run();
   return helper.checkAll(results).then((_) => helper.tearDown());
 }
+
+/// Variant of [dartSdkDirectory] which includes additional cases only
+/// typically encountered in Dart's testing environment.
+String get testingDartSdkDirectory {
+  var sdkDir = dartSdkDirectory;
+  if (sdkDir == null) {
+    // If we cannot find the SDK dir, then assume this is being run from Dart's
+    // source directory and this script is the main script.
+    var segments = path.split(path.fromUri(Platform.script));
+    var index = segments.indexOf('pkg');
+    expect(index, greaterThan(0),
+        reason: 'testingDartSdkDirectory is only supported in pkg/ tests');
+    sdkDir = path.joinAll(segments.sublist(0, index)..add('sdk'));
+  }
+  return sdkDir;
+}
diff --git a/pkg/code_transformers/pubspec.yaml b/pkg/code_transformers/pubspec.yaml
index 3ff8c5d..bd85f83 100644
--- a/pkg/code_transformers/pubspec.yaml
+++ b/pkg/code_transformers/pubspec.yaml
@@ -1,10 +1,10 @@
 name: code_transformers
-version: 0.0.1-dev.1
+version: 0.0.1-dev.4
 author: "Dart Team <misc@dartlang.org>"
 description: Collection of utilities related to creating barback transformers.
 homepage: http://www.dartlang.org
 dependencies:
-  analyzer: "0.13.0-dev.6"
+  analyzer: ">=0.13.0-dev.9 <0.14.0"
   barback: ">=0.11.0 <0.12.0"
   path: ">=0.9.0 <2.0.0"
   source_maps: ">=0.9.0 <0.10.0"
diff --git a/pkg/code_transformers/test/assets_test.dart b/pkg/code_transformers/test/assets_test.dart
new file mode 100644
index 0000000..0d104dd
--- /dev/null
+++ b/pkg/code_transformers/test/assets_test.dart
@@ -0,0 +1,110 @@
+// 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.
+
+library code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  useCompactVMConfiguration();
+
+
+  Future testAssetUri(String name,
+      {AssetId source, String uri, AssetId result, String message,
+      bool errorOnAbsolute: true}) {
+    test(name, () {
+      var transformer = new Validator((transform) {
+      var assetId = uriToAssetId(source, uri, transform.logger, null,
+          errorOnAbsolute: errorOnAbsolute);
+        expect(assetId, result);
+      });
+      var messages = [];
+      if (message != null) messages.add(message);
+
+      return applyTransformers(
+            [[transformer]],
+            inputs: {
+              source.toString(): ''
+            },
+            messages: messages);
+    });
+  }
+
+  group('uriToAssetId', () {
+    testAssetUri('resolves relative URIs',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'foo.dart',
+        result: new AssetId('a', 'web/foo.dart'));
+
+    testAssetUri('resolves package: URIs',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'package:foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves package: URIs from libs',
+        source: new AssetId('a', 'lib/main.dart'),
+        uri: 'package:foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves packages paths',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'packages/foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('resolves relative packages paths',
+        source: new AssetId('a', 'web/main.dart'),
+        uri: 'packages/foo/foo.dart',
+        result: new AssetId('foo', 'lib/foo.dart'));
+
+    testAssetUri('does not allow packages from non-dart lib files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: 'packages/foo/bar',
+        message: 'error: Invalid url to reach to another package: '
+            'packages/foo/bar. Path reaching to other packages must first '
+            'reach up all the way to the packages folder. For example, try '
+            'changing the url above to: ../../packages/foo/bar');
+
+    testAssetUri('allows relative packages from non-dart lib files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '../../packages/foo/bar',
+        result: new AssetId('foo', 'lib/bar'));
+
+    testAssetUri('does not allow package: imports from non-dart files',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: 'package:foo/bar.dart',
+        message: 'error: absolute paths not allowed: "package:foo/bar.dart"');
+
+    testAssetUri('does not allow absolute /packages by default',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '/packages/foo/bar.dart',
+        message: 'error: absolute paths not allowed: "/packages/foo/bar.dart"');
+
+    testAssetUri('can suppress error on absolute /packages ',
+        source: new AssetId('a', 'lib/index.html'),
+        uri: '/packages/foo/bar.dart',
+        errorOnAbsolute: false,
+        result: null);
+  });
+}
+
+class Validator extends Transformer {
+  final Function validation;
+
+  Validator(this.validation);
+
+  Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+  Future apply(Transform transform) {
+    return new Future.value(validation(transform));
+  }
+}
diff --git a/pkg/code_transformers/test/entry_point_test.dart b/pkg/code_transformers/test/entry_point_test.dart
new file mode 100644
index 0000000..a384444
--- /dev/null
+++ b/pkg/code_transformers/test/entry_point_test.dart
@@ -0,0 +1,108 @@
+// 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.
+
+library code_transformers.test.assets_test;
+
+import 'dart:async';
+import 'dart:io' show File, Platform;
+
+import 'package:barback/barback.dart';
+import 'package:code_transformers/resolver.dart';
+import 'package:code_transformers/tests.dart';
+import 'package:path/path.dart' as path;
+import 'package:unittest/compact_vm_config.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  useCompactVMConfiguration();
+
+  Future checkDartEntry({Map<String, String> inputs, bool expectation}) {
+    var transformer = new Validator((transform) {
+      return isPossibleDartEntry(transform.primaryInput).then((value) {
+        expect(value, expectation);
+      });
+    });
+    return applyTransformers(
+          [[transformer]],
+          inputs: inputs);
+  }
+
+  group('isPossibleDartEntry', () {
+    test('should handle empty files', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': '',
+          },
+          expectation: false);
+    });
+
+    test('should detect main methods', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'main() {}',
+          },
+          expectation: true);
+    });
+
+    test('should exclude dart mains in lib folder', () {
+      return checkDartEntry(
+          inputs: {
+            'a|lib/main.dart': 'main() {}',
+          },
+          expectation: false);
+    });
+
+    test('should validate file extension', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.not_dart': 'main() {}',
+          },
+          expectation: false);
+    });
+
+    test('should count exports as main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'export "foo.dart";',
+          },
+          expectation: true);
+    });
+
+    test('should count parts as main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'part "foo.dart";',
+          },
+          expectation: true);
+    });
+
+    test('is tolerant of syntax errors with main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'main() {} {',
+          },
+          expectation: true);
+    });
+
+    test('is tolerant of syntax errors without main', () {
+      return checkDartEntry(
+          inputs: {
+            'a|web/main.dart': 'class Foo {',
+          },
+          expectation: false);
+    });
+  });
+}
+
+class Validator extends Transformer {
+  final Function validation;
+
+  Validator(this.validation);
+
+  Future<bool> isPrimary(Asset input) => new Future.value(true);
+
+  Future apply(Transform transform) {
+    return new Future.value(validation(transform));
+  }
+}
diff --git a/pkg/code_transformers/test/resolver_test.dart b/pkg/code_transformers/test/resolver_test.dart
index 73f50f1..886e935 100644
--- a/pkg/code_transformers/test/resolver_test.dart
+++ b/pkg/code_transformers/test/resolver_test.dart
@@ -16,17 +16,8 @@
 
 main() {
   useCompactVMConfiguration();
-
-  var sdkDir = dartSdkDirectory;
-  if (sdkDir == null) {
-    // If we cannot find the SDK dir, then assume this is being run from Dart's
-    // source directory and this script is the main script.
-    sdkDir = path.join(
-        path.dirname(path.fromUri(Platform.script)), '..', '..', '..', 'sdk');
-  }
-
   var entryPoint = new AssetId('a', 'web/main.dart');
-  var resolvers = new Resolvers(sdkDir);
+  var resolvers = new Resolvers(testingDartSdkDirectory);
 
   Future validateResolver({Map<String, String> inputs, void validator(Resolver),
       List<String> messages: const[]}) {
@@ -47,7 +38,7 @@
             var source = resolver.sources[entryPoint];
             expect(source.modificationStamp, 1);
 
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib, isNotNull);
             expect(lib.entryPoint, isNull);
           });
@@ -62,7 +53,7 @@
             var source = resolver.sources[entryPoint];
             expect(source.modificationStamp, 2);
 
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib, isNotNull);
             expect(lib.entryPoint, isNotNull);
           });
@@ -81,7 +72,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
             expect(libA.getType('Foo'), isNull);
@@ -102,7 +93,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libA = lib.importedLibraries.where((l) => l.name == 'a').single;
             expect(libA.getType('Foo'), isNotNull);
@@ -122,7 +113,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
             expect(libB.getType('Foo'), isNull);
@@ -143,7 +134,7 @@
               ''',
           },
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 2);
             var libB = lib.importedLibraries.where((l) => l.name == 'b').single;
             expect(libB.getType('Bar'), isNotNull);
@@ -161,10 +152,9 @@
           },
           messages: [
             'error: Unable to find asset for "package:b/b.dart"',
-            'error: Unable to find asset for "package:b/b.dart"',
           ],
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 1);
           });
     });
@@ -180,13 +170,13 @@
           },
           messages: [
             // First from the AST walker
-            'error: absolute paths not allowed: "/b.dart" (main.dart 0 14)',
+            'error: absolute paths not allowed: "/b.dart" (web/main.dart 0 14)',
             // Then two from the resolver.
             'error: absolute paths not allowed: "/b.dart"',
             'error: absolute paths not allowed: "/b.dart"',
           ],
           validator: (resolver) {
-            var lib = resolver.entryLibrary;
+            var lib = resolver.getLibrary(entryPoint);
             expect(lib.importedLibraries.length, 1);
           });
     });
@@ -329,7 +319,7 @@
                 library foo;'''
           },
           validator: (resolver) {
-            expect(resolver.entryLibrary.name, 'foo');
+            expect(resolver.getLibrary(entryPoint).name, 'foo');
           }),
         validateResolver(
           inputs: {
@@ -337,7 +327,7 @@
                 library bar;'''
           },
           validator: (resolver) {
-            expect(resolver.entryLibrary.name, 'bar');
+            expect(resolver.getLibrary(entryPoint).name, 'bar');
           }),
       ]);
     });
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
index 3b5784c..da817fe 100644
--- a/pkg/docgen/lib/docgen.dart
+++ b/pkg/docgen/lib/docgen.dart
@@ -22,8 +22,12 @@
 import 'package:path/path.dart' as path;
 import 'package:yaml/yaml.dart';
 
-import 'dart2yaml.dart';
+import 'src/dart2yaml.dart';
 import 'src/io.dart';
+import 'src/mdn.dart';
+import 'src/models.dart';
+import 'src/utils.dart';
+
 import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
 import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
 import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart'
@@ -44,7 +48,7 @@
     '_js_helper.Returns'];
 
 /// Support for [:foo:]-style code comments to the markdown parser.
-List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
+final List<markdown.InlineSyntax> _MARKDOWN_SYNTAXES =
   [new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
 
 /// If we can't find the SDK introduction text, which will happen if running
@@ -218,29 +222,6 @@
   }
 }
 
-/// Docgen representation of an item to be documented, that wraps around a
-/// dart2js mirror.
-abstract class MirrorBased {
-  /// The original dart2js mirror around which this object wraps.
-  DeclarationMirror get mirror;
-
-  /// Returns a list of meta annotations assocated with a mirror.
-  static List<Annotation> _createAnnotations(DeclarationMirror mirror,
-      Library owningLibrary) {
-    var annotationMirrors = mirror.metadata.where((e) =>
-        e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
-    var annotations = [];
-    annotationMirrors.forEach((annotation) {
-      var docgenAnnotation = new Annotation(annotation, owningLibrary);
-      if (!_SKIPPED_ANNOTATIONS.contains(
-          dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
-        annotations.add(docgenAnnotation);
-      }
-    });
-    return annotations;
-  }
-}
-
 /// Top level documentation traversal and generation object.
 ///
 /// Yes, everything in this class is used statically so this technically doesn't
@@ -377,7 +358,7 @@
     libs.forEach((lib) {
       // Files belonging to the SDK have a uri that begins with 'dart:'.
       if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
-        var library = generateLibrary(lib);
+        generateLibrary(lib);
       }
     });
 
@@ -398,7 +379,7 @@
 
     // Outputs a JSON file with all libraries and their preview comments.
     // This will help the viewer know what libraries are available to read in.
-    var libraryMap;
+    Map<String, dynamic> libraryMap;
 
     if (append) {
       var docsDir = listDir(_outputDirectory);
@@ -430,7 +411,7 @@
 
   /// Output all of the libraries and classes into json or yaml files for
   /// consumption by a viewer.
-  static void _writeOutputFiles(libraryMap,
+  static void _writeOutputFiles(Map<String, dynamic> libraryMap,
       Iterable<Indexable> filteredEntities, bool outputToYaml, bool append,
       String startPage) {
     if (startPage != null) libraryMap['start-page'] = startPage;
@@ -577,8 +558,9 @@
     for (var arg in args) {
       if (FileSystemEntity.typeSync(arg) == FileSystemEntityType.FILE) {
         if (arg.endsWith('.dart')) {
-          libraries.add(new Uri.file(path.absolute(arg)));
-          logger.info('Added to libraries: ${libraries.last}');
+          var lib = new Uri.file(path.absolute(arg));
+          libraries.add(lib);
+          logger.info('Added to libraries: $lib');
         }
       } else {
         libraries.addAll(_findFilesToDocumentInPackage(arg));
@@ -594,26 +576,49 @@
     // To avoid anaylzing package files twice, only files with paths not
     // containing '/packages' will be added. The only exception is if the file
     // to analyze already has a '/package' in its path.
-    var files = listDir(packageName, recursive: true).where(
-        (f) => f.endsWith('.dart') && (!f.contains('${path.separator}packages')
-            || packageName.contains('${path.separator}packages'))).toList();
+    var files = listDir(packageName, recursive: true, listDir: _packageDirList)
+        .where((f) => f.endsWith('.dart')
+            &&  (!f.contains('${path.separator}packages')
+                || packageName.contains('${path.separator}packages'))).toList();
 
-    files.forEach((String f) {
+    files.forEach((String lib) {
       // Only include libraries at the top level of "lib"
-      if (path.basename(path.dirname(f)) == 'lib') {
+      if (path.basename(path.dirname(lib)) == 'lib') {
         // Only add the file if it does not contain 'part of'
         // TODO(janicejl): Remove when Issue(12406) is resolved.
-        var contents = new File(f).readAsStringSync();
+        var contents = new File(lib).readAsStringSync();
         if (!(contents.contains(new RegExp('\npart of ')) ||
             contents.startsWith(new RegExp('part of ')))) {
-          libraries.add(new Uri.file(path.normalize(path.absolute(f))));
-          logger.info('Added to libraries: $f');
+          libraries.add(new Uri.file(path.normalize(path.absolute(lib))));
+          logger.info('Added to libraries: $lib');
         }
       }
     });
     return libraries;
   }
 
+  /// If [dir] contains both a `lib` directory and a `pubspec.yaml` file treat
+  /// it like a package and only return the `lib` dir.
+  ///
+  /// This ensures that packages don't have non-`lib` content documented.
+  static List<FileSystemEntity> _packageDirList(Directory dir) {
+    var entities = dir.listSync();
+
+    var pubspec = entities
+        .firstWhere((e) => e is File &&
+        path.basename(e.path) == 'pubspec.yaml', orElse: () => null);
+
+    var libDir = entities
+        .firstWhere((e) => e is Directory &&
+        path.basename(e.path) == 'lib', orElse: () => null);
+
+    if (pubspec != null && libDir != null) {
+      return [libDir];
+    } else {
+      return entities;
+    }
+  }
+
   /// All of the directories for our dependent packages
   /// If this is not a package, return an empty list.
   static List<String> _allDependentPackageDirs(String packageDirectory) {
@@ -648,11 +653,10 @@
   }
 
   /// Currently left public for testing purposes. :-/
-  static Library generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
+  static void generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
     var result = new Library(library);
-    result._findPackage(library);
+    result._updateLibraryPackage(library);
     logger.fine('Generated library for ${result.name}');
-    return result;
   }
 }
 
@@ -862,19 +866,15 @@
   /// when running dart by default.
   static Iterable<LibraryMirror> _sdkLibraries;
 
+  Library get _owningLibrary => owner._owningLibrary;
+
   String get qualifiedName => fileName;
-  bool isPrivate;
-  DeclarationMirror mirror;
+  final DeclarationMirror mirror;
+  final bool isPrivate;
   /// The comment text pre-resolution. We keep this around because inherited
   /// methods need to resolve links differently from the superclass.
   String _unresolvedComment = '';
 
-  // TODO(janicejl): Make MDN content generic or pluggable. Maybe move
-  // MDN-specific code to its own library that is imported into the default
-  // impl?
-  /// Map of all the comments for dom elements from MDN.
-  static Map _mdn;
-
   /// Index of all the dart2js mirrors examined to corresponding MirrorBased
   /// docgen objects.
   ///
@@ -884,8 +884,9 @@
   static Map<String, Map<String, Set<Indexable>>> _mirrorToDocgen =
       new Map<String, Map<String, Set<Indexable>>>();
 
-  Indexable(this.mirror) {
-    this.isPrivate = _isHidden(mirror);
+  Indexable(DeclarationMirror mirror)
+      : this.mirror = mirror,
+        this.isPrivate = isHidden(mirror) {
 
     var map = _mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)];
     if (map == null) map = new Map<String, Set<Indexable>>();
@@ -897,12 +898,6 @@
     _mirrorToDocgen[dart2js_util.qualifiedNameOf(this.mirror)] = map;
   }
 
-  /** Walk up the owner chain to find the owning library. */
-  Library _getOwningLibrary(Indexable indexable) {
-    if (indexable is Library) return indexable;
-    return _getOwningLibrary(indexable.owner);
-  }
-
   static _initializeTopLevelLibraries(MirrorSystem mirrorSystem) {
     _sdkLibraries = mirrorSystem.libraries.values.where(
         (each) => each.uri.scheme == 'dart');
@@ -930,12 +925,6 @@
   String findElementInScope(String name) =>
       _findElementInScope(name, packagePrefix);
 
-  /// For a given name, determine if we need to resolve it as a qualified name
-  /// or a simple name in the source mirors.
-  static determineLookupFunc(name) => name.contains('.') ?
-      dart2js_util.lookupQualifiedInScope :
-        (mirror, name) => mirror.lookupInScope(name);
-
   /// The reference to this element based on where it is printed as a
   /// documentation file and also the unique URL to refer to this item.
   ///
@@ -986,33 +975,6 @@
   /// Generates MDN comments from database.json.
   String _mdnComment();
 
-  /// Generates the MDN Comment for variables and method DOM elements.
-  String _mdnMemberComment(String type, String member) {
-    var mdnType = _mdn[type];
-    if (mdnType == null) return '';
-    var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
-        orElse: () => null);
-    if (mdnMember == null) return '';
-    if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
-    if (mdnMember['url'] == null) return '';
-    return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
-  }
-
-  /// Generates the MDN Comment for class DOM elements.
-  String _mdnTypeComment(String type) {
-    var mdnType = _mdn[type];
-    if (mdnType == null) return '';
-    if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
-    if (mdnType['srcUrl'] == null) return '';
-    return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
-  }
-
-  /// Encloses the given content in an MDN div and the original source link.
-  String _htmlifyMdn(String content, String url) {
-    return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
-        '<a href="' + url.trim() + '">from Mdn</a></p></div>';
-  }
-
   /// The type of this member to be used in index.txt.
   String get typeName => '';
 
@@ -1081,7 +1043,7 @@
     // TODO(janicejl): When map to map feature is created, replace the below
     // with a filter. Issue(#9590).
     mirrors.forEach((VariableMirror mirror) {
-      if (_Generator._includePrivate || !_isHidden(mirror)) {
+      if (_Generator._includePrivate || !isHidden(mirror)) {
         var mirrorName = dart2js_util.nameOf(mirror);
         data[mirrorName] = new Variable(mirrorName, mirror, owner);
       }
@@ -1110,7 +1072,7 @@
     var data = {};
     mirrorList.forEach((ParameterMirror mirror) {
       data[dart2js_util.nameOf(mirror)] =
-          new Parameter(mirror, _getOwningLibrary(owner));
+          new Parameter(mirror, owner._owningLibrary);
     });
     return data;
   }
@@ -1128,37 +1090,7 @@
   /// Return a map representation of this type.
   Map toMap();
 
-  /// A declaration is private if itself is private, or the owner is private.
-  // Issue(12202) - A declaration is public even if it's owner is private.
-  bool _isHidden(DeclarationMirror mirror) {
-    if (mirror is LibraryMirror) {
-      return _isLibraryPrivate(mirror);
-    } else if (mirror.owner is LibraryMirror) {
-      return (mirror.isPrivate || _isLibraryPrivate(mirror.owner)
-          || mirror.isNameSynthetic);
-    } else {
-      return (mirror.isPrivate || _isHidden(mirror.owner)
-          || owner.mirror.isNameSynthetic);
-    }
-  }
 
-  /// Returns true if a library name starts with an underscore, and false
-  /// otherwise.
-  ///
-  /// An example that starts with _ is _js_helper.
-  /// An example that contains ._ is dart._collection.dev
-  bool _isLibraryPrivate(LibraryMirror mirror) {
-    // This method is needed because LibraryMirror.isPrivate returns `false` all
-    // the time.
-    var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
-    if (sdkLibrary != null) {
-      return !sdkLibrary.documented;
-    } else if (dart2js_util.nameOf(mirror).startsWith('_') ||
-        dart2js_util.nameOf(mirror).contains('._')) {
-      return true;
-    }
-    return false;
-  }
 
   ////// Top level resolution functions
   /// Converts all [foo] references in comments to <a>libraryName.foo</a>.
@@ -1182,11 +1114,11 @@
   /// version of resolvedBar.
   static markdown.Node _fixComplexReference(String name) {
     // Parse into multiple elements we can try to resolve.
-    var tokens = _tokenizeComplexReference(name);
+    var tokens = tokenizeComplexReference(name);
 
     // Produce an html representation of our elements. Group unresolved and
     // plain text are grouped into "link" elements so they display as code.
-    final textElements = [' ', ',', '>', _LESS_THAN];
+    final textElements = [' ', ',', '>', LESS_THAN];
     var accumulatedHtml = '';
 
     for (var token in tokens) {
@@ -1206,43 +1138,6 @@
     return new markdown.Text(accumulatedHtml);
   }
 
-
-  // HTML escaped version of '<' character.
-  static final _LESS_THAN = '&lt;';
-
-  /// Chunk the provided name into individual parts to be resolved. We take a
-  /// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
-  /// and ">". All other characters are grouped into the name to be resolved.
-  /// As a result, these characters will all be treated as part of the item to
-  /// be resolved (aka the * is interpreted literally as a *, not as an
-  /// indicator for bold <em>.
-  static List<String> _tokenizeComplexReference(String name) {
-    var tokens = [];
-    var append = false;
-    var index = 0;
-    while(index < name.length) {
-      if (name.indexOf(_LESS_THAN, index) == index) {
-        tokens.add(_LESS_THAN);
-        append = false;
-        index += _LESS_THAN.length;
-      } else if (name[index] == ' ' || name[index] == ',' ||
-          name[index] == '>') {
-        tokens.add(name[index]);
-        append = false;
-        index++;
-      } else {
-        if (append) {
-          tokens[tokens.length - 1] = tokens.last + name[index];
-        } else {
-          tokens.add(name[index]);
-          append = true;
-        }
-        index++;
-      }
-    }
-    return tokens;
-  }
-
   static String _findElementInScope(String name, String packagePrefix) {
     var lookupFunc = determineLookupFunc(name);
     // Look in the dart core library scope.
@@ -1278,39 +1173,18 @@
   /// Expand the method map [mapToExpand] into a more detailed map that
   /// separates out setters, getters, constructors, operators, and methods.
   Map _expandMethodMap(Map<String, Method> mapToExpand) => {
-    'setters': recurseMap(_filterMap(mapToExpand,
+    'setters': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isSetter)),
-    'getters': recurseMap(_filterMap(mapToExpand,
+    'getters': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isGetter)),
-    'constructors': recurseMap(_filterMap(mapToExpand,
+    'constructors': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isConstructor)),
-    'operators': recurseMap(_filterMap(mapToExpand,
+    'operators': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isOperator)),
-    'methods': recurseMap(_filterMap(mapToExpand,
+    'methods': recurseMap(filterMap(mapToExpand,
         (key, val) => val.mirror.isRegularMethod && !val.mirror.isOperator))
   };
 
-  /// Transforms the map by calling toMap on each value in it.
-  Map recurseMap(Map inputMap) {
-    var outputMap = {};
-    inputMap.forEach((key, value) {
-      if (value is Map) {
-        outputMap[key] = recurseMap(value);
-      } else {
-        outputMap[key] = value.toMap();
-      }
-    });
-    return outputMap;
-  }
-
-  Map _filterMap(Map map, Function test) {
-    var exported = new Map();
-    map.forEach((key, value) {
-      if (test(key, value)) exported[key] = value;
-    });
-    return exported;
-  }
-
   /// Accessor to determine if this item and all of its owners are visible.
   bool get _isVisible => _Generator._isFullChainVisible(this);
 
@@ -1365,6 +1239,9 @@
 
 /// A class containing contents of a Dart library.
 class Library extends Indexable {
+  final Map<String, Class> classes = {};
+  final Map<String, Typedef> typedefs = {};
+  final Map<String, Class> errors = {};
 
   /// Top-level variables in the library.
   Map<String, Variable> variables;
@@ -1372,14 +1249,12 @@
   /// Top-level functions in the library.
   Map<String, Method> functions;
 
-  Map<String, Class> classes = {};
-  Map<String, Typedef> typedefs = {};
-  Map<String, Class> errors = {};
-
   String packageName = '';
   bool _hasBeenCheckedForPackage = false;
   String packageIntro;
 
+  Library get _owningLibrary => this;
+
   /// Returns the [Library] for the given [mirror] if it has already been
   /// created, else creates it.
   factory Library(LibraryMirror mirror) {
@@ -1394,10 +1269,7 @@
     var exported = _calcExportedItems(libraryMirror);
     var exportedClasses = _addAll(exported['classes'],
         dart2js_util.typesOf(libraryMirror.declarations));
-    _findPackage(mirror);
-    classes = {};
-    typedefs = {};
-    errors = {};
+    _updateLibraryPackage(mirror);
     exportedClasses.forEach((String mirrorName, TypeMirror mirror) {
         if (mirror is TypedefMirror) {
           // This is actually a Dart2jsTypedefMirror, and it does define value,
@@ -1428,7 +1300,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var libraryScope = lookupFunc(mirror, name);
     if (libraryScope != null) {
       var result = Indexable.getDocgenObject(libraryScope, this);
@@ -1441,7 +1313,7 @@
   String _mdnComment() => '';
 
   /// Helper that maps [mirrors] to their simple name in map.
-  Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
+  static Map _addAll(Map map, Iterable<DeclarationMirror> mirrors) {
     for (var mirror in mirrors) {
       map[dart2js_util.nameOf(mirror)] = mirror;
     }
@@ -1452,17 +1324,16 @@
   /// believe it came from (because of its file URI).
   ///
   /// If no package could be determined, we return an empty string.
-  String _findPackage(LibraryMirror mirror) {
-    if (mirror == null) return '';
-    if (_hasBeenCheckedForPackage) return packageName;
+  void _updateLibraryPackage(LibraryMirror mirror) {
+    if (mirror == null) return;
+    if (_hasBeenCheckedForPackage) return;
     _hasBeenCheckedForPackage = true;
-    if (mirror.uri.scheme != 'file') return '';
+    if (mirror.uri.scheme != 'file') return;
     packageName = _packageName(mirror);
     // Associate the package readme with all the libraries. This is a bit
     // wasteful, but easier than trying to figure out which partial match
     // is best.
     packageIntro = _packageIntro(_getPackageDirectory(mirror));
-    return packageName;
   }
 
   String _packageIntro(packageDir) {
@@ -1569,7 +1440,7 @@
 
     // Determine the classes, variables and methods that are exported for a
     // specific dependency.
-    _populateExports(LibraryDependencyMirror export, bool showExport) {
+    void _populateExports(LibraryDependencyMirror export, bool showExport) {
       if (!showExport) {
         // Add all items, and then remove the hidden ones.
         // Ex: "export foo hide bar"
@@ -1667,29 +1538,13 @@
 
   /// Generates MDN comments from database.json.
   String _mdnComment() {
-    //Check if MDN is loaded.
-    if (Indexable._mdn == null) {
-      // Reading in MDN related json file.
-      var root = _Generator._rootDirectory;
-      var mdnPath = path.join(root, 'utils/apidoc/mdn/database.json');
-      var mdnFile = new File(mdnPath);
-      if (mdnFile.existsSync()) {
-        Indexable._mdn = JSON.decode(mdnFile.readAsStringSync());
-      } else {
-        _Generator.logger.warning("Cannot find MDN docs expected at $mdnPath");
-        Indexable._mdn = {};
-      }
-    }
     var domAnnotation = this.annotations.firstWhere(
         (e) => e.mirror.qualifiedName == #metadata.DomName,
         orElse: () => null);
     if (domAnnotation == null) return '';
     var domName = domAnnotation.parameters.single;
-    var parts = domName.split('.');
-    if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
-    if (parts.length == 1) return _mdnTypeComment(parts[0]);
 
-    throw new StateError('More than two items is not supported: $parts');
+    return mdnComment(_Generator._rootDirectory, _Generator.logger, domName);
   }
 
   String get packagePrefix => owner.packagePrefix;
@@ -1768,7 +1623,7 @@
         dart2js_util.variablesOf(classMirror.declarations), this);
     methods = _createMethods(classMirror.declarations.values.where(
         (mirror) => mirror is MethodMirror), this);
-    annotations = MirrorBased._createAnnotations(classMirror, _getOwningLibrary(owner));
+    annotations = _createAnnotations(classMirror, owner._owningLibrary);
     generics = _createGenerics(classMirror);
     isAbstract = classMirror.isAbstract;
     inheritedMethods = new Map<String, Method>();
@@ -1784,7 +1639,7 @@
   }
 
   String _lookupInClassAndSuperclasses(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var classScope = this;
     while (classScope != null) {
       var classFunc = lookupFunc(classScope.mirror, name);
@@ -1799,7 +1654,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var result = _lookupInClassAndSuperclasses(name);
     if (result != null) {
       return result;
@@ -1951,7 +1806,7 @@
     returnType = Indexable.getDocgenObject(mirror.referent.returnType).docName;
     generics = _createGenerics(mirror);
     parameters = _createParameters(mirror.referent.parameters, owningLibrary);
-    annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+    annotations = _createAnnotations(mirror, owningLibrary);
   }
 
   Map toMap() {
@@ -2003,8 +1858,8 @@
     isFinal = mirror.isFinal;
     isStatic = mirror.isStatic;
     isConst = mirror.isConst;
-    type = new Type(mirror.type, _getOwningLibrary(owner));
-    annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+    type = new Type(mirror.type, owner._owningLibrary);
+    annotations = _createAnnotations(mirror, owner._owningLibrary);
   }
 
   String get name => _variableName;
@@ -2032,7 +1887,7 @@
   }
 
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
     var result = lookupFunc(mirror, name);
     if (result != null) {
       result = Indexable.getDocgenObject(result);
@@ -2081,9 +1936,9 @@
     isStatic = mirror.isStatic;
     isAbstract = mirror.isAbstract;
     isConst = mirror.isConstConstructor;
-    returnType = new Type(mirror.returnType, _getOwningLibrary(owner));
+    returnType = new Type(mirror.returnType, owner._owningLibrary);
     parameters = _createParameters(mirror.parameters, owner);
-    annotations = MirrorBased._createAnnotations(mirror, _getOwningLibrary(owner));
+    annotations = _createAnnotations(mirror, owner._owningLibrary);
   }
 
   Method get originallyInheritedFrom => methodInheritedFrom == null ?
@@ -2092,7 +1947,7 @@
   /// Look for the specified name starting with the current member, and
   /// progressively working outward to the current library scope.
   String findElementInScope(String name) {
-    var lookupFunc = Indexable.determineLookupFunc(name);
+    var lookupFunc = determineLookupFunc(name);
 
     var memberScope = lookupFunc(this.mirror, name);
     if (memberScope != null) {
@@ -2212,7 +2067,7 @@
         hasDefaultValue = mirror.hasDefaultValue,
         defaultValue = '${mirror.defaultValue}',
         type = new Type(mirror.type, owningLibrary),
-        annotations = MirrorBased._createAnnotations(mirror, owningLibrary);
+        annotations = _createAnnotations(mirror, owningLibrary);
 
   /// Generates a map describing the [Parameter] object.
   Map toMap() => {
@@ -2226,16 +2081,6 @@
   };
 }
 
-/// A Docgen wrapper around the dart2js mirror for a generic type.
-class Generic extends MirrorBased {
-  final TypeVariableMirror mirror;
-  Generic(this.mirror);
-  Map toMap() => {
-    'name': dart2js_util.nameOf(mirror),
-    'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
-  };
-}
-
 /// Docgen wrapper around the mirror for a return type, and/or its generic
 /// type parameters.
 ///
@@ -2315,3 +2160,19 @@
     'parameters': parameters
   };
 }
+
+/// Returns a list of meta annotations assocated with a mirror.
+List<Annotation> _createAnnotations(DeclarationMirror mirror,
+    Library owningLibrary) {
+  var annotationMirrors = mirror.metadata.where((e) =>
+      e is dart2js_mirrors.Dart2JsConstructedConstantMirror);
+  var annotations = [];
+  annotationMirrors.forEach((annotation) {
+    var docgenAnnotation = new Annotation(annotation, owningLibrary);
+    if (!_SKIPPED_ANNOTATIONS.contains(
+        dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
+      annotations.add(docgenAnnotation);
+    }
+  });
+  return annotations;
+}
diff --git a/pkg/docgen/lib/dart2yaml.dart b/pkg/docgen/lib/src/dart2yaml.dart
similarity index 98%
rename from pkg/docgen/lib/dart2yaml.dart
rename to pkg/docgen/lib/src/dart2yaml.dart
index b86cbb4..ac0a8ee 100644
--- a/pkg/docgen/lib/dart2yaml.dart
+++ b/pkg/docgen/lib/src/dart2yaml.dart
@@ -5,7 +5,7 @@
 /**
  * This library is used to convert data from a map to a YAML string.
  */
-library dart2yaml;
+library docgen.dart2yaml;
 
 /**
  * Gets a String representing the input Map in YAML format.
diff --git a/pkg/docgen/lib/src/io.dart b/pkg/docgen/lib/src/io.dart
index 9998687..65e69e8 100644
--- a/pkg/docgen/lib/src/io.dart
+++ b/pkg/docgen/lib/src/io.dart
@@ -1,151 +1,61 @@
-library io;
+// 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.
+
 /// This is a helper library to make working with io easier.
+library docgen.io;
+
 // TODO(janicejl): listDir, canonicalize, resolveLink, and linkExists are from
 // pub/lib/src/io.dart. If the io.dart file becomes a package, should remove
 // copy of the functions.
 
-import 'dart:collection';
 import 'dart:io';
 import 'package:path/path.dart' as path;
 
-/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
-/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
-/// and directories beginning with `.` (defaults to `false`).
+/// Lists the contents of [dir].
+///
+/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
+///
+/// Excludes files and directories beginning with `.`
 ///
 /// The returned paths are guaranteed to begin with [dir].
 List<String> listDir(String dir, {bool recursive: false,
-    bool includeHidden: false}) {
-  List<String> doList(String dir, Set<String> listedDirectories) {
-    var contents = <String>[];
+  List<FileSystemEntity> listDir(Directory dir)}) {
+  if (listDir == null) listDir = (Directory dir) => dir.listSync();
 
-    // Avoid recursive symlinks.
-    var resolvedPath = canonicalize(dir);
-    if (listedDirectories.contains(resolvedPath)) return [];
-
-    listedDirectories = new Set<String>.from(listedDirectories);
-    listedDirectories.add(resolvedPath);
-
-    var children = <String>[];
-    for (var entity in new Directory(dir).listSync()) {
-      if (!includeHidden && path.basename(entity.path).startsWith('.')) {
-        continue;
-      }
-
-      contents.add(entity.path);
-      if (entity is Directory) {
-        // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
-        // Note that once we remove the manual recursion, we'll need to
-        // explicitly filter out files in hidden directories.
-        if (recursive) {
-          children.addAll(doList(entity.path, listedDirectories));
-        }
-      }
-    }
-
-    contents.addAll(children);
-    return contents;
-  }
-
-  return doList(dir, new Set<String>());
+  return _doList(dir, new Set<String>(), recursive, listDir);
 }
 
-/// Returns the canonical path for [pathString]. This is the normalized,
-/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
-/// recursive symlinks will not be fully resolved.
-///
-/// This doesn't require [pathString] to point to a path that exists on the
-/// filesystem; nonexistent or unreadable path entries are treated as normal
-/// directories.
-String canonicalize(String pathString) {
-  var seen = new Set<String>();
-  var components = new Queue<String>.from(
-      path.split(path.normalize(path.absolute(pathString))));
+List<String> _doList(String dir, Set<String> listedDirectories, bool recurse,
+    List<FileSystemEntity> listDir(Directory dir)) {
+  var contents = <String>[];
 
-  // The canonical path, built incrementally as we iterate through [components].
-  var newPath = components.removeFirst();
+  // Avoid recursive symlinks.
+  var resolvedPath = new Directory(dir).resolveSymbolicLinksSync();
+  if (listedDirectories.contains(resolvedPath)) return [];
 
-  // Move through the components of the path, resolving each one's symlinks as
-  // necessary. A resolved component may also add new components that need to be
-  // resolved in turn.
-  while (!components.isEmpty) {
-    seen.add(path.join(newPath, path.joinAll(components)));
-    var resolvedPath = resolveLink(
-        path.join(newPath, components.removeFirst()));
-    var relative = path.relative(resolvedPath, from: newPath);
+  listedDirectories = new Set<String>.from(listedDirectories);
+  listedDirectories.add(resolvedPath);
 
-    // If the resolved path of the component relative to `newPath` is just ".",
-    // that means component was a symlink pointing to its parent directory. We
-    // can safely ignore such components.
-    if (relative == '.') continue;
-
-    var relativeComponents = new Queue<String>.from(path.split(relative));
-
-    // If the resolved path is absolute relative to `newPath`, that means it's
-    // on a different drive. We need to canonicalize the entire target of that
-    // symlink again.
-    if (path.isAbsolute(relative)) {
-      // If we've already tried to canonicalize the new path, we've encountered
-      // a symlink loop. Avoid going infinite by treating the recursive symlink
-      // as the canonical path.
-      if (seen.contains(relative)) {
-        newPath = relative;
-      } else {
-        newPath = relativeComponents.removeFirst();
-        relativeComponents.addAll(components);
-        components = relativeComponents;
-      }
+  var children = <String>[];
+  for (var entity in listDir(new Directory(dir))) {
+    // Skip hidden files and directories
+    if (path.basename(entity.path).startsWith('.')) {
       continue;
     }
 
-    // Pop directories off `newPath` if the component links upwards in the
-    // directory hierarchy.
-    while (relativeComponents.first == '..') {
-      newPath = path.dirname(newPath);
-      relativeComponents.removeFirst();
+    contents.add(entity.path);
+    if (entity is Directory) {
+      // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
+      // Note that once we remove the manual recursion, we'll need to
+      // explicitly filter out files in hidden directories.
+      if (recurse) {
+        children.addAll(_doList(entity.path, listedDirectories, recurse,
+            listDir));
+      }
     }
-
-    // If there's only one component left, [resolveLink] guarantees that it's
-    // not a link (or is a broken link). We can just add it to `newPath` and
-    // continue resolving the remaining components.
-    if (relativeComponents.length == 1) {
-      newPath = path.join(newPath, relativeComponents.single);
-      continue;
-    }
-
-    // If we've already tried to canonicalize the new path, we've encountered a
-    // symlink loop. Avoid going infinite by treating the recursive symlink as
-    // the canonical path.
-    var newSubPath = path.join(newPath, path.joinAll(relativeComponents));
-    if (seen.contains(newSubPath)) {
-      newPath = newSubPath;
-      continue;
-    }
-
-    // If there are multiple new components to resolve, add them to the
-    // beginning of the queue.
-    relativeComponents.addAll(components);
-    components = relativeComponents;
   }
-  return newPath;
-}
 
-/// Returns the transitive target of [link] (if A links to B which links to C,
-/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
-/// which links back to A), this returns the path to the first repeated link (so
-/// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
-/// return `"B"`).
-///
-/// This accepts paths to non-links or broken links, and returns them as-is.
-String resolveLink(String link) {
-  var seen = new Set<String>();
-  while (linkExists(link) && !seen.contains(link)) {
-    seen.add(link);
-    link = path.normalize(path.join(
-        path.dirname(link), new Link(link).targetSync()));
-  }
-  return link;
+  contents.addAll(children);
+  return contents;
 }
-
-/// Returns whether [link] exists on the file system. This will return `true`
-/// for any symlink, regardless of what it points at or whether it's broken.
-bool linkExists(String link) => new Link(link).existsSync();
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/mdn.dart b/pkg/docgen/lib/src/mdn.dart
new file mode 100644
index 0000000..073dbdd
--- /dev/null
+++ b/pkg/docgen/lib/src/mdn.dart
@@ -0,0 +1,65 @@
+// 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.
+
+library docgen.mdn;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:logging/logging.dart';
+import 'package:path/path.dart' as p;
+
+// TODO(janicejl): Make MDN content generic or pluggable.
+
+/// Map of all the comments for dom elements from MDN.
+Map<String, dynamic> _mdn;
+
+/// Generates MDN comments from database.json.
+String mdnComment(String root, Logger logger, String domName) {
+   //Check if MDN is loaded.
+ if (_mdn == null) {
+   // Reading in MDN related json file.
+   var mdnPath = p.join(root, 'utils/apidoc/mdn/database.json');
+   var mdnFile = new File(mdnPath);
+   if (mdnFile.existsSync()) {
+     _mdn = JSON.decode(mdnFile.readAsStringSync());
+   } else {
+     logger.warning("Cannot find MDN docs expected at $mdnPath");
+     _mdn = {};
+   }
+ }
+
+ var parts = domName.split('.');
+ if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
+ if (parts.length == 1) return _mdnTypeComment(parts[0]);
+
+ throw new StateError('More than two items is not supported: $parts');
+}
+
+/// Generates the MDN Comment for variables and method DOM elements.
+String _mdnMemberComment(String type, String member) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
+      orElse: () => null);
+  if (mdnMember == null) return '';
+  if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
+  if (mdnMember['url'] == null) return '';
+  return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
+}
+
+/// Generates the MDN Comment for class DOM elements.
+String _mdnTypeComment(String type) {
+  var mdnType = _mdn[type];
+  if (mdnType == null) return '';
+  if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
+  if (mdnType['srcUrl'] == null) return '';
+  return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
+}
+
+/// Encloses the given content in an MDN div and the original source link.
+String _htmlifyMdn(String content, String url) {
+  return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
+      '<a href="' + url.trim() + '">from Mdn</a></p></div>';
+}
diff --git a/pkg/docgen/lib/src/models.dart b/pkg/docgen/lib/src/models.dart
new file mode 100644
index 0000000..32f4a43
--- /dev/null
+++ b/pkg/docgen/lib/src/models.dart
@@ -0,0 +1,28 @@
+// 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.
+
+library docgen.models;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+    as dart2js_util;
+
+/// Docgen representation of an item to be documented, that wraps around a
+/// dart2js mirror.
+abstract class MirrorBased {
+  /// The original dart2js mirror around which this object wraps.
+  DeclarationMirror get mirror;
+}
+
+/// A Docgen wrapper around the dart2js mirror for a generic type.
+class Generic extends MirrorBased {
+  final TypeVariableMirror mirror;
+
+  Generic(this.mirror);
+
+  Map toMap() => {
+    'name': dart2js_util.nameOf(mirror),
+    'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
+  };
+}
diff --git a/pkg/docgen/lib/src/utils.dart b/pkg/docgen/lib/src/utils.dart
new file mode 100644
index 0000000..8915af4
--- /dev/null
+++ b/pkg/docgen/lib/src/utils.dart
@@ -0,0 +1,107 @@
+// 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.
+
+library docgen.utils;
+
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart'
+    as dart2js_util;
+import '../../../../sdk/lib/_internal/libraries.dart';
+
+// HTML escaped version of '<' character.
+const LESS_THAN = '&lt;';
+
+/// A declaration is private if itself is private, or the owner is private.
+// Issue(12202) - A declaration is public even if it's owner is private.
+bool isHidden(DeclarationMirror mirror) {
+  if (mirror is LibraryMirror) {
+    return _isLibraryPrivate(mirror);
+  } else if (mirror.owner is LibraryMirror) {
+    return (mirror.isPrivate || _isLibraryPrivate(mirror.owner) ||
+        mirror.isNameSynthetic);
+  } else {
+    return (mirror.isPrivate || isHidden(mirror.owner) ||
+        mirror.isNameSynthetic);
+  }
+}
+
+/// Returns true if a library name starts with an underscore, and false
+/// otherwise.
+///
+/// An example that starts with _ is _js_helper.
+/// An example that contains ._ is dart._collection.dev
+bool _isLibraryPrivate(LibraryMirror mirror) {
+  // This method is needed because LibraryMirror.isPrivate returns `false` all
+  // the time.
+  var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
+  if (sdkLibrary != null) {
+    return !sdkLibrary.documented;
+  } else if (dart2js_util.nameOf(mirror).startsWith('_') || dart2js_util.nameOf(
+      mirror).contains('._')) {
+    return true;
+  }
+  return false;
+}
+
+/// Transforms the map by calling toMap on each value in it.
+Map recurseMap(Map inputMap) {
+  var outputMap = {};
+  inputMap.forEach((key, value) {
+    if (value is Map) {
+      outputMap[key] = recurseMap(value);
+    } else {
+      outputMap[key] = value.toMap();
+    }
+  });
+  return outputMap;
+}
+
+Map filterMap(Map map, Function test) {
+  var exported = new Map();
+  map.forEach((key, value) {
+    if (test(key, value)) exported[key] = value;
+  });
+  return exported;
+}
+
+/// Chunk the provided name into individual parts to be resolved. We take a
+/// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
+/// and ">". All other characters are grouped into the name to be resolved.
+/// As a result, these characters will all be treated as part of the item to
+/// be resolved (aka the * is interpreted literally as a *, not as an
+/// indicator for bold <em>.
+List<String> tokenizeComplexReference(String name) {
+  var tokens = [];
+  var append = false;
+  var index = 0;
+  while (index < name.length) {
+    if (name.indexOf(LESS_THAN, index) == index) {
+      tokens.add(LESS_THAN);
+      append = false;
+      index += LESS_THAN.length;
+    } else if (name[index] == ' ' || name[index] == ',' || name[index] == '>') {
+      tokens.add(name[index]);
+      append = false;
+      index++;
+    } else {
+      if (append) {
+        tokens[tokens.length - 1] = tokens.last + name[index];
+      } else {
+        tokens.add(name[index]);
+        append = true;
+      }
+      index++;
+    }
+  }
+  return tokens;
+}
+
+typedef DeclarationMirror LookupFunction(DeclarationSourceMirror declaration,
+    String name);
+
+/// For a given name, determine if we need to resolve it as a qualified name
+/// or a simple name in the source mirors.
+LookupFunction determineLookupFunc(String name) => name.contains('.') ?
+    dart2js_util.lookupQualifiedInScope :
+      (mirror, name) => mirror.lookupInScope(name);
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
index f158dab..68a3a12 100644
--- a/pkg/docgen/test/generate_json_test.dart
+++ b/pkg/docgen/test/generate_json_test.dart
@@ -1,4 +1,9 @@
-import 'dart:convert';
+// 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.
+
+library docgen.generate_json_test;
+
 import 'dart:io';
 
 import 'package:path/path.dart' as p;
@@ -12,94 +17,29 @@
 void main() {
 
   setUp(() {
-     var tempDir;
-     schedule(() {
-       return Directory.systemTemp
-           .createTemp('docgen_test-')
-           .then((dir) {
-         tempDir = dir;
-         d.defaultRoot = tempDir.path;
-       });
-     });
-
-     currentSchedule.onComplete.schedule(() {
-       d.defaultRoot = null;
-       return tempDir.delete(recursive: true);
-     });
-   });
+    scheduleTempDir();
+  });
 
   test('json output', () {
     schedule(() {
       var codeDir = getMultiLibraryCodePath();
       expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
     });
 
     d.dir('docs', [
-        d.matcherFile('index.json', _isJsonMap),
-        d.matcherFile('index.txt', _hasSortedLines),
-        d.matcherFile('library_list.json', _isJsonMap),
-        d.matcherFile('testLib-bar.C.json', _isJsonMap),
-        d.matcherFile('testLib-bar.json', _isJsonMap),
-        d.matcherFile('testLib.A.json', _isJsonMap),
-        d.matcherFile('testLib.B.json', _isJsonMap),
-        d.matcherFile('testLib.C.json', _isJsonMap),
-        d.matcherFile('testLib.json', _isJsonMap),
-        d.matcherFile('testLib2-foo.B.json', _isJsonMap),
-        d.matcherFile('testLib2-foo.json', _isJsonMap)
+        d.matcherFile('index.json', isJsonMap),
+        d.matcherFile('index.txt', hasSortedLines),
+        d.matcherFile('library_list.json', isJsonMap),
+        d.matcherFile('test_lib-bar.C.json', isJsonMap),
+        d.matcherFile('test_lib-bar.json', isJsonMap),
+        d.matcherFile('test_lib-foo.B.json', isJsonMap),
+        d.matcherFile('test_lib-foo.json', isJsonMap),
+        d.matcherFile('test_lib.A.json', isJsonMap),
+        d.matcherFile('test_lib.B.json', isJsonMap),
+        d.matcherFile('test_lib.C.json', isJsonMap),
+        d.matcherFile('test_lib.json', isJsonMap),
     ]).validate();
 
   });
-
-  test('typedef gen', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    schedule(() {
-      var dartCoreJson = new File(p.join(d.defaultRoot, 'docs', 'testLib-bar.json'))
-        .readAsStringSync();
-
-      var dartCore = JSON.decode(dartCoreJson) as Map<String, dynamic>;
-
-      var classes = dartCore['classes'] as Map<String, dynamic>;
-
-      expect(classes, hasLength(3));
-
-      expect(classes['class'], isList);
-      expect(classes['error'], isList);
-
-      var typeDefs = classes['typedef'] as Map<String, dynamic>;
-      var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
-
-      var expectedPreview = '<p>A trivial use of <code>A</code> to eliminate '
-          'import warnings.</p>';
-
-      expect(comparator['preview'], expectedPreview);
-
-      var expectedComment = expectedPreview +
-          '\n<p>And to test typedef preview.</p>';
-
-      expect(comparator['comment'], expectedComment);
-    });
-  });
 }
-
-final Matcher _hasSortedLines = predicate((String input) {
-  var lines = new LineSplitter().convert(input);
-
-  var sortedLines = new List.from(lines)..sort();
-
-  var orderedMatcher = orderedEquals(sortedLines);
-  return orderedMatcher.matches(lines, {});
-}, 'String has sorted lines');
-
-final Matcher _isJsonMap = predicate((input) {
-  try {
-    return JSON.decode(input) is Map;
-  } catch (e) {
-    return false;
-  }
-}, 'Output is JSON encoded Map');
diff --git a/pkg/docgen/lib/dottedLibraryName.dart b/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
similarity index 100%
rename from pkg/docgen/lib/dottedLibraryName.dart
rename to pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
diff --git a/pkg/docgen/test/multi_library_code/lib/temp3.dart b/pkg/docgen/test/multi_library_code/lib/temp3.dart
deleted file mode 100644
index fa1d74a..0000000
--- a/pkg/docgen/test/multi_library_code/lib/temp3.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-library testLib.bar;
-import 'temp.dart';
-
-/*
- * Normal comment for class C.
- */
-class C {
-}
-
-/// A trivial use of `A` to eliminate import warnings.
-///
-/// And to test typedef preview.
-typedef A AnATransformer(A input);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp.dart b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
similarity index 75%
rename from pkg/docgen/test/multi_library_code/lib/temp.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib.dart
index 694a8a7..ab0a577 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
@@ -1,8 +1,9 @@
-library testLib;
-import 'temp2.dart';
-import 'temp3.dart';
-export 'temp2.dart';
-export 'temp3.dart';
+library test_lib;
+
+import 'test_lib_foo.dart';
+import 'test_lib_bar.dart';
+export 'test_lib_foo.dart';
+export 'test_lib_bar.dart';
 
 /**
  * Doc comment for class [A].
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
new file mode 100644
index 0000000..c329a43
--- /dev/null
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
@@ -0,0 +1,19 @@
+library test_lib.bar;
+
+import 'test_lib.dart';
+
+/*
+ * Normal comment for class C.
+ */
+class C {
+}
+
+/// [input] is of type [C] returns an [A].
+A generateFoo(C input) {
+  throw 'noop';
+}
+
+/// Processes a [C] instance for testing.
+///
+/// To eliminate import warnings for [A] and to test typedefs.
+typedef A AnATransformer(C other);
diff --git a/pkg/docgen/test/multi_library_code/lib/temp2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
similarity index 88%
rename from pkg/docgen/test/multi_library_code/lib/temp2.dart
rename to pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
index ad62c09..f933f7f 100644
--- a/pkg/docgen/test/multi_library_code/lib/temp2.dart
+++ b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
@@ -1,5 +1,6 @@
-library testLib2.foo;
-import 'temp.dart';
+library test_lib.foo;
+
+import 'test_lib.dart';
 
 /**
  * Doc comment for class [B].
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
index 7cb6fab..bf5e551 100644
--- a/pkg/docgen/test/multi_library_test.dart
+++ b/pkg/docgen/test/multi_library_test.dart
@@ -1,3 +1,7 @@
+// 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.
+
 library single_library_test;
 
 import 'package:path/path.dart' as p;
@@ -14,7 +18,7 @@
 
   codePath = p.join(codePath, 'lib');
 
-  return ['temp.dart', 'temp2.dart', 'temp3.dart']
+  return ['test_lib.dart', 'test_lib_bar.dart', 'test_lib_foo.dart']
       .map((name) => p.join(codePath, name))
       .map(p.toUri)
       .toList();
@@ -26,14 +30,14 @@
       var files = _writeLibFiles();
       return getMirrorSystem(files)
         .then((mirrorSystem) {
-          var testLibraryUri = files[0];
-          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
+          var test_libraryUri = files[0];
+          var library = new Library(mirrorSystem.libraries[test_libraryUri]);
 
           /// Testing fixReference
           // Testing Doc comment for class [B].
-          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
+          var libraryMirror = mirrorSystem.libraries[test_libraryUri];
           var classDocComment = library.fixReference('B').children.first.text;
-          expect(classDocComment, 'testLib.B');
+          expect(classDocComment, 'test_lib.B');
 
           // Test for linking to parameter [c]
           var importedLib = libraryMirror.libraryDependencies.firstWhere(
@@ -41,7 +45,7 @@
           var aClassMirror =
               dart2js_util.classesOf(importedLib.declarations).first;
           expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'testLib2.foo.B');
+                 'test_lib.foo.B');
           var exportedClass = Indexable.getDocgenObject(aClassMirror, library);
           expect(exportedClass is Class, isTrue);
 
@@ -50,17 +54,17 @@
           expect(method is Method, isTrue);
           var methodParameterDocComment = method.fixReference(
               'c').children.first.text;
-          expect(methodParameterDocComment, 'testLib.B.doThis.c');
+          expect(methodParameterDocComment, 'test_lib.B.doThis.c');
 
 
-          expect(method.fixReference('A').children.first.text, 'testLib.A');
+          expect(method.fixReference('A').children.first.text, 'test_lib.A');
           // Testing trying to refer to doThis function
           expect(method.fixReference('doThis').children.first.text,
-              'testLib.B.doThis');
+              'test_lib.B.doThis');
 
           // Testing trying to refer to doThis function
           expect(method.fixReference('doElse').children.first.text,
-              'testLib.B.doElse');
+              'test_lib.B.doElse');
 
 
           // Test a third library referencing another exported library in a
@@ -68,21 +72,21 @@
           importedLib = libraryMirror.libraryDependencies.firstWhere(
             (dep) => dep.isImport &&
                      dart2js_util.qualifiedNameOf(dep.targetLibrary) ==
-            'testLib.bar').targetLibrary;
+            'test_lib.bar').targetLibrary;
           aClassMirror = dart2js_util.classesOf(importedLib.declarations).first;
           expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'testLib.bar.C');
+                 'test_lib.bar.C');
           exportedClass = Indexable.getDocgenObject(aClassMirror, library);
           expect(exportedClass is Class, isTrue);
-          expect(exportedClass.docName, 'testLib.C');
+          expect(exportedClass.docName, 'test_lib.C');
 
           methodParameterDocComment = exportedClass.fixReference(
               'B').children.first.text;
-          expect(methodParameterDocComment, 'testLib.B');
+          expect(methodParameterDocComment, 'test_lib.B');
 
           methodParameterDocComment = exportedClass.fixReference(
               'testFunc').children.first.text;
-          expect(methodParameterDocComment, 'testLib.testFunc');
+          expect(methodParameterDocComment, 'test_lib.testFunc');
 
         });
     });
diff --git a/pkg/docgen/test/only_lib_content_in_pkg_test.dart b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
new file mode 100644
index 0000000..6df4a74
--- /dev/null
+++ b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
@@ -0,0 +1,50 @@
+// 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.
+
+library docgen.test.only_lib_content_in_pkg;
+
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import '../lib/docgen.dart' as dg;
+import 'util.dart';
+
+void main() {
+
+  setUp(() {
+    scheduleTempDir();
+  });
+
+  test('exclude non-lib code from package docs', () {
+    schedule(() {
+      var thisScript = Platform.script;
+      var thisPath = p.fromUri(thisScript);
+      expect(p.basename(thisPath), 'only_lib_content_in_pkg_test.dart');
+      expect(p.dirname(thisPath), endsWith('test'));
+
+
+      var codeDir = p.normalize(p.join(thisPath, '..', '..'));
+      print(codeDir);
+      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'));
+    });
+
+    d.dir('docs', [
+        d.dir('docgen', [
+          d.matcherFile('docgen.json',  isJsonMap)
+        ]),
+        d.matcherFile('index.json', isJsonMap),
+        d.matcherFile('index.txt', hasSortedLines),
+        d.matcherFile('library_list.json', isJsonMap),
+        d.nothing('test_lib.json'),
+        d.nothing('test_lib-bar.json'),
+        d.nothing('test_lib-foo.json')
+    ]).validate();
+
+  });
+}
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
index 1d7ded5..11b226b 100644
--- a/pkg/docgen/test/single_library_test.dart
+++ b/pkg/docgen/test/single_library_test.dart
@@ -1,3 +1,7 @@
+// 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.
+
 library single_library_test;
 
 import 'dart:io';
diff --git a/pkg/docgen/test/typedef_test.dart b/pkg/docgen/test/typedef_test.dart
new file mode 100644
index 0000000..5defa66
--- /dev/null
+++ b/pkg/docgen/test/typedef_test.dart
@@ -0,0 +1,66 @@
+// 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.
+
+library docgen.test.typedef;
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:unittest/matcher.dart';
+
+import 'util.dart';
+import '../lib/docgen.dart' as dg;
+
+void main() {
+
+  setUp(() {
+    scheduleTempDir();
+  });
+
+  test('typedef gen', () {
+    schedule(() {
+      var codeDir = getMultiLibraryCodePath();
+      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
+      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
+    });
+
+    schedule(() {
+      var path = p.join(d.defaultRoot, 'docs', 'test_lib-bar.json');
+      var dartCoreJson = new File(path).readAsStringSync();
+
+      var testLibBar = JSON.decode(dartCoreJson) as Map<String, dynamic>;
+
+      //
+      // Validate function doc references
+      //
+      var generateFoo = testLibBar['functions']['methods']['generateFoo']
+          as Map<String, dynamic>;
+
+      expect(generateFoo['comment'], '<p><a>test_lib-bar.generateFoo.input</a> '
+          'is of type <a>test_lib-bar.C</a> returns an <a>test_lib.A</a>.</p>');
+
+      var classes = testLibBar['classes'] as Map<String, dynamic>;
+
+      expect(classes, hasLength(3));
+
+      expect(classes['class'], isList);
+      expect(classes['error'], isList);
+
+      var typeDefs = classes['typedef'] as Map<String, dynamic>;
+      var comparator = typeDefs['AnATransformer'] as Map<String, dynamic>;
+
+      var expectedPreview = '<p>Processes a [C] instance for testing.</p>';
+
+      expect(comparator['preview'], expectedPreview);
+
+      var expectedComment = expectedPreview + '\n'
+          '<p>To eliminate import warnings for [A] and to test typedefs.</p>';
+
+      expect(comparator['comment'], expectedComment);
+    });
+  });
+}
diff --git a/pkg/docgen/test/util.dart b/pkg/docgen/test/util.dart
index fad786d..3f7f2ed 100644
--- a/pkg/docgen/test/util.dart
+++ b/pkg/docgen/test/util.dart
@@ -1,5 +1,31 @@
+// 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.
+
+library docgen.test.util;
+
+import 'dart:convert';
 import 'dart:io';
 import 'package:path/path.dart' as p;
+import 'package:scheduled_test/descriptor.dart' as d;
+import 'package:scheduled_test/scheduled_test.dart';
+
+void scheduleTempDir() {
+  var tempDir;
+  schedule(() {
+    return Directory.systemTemp
+        .createTemp('docgen_test-')
+        .then((dir) {
+      tempDir = dir;
+      d.defaultRoot = tempDir.path;
+    });
+  });
+
+  currentSchedule.onComplete.schedule(() {
+    d.defaultRoot = null;
+    return tempDir.delete(recursive: true);
+  });
+}
 
 String getMultiLibraryCodePath() {
   var currentScript = p.fromUri(Platform.script);
@@ -9,3 +35,20 @@
 
   return codeDir;
 }
+
+final Matcher hasSortedLines = predicate((String input) {
+  var lines = new LineSplitter().convert(input);
+
+  var sortedLines = new List.from(lines)..sort();
+
+  var orderedMatcher = orderedEquals(sortedLines);
+  return orderedMatcher.matches(lines, {});
+}, 'String has sorted lines');
+
+final Matcher isJsonMap = predicate((input) {
+  try {
+    return JSON.decode(input) is Map;
+  } catch (e) {
+    return false;
+  }
+}, 'Output is JSON encoded Map');
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
new file mode 100644
index 0000000..0a9b4ba
--- /dev/null
+++ b/pkg/http/CHANGELOG.md
@@ -0,0 +1,9 @@
+## 0.10.0
+
+* Make `BaseRequest.contentLength` and `BaseResponse.contentLength` use `null`
+  to indicate an unknown content length rather than -1.
+
+* The `contentLength` parameter to `new BaseResponse` is now named rather than
+  positional.
+
+* Make request headers case-insensitive.
diff --git a/pkg/http/lib/src/base_request.dart b/pkg/http/lib/src/base_request.dart
index dab055b..a52b9c2 100644
--- a/pkg/http/lib/src/base_request.dart
+++ b/pkg/http/lib/src/base_request.dart
@@ -27,12 +27,17 @@
   /// The URL to which the request will be sent.
   final Uri url;
 
-  /// The size of the request body, in bytes. This defaults to -1, which
-  /// indicates that the size of the request is not known in advance.
+  /// The size of the request body, in bytes.
+  ///
+  /// This defaults to `null`, which indicates that the size of the request is
+  /// not known in advance.
   int get contentLength => _contentLength;
-  int _contentLength = -1;
+  int _contentLength;
 
   set contentLength(int value) {
+    if (value != null && value < 0) {
+      throw new ArgumentError("Invalid content length $value.");
+    }
     _checkFinalized();
     _contentLength = value;
   }
@@ -110,10 +115,12 @@
     var client = new Client();
     return client.send(this).then((response) {
       var stream = onDone(response.stream, client.close);
+      var contentLength = response.contentLength < 0 ?
+          null : response.contentLength;
       return new StreamedResponse(
           new ByteStream(stream),
           response.statusCode,
-          response.contentLength,
+          contentLength: contentLength,
           request: response.request,
           headers: response.headers,
           isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/base_response.dart b/pkg/http/lib/src/base_response.dart
index df0edb4..f222596 100644
--- a/pkg/http/lib/src/base_response.dart
+++ b/pkg/http/lib/src/base_response.dart
@@ -20,8 +20,9 @@
   /// The reason phrase associated with the status code.
   final String reasonPhrase;
 
-  /// The size of the response body, in bytes. If the size of the request is not
-  /// known in advance, this is -1.
+  /// The size of the response body, in bytes.
+  ///
+  /// If the size of the request is not known in advance, this is `null`.
   final int contentLength;
 
   // TODO(nweiz): automatically parse cookies from headers
@@ -39,10 +40,16 @@
   /// Creates a new HTTP response.
   BaseResponse(
       this.statusCode,
-      this.contentLength,
-      {this.request,
+      {this.contentLength,
+       this.request,
        this.headers: const {},
        this.isRedirect: false,
        this.persistentConnection: true,
-       this.reasonPhrase});
+       this.reasonPhrase}) {
+    if (statusCode < 100) {
+      throw new ArgumentError("Invalid status code $statusCode.");
+    } else if (contentLength != null && contentLength < 0) {
+      throw new ArgumentError("Invalid content length $contentLength.");
+    }
+  }
 }
diff --git a/pkg/http/lib/src/io_client.dart b/pkg/http/lib/src/io_client.dart
index c12cac2..112607d 100644
--- a/pkg/http/lib/src/io_client.dart
+++ b/pkg/http/lib/src/io_client.dart
@@ -27,10 +27,12 @@
 
     return Chain.track(_inner.openUrl(request.method, request.url))
         .then((ioRequest) {
+      var contentLength = request.contentLength == null ?
+          -1 : request.contentLength;
       ioRequest
           ..followRedirects = request.followRedirects
           ..maxRedirects = request.maxRedirects
-          ..contentLength = request.contentLength
+          ..contentLength = contentLength
           ..persistentConnection = request.persistentConnection;
       request.headers.forEach((name, value) {
         ioRequest.headers.set(name, value);
@@ -42,10 +44,12 @@
         headers[key] = values.join(',');
       });
 
+      var contentLength = response.contentLength == -1 ?
+          null : response.contentLength;
       return new StreamedResponse(
           response,
           response.statusCode,
-          response.contentLength,
+          contentLength: contentLength,
           request: request,
           headers: headers,
           isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/mock_client.dart b/pkg/http/lib/src/mock_client.dart
index 5d29545..35a710d 100644
--- a/pkg/http/lib/src/mock_client.dart
+++ b/pkg/http/lib/src/mock_client.dart
@@ -46,7 +46,7 @@
         return new StreamedResponse(
             new ByteStream.fromBytes(response.bodyBytes),
             response.statusCode,
-            response.contentLength,
+            contentLength: response.contentLength,
             request: baseRequest,
             headers: response.headers,
             isRedirect: response.isRedirect,
@@ -63,7 +63,7 @@
         return new StreamedResponse(
             response.stream,
             response.statusCode,
-            response.contentLength,
+            contentLength: response.contentLength,
             request: request,
             headers: response.headers,
             isRedirect: response.isRedirect,
diff --git a/pkg/http/lib/src/response.dart b/pkg/http/lib/src/response.dart
index 435027d..afbb714 100644
--- a/pkg/http/lib/src/response.dart
+++ b/pkg/http/lib/src/response.dart
@@ -57,7 +57,7 @@
     : bodyBytes = toUint8List(bodyBytes),
       super(
         statusCode,
-        bodyBytes.length,
+        contentLength: bodyBytes.length,
         request: request,
         headers: headers,
         isRedirect: isRedirect,
diff --git a/pkg/http/lib/src/streamed_response.dart b/pkg/http/lib/src/streamed_response.dart
index f82c964..21c7d9a 100644
--- a/pkg/http/lib/src/streamed_response.dart
+++ b/pkg/http/lib/src/streamed_response.dart
@@ -23,15 +23,15 @@
   StreamedResponse(
       Stream<List<int>> stream,
       int statusCode,
-      int contentLength,
-      {BaseRequest request,
+      {int contentLength,
+       BaseRequest request,
        Map<String, String> headers: const {},
        bool isRedirect: false,
        bool persistentConnection: true,
        String reasonPhrase})
     : super(
         statusCode,
-        contentLength,
+        contentLength: contentLength,
         request: request,
         headers: headers,
         isRedirect: isRedirect,
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index 3821bb0..75b4e54 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.9.3-dev
+version: 0.10.0-dev
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
diff --git a/pkg/http/test/mock_client_test.dart b/pkg/http/test/mock_client_test.dart
index ac0eeee..5c1cbf0 100644
--- a/pkg/http/test/mock_client_test.dart
+++ b/pkg/http/test/mock_client_test.dart
@@ -40,7 +40,7 @@
           controller.close();
         });
 
-        return new http.StreamedResponse(controller.stream, 200, -1);
+        return new http.StreamedResponse(controller.stream, 200);
       });
     });
 
diff --git a/pkg/http/test/response_test.dart b/pkg/http/test/response_test.dart
index bc1f33d..52efa2c 100644
--- a/pkg/http/test/response_test.dart
+++ b/pkg/http/test/response_test.dart
@@ -52,9 +52,9 @@
     test('sets body', () {
       var controller = new StreamController(sync: true);
       var streamResponse = new http.StreamedResponse(
-          controller.stream, 200, 13);
+          controller.stream, 200, contentLength: 13);
       var future = http.Response.fromStream(streamResponse)
-        .then((response) => response.body);
+          .then((response) => response.body);
       expect(future, completion(equals("Hello, world!")));
 
       controller.add([72, 101, 108, 108, 111, 44, 32]);
@@ -64,9 +64,10 @@
 
     test('sets bodyBytes', () {
       var controller = new StreamController(sync: true);
-      var streamResponse = new http.StreamedResponse(controller.stream, 200, 5);
+      var streamResponse = new http.StreamedResponse(
+          controller.stream, 200, contentLength: 5);
       var future = http.Response.fromStream(streamResponse)
-        .then((response) => response.bodyBytes);
+          .then((response) => response.bodyBytes);
       expect(future, completion(equals([104, 101, 108, 108, 111])));
 
       controller.add([104, 101, 108, 108, 111]);
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index 56c9252..761102c 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -4,17 +4,58 @@
 
 library streamed_request_test;
 
+import 'dart:convert';
+
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
 
 import 'utils.dart';
 
 void main() {
-  test('#finalize freezes contentLength', () {
-    var request = new http.StreamedRequest('POST', dummyUrl);
-    request.finalize();
+  group('contentLength', () {
+    test('defaults to null', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      expect(request.contentLength, isNull);
+    });
 
-    expect(request.contentLength, equals(-1));
-    expect(() => request.contentLength = 10, throwsStateError);
+    test('disallows negative values', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      expect(() => request.contentLength = -1, throwsArgumentError);
+    });
+
+    test('controls the Content-Length header', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.contentLength = 10;
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                containsPair('content-length', ['10'])))));
+      }).whenComplete(stopServer);
+    });
+
+    test('defaults to sending no Content-Length', () {
+      return startServer().then((_) {
+        var request = new http.StreamedRequest('POST', serverUrl);
+        request.sink.add([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
+        request.sink.close();
+
+        return request.send();
+      }).then((response) {
+        expect(UTF8.decodeStream(response.stream),
+            completion(parse(containsPair('headers',
+                isNot(contains('content-length'))))));
+      }).whenComplete(stopServer);
+    });
+
+    test('is frozen by finalize()', () {
+      var request = new http.StreamedRequest('POST', dummyUrl);
+      request.finalize();
+      expect(() => request.contentLength = 10, throwsStateError);
+    });
   });
 }
\ No newline at end of file
diff --git a/pkg/oauth2/pubspec.yaml b/pkg/oauth2/pubspec.yaml
index c3dad6e..61c4f52 100644
--- a/pkg/oauth2/pubspec.yaml
+++ b/pkg/oauth2/pubspec.yaml
@@ -9,6 +9,6 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  http: '>=0.9.2 <0.10.0'
+  http: '>=0.9.2 <0.11.0'
 dev_dependencies:
   unittest: '>=0.9.0 <0.11.0'
diff --git a/pkg/observe/CHANGELOG.md b/pkg/observe/CHANGELOG.md
new file mode 100644
index 0000000..f51ca6a
--- /dev/null
+++ b/pkg/observe/CHANGELOG.md
@@ -0,0 +1,13 @@
+# changelog
+
+This file contains highlights of what changes on each version of the observe
+package.
+
+#### Pub version 0.10.0-dev
+  * package:observe no longer declares @MirrorsUsed. The package uses mirrors
+    for development time, but assumes frameworks (like polymer) and apps that
+    use it directly will either generate code that replaces the use of mirrors,
+    or add the @MirrorsUsed declaration themselves. For convinience, you can
+    import 'package:observe/mirrors_used.dart', and that will add a @MirrorsUsed
+    annotation that preserves properties and classes labeled with @reflectable
+    and properties labeled with @observable.
diff --git a/pkg/observe/lib/mirrors_used.dart b/pkg/observe/lib/mirrors_used.dart
new file mode 100644
index 0000000..b3d3f43
--- /dev/null
+++ b/pkg/observe/lib/mirrors_used.dart
@@ -0,0 +1,18 @@
+// 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.
+
+/// An empty library that declares what needs to be retained with [MirrorsUsed]
+/// if you were to use observables together with mirrors. By default this is not
+/// included because frameworks using this package also use code generation to
+/// avoid using mirrors at deploy time.
+library observe.mirrors_used;
+
+// Note: ObservableProperty is in this list only for the unusual use case of
+// invoking dart2js without running this package's transformers. The
+// transformer in `lib/transformer.dart` will replace @observable with the
+// @reflectable annotation.
+@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
+    override: 'smoke.mirrors')
+import 'dart:mirrors' show MirrorsUsed;
+import 'package:observe/observe.dart' show Reflectable, ObservableProperty;
diff --git a/pkg/observe/lib/observe.dart b/pkg/observe/lib/observe.dart
index 3b7c138..bce717e 100644
--- a/pkg/observe/lib/observe.dart
+++ b/pkg/observe/lib/observe.dart
@@ -12,6 +12,9 @@
 /// You can provide an observable object in two ways. The simplest way is to
 /// use dirty checking to discover changes automatically:
 ///
+///     import 'package:observe/observe.dart';
+///     import 'package:observe/mirrors_used.dart'; // for smaller code
+///
 ///     class Monster extends Unit with Observable {
 ///       @observable int health = 100;
 ///
@@ -40,6 +43,9 @@
 /// manually. This avoids the potentially expensive [Observable.dirtyCheck]
 /// operation, but requires more work in the object:
 ///
+///     import 'package:observe/observe.dart';
+///     import 'package:observe/mirrors_used.dart'; // for smaller code
+///
 ///     class Monster extends Unit with ChangeNotifier {
 ///       int _health = 100;
 ///       @reflectable get health => _health;
@@ -66,9 +72,24 @@
 ///       print('done!');
 ///     }
 ///
-/// *Note*: it is good practice to keep `@reflectable` annotation on
-/// getters/setters so they are accessible via reflection. This will preserve
-/// them from tree-shaking. You can also put this annotation on the class and it
+/// **Note**: by default this package uses mirrors to access getters and setters
+/// marked with `@reflectable`. Dart2js disables tree-shaking if there are any
+/// uses of mirrors, unless you declare how mirrors are used (via the
+/// [MirrorsUsed](https://api.dartlang.org/apidocs/channels/stable/#dart-mirrors.MirrorsUsed)
+/// annotation).
+///
+/// As of version 0.10.0, this package doesn't declare `@MirrorsUsed`. This is
+/// because we intend to use mirrors for development time, but assume that
+/// frameworks and apps that use this pacakge will either generate code that
+/// replaces the use of mirrors, or add the `@MirrorsUsed` declaration
+/// themselves.  For convenience, you can import
+/// `package:observe/mirrors_used.dart` as shown on the first example above.
+/// That will add a `@MirrorsUsed` annotation that preserves properties and
+/// classes labeled with `@reflectable` and properties labeled with
+/// `@observable`.
+///
+/// If you are using the `package:observe/mirrors_used.dart` import, you can
+/// also make use of `@reflectable` on your own classes and dart2js will
 /// preserve all of its members for reflection.
 ///
 /// [Tools](https://www.dartlang.org/polymer-dart/) exist to convert the first
diff --git a/pkg/observe/lib/src/observable.dart b/pkg/observe/lib/src/observable.dart
index a1c7b65..eee62f2 100644
--- a/pkg/observe/lib/src/observable.dart
+++ b/pkg/observe/lib/src/observable.dart
@@ -7,14 +7,6 @@
 import 'dart:async';
 import 'dart:collection';
 
-// TODO(sigmund): figure out how to remove this annotation entirely
-// Note: ObservableProperty is in this list only for the unusual use case of
-// dart2js without deploy tool. The deploy tool (see "transformer.dart") will
-// add the @reflectable annotation, which makes it work with Polymer's
-// @published.
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
-    override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:observe/observe.dart';
 
diff --git a/pkg/observe/lib/src/path_observer.dart b/pkg/observe/lib/src/path_observer.dart
index be55102..0d631a0 100644
--- a/pkg/observe/lib/src/path_observer.dart
+++ b/pkg/observe/lib/src/path_observer.dart
@@ -7,13 +7,9 @@
 import 'dart:async';
 import 'dart:collection';
 import 'dart:math' show min;
-@MirrorsUsed(metaTargets: const [Reflectable, ObservableProperty],
-    override: 'smoke.mirrors')
-import 'dart:mirrors' show MirrorsUsed;
 
 import 'package:logging/logging.dart' show Logger, Level;
 import 'package:observe/observe.dart';
-import 'package:observe/src/observable.dart' show objectType;
 import 'package:smoke/smoke.dart' as smoke;
 
 /// A data-bound path starting from a view-model or model object, for example
@@ -128,7 +124,7 @@
     for (var segment in path.trim().split('.')) {
       if (segment == '') continue;
       var index = int.parse(segment, radix: 10, onError: (_) => null);
-      segments.add(index != null ? index : new Symbol(segment));
+      segments.add(index != null ? index : smoke.nameToSymbol(segment));
     }
 
     // TODO(jmesserly): we could use an UnmodifiableListView here, but that adds
diff --git a/pkg/observe/pubspec.yaml b/pkg/observe/pubspec.yaml
index fdb276a..85feca4 100644
--- a/pkg/observe/pubspec.yaml
+++ b/pkg/observe/pubspec.yaml
@@ -1,5 +1,5 @@
 name: observe
-version: 0.10.0-pre.2
+version: 0.10.0-pre.3.dev
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Observable properties and objects for use in template_binding.
@@ -9,13 +9,13 @@
   user input into the DOM is immediately assigned to the model.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.6"
-  barback: ">=0.9.0 <0.13.0"
-  logging: ">=0.9.0 <0.10.0"
-  path: ">=0.9.0 <2.0.0"
-  smoke: ">=0.1.0-pre.0 <0.2.0"
-  source_maps: ">=0.9.0 <0.10.0"
+  analyzer: 0.13.0-dev.6
+  barback: '>=0.9.0 <0.13.0'
+  logging: '>=0.9.0 <0.10.0'
+  path: '>=0.9.0 <2.0.0'
+  smoke: '>=0.1.0-pre.0 <0.2.0'
+  source_maps: '>=0.9.0 <0.10.0'
 dev_dependencies:
-  unittest: ">=0.10.0 <0.11.0"
+  unittest: '>=0.10.0 <0.11.0'
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/observe/test/observe_test.dart b/pkg/observe/test/observe_test.dart
index f973db9..802e4d1 100644
--- a/pkg/observe/test/observe_test.dart
+++ b/pkg/observe/test/observe_test.dart
@@ -43,7 +43,7 @@
       var maxNumIterations = dirty_check.MAX_DIRTY_CHECK_CYCLES;
 
       var x = new WatcherModel(0);
-      var sub = x.changes.listen(expectAsync1((_) { x.value++; },
+      var sub = x.changes.listen(expectAsync((_) { x.value++; },
           count: maxNumIterations));
       x.value = 1;
       Observable.dirtyCheck();
@@ -82,7 +82,7 @@
   });
 
   test('handle future result', () {
-    var callback = expectAsync0((){});
+    var callback = expectAsync((){});
     return new Future(callback);
   });
 
@@ -106,7 +106,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync1((records) {
+    subs.add(t.changes.listen(expectAsync((records) {
       called++;
       expectPropertyChanges(records, watch ? 1 : 2);
     })));
@@ -120,7 +120,7 @@
     var t = createModel(123);
     int called = 0;
 
-    subs.add(t.changes.listen(expectAsync1((records) {
+    subs.add(t.changes.listen(expectAsync((records) {
       called++;
       expectPropertyChanges(records, 1);
       if (called == 1) {
@@ -139,8 +139,8 @@
       expectPropertyChanges(records, watch ? 1 : 2);
     };
 
-    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
-    subs.add(t.changes.listen(expectAsync1(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
+    subs.add(t.changes.listen(expectAsync(verifyRecords)));
 
     t.value = 41;
     t.value = 42;
@@ -173,7 +173,7 @@
   test('cancel listening', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync1((records) {
+    sub = t.changes.listen(expectAsync((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
       t.value = 777;
@@ -185,12 +185,12 @@
   test('cancel and reobserve', () {
     var t = createModel(123);
     var sub;
-    sub = t.changes.listen(expectAsync1((records) {
+    sub = t.changes.listen(expectAsync((records) {
       expectPropertyChanges(records, 1);
       sub.cancel();
 
-      scheduleMicrotask(expectAsync0(() {
-        subs.add(t.changes.listen(expectAsync1((records) {
+      scheduleMicrotask(expectAsync(() {
+        subs.add(t.changes.listen(expectAsync((records) {
           expectPropertyChanges(records, 1);
         })));
         t.value = 777;
diff --git a/pkg/observe/test/observe_test_utils.dart b/pkg/observe/test/observe_test_utils.dart
index 02a88e2..07f4488 100644
--- a/pkg/observe/test/observe_test_utils.dart
+++ b/pkg/observe/test/observe_test_utils.dart
@@ -6,6 +6,7 @@
 
 import 'dart:async';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // to make tests smaller
 import 'package:unittest/unittest.dart';
 export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 
diff --git a/pkg/observe/test/path_observer_test.dart b/pkg/observe/test/path_observer_test.dart
index 0993c69..8d71680 100644
--- a/pkg/observe/test/path_observer_test.dart
+++ b/pkg/observe/test/path_observer_test.dart
@@ -201,7 +201,7 @@
   test('Path Value With Indices', () {
     var model = toObservable([]);
     var path = new PathObserver(model, '0');
-    path.open(expectAsync1((x) {
+    path.open(expectAsync((x) {
       expect(path.value, 123);
       expect(x, 123);
     }));
@@ -214,7 +214,7 @@
       var path = new PathObserver(model, 'isNotEmpty');
       expect(path.value, false);
 
-      path.open(expectAsync1((_) {
+      path.open(expectAsync((_) {
         expect(path.value, true);
       }));
       model.add(123);
@@ -225,7 +225,7 @@
       var path = new PathObserver(model, 'isEmpty');
       expect(path.value, true);
 
-      path.open(expectAsync1((_) {
+      path.open(expectAsync((_) {
         expect(path.value, false);
       }));
       model.add(123);
diff --git a/pkg/observe/test/transformer_test.dart b/pkg/observe/test/transformer_test.dart
index 1687d8a..0da84a5 100644
--- a/pkg/observe/test/transformer_test.dart
+++ b/pkg/observe/test/transformer_test.dart
@@ -164,6 +164,7 @@
 
   readInput(id) => throw new UnimplementedError();
   readInputAsString(id, {encoding}) => throw new UnimplementedError();
+  hasInput(id) => throw new UnimplementedError();
 
   static void _mockLogFn(AssetId asset, LogLevel level, String message,
                          span) {
diff --git a/pkg/path/CHANGELOG.md b/pkg/path/CHANGELOG.md
new file mode 100644
index 0000000..0d48c07
--- /dev/null
+++ b/pkg/path/CHANGELOG.md
@@ -0,0 +1,3 @@
+# 1.1.0
+
+* `path.fromUri` now accepts strings as well as `Uri` objects.
diff --git a/pkg/path/lib/path.dart b/pkg/path/lib/path.dart
index 7ff858c..524f16d 100644
--- a/pkg/path/lib/path.dart
+++ b/pkg/path/lib/path.dart
@@ -322,23 +322,27 @@
 ///     withoutExtension('path/to/foo.dart'); // -> 'path/to/foo'
 String withoutExtension(String path) => _context.withoutExtension(path);
 
-/// Returns the path represented by [uri].
+/// Returns the path represented by [uri], which may be a [String] or a [Uri].
 ///
 /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
 /// style, this will just convert [uri] to a string.
 ///
 ///     // POSIX
-///     path.fromUri(Uri.parse('file:///path/to/foo'))
+///     context.fromUri('file:///path/to/foo')
 ///       // -> '/path/to/foo'
 ///
 ///     // Windows
-///     path.fromUri(Uri.parse('file:///C:/path/to/foo'))
+///     context.fromUri('file:///C:/path/to/foo')
 ///       // -> r'C:\path\to\foo'
 ///
 ///     // URL
-///     path.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+///     context.fromUri('http://dartlang.org/path/to/foo')
 ///       // -> 'http://dartlang.org/path/to/foo'
-String fromUri(Uri uri) => _context.fromUri(uri);
+///
+/// If [uri] is relative, a relative path will be returned.
+///
+///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+String fromUri(uri) => _context.fromUri(uri);
 
 /// Returns the URI that represents [path].
 ///
diff --git a/pkg/path/lib/src/context.dart b/pkg/path/lib/src/context.dart
index b897c8b..9c8e1e4 100644
--- a/pkg/path/lib/src/context.dart
+++ b/pkg/path/lib/src/context.dart
@@ -423,23 +423,30 @@
     return parsed.toString();
   }
 
-  /// Returns the path represented by [uri].
+  /// Returns the path represented by [uri], which may be a [String] or a [Uri].
   ///
   /// For POSIX and Windows styles, [uri] must be a `file:` URI. For the URL
   /// style, this will just convert [uri] to a string.
   ///
   ///     // POSIX
-  ///     context.fromUri(Uri.parse('file:///path/to/foo'))
+  ///     context.fromUri('file:///path/to/foo')
   ///       // -> '/path/to/foo'
   ///
   ///     // Windows
-  ///     context.fromUri(Uri.parse('file:///C:/path/to/foo'))
+  ///     context.fromUri('file:///C:/path/to/foo')
   ///       // -> r'C:\path\to\foo'
   ///
   ///     // URL
-  ///     context.fromUri(Uri.parse('http://dartlang.org/path/to/foo'))
+  ///     context.fromUri('http://dartlang.org/path/to/foo')
   ///       // -> 'http://dartlang.org/path/to/foo'
-  String fromUri(Uri uri) => style.pathFromUri(uri);
+  ///
+  /// If [uri] is relative, a relative path will be returned.
+  ///
+  ///     path.fromUri('path/to/foo'); // -> 'path/to/foo'
+  String fromUri(uri) {
+    if (uri is String) uri = Uri.parse(uri);
+    return style.pathFromUri(uri);
+  }
 
   /// Returns the URI that represents [path].
   ///
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index 3b555a1..8095c88 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 1.0.0
+version: 1.1.0
 author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
diff --git a/pkg/path/test/posix_test.dart b/pkg/path/test/posix_test.dart
index 83a473e..9da97c9 100644
--- a/pkg/path/test/posix_test.dart
+++ b/pkg/path/test/posix_test.dart
@@ -474,19 +474,26 @@
     expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo/')), '/path/to/foo/');
-    expect(context.fromUri(Uri.parse('file:///')), '/');
-    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
-        '/path/to/foo#bar');
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_{_}_`_^_ _"_%_');
-    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
-        throwsArgumentError);
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo/')),
+          '/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///')), '/');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(context.fromUri(Uri.parse('/path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('///path/to/foo')), '/path/to/foo');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo%23bar')),
+          '/path/to/foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///path/to/foo'), '/path/to/foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/path/test/url_test.dart b/pkg/path/test/url_test.dart
index e149b4f..58c7b92 100644
--- a/pkg/path/test/url_test.dart
+++ b/pkg/path/test/url_test.dart
@@ -700,20 +700,28 @@
     expect(context.withoutExtension('a/b.c//'), 'a/b//');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
-        'http://dartlang.org/path/to/foo');
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
-        'http://dartlang.org/path/to/foo/');
-    expect(context.fromUri(Uri.parse('file:///path/to/foo')),
-        'file:///path/to/foo');
-    expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
-    expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo%23bar')),
-        'http://dartlang.org/path/to/foo%23bar');
-    // Since the resulting "path" is also a URL, special characters should
-    // remain percent-encoded in the result.
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo')),
+          'http://dartlang.org/path/to/foo');
+      expect(context.fromUri(Uri.parse('http://dartlang.org/path/to/foo/')),
+          'http://dartlang.org/path/to/foo/');
+      expect(context.fromUri(Uri.parse('file:///path/to/foo')),
+          'file:///path/to/foo');
+      expect(context.fromUri(Uri.parse('foo/bar')), 'foo/bar');
+      expect(context.fromUri(
+          Uri.parse('http://dartlang.org/path/to/foo%23bar')),
+          'http://dartlang.org/path/to/foo%23bar');
+      // Since the resulting "path" is also a URL, special characters should
+      // remain percent-encoded in the result.
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_%7B_%7D_%60_%5E_%20_%22_%25_');
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('http://dartlang.org/path/to/foo'),
+          'http://dartlang.org/path/to/foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/path/test/windows_test.dart b/pkg/path/test/windows_test.dart
index e5dcac4..d194663 100644
--- a/pkg/path/test/windows_test.dart
+++ b/pkg/path/test/windows_test.dart
@@ -590,27 +590,35 @@
     expect(context.withoutExtension(r'a\b.c\'), r'a\b\');
   });
 
-  test('fromUri', () {
-    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
-        r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
-        r'\\server\share\path\to\foo');
-    expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
-    expect(context.fromUri(Uri.parse('file://server/share')),
-        r'\\server\share');
-    expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
-    expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('///C:/path/to/foo')), r'C:\path\to\foo');
-    expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
-        r'\\server\share\path\to\foo');
-    expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
-        r'C:\path\to\foo#bar');
-    expect(context.fromUri(Uri.parse('file://server/share/path/to/foo%23bar')),
-        r'\\server\share\path\to\foo#bar');
-    expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
-        r'_{_}_`_^_ _"_%_');
-    expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
-        throwsArgumentError);
+  group('fromUri', () {
+    test('with a URI', () {
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo')),
+          r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('file://server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/')), r'C:\');
+      expect(context.fromUri(Uri.parse('file://server/share')),
+          r'\\server\share');
+      expect(context.fromUri(Uri.parse('foo/bar')), r'foo\bar');
+      expect(context.fromUri(Uri.parse('/C:/path/to/foo')), r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('///C:/path/to/foo')),
+          r'C:\path\to\foo');
+      expect(context.fromUri(Uri.parse('//server/share/path/to/foo')),
+          r'\\server\share\path\to\foo');
+      expect(context.fromUri(Uri.parse('file:///C:/path/to/foo%23bar')),
+          r'C:\path\to\foo#bar');
+      expect(context.fromUri(
+          Uri.parse('file://server/share/path/to/foo%23bar')),
+          r'\\server\share\path\to\foo#bar');
+      expect(context.fromUri(Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_')),
+          r'_{_}_`_^_ _"_%_');
+      expect(() => context.fromUri(Uri.parse('http://dartlang.org')),
+          throwsArgumentError);
+    });
+
+    test('with a string', () {
+      expect(context.fromUri('file:///C:/path/to/foo'), r'C:\path\to\foo');
+    });
   });
 
   test('toUri', () {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 152c39b..c6a89c0 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -17,7 +17,22 @@
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
 polymer/test/event_path_test: Pass, Fail # Issue 15766
-docgen/test/generate_json_test: Skip # Issue 17430
+
+[ $compiler == dart2js && $mode == debug ]
+docgen/test/generate_json_test: Skip # Way too slow
+docgen/test/multi_library_test: Skip # Way too slow
+docgen/test/single_library_test: Skip # Way too slow
+docgen/test/typedef_test: Skip # Way too slow
+
+[ $runtime == vm ]
+docgen/test/only_lib_content_in_pkg_test: Fail, Timeout # Issue 17597
+
+[ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
+docgen/test/only_lib_content_in_pkg_test: Skip # slow
+docgen/test/typedef_test: Skip # slow
+
+[ $runtime == vm && $arch == ia32 && $mode == debug ]
+docgen/test/generate_json_test: Skip # Issue 17602
 
 [ $compiler == dart2js ]
 collection/test/equality_test/01: Fail # Issue 1533
@@ -118,6 +133,7 @@
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
+smoke/test/codegen/end_to_end_test: Fail # Issue 17600
 
 [ $compiler == dartanalyzer ]
 # These tests are runtime negative but statically positive, so we skip
@@ -212,6 +228,8 @@
 observe/test/transformer_test: Fail, OK # Uses dart:io.
 path/test/io_test: Fail, OK # Uses dart:io.
 polymer/test/build/*: Fail, OK # Uses dart:io.
+smoke/test/codegen/recorder_test: Skip # Uses dart:io.
+smoke/test/codegen/end_to_end_test: Skip # Uses dart:io.
 third_party/angular_tests/vm_test: Skip # Uses dart:io
 third_party/angular_tests/browser_test/core_dom/cookies: Fail # Issue 16337
 watcher/test/*: Fail, OK # Uses dart:io.
@@ -305,10 +323,8 @@
 [ $runtime == safari || $runtime == ie9 || $runtime == ie10 ]
 polymer_expressions/test/globals_test: Fail # Issue 16568
 
-[ $runtime == safari || $runtime == chrome || $runtime == ie9 || $runtime == ff || $runtime == dartium || $runtime == drt ]
-docgen/test/generate_json_test: Skip  # Uses dart:io
-docgen/test/single_library_test: Skip # Uses dart:io
-docgen/test/multi_library_test: Skip # Uses dart:io
+[ $browser ]
+docgen/test/*: Skip  # Uses dart:io
 scheduled_test/test/scheduled_server_test: Skip # Uses dart:io
 
 [ $browser || $runtime == vm ]
@@ -320,8 +336,10 @@
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 docgen/test/generate_json_test: StaticWarning # Issue 16950
-docgen/test/single_library_test: StaticWarning # Issue 16950
 docgen/test/multi_library_test: StaticWarning # Issue 16950
+docgen/test/only_lib_content_in_pkg_test: StaticWarning # Issue 16950
+docgen/test/single_library_test: StaticWarning # Issue 16950
+docgen/test/typedef_test: StaticWarning # Issue 16950
 unittest/test/matchers_test: StaticWarning, OK # testing error creating abstract class
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
diff --git a/pkg/polymer/example/canonicalization2/lib/g.html b/pkg/polymer/example/canonicalization2/lib/g.html
index 1b9e8d2..3897dba 100644
--- a/pkg/polymer/example/canonicalization2/lib/g.html
+++ b/pkg/polymer/example/canonicalization2/lib/g.html
@@ -5,6 +5,6 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization2/b.html'.
  -->
-<link rel="import" href="../packages/canonicalization/b.html">
+<link rel="import" href="../packages/canonicalization2/b.html">
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
index d467d03..2612a8f 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
@@ -3,17 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests how canonicalization works when using the deployed app.
-library canonicalization.dev3_test;
+library canonicalization.dev2_test;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization2/a.dart';
+import 'packages/canonicalization2/b.dart';
+import 'package:canonicalization2/c.dart';
+import 'package:canonicalization2/d.dart' as d1;
+import 'packages/canonicalization2/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
index 4db4438..bac8aba 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization2/a.html">
+    <link rel="import" href="packages/canonicalization2/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
index 3d6f1fe..f3df1c3 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization2/a.dart';
+import 'packages/canonicalization2/b.dart';
+import 'package:canonicalization2/c.dart';
+import 'package:canonicalization2/d.dart' as d1;
+import 'packages/canonicalization2/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
index a5c2d28..83313ee 100644
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization2/a.html">
+    <link rel="import" href="packages/canonicalization2/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/example/canonicalization3/lib/g.html
index af83397..ab73db5 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/example/canonicalization3/lib/g.html
@@ -5,6 +5,6 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization/b.html'.
+'b.html' or '../../packages/canonicalization3/b.html'.
  -->
-<link rel="import" href="packages/canonicalization/b.html">
+<link rel="import" href="packages/canonicalization3/b.html">
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
index d467d03..574c472 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization3/a.dart';
+import 'packages/canonicalization3/b.dart';
+import 'package:canonicalization3/c.dart';
+import 'package:canonicalization3/d.dart' as d1;
+import 'packages/canonicalization3/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
index 4db4438..21448a6 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization3/a.html">
+    <link rel="import" href="packages/canonicalization3/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
index 3d6f1fe..afb2ab7 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
@@ -9,11 +9,11 @@
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization3/a.dart';
+import 'packages/canonicalization3/b.dart';
+import 'package:canonicalization3/c.dart';
+import 'package:canonicalization3/d.dart' as d1;
+import 'packages/canonicalization3/d.dart' as d2;
 
 main() {
   initPolymer();
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
index a5c2d28..72f7574 100644
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
+++ b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
@@ -9,8 +9,8 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/g.html">
+    <link rel="import" href="packages/canonicalization3/a.html">
+    <link rel="import" href="packages/canonicalization3/g.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.dart b/pkg/polymer/example/component/news/test/news_index_test.dart
index 4825b83..6e0c660 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.dart
+++ b/pkg/polymer/example/component/news/test/news_index_test.dart
@@ -16,13 +16,13 @@
       .map((n) => n.query('a').href.split('/').last).toList();
 
   test('initial state', () {
-    final listComp = query('ul');
-    final items = listComp.queryAll('li');
+    final listComp = querySelector('ul');
+    final items = listComp.querySelectorAll('li');
     expect(items.length, 6);
     expect(extractLinks(items), ['1', '2', '3', '4', '4', '5']);
     expect(listComp is Polymer, true, reason: 'x-news should be created');
 
-    final contents = listComp.shadowRoot.queryAll('content');
+    final contents = listComp.shadowRoot.querySelectorAll('content');
     expect(contents.length, 2, reason: 'news has 2 content tags');
     expect(extractLinks(contents[0].getDistributedNodes()),
         ['3', '5'], reason: 'breaking stories first');
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index fa1c0f7..9cf811a 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -78,7 +78,6 @@
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:smoke/mirrors.dart' as smoke;
 import 'package:template_binding/template_binding.dart';
-import 'package:web_components/polyfill.dart' show customElementsReady;
 
 import 'deserialize.dart' as deserialize;
 import 'src/mirror_loader.dart' as loader; // ** see important note above
diff --git a/pkg/polymer/lib/polymer_element.dart b/pkg/polymer/lib/polymer_element.dart
index c004985..ac98793 100644
--- a/pkg/polymer/lib/polymer_element.dart
+++ b/pkg/polymer/lib/polymer_element.dart
@@ -4,4 +4,4 @@
 
 library polymer.polymer_element;
 
-export 'polymer.dart' show PolymerElement, registerPolymerElement;
+export 'polymer.dart' show PolymerElement;
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index 5862562..2510742 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -136,93 +136,6 @@
 List<List<Transformer>> get phasesForPolymer =>
     [[new ObservableTransformer(['lib/src/instance.dart'])]];
 
-/// Create an [AssetId] for a [url] seen in the [source] asset. By default this
-/// is used to resolve relative urls that occur in HTML assets, including
-/// cross-package urls of the form "packages/foo/bar.html". Dart "package:"
-/// urls are not resolved unless [source] is Dart file (has a .dart extension).
-// TODO(sigmund): delete once this is part of barback (dartbug.com/12610)
-AssetId resolve(AssetId source, String url, TransformLogger logger, Span span,
-    {bool allowAbsolute: false}) {
-  if (url == null || url == '') return null;
-  var uri = Uri.parse(url);
-  var urlBuilder = path.url;
-  if (uri.host != '' || uri.scheme != '' || urlBuilder.isAbsolute(url)) {
-    if (source.extension == '.dart' && uri.scheme == 'package') {
-      var index = uri.path.indexOf('/');
-      if (index != -1) {
-        return new AssetId(uri.path.substring(0, index),
-            'lib${uri.path.substring(index)}');
-      }
-    }
-
-    if (!allowAbsolute) {
-      logger.error('absolute paths not allowed: "$url"', span: span);
-    }
-    return null;
-  }
-
-  var targetPath = urlBuilder.normalize(
-      urlBuilder.join(urlBuilder.dirname(source.path), url));
-  var segments = urlBuilder.split(targetPath);
-  var sourceSegments = urlBuilder.split(source.path);
-  assert (sourceSegments.length > 0);
-  var topFolder = sourceSegments[0];
-  var entryFolder = topFolder != 'lib' && topFolder != 'asset';
-
-  // Find the first 'packages/'  or 'assets/' segment:
-  var packagesIndex = segments.indexOf('packages');
-  var assetsIndex = segments.indexOf('assets');
-  var index = (packagesIndex >= 0 && assetsIndex >= 0)
-      ? min(packagesIndex, assetsIndex)
-      : max(packagesIndex, assetsIndex);
-  if (index > -1) {
-    if (entryFolder) {
-      // URLs of the form "packages/foo/bar" seen under entry folders (like
-      // web/, test/, example/, etc) are resolved as an asset in another
-      // package. 'packages' can be used anywhere, there is no need to walk up
-      // where the entrypoint file was.
-      return _extractOtherPackageId(index, segments, logger, span);
-    } else if (index == 1 && segments[0] == '..') {
-      // Relative URLs of the form "../../packages/foo/bar" in an asset under
-      // lib/ or asset/ are also resolved as an asset in another package, but we
-      // check that the relative path goes all the way out where the packages
-      // folder lives (otherwise the app would not work in Dartium). Since
-      // [targetPath] has been normalized, "packages" or "assets" should be at
-      // index 1.
-      return _extractOtherPackageId(1, segments, logger, span);
-    } else {
-      var prefix = segments[index];
-      var fixedSegments = [];
-      fixedSegments.addAll(sourceSegments.map((_) => '..'));
-      fixedSegments.addAll(segments.sublist(index));
-      var fixedUrl = urlBuilder.joinAll(fixedSegments);
-      logger.error('Invalid url to reach to another package: $url. Path '
-          'reaching to other packages must first reach up all the '
-          'way to the $prefix folder. For example, try changing the url above '
-          'to: $fixedUrl', span: span);
-      return null;
-    }
-  }
-
-  // Otherwise, resolve as a path in the same package.
-  return new AssetId(source.package, targetPath);
-}
-
-AssetId _extractOtherPackageId(int index, List segments,
-    TransformLogger logger, Span span) {
-  if (index >= segments.length) return null;
-  var prefix = segments[index];
-  if (prefix != 'packages' && prefix != 'assets') return null;
-  var folder = prefix == 'packages' ? 'lib' : 'asset';
-  if (segments.length < index + 3) {
-    logger.error("incomplete $prefix/ path. It should have at least 3 "
-        "segments $prefix/name/path-from-name's-$folder-dir", span: span);
-    return null;
-  }
-  return new AssetId(segments[index + 1],
-      path.url.join(folder, path.url.joinAll(segments.sublist(index + 2))));
-}
-
 /// Generate the import url for a file described by [id], referenced by a file
 /// with [sourceId].
 // TODO(sigmund): this should also be in barback (dartbug.com/12610)
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index abaa275..992ae78 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -10,6 +10,7 @@
 
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as path;
 import 'package:html5lib/dom.dart' show
     Document, DocumentFragment, Element, Node;
@@ -80,8 +81,8 @@
 
       // Note: URL has already been normalized so use docId.
       var href = tag.attributes['href'];
-      var id = resolve(docId, href, transform.logger, tag.sourceSpan,
-          allowAbsolute: rel == 'stylesheet');
+      var id = uriToAssetId(docId, href, transform.logger, tag.sourceSpan,
+          errorOnAbsolute: rel != 'stylesheet');
 
       if (rel == 'import') {
         changed = true;
@@ -162,7 +163,7 @@
       if (script.attributes['type'] == TYPE_DART) {
         script.remove();
         var src = script.attributes['src'];
-        scriptIds.add(resolve(docId, src, logger, script.sourceSpan));
+        scriptIds.add(uriToAssetId(docId, src, logger, script.sourceSpan));
 
         // only the first script needs to be added.
         // others are already removed by _extractScripts
@@ -318,8 +319,8 @@
         var uri = directive.uri.stringValue;
         var span = _getSpan(file, directive.uri);
 
-        var id = resolve(sourceId, uri, transform.logger, span,
-            allowAbsolute: true);
+        var id = uriToAssetId(sourceId, uri, transform.logger, span,
+            errorOnAbsolute: false);
         if (id == null) continue;
 
         var primaryId = transform.primaryInput.id;
@@ -345,7 +346,7 @@
     if (uri.path.isEmpty) return href;  // Implies standalone ? or # in URI.
     if (path.isAbsolute(href)) return href;
 
-    var id = resolve(sourceId, href, transform.logger, span);
+    var id = uriToAssetId(sourceId, href, transform.logger, span);
     if (id == null) return href;
     var primaryId = transform.primaryInput.id;
 
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index acd9c63..df33318 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -9,6 +9,7 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:html5lib/dom.dart';
 import 'package:html5lib/dom_parsing.dart';
 import 'package:source_maps/span.dart';
@@ -74,7 +75,7 @@
       if (tag.attributes['rel'] != 'import') continue;
       var href = tag.attributes['href'];
       var span = tag.sourceSpan;
-      var id = resolve(sourceId, href, logger, span);
+      var id = uriToAssetId(sourceId, href, logger, span);
       if (id == null ||
           (id.package == 'polymer' && id.path == 'lib/init.html')) continue;
       importIds.add(assetExists(id, transform).then((exists) {
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index fe85e8f..61a6b71 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -11,6 +11,7 @@
 import 'package:html5lib/dom.dart' show Document, Element;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:barback/barback.dart';
+import 'package:code_transformers/assets.dart';
 import 'package:path/path.dart' as path;
 import 'package:source_maps/span.dart' show SourceFile;
 
@@ -102,7 +103,7 @@
         tag.remove();
         continue;
       }
-      mainLibraryId = resolve(docId, src, logger, tag.sourceSpan);
+      mainLibraryId = uriToAssetId(docId, src, logger, tag.sourceSpan);
       mainScriptTag = tag;
     }
   }
@@ -171,7 +172,7 @@
       return Future.forEach(unit.directives, (directive) {
         // Include anything from parts.
         if (directive is PartDirective) {
-          var targetId = resolve(dartLibrary, directive.uri.stringValue,
+          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
           return _initializersOf(targetId).then(result.addAll);
         }
@@ -179,7 +180,7 @@
         // Similarly, include anything from exports except what's filtered by
         // the show/hide combinators.
         if (directive is ExportDirective) {
-          var targetId = resolve(dartLibrary, directive.uri.stringValue,
+          var targetId = uriToAssetId(dartLibrary, directive.uri.stringValue,
               logger, _getSpan(file, directive));
           return _initializersOf(targetId).then(
             (r) => _processExportDirective(directive, r, result));
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 54533c9..60bf2fe 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -81,13 +81,9 @@
   polymerJs.callMethod('whenPolymerReady',
       [zone.bindCallback(() => Polymer._ready.complete())]);
 
-  var jsPolymer = new JsObject.fromBrowserObject(
-      document.createElement('polymer-element'));
-
-  var proto = js.context['Object'].callMethod('getPrototypeOf', [jsPolymer]);
-  if (proto is Node) {
-    proto = new JsObject.fromBrowserObject(proto);
-  }
+  var polyElem = document.createElement('polymer-element');
+  var proto = new JsObject.fromBrowserObject(polyElem)['__proto__'];
+  if (proto is Node) proto = new JsObject.fromBrowserObject(proto);
 
   JsFunction originalRegister = proto['register'];
   if (originalRegister == null) {
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index d9d226f..c0a70ed 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.2
+version: 0.10.0-pre.4
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 description: >
   Polymer.dart is a new type of library for the web, built on top of Web
@@ -7,20 +7,23 @@
   browsers.
 homepage: https://www.dartlang.org/polymer-dart/
 dependencies:
-  analyzer: "0.13.0-dev.6"
-  args: ">=0.10.0 <0.11.0"
-  barback: ">=0.9.0 <0.13.0"
-  browser: ">=0.10.0 <0.11.0"
-  html5lib: ">=0.9.2 <0.10.0"
-  logging: ">=0.9.0 <0.10.0"
-  observe: ">=0.10.0-pre.0 <0.11.0"
-  path: ">=0.9.0 <2.0.0"
-  polymer_expressions: ">=0.10.0-pre.0 <0.11.0"
-  smoke: ">=0.1.0-pre.0 <0.2.0"
-  source_maps: ">=0.9.0 <0.10.0"
-  template_binding: ">=0.10.0-pre.0 <0.11.0"
-  web_components: ">=0.3.2 <0.4.0"
-  yaml: ">=0.9.0 <0.10.0"
+  analyzer: '>=0.13.0-dev.6 <0.14.0'
+  args: '>=0.10.0 <0.11.0'
+  barback: '>=0.9.0 <0.13.0'
+  browser: '>=0.10.0 <0.11.0'
+  code_transformers: '>=0.0.1-dev.4 <0.1.0'
+  html5lib: '>=0.9.2 <0.10.0'
+  logging: '>=0.9.0 <0.10.0'
+  observe: '>=0.10.0-pre.0 <0.11.0'
+  path: '>=0.9.0 <2.0.0'
+  polymer_expressions: '>=0.10.0-pre.0 <0.11.0'
+  smoke: '>=0.1.0-pre.0 <0.2.0'
+  source_maps: '>=0.9.0 <0.10.0'
+  template_binding: '>=0.10.0-pre.0 <0.11.0'
+  web_components: '>=0.3.2 <0.4.0'
+  yaml: '>=0.9.0 <0.10.0'
+dev_dependencies:
+  unittest: '>=0.10.0 <0.11.0'
 transformers:
 # TODO(sigmund): uncomment when full codegen is ready.
 #- polymer/src/build/remove_mirrors
@@ -30,7 +33,5 @@
     # TODO(sigmund): uncomment once $include is available in the stable channel
     # (1.3.0) or when we really need a dependency on the latest dev channel.
     # $include: lib/src/instance.dart
-dev_dependencies:
-  unittest: ">=0.10.0 <0.11.0"
 environment:
-  sdk: ">=1.2.0 <2.0.0"
+  sdk: '>=1.2.0 <2.0.0'
diff --git a/pkg/polymer/test/bind_mdv_test.dart b/pkg/polymer/test/bind_mdv_test.dart
index a47bfc2..d30bc66 100644
--- a/pkg/polymer/test/bind_mdv_test.dart
+++ b/pkg/polymer/test/bind_mdv_test.dart
@@ -8,6 +8,7 @@
 import 'dart:html';
 import 'package:template_binding/template_binding.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:unittest/html_config.dart';
 import 'package:unittest/unittest.dart';
 import 'package:web_components/polyfill.dart';
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index 60d6c84..fbbda2e 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -5,7 +5,6 @@
 library polymer.test.property_change_test;
 
 import 'dart:async';
-import 'dart:html';
 import 'package:polymer/polymer.dart';
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
diff --git a/pkg/polymer_expressions/test/bindings_test.dart b/pkg/polymer_expressions/test/bindings_test.dart
index 209012d..c9321f3 100644
--- a/pkg/polymer_expressions/test/bindings_test.dart
+++ b/pkg/polymer_expressions/test/bindings_test.dart
@@ -9,6 +9,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart' show templateBind;
diff --git a/pkg/polymer_expressions/test/eval_test.dart b/pkg/polymer_expressions/test/eval_test.dart
index 952e78e..1f4bee6 100644
--- a/pkg/polymer_expressions/test/eval_test.dart
+++ b/pkg/polymer_expressions/test/eval_test.dart
@@ -15,6 +15,7 @@
 import 'package:polymer_expressions/parser.dart';
 import 'package:unittest/unittest.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 
 main() {
   reflectClass(Object); // suppress unused import warning
diff --git a/pkg/polymer_expressions/test/globals_test.dart b/pkg/polymer_expressions/test/globals_test.dart
index 9690baf..433cd08 100644
--- a/pkg/polymer_expressions/test/globals_test.dart
+++ b/pkg/polymer_expressions/test/globals_test.dart
@@ -6,6 +6,7 @@
 import 'dart:html';
 
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart';
 import 'package:unittest/unittest.dart';
diff --git a/pkg/polymer_expressions/test/syntax_test.dart b/pkg/polymer_expressions/test/syntax_test.dart
index 50972e3..b7e6592 100644
--- a/pkg/polymer_expressions/test/syntax_test.dart
+++ b/pkg/polymer_expressions/test/syntax_test.dart
@@ -7,6 +7,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observe/observe.dart';
+import 'package:observe/mirrors_used.dart'; // make test smaller.
 import 'package:polymer_expressions/polymer_expressions.dart';
 import 'package:template_binding/template_binding.dart';
 import 'package:unittest/html_config.dart';
diff --git a/pkg/scheduled_test/lib/scheduled_process.dart b/pkg/scheduled_test/lib/scheduled_process.dart
index 46bb5b6..c99cf06 100644
--- a/pkg/scheduled_test/lib/scheduled_process.dart
+++ b/pkg/scheduled_test/lib/scheduled_process.dart
@@ -185,8 +185,8 @@
     });
   }
 
-  /// Converts a stream of bytes to a stream of lines and returns that along
-  /// with a [StreamCanceller] controlling it.
+  /// Converts a stream of byte lists to a stream of lines and returns that
+  /// along with a [StreamCanceller] controlling it.
   Pair<Stream<String>, StreamCanceller> _lineStreamWithCanceller(
       Future<Stream<List<int>>> streamFuture) {
     return streamWithCanceller(futureStream(streamFuture)
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 55fea14..8e8462e 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -10,7 +10,7 @@
   read like synchronous, linear code, despite executing asynchronously.
 
 dependencies:
-  http: ">=0.9.0 <0.10.0"
+  http: ">=0.9.0 <0.11.0"
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <0.10.0"
   unittest: ">=0.9.0 <0.11.0"
diff --git a/pkg/smoke/lib/codegen/generator.dart b/pkg/smoke/lib/codegen/generator.dart
new file mode 100644
index 0000000..06313f7
--- /dev/null
+++ b/pkg/smoke/lib/codegen/generator.dart
@@ -0,0 +1,445 @@
+// 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.
+
+/// Library to generate code that can initialize the `StaticConfiguration` in
+/// `package:smoke/static.dart`.
+///
+/// This library doesn't have any specific logic to extract information from
+/// Dart source code. To extract code using the analyzer, take a look at the
+/// `smoke.codegen.recorder` library.
+library smoke.codegen.generator;
+
+import 'dart:collection' show SplayTreeMap, SplayTreeSet;
+
+/// Collects the necessary information and generates code to initialize a
+/// `StaticConfiguration`. After setting up the generator by calling
+/// [addGetter], [addSetter], [addSymbol], and [addDeclaration], you can
+/// retrieve the generated code using the following three methods:
+///
+///   * [writeImports] writes a list of imports directives,
+///   * [writeTopLevelDeclarations] writes additional declarations used to
+///     represent mixin classes by name in the generated code.
+///   * [writeInitCall] writes the actual code that allocates the static
+///     configuration.
+///
+/// You'd need to include all three in your generated code, since the
+/// initialization code refers to symbols that are only available from the
+/// generated imports or the generated top-level declarations.
+class SmokeCodeGenerator {
+  // Note: we use SplayTreeSet/Map here and below to keep generated code sorted.
+  /// Names used as getters via smoke.
+  final Set<String> _getters = new SplayTreeSet();
+
+  /// Names used as setters via smoke.
+  final Set<String> _setters = new SplayTreeSet();
+
+  /// Subclass relations needed to run smoke queries.
+  final Map<TypeIdentifier, TypeIdentifier> _parents = new SplayTreeMap();
+
+  /// Declarations requested via `smoke.getDeclaration or `smoke.query`.
+  final Map<TypeIdentifier, Map<String, _DeclarationCode>> _declarations =
+      new SplayTreeMap();
+
+  /// Names that are used both as strings and symbols.
+  final Set<String> _names = new SplayTreeSet();
+
+  /// Prefixes associated with imported libraries.
+  final Map<String, String> _libraryPrefix = {};
+
+  /// Register that [name] is used as a getter in the code.
+  void addGetter(String name) { _getters.add(name); }
+
+  /// Register that [name] is used as a setter in the code.
+  void addSetter(String name) { _setters.add(name); }
+
+  /// Register that [name] might be needed as a symbol.
+  void addSymbol(String name) { _names.add(name); }
+
+  int _mixins = 0;
+
+  /// Creates a new type to represent a mixin. Use [comment] to help users
+  /// figure out what mixin is being represented.
+  TypeIdentifier createMixinType([String comment = '']) =>
+      new TypeIdentifier(null, '_M${_mixins++}', comment);
+
+  /// Register that we care to know that [child] extends [parent].
+  void addParent(TypeIdentifier child, TypeIdentifier parent) {
+    var existing = _parents[child];
+    if (existing != null) {
+      if (existing == parent) return;
+      throw new StateError('$child already has a different parent associated'
+          '($existing instead of $parent)');
+    }
+    _addLibrary(child.importUrl);
+    _addLibrary(parent.importUrl);
+    _parents[child] = parent;
+  }
+
+  /// Register a declaration of a field, property, or method. Note that one and
+  /// only one of [isField], [isMethod], or [isProperty] should be set at a
+  /// given time.
+  void addDeclaration(TypeIdentifier cls, String name, TypeIdentifier type,
+      {bool isField: false, bool isProperty: false, bool isMethod: false,
+      bool isFinal: false, bool isStatic: false,
+      List<ConstExpression> annotations: const []}) {
+    final count = (isField ? 1 : 0) + (isProperty ? 1 : 0) + (isMethod ? 1 : 0);
+    if (count != 1) {
+      throw new ArgumentError('Declaration must be one (and only one) of the '
+          'following: a field, a property, or a method.');
+    }
+    var kind = isField ? 'FIELD' : isProperty ? 'PROPERTY' : 'METHOD';
+    _declarations.putIfAbsent(cls,
+        () => new SplayTreeMap<String, _DeclarationCode>());
+    _addLibrary(cls.importUrl);
+    var map = _declarations[cls];
+
+    for (var exp in annotations) {
+      for (var lib in exp.librariesUsed) {
+        _addLibrary(lib);
+      }
+    }
+
+    _addLibrary(type.importUrl);
+    var decl = new _DeclarationCode(name, type, kind, isFinal, isStatic,
+        annotations);
+    if (map.containsKey(name) && map[name] != decl) {
+      throw new StateError('$type.$name already has a different declaration'
+          ' (${map[name]} instead of $decl).');
+    }
+    map[name] = decl;
+  }
+
+  /// Register that we might try to read declarations of [type], even if no
+  /// declaration exists. This informs the smoke system that querying for a
+  /// member in this class might be intentional and not an error.
+  void addEmptyDeclaration(TypeIdentifier type) {
+    _addLibrary(type.importUrl);
+    _declarations.putIfAbsent(type,
+        () => new SplayTreeMap<String, _DeclarationCode>());
+  }
+
+  /// Writes to [buffer] a line for each import that is needed by the generated
+  /// code. The code added by [writeInitCall] depends on these imports.
+  void writeImports(StringBuffer buffer) {
+    DEFAULT_IMPORTS.forEach((i) => buffer.writeln(i));
+    _libraryPrefix.forEach((url, prefix) {
+      buffer.writeln("import '$url' as $prefix;");
+    });
+  }
+
+  /// Writes to [buffer] top-level declarations that are used by the code
+  /// generated in [writeInitCall]. These are typically declarations of empty
+  /// classes that are then used as placeholders for mixin superclasses.
+  void writeTopLevelDeclarations(StringBuffer buffer) {
+    var types = new Set()
+        ..addAll(_parents.keys)
+        ..addAll(_parents.values)
+        ..addAll(_declarations.keys)
+        ..addAll(_declarations.values.expand(
+              (m) => m.values.map((d) => d.type)))
+        ..removeWhere((t) => t.importUrl != null);
+    for (var type in types) {
+      buffer.write('abstract class ${type.name} {}');
+      if (type.comment != null) buffer.write(' // ${type.comment}');
+      buffer.writeln();
+    }
+  }
+
+  /// Appends to [buffer] code that will initialize smoke's static
+  /// configuration. For example, the code might be of the form:
+  ///
+  ///    useGeneratedCode(new StaticConfiguration(
+  ///      getters: {
+  ///         #i: (o) => o.i,
+  ///         ...
+  ///      names: {
+  ///         #i: "i",
+  ///      }));
+  ///
+  /// The optional [indent] argument is used for formatting purposes. All
+  /// entries in each map (getters, setters, names, declarations, parents) are
+  /// sorted alphabetically.
+  ///
+  /// **Note**: this code assumes that imports from [writeImports] and top-level
+  /// declarations from [writeTopLevelDeclarations] are included in the same
+  /// library where this code will live.
+  void writeInitCall(StringBuffer buffer, [int indent = 2]) {
+    final spaces = new List.filled(indent, ' ').join('');
+    var args = {};
+
+    if (_getters.isNotEmpty) {
+      args['getters'] = _getters.map((n) => '#$n: (o) => o.$n');
+    }
+    if (_setters.isNotEmpty) {
+      args['setters'] = _setters.map((n) => '#$n: (o, v) { o.$n = v; }');
+    }
+
+    if (_parents.isNotEmpty) {
+      var parentsMap = [];
+      _parents.forEach((child, parent) {
+        var parent = _parents[child];
+        parentsMap.add('${child.asCode(_libraryPrefix)}: '
+          '${parent.asCode(_libraryPrefix)}');
+      });
+      args['parents'] = parentsMap;
+    }
+
+    if (_declarations.isNotEmpty) {
+      var declarations = [];
+      _declarations.forEach((type, members) {
+        final sb = new StringBuffer()
+            ..write(type.asCode(_libraryPrefix))
+            ..write(': ');
+        if (members.isEmpty) {
+          sb.write('const {}');
+        } else {
+          sb.write('{\n');
+          members.forEach((name, decl) {
+            var decl = members[name].asCode(_libraryPrefix);
+            sb.write('$spaces        #$name: $decl,\n');
+          });
+          sb.write('$spaces      }');
+        }
+        declarations.add(sb.toString());
+      });
+      args['declarations'] = declarations;
+    }
+
+    if (_names.isNotEmpty) {
+      args['names'] = _names.map((n) => "#$n: '$n'");
+    }
+
+    buffer..write(spaces)
+        ..writeln('useGeneratedCode(new StaticConfiguration(')
+        ..write('$spaces    checkedMode: false');
+
+    args.forEach((name, mapContents) {
+      buffer.writeln(',');
+      // TODO(sigmund): use const map when Type can be keys (dartbug.com/17123)
+      buffer.writeln('$spaces    $name: {');
+      for (var entry in mapContents) {
+        buffer.writeln('$spaces      $entry,');
+      }
+      buffer.write('$spaces    }');
+    });
+    buffer.writeln('));');
+  }
+
+  /// Adds a library that needs to be imported.
+  void _addLibrary(String url) {
+    if (url == null || url == 'dart:core') return;
+    _libraryPrefix.putIfAbsent(url, () => 'smoke_${_libraryPrefix.length}');
+  }
+}
+
+/// Information used to generate code that allocates a `Declaration` object.
+class _DeclarationCode extends ConstExpression {
+  final String name;
+  final TypeIdentifier type;
+  final String kind;
+  final bool isFinal;
+  final bool isStatic;
+  final List<ConstExpression> annotations;
+
+  _DeclarationCode(this.name, this.type, this.kind, this.isFinal, this.isStatic,
+      this.annotations);
+
+  List<String> get librariesUsed => []
+      ..addAll(type.librariesUsed)
+      ..addAll(annotations.expand((a) => a.librariesUsed));
+
+  String asCode(Map<String, String> libraryPrefixes) {
+    var sb = new StringBuffer();
+    sb.write("const Declaration(#$name, ${type.asCode(libraryPrefixes)}");
+    if (kind != 'FIELD') sb.write(', kind: $kind');
+    if (isFinal) sb.write(', isFinal: true');
+    if (isStatic) sb.write(', isStatic: true');
+    if (annotations != null && annotations.isNotEmpty) {
+      sb.write(', annotations: const [');
+      bool first = true;
+      for (var e in annotations) {
+        if (!first) sb.write(', ');
+        first = false;
+        sb.write(e.asCode(libraryPrefixes));
+      }
+      sb.write(']');
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+
+  String toString() =>
+      '(decl: $type.$name - $kind, $isFinal, $isStatic, $annotations)';
+  operator== (other) => other is _DeclarationCode && name == other.name && 
+      type == other.type && kind == other.kind && isFinal == other.isFinal &&
+      isStatic == other.isStatic &&
+      _compareLists(annotations, other.annotations);
+  int get hashCode => name.hashCode + (31 * type.hashCode);
+}
+
+/// A constant expression that can be used as an annotation.
+abstract class ConstExpression {
+
+  /// Returns the library URLs that needs to be imported for this
+  /// [ConstExpression] to be a valid annotation.
+  List<String> get librariesUsed;
+
+  /// Return a string representation of the code in this expression.
+  /// [libraryPrefixes] describes what prefix has been associated with each
+  /// import url mentioned in [libraryUsed].
+  String asCode(Map<String, String> libraryPrefixes);
+
+  ConstExpression();
+
+  /// Create a string expression of the form `'string'`, where [string] is
+  /// normalized so we can correctly wrap it in single quotes.
+  factory ConstExpression.string(String string) {
+    var value = string.replaceAll(r'\', r'\\').replaceAll(r"'", r"\'");
+    return new CodeAsConstExpression("'$value'");
+  }
+
+  /// Create an expression of the form `prefix.variable_name`.
+  factory ConstExpression.identifier(String importUrl, String name) =>
+      new TopLevelIdentifier(importUrl, name);
+
+  /// Create an expression of the form `prefix.Constructor(v1, v2, p3: v3)`.
+  factory ConstExpression.constructor(String importUrl, String name,
+      List<ConstExpression> positionalArgs,
+      Map<String, ConstExpression> namedArgs) =>
+      new ConstructorExpression(importUrl, name, positionalArgs, namedArgs);
+}
+
+/// A constant expression written as a String. Used when the code is self
+/// contained and it doesn't depend on any imported libraries.
+class CodeAsConstExpression extends ConstExpression {
+  String code;
+  List<String> get librariesUsed => const [];
+
+  CodeAsConstExpression(this.code);
+
+  String asCode(Map<String, String> libraryPrefixes) => code;
+
+  String toString() => '(code: $code)';
+  operator== (other) => other is CodeAsConstExpression && code == other.code;
+  int get hashCode => code.hashCode;
+}
+
+/// Describes a reference to some symbol that is exported from a library. This
+/// is typically used to refer to a type or a top-level variable from that
+/// library.
+class TopLevelIdentifier extends ConstExpression {
+  final String importUrl;
+  final String name;
+  TopLevelIdentifier(this.importUrl, this.name);
+
+  List<String> get librariesUsed => [importUrl];
+  String asCode(Map<String, String> libraryPrefixes) {
+    if (importUrl == 'dart:core' || importUrl == null) return name;
+    return '${libraryPrefixes[importUrl]}.$name';
+  }
+
+  String toString() => '(identifier: $importUrl, $name)';
+  operator== (other) => other is TopLevelIdentifier && name == other.name
+      && importUrl == other.importUrl;
+  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+/// Represents an expression that invokes a const constructor.
+class ConstructorExpression extends ConstExpression {
+  final String importUrl;
+  final String name;
+  final List<ConstExpression> positionalArgs;
+  final Map<String, ConstExpression> namedArgs;
+  ConstructorExpression(this.importUrl, this.name, this.positionalArgs,
+      this.namedArgs);
+
+  List<String> get librariesUsed => [importUrl]
+      ..addAll(positionalArgs.expand((e) => e.librariesUsed))
+      ..addAll(namedArgs.values.expand((e) => e.librariesUsed));
+
+  String asCode(Map<String, String> libraryPrefixes) {
+    var sb = new StringBuffer();
+    sb.write('const ');
+    if (importUrl != 'dart:core' && importUrl != null) {
+      sb.write('${libraryPrefixes[importUrl]}.');
+    }
+    sb.write('$name(');
+    bool first = true;
+    for (var e in positionalArgs) {
+      if (!first) sb.write(', ');
+      first = false;
+      sb.write(e.asCode(libraryPrefixes));
+    }
+    namedArgs.forEach((name, value) {
+      if (!first) sb.write(', ');
+      first = false;
+      sb.write('$name: ');
+      sb.write(value.asCode(libraryPrefixes));
+    });
+    sb.write(')');
+    return sb.toString();
+  }
+
+  String toString() => '(ctor: $importUrl, $name, $positionalArgs, $namedArgs)';
+  operator== (other) => other is ConstructorExpression && name == other.name
+      && importUrl == other.importUrl &&
+      _compareLists(positionalArgs, other.positionalArgs) &&
+      _compareMaps(namedArgs, other.namedArgs);
+  int get hashCode => 31 * importUrl.hashCode + name.hashCode;
+}
+
+
+/// Describes a type identifier, with the library URL where the type is defined.
+// TODO(sigmund): consider adding support for imprecise TypeIdentifiers, which
+// may be used by tools that want to generate code without using the analyzer
+// (they can syntactically tell the type comes from one of N imports).
+class TypeIdentifier extends TopLevelIdentifier
+    implements Comparable<TypeIdentifier> {
+  final String comment;
+  TypeIdentifier(importUrl, typeName, [this.comment])
+      : super(importUrl, typeName);
+
+  // We implement [Comparable] to sort out entries in the generated code.
+  int compareTo(TypeIdentifier other) {
+    if (importUrl == null && other.importUrl != null) return 1;
+    if (importUrl != null && other.importUrl == null) return -1;
+    var c1 = importUrl == null ? 0 : importUrl.compareTo(other.importUrl);
+    return c1 != 0 ? c1 : name.compareTo(other.name);
+  }
+
+  String toString() => '(type-identifier: $importUrl, $name, $comment)';
+  bool operator ==(other) => other is TypeIdentifier &&
+      importUrl == other.importUrl && name == other.name &&
+      comment == other.comment;
+  int get hashCode => super.hashCode;
+}
+
+/// Default set of imports added by [SmokeCodeGenerator].
+const DEFAULT_IMPORTS = const [
+    "import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;",
+    "import 'package:smoke/static.dart' show "
+        "useGeneratedCode, StaticConfiguration;",
+  ];
+
+/// Shallow comparison of two lists.
+bool _compareLists(List a, List b) {
+  if (a == null && b != null) return false;
+  if (a != null && b == null) return false;
+  if (a.length != b.length) return false;
+  for (int i = 0; i < a.length; i++) {
+    if (a[i] != b[i]) return false;
+  }
+  return true;
+}
+
+/// Shallow comparison of two maps.
+bool _compareMaps(Map a, Map b) {
+  if (a == null && b != null) return false;
+  if (a != null && b == null) return false;
+  if (a.length != b.length) return false;
+  for (var k in a.keys) {
+    if (!b.containsKey(k) || a[k] != b[k]) return false;
+  }
+  return true;
+}
diff --git a/pkg/smoke/lib/codegen/recorder.dart b/pkg/smoke/lib/codegen/recorder.dart
new file mode 100644
index 0000000..be4c96b
--- /dev/null
+++ b/pkg/smoke/lib/codegen/recorder.dart
@@ -0,0 +1,349 @@
+// 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.
+
+/// Records accesses to Dart program declarations and generates code that will
+/// allow to do the same accesses at runtime using `package:smoke/static.dart`.
+/// Internally, this library relies on the `analyzer` to extract data from the
+/// program, and then uses [SmokeCodeGenerator] to produce the code needed by
+/// the smoke system.
+///
+/// This library only uses the analyzer to consume data previously produced by
+/// running the resolver. This library does not provide any hooks to integrate
+/// running the analyzer itself. See `package:code_transformers` to integrate
+/// the analyzer into pub transformers.
+library smoke.codegen.recorder;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'generator.dart';
+
+typedef String ImportUrlResolver(LibraryElement lib);
+
+/// A recorder that tracks how elements are accessed in order to generate code
+/// that replicates those accesses with the smoke runtime.
+class Recorder {
+  /// Underlying code generator.
+  SmokeCodeGenerator generator;
+
+  /// Function that provides the import url for a library element. This may
+  /// internally use the resolver to resolve the import url.
+  ImportUrlResolver importUrlFor;
+
+  Recorder(this.generator, this.importUrlFor);
+
+  /// Stores mixins that have been recorded and associates a type identifier
+  /// with them. Mixins don't have an associated identifier in the code, so we
+  /// generate a unique identifier for them and use it throughout the code.
+  Map<TypeIdentifier, Map<ClassElement, TypeIdentifier>> _mixins = {};
+
+  /// Adds the superclass information of [type] (including intermediate mixins).
+  /// This will not generate data for direct subtypes of Object, as that is
+  /// considered redundant information.
+  void lookupParent(ClassElement type) {
+    var parent = type.supertype;
+    var mixins = type.mixins;
+    if (parent == null && mixins.isEmpty) return; // type is Object
+    var baseType = parent.element;
+    var baseId = _typeFor(baseType);
+    if (mixins.isNotEmpty) {
+      _mixins.putIfAbsent(baseId, () => {});
+      for (var m in mixins) {
+        var mixinType = m.element;
+        var mixinId = _mixins[baseId].putIfAbsent(mixinType, () {
+          var comment = '${baseId.name} & ${mixinType.name}';
+          return generator.createMixinType(comment);
+        });
+        if (!baseType.type.isObject) generator.addParent(mixinId, baseId);
+        baseType = mixinType;
+        baseId = mixinId;
+        _mixins.putIfAbsent(mixinId, () => {});
+      }
+    }
+    if (!baseType.type.isObject) generator.addParent(_typeFor(type), baseId);
+  }
+
+  TypeIdentifier _typeFor(ClassElement type) =>
+      new TypeIdentifier(importUrlFor(type.library), type.displayName);
+
+  /// Adds any declaration and superclass information that is needed to answer a
+  /// query on [type] that matches [options].
+  void runQuery(ClassElement type, QueryOptions options) {
+    if (type.type.isObject) return; // We don't include Object in query results.
+    var id = _typeFor(type);
+    var parent = type.supertype != null ? type.supertype.element : null;
+    if (options.includeInherited && parent != null &&
+        parent != options.includeUpTo) {
+      lookupParent(type);
+      runQuery(parent, options);
+      var parentId = _typeFor(parent);
+      for (var m in type.mixins) {
+        var mixinClass = m.element;
+        var mixinId = _mixins[parentId][mixinClass];
+        _runQueryInternal(mixinClass, mixinId, options);
+        parentId = mixinId;
+      }
+    }
+    _runQueryInternal(type, id, options);
+  }
+
+  /// Helper for [runQuery]. This runs the query only on a specific [type],
+  /// which could be a class or a mixin labeled by [id].
+  // TODO(sigmund): currently we materialize mixins in smoke/static.dart,
+  // we should consider to include the mixin declaration information directly,
+  // and remove the duplication we have for mixins today.
+  void _runQueryInternal(ClassElement type, TypeIdentifier id,
+      QueryOptions options) {
+
+    skipBecauseOfAnnotations(Element e) {
+      if (options.withAnnotations == null) return false;
+      return !_matchesAnnotation(e.metadata, options.withAnnotations);
+    }
+
+    if (options.includeFields) {
+      for (var f in type.fields) {
+        if (f.isStatic) continue;
+        if (f.isSynthetic) continue; // exclude getters
+        if (options.excludeFinal && f.isFinal) continue;
+        if (skipBecauseOfAnnotations(f)) continue;
+        generator.addDeclaration(id, f.displayName, _typeFor(f.type.element),
+            isField: true, isFinal: f.isFinal,
+            annotations: _copyAnnotations(f));
+      }
+    }
+
+    if (options.includeProperties) {
+      for (var a in type.accessors) {
+        if (a is! PropertyAccessorElement) continue;
+        if (a.isStatic || !a.isGetter) continue;
+        var v = a.variable;
+        if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+        if (options.excludeFinal && v.isFinal) continue;
+        if (skipBecauseOfAnnotations(v)) continue;
+        generator.addDeclaration(id, v.displayName, _typeFor(v.type.element),
+            isProperty: true, isFinal: v.isFinal,
+            annotations: _copyAnnotations(a));
+      }
+    }
+
+    if (options.includeMethods) {
+      for (var m in type.methods) {
+        if (m.isStatic) continue;
+        if (skipBecauseOfAnnotations(m)) continue;
+        generator.addDeclaration(id, m.displayName,
+            new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+            annotations: _copyAnnotations(m));
+      }
+    }
+  }
+
+  /// Adds the declaration of [name] if it was found in [type]. If [recursive]
+  /// is true, then we continue looking up [name] in the parent classes until we
+  /// find it or we reach Object.
+  void lookupMember(ClassElement type, String name, {bool recursive: false}) {
+    _lookupMemberInternal(type, _typeFor(type), name, recursive);
+  }
+
+  /// Helper for [lookupMember] that walks up the type hierarchy including mixin
+  /// classes.
+  bool _lookupMemberInternal(ClassElement type, TypeIdentifier id, String name,
+      bool recursive) {
+    // Exclude members from [Object].
+    if (type.type.isObject) return false;
+    generator.addEmptyDeclaration(id);
+    for (var f in type.fields) {
+      if (f.displayName != name) continue;
+      if (f.isSynthetic) continue; // exclude getters
+      generator.addDeclaration(id, f.displayName,
+          _typeFor(f.type.element), isField: true, isFinal: f.isFinal,
+          isStatic: f.isStatic, annotations: _copyAnnotations(f));
+      return true;
+    }
+
+    for (var a in type.accessors) {
+      if (a is! PropertyAccessorElement) continue;
+      // TODO(sigmund): support setters without getters.
+      if (!a.isGetter) continue;
+      if (a.displayName != name) continue;
+      var v = a.variable;
+      if (v is FieldElement && !v.isSynthetic) continue; // exclude fields
+      generator.addDeclaration(id, v.displayName,
+          _typeFor(v.type.element), isProperty: true, isFinal: v.isFinal,
+          isStatic: v.isStatic, annotations: _copyAnnotations(a));
+      return true;
+    }
+
+    for (var m in type.methods) {
+      if (m.displayName != name) continue;
+      generator.addDeclaration(id, m.displayName,
+          new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+          isStatic: m.isStatic, annotations: _copyAnnotations(m));
+      return true;
+    }
+
+    if (recursive) {
+      lookupParent(type);
+      var parent = type.supertype != null ? type.supertype.element : null;
+      if (parent == null) return false;
+      var parentId = _typeFor(parent);
+      for (var m in type.mixins) {
+        var mixinClass = m.element;
+        var mixinId = _mixins[parentId][mixinClass];
+        if (_lookupMemberInternal(mixinClass, mixinId, name, false)) {
+          return true;
+        }
+        parentId = mixinId;
+      }
+      return _lookupMemberInternal(parent, parentId, name, true);
+    }
+    return false;
+  }
+
+
+  /// Copy metadata associated with the declaration of [target].
+  List<ConstExpression> _copyAnnotations(Element target) {
+    var node = target.node;
+    // [node] is the initialization expression, we walk up to get to the actual
+    // member declaration where the metadata is attached to.
+    while (node is! ClassMember) node = node.parent;
+    return node.metadata.map(_convertAnnotation).toList();
+  }
+
+  /// Converts annotations into [ConstExpression]s supported by the codegen
+  /// library.
+  ConstExpression _convertAnnotation(Annotation annotation) {
+    var element = annotation.element;
+    if (element is ConstructorElement) {
+      if (!element.name.isEmpty) {
+        throw new UnimplementedError(
+            'named constructors are not implemented in smoke.codegen.recorder');
+      }
+
+      var positionalArgs = [];
+      for (var arg in annotation.arguments.arguments) {
+        if (arg is NamedExpression) {
+          throw new UnimplementedError(
+              'named arguments in constructors are not implemented in '
+              'smoke.codegen.recorder');
+        }
+        positionalArgs.add(_convertExpression(arg));
+      }
+
+      return new ConstructorExpression(importUrlFor(element.library),
+          element.enclosingElement.name, positionalArgs, const {});
+    }
+
+    if (element is PropertyAccessorElement) {
+      return new TopLevelIdentifier(
+          importUrlFor(element.library), element.name);
+    }
+
+    throw new UnsupportedError('unsupported annotation $annotation');
+  }
+
+  /// Converts [expression] into a [ConstExpression].
+  ConstExpression _convertExpression(Expression expression) {
+    if (expression is StringLiteral) {
+      return new ConstExpression.string(expression.stringValue);
+    }
+
+    if (expression is BooleanLiteral || expression is DoubleLiteral ||
+        expression is IntegerLiteral || expression is NullLiteral) {
+      return new CodeAsConstExpression("${(expression as dynamic).value}");
+    }
+
+    if (expression is Identifier) {
+      var element = expression.bestElement;
+      if (element == null || !element.isPublic) {
+        throw new UnsupportedError('private constants are not supported');
+      }
+
+      var url = importUrlFor(element.library);
+      if (element is ClassElement) {
+        return new TopLevelIdentifier(url, element.name);
+      }
+
+      if (element is PropertyAccessorElement) {
+        var variable = element.variable;
+        if (variable is FieldElement) {
+          var cls = variable.enclosingElement;
+          return new TopLevelIdentifier(url, '${cls.name}.${variable.name}');
+        } else if (variable is TopLevelVariableElement) {
+          return new TopLevelIdentifier(url, variable.name);
+        }
+      }
+    }
+
+    throw new UnimplementedError('expression convertion not implemented in '
+        'smoke.codegen.recorder (${expression.runtimeType} $expression)');
+  }
+}
+
+/// Returns whether [metadata] contains any annotation that is either equal to
+/// an annotation in [queryAnnotations] or whose type is a subclass of a type
+/// listed in [queryAnnotations]. This is equivalent to the check done in
+/// `src/common.dart#matchesAnnotation`, except that this is applied to
+/// static metadata as it was provided by the analyzer.
+bool _matchesAnnotation(Iterable<ElementAnnotation> metadata,
+    Iterable<Element> queryAnnotations) {
+  for (var meta in metadata) {
+    var element = meta.element;
+    var exp;
+    var type;
+    if (element is PropertyAccessorElement) {
+      exp = element.variable;
+      type = exp.evaluationResult.value.type;
+    } else if (element is ConstructorElement) {
+      exp = element;
+      type = element.enclosingElement.type;
+    } else {
+      throw new UnimplementedError('Unsupported annotation: ${meta}');
+    }
+    for (var queryMeta in queryAnnotations) {
+      if (exp == queryMeta) return true;
+      if (queryMeta is ClassElement && type.isSubtypeOf(queryMeta.type)) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+/// Options equivalent to `smoke.dart#QueryOptions`, except that type
+/// information and annotations are denoted by resolver's elements.
+class QueryOptions {
+  /// Whether to include fields (default is true).
+  final bool includeFields;
+
+  /// Whether to include getters and setters (default is true). Note that to
+  /// include fields you also need to enable [includeFields].
+  final bool includeProperties;
+
+  /// Whether to include symbols from the given type and its superclasses
+  /// (except [Object]).
+  final bool includeInherited;
+
+  /// If [includeInherited], walk up the type hierarchy up to this type
+  /// (defaults to [Object]).
+  final ClassElement includeUpTo;
+
+  /// Whether to include final fields and getter-only properties.
+  final bool excludeFinal;
+
+  /// Whether to include methods (default is false).
+  final bool includeMethods;
+
+  /// If [withAnnotation] is not null, then it should be a list of types, so
+  /// only symbols that are annotated with instances of those types are
+  /// included.
+  final List<Element> withAnnotations;
+
+  const QueryOptions({
+      this.includeFields: true,
+      this.includeProperties: true,
+      this.includeInherited: true,
+      this.includeUpTo: null,
+      this.excludeFinal: false,
+      this.includeMethods: false,
+      this.withAnnotations: null});
+}
diff --git a/pkg/smoke/lib/static.dart b/pkg/smoke/lib/static.dart
index 4b276fc..3c8d59c 100644
--- a/pkg/smoke/lib/static.dart
+++ b/pkg/smoke/lib/static.dart
@@ -37,9 +37,15 @@
 
   /// A map from strings to symbols (the reverse of [names]).
   final Map<String, Symbol> symbols;
+
+  /// Whether to check for missing declarations, otherwise, return default
+  /// values (for example a missing parent class can be treated as Object)
+  final bool checkedMode;
+
   StaticConfiguration({
       this.getters: const {}, this.setters: const {}, this.parents: const {},
-      this.declarations: const {}, this.names: const {}})
+      this.declarations: const {}, this.names: const {},
+      this.checkedMode: true})
       : this.symbols = {} {
     names.forEach((k, v) { symbols[v] = k; });
   }
@@ -120,6 +126,7 @@
       var parentType = _configuration.parents[type];
       if (parentType == supertype) return true;
       if (parentType == null) {
+        if (!_configuration.checkedMode) return false;
         throw new MissingCodeException('superclass of "$type" ($parentType)');
       }
       type = parentType;
@@ -147,6 +154,7 @@
   bool hasStaticMethod(Type type, Symbol name) {
     final map = _configuration.declarations[type];
     if (map == null) {
+      if (!_configuration.checkedMode) return false;
       throw new MissingCodeException('declarations for $type');
     }
     final decl = map[name];
@@ -156,25 +164,27 @@
   Declaration getDeclaration(Type type, Symbol name) {
     var decl = _findDeclaration(type, name);
     if (decl == null) {
+      if (!_configuration.checkedMode) return null;
       throw new MissingCodeException('declaration for $type.$name');
     }
     return decl;
   }
 
   List<Declaration> query(Type type, QueryOptions options) {
-    var result;
+    var result = [];
     if (options.includeInherited) {
       var superclass = _configuration.parents[type];
       if (superclass == null) {
-        throw new MissingCodeException('superclass of "$type"');
+        if (_configuration.checkedMode) {
+          throw new MissingCodeException('superclass of "$type"');
+        }
+      } else if (superclass != options.includeUpTo) {
+        result = query(superclass, options);
       }
-      result = (superclass == options.includeUpTo) ? []
-          : query(superclass, options);
-    } else {
-      result = [];
     }
     var map = _configuration.declarations[type];
     if (map == null) {
+      if (!_configuration.checkedMode) return result;
       throw new MissingCodeException('declarations for $type');
     }
     for (var decl in map.values) {
@@ -218,6 +228,7 @@
     }
     var parentType = _configuration.parents[type];
     if (parentType == null) {
+      if (!_configuration.checkedMode) return null;
       throw new MissingCodeException('superclass of "$type"');
     }
     type = parentType;
diff --git a/pkg/smoke/pubspec.yaml b/pkg/smoke/pubspec.yaml
index 4332d339..c20c690 100644
--- a/pkg/smoke/pubspec.yaml
+++ b/pkg/smoke/pubspec.yaml
@@ -9,11 +9,16 @@
 dependencies:
   barback: ">=0.9.0 <0.12.0"
   logging: ">=0.9.0 <0.10.0"
-#TODO(sigmund): uncomment this once we have some easier way to do global
+# TODO(sigmund): uncomment this once we have some easier way to do global
 # app-level transformers or a way to enable this selectively from the
 # application package.
-#transformers: [smoke/src/default_transformer]
+#transformers:
+#- smoke/src/default_transformer
+#    # TODO(sigmund): include this once this feature is available in the stable
+#    # channel, or when we really need some other feature in the dev channel.
+#    # $include: lib/src/implementation.dart
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
+  path: ">=1.0.0 <2.0.0"
 environment:
   sdk: ">=1.2.0 <2.0.0"
diff --git a/pkg/smoke/test/codegen/common.dart b/pkg/smoke/test/codegen/common.dart
new file mode 100644
index 0000000..a7a4c4c
--- /dev/null
+++ b/pkg/smoke/test/codegen/common.dart
@@ -0,0 +1,25 @@
+// 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.
+
+library smoke.test.codegen.common;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+checkResults(SmokeCodeGenerator generator, {List<String> imports: const [],
+    String topLevel: '', String initCall}) {
+  var allImports = []..addAll(DEFAULT_IMPORTS)..addAll(imports)..add('');
+  var genImports = new StringBuffer();
+  generator.writeImports(genImports);
+  expect(genImports.toString(), allImports.join('\n'));
+
+  var genTopLevel = new StringBuffer();
+  generator.writeTopLevelDeclarations(genTopLevel);
+  expect(genTopLevel.toString(), topLevel);
+
+  var indentedCode = initCall.replaceAll("\n", "\n  ").trim();
+  var genInitCall = new StringBuffer();
+  generator.writeInitCall(genInitCall);
+  expect(genInitCall.toString(), '  $indentedCode\n');
+}
diff --git a/pkg/smoke/test/codegen/end_to_end_test.dart b/pkg/smoke/test/codegen/end_to_end_test.dart
new file mode 100644
index 0000000..37a627a
--- /dev/null
+++ b/pkg/smoke/test/codegen/end_to_end_test.dart
@@ -0,0 +1,147 @@
+// 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.
+
+/// And end-to-end test that generates code and checks that the output matches
+/// the code in `static_test.dart`. Techincally we could run the result in an
+/// isolate, but instead we decided to split that up in two tests. This test
+/// ensures that we generate the code as it was written in static_test, and
+/// separately static_test ensures that the smoke.static library behaves as
+/// expected.
+library smoke.test.codegen.end_to_end_test;
+
+import 'dart:io';
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+import 'package:path/path.dart' as path;
+
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main(args) {
+  final updateStaticTest = args.length > 0 && args[0] == '--update_static_test';
+
+  test('static_test is up to date', () {
+    var scriptPath = Platform.script.path;
+    var testDir = path.posix.dirname(path.posix.dirname(scriptPath));
+    var commonPath = path.posix.join(testDir, 'common.dart');
+    var testCode = new File('$commonPath').readAsStringSync();
+    var lib = initAnalyzer({'common.dart' : testCode})
+        .libraryFor('common.dart');
+    var coreLib = lib.visibleLibraries.firstWhere(
+        (l) => l.displayName == 'dart.core');
+    var generator = new SmokeCodeGenerator();
+    var recorder = new Recorder(generator, resolveImportUrl);
+
+    // Record all getters and setters we use in the tests.
+    generator.addGetter("i");
+    generator.addGetter("j");
+    generator.addGetter("j2");
+    generator.addGetter("inc0");
+    generator.addGetter("inc1");
+    generator.addGetter("inc2");
+    generator.addSetter("i");
+    generator.addSetter("j2");
+
+    // Record symbol convertions.
+    generator.addSymbol('i');
+
+    /// Record all parent-class relations that we explicitly request for 
+    recorder.lookupParent(lib.getType('AnnotB'));
+    recorder.lookupParent(lib.getType('A'));
+    recorder.lookupParent(lib.getType('B'));
+    recorder.lookupParent(lib.getType('D'));
+    recorder.lookupParent(lib.getType('H'));
+
+    // Record members for which we implicitly request their declaration in
+    // has-getter and has-setter tests.
+    recorder.lookupMember(lib.getType('A'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "j2", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "inc2", recursive: true);
+    recorder.lookupMember(lib.getType('B'), "a", recursive: true);
+    recorder.lookupMember(lib.getType('B'), "f", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "y", recursive: true);
+
+    // Record also lookups for non-exisiting members.
+    recorder.lookupMember(lib.getType('B'), "i", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "x", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "z", recursive: true);
+
+    // Record members for which we explicitly request their declaration.
+    recorder.lookupMember(lib.getType('B'), "a");
+    recorder.lookupMember(lib.getType('B'), "w");
+    recorder.lookupMember(lib.getType('A'), "inc1");
+    recorder.lookupMember(lib.getType('F'), "staticMethod");
+    recorder.lookupMember(lib.getType('G'), "b");
+    recorder.lookupMember(lib.getType('G'), "d");
+
+    // Lookups from no-such-method test.
+    recorder.lookupMember(lib.getType('A'), "noSuchMethod", recursive: true);
+    recorder.lookupMember(lib.getType('E'), "noSuchMethod", recursive: true);
+    recorder.lookupMember(lib.getType('E2'), "noSuchMethod", recursive: true);
+
+    // Lookups from has-instance-method and has-static-method tests.
+    recorder.lookupMember(lib.getType('A'), "inc0", recursive: true);
+    recorder.lookupMember(lib.getType('A'), "inc3", recursive: true);
+    recorder.lookupMember(lib.getType('C'), "inc", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "inc", recursive: true);
+    recorder.lookupMember(lib.getType('D'), "inc0", recursive: true);
+    recorder.lookupMember(lib.getType('F'), "staticMethod", recursive: true);
+    recorder.lookupMember(lib.getType('F2'), "staticMethod", recursive: true);
+
+    // Record all queries done by the test.
+    recorder.runQuery(lib.getType('A'), new QueryOptions());
+    recorder.runQuery(lib.getType('D'),
+        new QueryOptions(includeInherited: true));
+
+    var vars = lib.definingCompilationUnit.topLevelVariables;
+    expect(vars[0].name, 'a1');
+    expect(vars[1].name, 'a2');
+    var options = new QueryOptions(includeInherited: true,
+        withAnnotations: [vars[0], vars[1], lib.getType('Annot')]);
+    recorder.runQuery(lib.getType('H'), options);
+
+    var code = _createEntrypoint(generator);
+    var staticTestFile = new File(path.posix.join(testDir, 'static_test.dart'));
+    var existingCode = staticTestFile.readAsStringSync();
+    if (!updateStaticTest) {
+      expect(code, existingCode);
+    } else if (code == existingCode) {
+      print('static_test.dart is already up to date');
+    } else {
+      staticTestFile.writeAsStringSync(code);
+      print('static_test.dart has been updated.');
+    }
+  });
+}
+
+_createEntrypoint(SmokeCodeGenerator generator) {
+  var sb = new StringBuffer()
+      ..writeln('/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------')
+      ..writeln('/// To update this test file, call:')
+      ..writeln('/// > dart codegen/end_to_end_test.dart --update_static_test')
+      ..writeln('/// --------------------------------------------------------');
+  sb.write('\nlibrary smoke.test.static_test;\n\n');
+  sb.writeln("import 'package:unittest/unittest.dart';");
+  generator.writeImports(sb);
+  sb.writeln("import 'common.dart' as common show main;\n");
+  generator.writeTopLevelDeclarations(sb);
+  sb.writeln('\n_configure() {');
+  generator.writeInitCall(sb);
+  sb.writeln('}\n');
+  sb.writeln('main() {');
+  sb.writeln('  setUp(_configure);');
+  sb.writeln('  common.main();');
+  sb.writeln('}');
+  return sb.toString();
+}
+
+
+resolveImportUrl(LibraryElement lib) {
+  if (lib.isDartCore) return 'dart:core';
+  if (lib.displayName == 'smoke.test.common') return 'common.dart';
+  return 'unknown.dart';
+}
diff --git a/pkg/smoke/test/codegen/generator_test.dart b/pkg/smoke/test/codegen/generator_test.dart
new file mode 100644
index 0000000..dcd4c55
--- /dev/null
+++ b/pkg/smoke/test/codegen/generator_test.dart
@@ -0,0 +1,181 @@
+// 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.
+
+library smoke.test.codegen.generator_test;
+
+import 'package:smoke/codegen/generator.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+
+main() {
+  test('getters', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('i');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #i: (o) => o.i,\n'
+        '    }));\n');
+
+    generator.addGetter('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #foo: (o) => o.foo,\n'
+        '      #i: (o) => o.i,\n'
+        '    }));\n');
+  });
+
+  test('setters', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addSetter('i');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    setters: {\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    }));\n');
+
+    generator.addSetter('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    setters: {\n'
+        '      #foo: (o, v) { o.foo = v; },\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    }));\n');
+  });
+
+  test('names/symbols', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addSymbol('i');
+    generator.addSymbol('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    names: {\n'
+        '      #foo: \'foo\',\n'
+        '      #i: \'i\',\n'
+        '    }));\n');
+  });
+
+  test('getters, setters, and names', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('i');
+    generator.addSetter('i');
+    generator.addSetter('foo');
+    generator.addSymbol('foo');
+    checkResults(generator, initCall:
+        'useGeneratedCode(new StaticConfiguration(\n'
+        '    checkedMode: false,\n'
+        '    getters: {\n'
+        '      #i: (o) => o.i,\n'
+        '    },\n'
+        '    setters: {\n'
+        '      #foo: (o, v) { o.foo = v; },\n'
+        '      #i: (o, v) { o.i = v; },\n'
+        '    },\n'
+        '    names: {\n'
+        '      #foo: \'foo\',\n'
+        '    }));\n');
+  });
+
+  test('parents', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addParent(new TypeIdentifier('a.dart', 'A'),
+        new TypeIdentifier('b.dart', 'B'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    checkResults(generator,
+        imports: [
+          "import 'a.dart' as smoke_0;",
+          "import 'b.dart' as smoke_1;"
+        ],
+        initCall:
+          'useGeneratedCode(new StaticConfiguration(\n'
+          '    checkedMode: false,\n'
+          '    parents: {\n'
+          '      smoke_0.A: smoke_1.B,\n'
+          '      smoke_0.C: smoke_0.A,\n'
+          '    }));\n');
+  });
+
+  test('declarations', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'bar',
+        new TypeIdentifier('dart:core', 'Function'), isMethod: true,
+        annotations: [new ConstExpression.constructor(null, 'Annotation',
+          [new ConstExpression.string("hi")], const {})]);
+    checkResults(generator,
+        imports: ["import 'a.dart' as smoke_0;"],
+        initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #bar: const Declaration(#bar, Function, kind: METHOD, '
+                           'annotations: const [const Annotation(\'hi\')]),\n'
+            '        #foo: const Declaration(#foo, int, isFinal: true),\n'
+            '      },\n'
+            '    }));\n');
+  });
+
+  test('repeated entries appear only once', () {
+    var generator = new SmokeCodeGenerator();
+    generator.addGetter('a');
+    generator.addGetter('a');
+    generator.addSetter('b');
+    generator.addSetter('b');
+    generator.addSymbol('d');
+    generator.addSymbol('d');
+    generator.addSymbol('c');
+    generator.addSymbol('c');
+    generator.addSymbol('c');
+
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+    generator.addParent(new TypeIdentifier('a.dart', 'C'),
+        new TypeIdentifier('a.dart', 'A'));
+
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+    generator.addDeclaration(new TypeIdentifier('a.dart', 'A'), 'foo',
+        new TypeIdentifier('dart:core', 'int'), isField: true, isFinal: true);
+
+    checkResults(generator,
+        imports: [
+          "import 'a.dart' as smoke_0;",
+        ],
+        initCall:
+          'useGeneratedCode(new StaticConfiguration(\n'
+          '    checkedMode: false,\n'
+          '    getters: {\n'
+          '      #a: (o) => o.a,\n'
+          '    },\n'
+          '    setters: {\n'
+          '      #b: (o, v) { o.b = v; },\n'
+          '    },\n'
+          '    parents: {\n'
+          '      smoke_0.C: smoke_0.A,\n'
+          '    },\n'
+          '    declarations: {\n'
+          '      smoke_0.A: {\n'
+          '        #foo: const Declaration(#foo, int, isFinal: true),\n'
+          '      },\n'
+          '    },\n'
+          '    names: {\n'
+          '      #c: \'c\',\n'
+          '      #d: \'d\',\n'
+          '    }));\n');
+  });
+}
diff --git a/pkg/smoke/test/codegen/recorder_test.dart b/pkg/smoke/test/codegen/recorder_test.dart
new file mode 100644
index 0000000..33698c9
--- /dev/null
+++ b/pkg/smoke/test/codegen/recorder_test.dart
@@ -0,0 +1,554 @@
+// 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.
+
+library smoke.test.codegen.recorder_test;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:smoke/codegen/generator.dart';
+import 'package:smoke/codegen/recorder.dart';
+import 'package:unittest/unittest.dart';
+
+import 'common.dart' show checkResults;
+import 'testing_resolver_utils.dart' show initAnalyzer;
+
+main() {
+  var provider = initAnalyzer(_SOURCES);
+  var generator;
+  var recorder;
+  setUp(() {
+    generator = new SmokeCodeGenerator();
+    recorder = new Recorder(generator, resolveImportUrl);
+  });
+
+  group('parents', () {
+    test('simple subclassing', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('A'));
+      recorder.lookupParent(lib.getType('C'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+            "import '/b.dart' as smoke_1;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.A: smoke_1.B,\n'
+            '      smoke_0.C: smoke_0.A,\n'
+            '    }));\n');
+    });
+
+    test('single mixin', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('E'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // A & D1\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.E: _M0,\n'
+            '      _M0: smoke_0.A,\n'
+            '    }));\n');
+    });
+
+    test('multiple mixins', () {
+      var lib = provider.libraryFor('/a.dart');
+      recorder.lookupParent(lib.getType('F'));
+
+      checkResults(generator,
+          imports: [
+            "import '/a.dart' as smoke_0;",
+          ],
+          topLevel: 
+            'abstract class _M0 {} // A & D1\n'
+            'abstract class _M1 {} // _M0 & D2\n'
+            'abstract class _M2 {} // _M1 & D3\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.F: _M2,\n'
+            '      _M0: smoke_0.A,\n'
+            '      _M1: _M0,\n'
+            '      _M2: _M1,\n'
+            '    }));\n');
+    });
+
+    test('same as common_test', () {
+      var lib = provider.libraryFor('/common.dart');
+      recorder.lookupParent(lib.getType('Annot'));
+      recorder.lookupParent(lib.getType('AnnotB'));
+      recorder.lookupParent(lib.getType('A'));
+      recorder.lookupParent(lib.getType('B'));
+      recorder.lookupParent(lib.getType('C'));
+      recorder.lookupParent(lib.getType('D'));
+      recorder.lookupParent(lib.getType('E'));
+      recorder.lookupParent(lib.getType('E2'));
+      recorder.lookupParent(lib.getType('F'));
+      recorder.lookupParent(lib.getType('F2'));
+      recorder.lookupParent(lib.getType('G'));
+      recorder.lookupParent(lib.getType('H'));
+      var coreLib = lib.visibleLibraries.firstWhere(
+          (l) => l.displayName == 'dart.core');
+      recorder.lookupParent(coreLib.getType('int'));
+      recorder.lookupParent(coreLib.getType('num'));
+
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel:
+            'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.AnnotB: smoke_0.Annot,\n'
+            '      smoke_0.D: _M0,\n'
+            '      smoke_0.E2: smoke_0.E,\n'
+            '      smoke_0.F2: smoke_0.F,\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '      int: num,\n'
+            '      _M0: smoke_0.C,\n'
+            '    }));\n');
+    });
+  });
+
+  group('lookup member', () {
+    var lib;
+    setUp(() {
+      lib = provider.libraryFor('/common.dart');
+    });
+
+    test('missing declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'q');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: const {},\n'
+            '    }));\n');
+    });
+
+    test('field declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'i');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('property declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'j2');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('method declaration', () {
+      recorder.lookupMember(lib.getType('A'), 'inc0');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('inherited field - not recursive', () {
+      recorder.lookupMember(lib.getType('D'), 'i');
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.D: const {},\n'
+            '    }));\n');
+    });
+
+    test('inherited field - recursive', () {
+      recorder.lookupMember(lib.getType('D'), 'i', recursive: true);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.D: _M0,\n'
+            '      _M0: smoke_0.C,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.D: const {},\n'
+            '      _M0: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '      },\n'
+            '    }));\n');
+    });
+  });
+
+  group('query', () {
+    test('default query', () {
+      var options = new QueryOptions();
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('only fields', () {
+      var options = new QueryOptions(includeProperties: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('only properties', () {
+      var options = new QueryOptions(includeFields: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+
+    });
+
+    test('fields, properties, and and methods', () {
+      var options = new QueryOptions(includeMethods: true);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('A'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.A: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #inc0: const Declaration(#inc0, Function, kind: METHOD),\n'
+            '        #inc1: const Declaration(#inc1, Function, kind: METHOD),\n'
+            '        #inc2: const Declaration(#inc2, Function, kind: METHOD),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('exclude inherited', () {
+      var options = new QueryOptions(includeInherited: false);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('D'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    declarations: {\n'
+            '      smoke_0.D: {\n'
+            '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('include inherited', () {
+      var options = new QueryOptions(includeInherited: true);
+      var lib = provider.libraryFor('/common.dart');
+      recorder.runQuery(lib.getType('D'), options);
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          topLevel: 'abstract class _M0 {} // C & A\n',
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.D: _M0,\n'
+            '      _M0: smoke_0.C,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.C: {\n'
+            '        #b: const Declaration(#b, smoke_0.B),\n'
+            '        #x: const Declaration(#x, int),\n'
+            '        #y: const Declaration(#y, String),\n'
+            '      },\n'
+            '      smoke_0.D: {\n'
+            '        #i2: const Declaration(#i2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '        #x2: const Declaration(#x2, int, kind: PROPERTY, '
+                                           'isFinal: true),\n'
+            '      },\n'
+            '      _M0: {\n'
+            '        #i: const Declaration(#i, int),\n'
+            '        #j: const Declaration(#j, int),\n'
+            '        #j2: const Declaration(#j2, int, kind: PROPERTY),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('exact annotation', () {
+      var lib = provider.libraryFor('/common.dart');
+      var vars = lib.definingCompilationUnit.topLevelVariables;
+      expect(vars[0].name, 'a1');
+      var options = new QueryOptions(includeInherited: true,
+          withAnnotations: [vars[0]]);
+      recorder.runQuery(lib.getType('H'), options);
+      final annot = 'annotations: const [smoke_0.a1]';
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.G: {\n'
+            '        #b: const Declaration(#b, int, $annot),\n'
+            '      },\n'
+            '      smoke_0.H: {\n'
+            '        #f: const Declaration(#f, int, $annot),\n'
+            '        #g: const Declaration(#g, int, $annot),\n'
+            '      },\n'
+            '    }));\n');
+    });
+
+    test('type annotation', () {
+      var lib = provider.libraryFor('/common.dart');
+      var options = new QueryOptions(includeInherited: true,
+          withAnnotations: [lib.getType('Annot')]);
+      recorder.runQuery(lib.getType('H'), options);
+      final a1Annot = 'annotations: const [smoke_0.a1]';
+      final a3Annot = 'annotations: const [smoke_0.a3]';
+      final exprAnnot = 'annotations: const [const smoke_0.Annot(1)]';
+      checkResults(generator,
+          imports: [
+            "import '/common.dart' as smoke_0;",
+          ],
+          initCall:
+            'useGeneratedCode(new StaticConfiguration(\n'
+            '    checkedMode: false,\n'
+            '    parents: {\n'
+            '      smoke_0.H: smoke_0.G,\n'
+            '    },\n'
+            '    declarations: {\n'
+            '      smoke_0.G: {\n'
+            '        #b: const Declaration(#b, int, $a1Annot),\n'
+            '      },\n'
+            '      smoke_0.H: {\n'
+            '        #f: const Declaration(#f, int, $a1Annot),\n'
+            '        #g: const Declaration(#g, int, $a1Annot),\n'
+            '        #i: const Declaration(#i, int, $a3Annot),\n'
+            '        #j: const Declaration(#j, int, $exprAnnot),\n'
+            '      },\n'
+            '    }));\n');
+    });
+  });
+}
+
+const _SOURCES = const {
+  '/a.dart': '''
+      library a;
+      import '/b.dart';
+
+      class Annot { const Annot(); }
+      const annot = const Annot();
+
+      class A extends B {}
+      class C extends A {}
+      class D1 {
+        int d1;
+      }
+      class D2 {
+        int d2;
+      }
+      class D3 {
+        int d3;
+      }
+      class E extends A with D1 {
+        int e1;
+      }
+      class F extends A with D1, D2, D3 {
+        int f1;
+      }
+      ''',
+
+  '/b.dart': '''
+      library b;
+
+      class B {}
+      ''',
+  '/common.dart': '''
+      library common;
+
+      class A {
+        int i = 42;
+        int j = 44;
+        int get j2 => j;
+        void set j2(int v) { j = v; }
+        void inc0() { i++; }
+        void inc1(int v) { i = i + (v == null ? -10 : v); }
+        void inc2([int v]) { i = i + (v == null ? -10 : v); }
+      }
+
+      class B {
+        final int f = 3;
+        int _w;
+        int get w => _w;
+        set w(int v) { _w = v; }
+
+        String z;
+        A a;
+
+        B(this._w, this.z, this.a);
+      }
+
+      class C {
+        int x;
+        String y;
+        B b;
+
+        inc(int n) {
+          x = x + n;
+        }
+        dec(int n) {
+          x = x - n;
+        }
+
+        C(this.x, this.y, this.b);
+      }
+
+
+      class D extends C with A {
+        int get x2 => x;
+        int get i2 => i;
+
+        D(x, y, b) : super(x, y, b);
+      }
+
+      class E {
+        set x(int v) { }
+        int get y => 1;
+
+        noSuchMethod(i) => y;
+      }
+
+      class E2 extends E {}
+
+      class F {
+        static int staticMethod(A a) => a.i;
+      }
+
+      class F2 extends F {}
+
+      class Annot { const Annot(int ignore); }
+      class AnnotB extends Annot { const AnnotB(); }
+      const a1 = const Annot(0);
+      const a2 = 32;
+      const a3 = const AnnotB();
+
+
+      class G {
+        int a;
+        @a1 int b;
+        int c;
+        @a2 int d;
+      }
+
+      class H extends G {
+        int e;
+        @a1 int f;
+        @a1 int g;
+        @a2 int h;
+        @a3 int i;
+        @Annot(1) int j;
+      }
+      '''
+};
+
+resolveImportUrl(LibraryElement lib) =>
+    lib.isDartCore ? 'dart:core' : '/${lib.displayName}.dart';
diff --git a/pkg/smoke/test/codegen/testing_resolver_utils.dart b/pkg/smoke/test/codegen/testing_resolver_utils.dart
new file mode 100644
index 0000000..7a76614
--- /dev/null
+++ b/pkg/smoke/test/codegen/testing_resolver_utils.dart
@@ -0,0 +1,97 @@
+// 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.
+
+/// Utility functions to test the code generation tools with the resolver.
+// Note, this is just for simple tests, so we restricted the logic to only
+// support root-relative imports. For more sophisticated stuff, you should be
+// using the test helpers in `package:code_transformers`.
+library smoke.test.codegen.testing_resolver_utils;
+
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/sdk_io.dart' show DirectoryBasedDartSdk;
+import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
+
+class LibraryProvider {
+  final AnalysisContext _analyzer;
+  final Map<String, Source> _allSources;
+  LibraryProvider(this._analyzer, this._allSources);
+  LibraryElement libraryFor(String uri) =>
+      _analyzer.computeLibraryElement(_allSources[uri]);
+}
+
+LibraryProvider initAnalyzer(Map<String, String> contents) {
+  var analyzer = AnalysisEngine.instance.createAnalysisContext();
+  var options = new AnalysisOptionsImpl()
+      ..cacheSize = 256
+      ..preserveComments = false
+      ..analyzeFunctionBodies = false;
+  analyzer.analysisOptions = options;
+  var sdk = new DirectoryBasedDartSdk(new JavaFile(testingDartSdkDirectory));
+  sdk.context.analysisOptions = options;
+  var changes = new ChangeSet();
+  var allSources = {};
+  contents.forEach((url, code) { 
+    var source = new _SimpleSource(url, code, allSources);
+    allSources[url] = source;
+    changes.addedSource(source);
+  });
+  analyzer.applyChanges(changes);
+
+  analyzer.sourceFactory = new SourceFactory([
+      new DartUriResolver(sdk),
+      new _SimpleUriResolver(allSources)]);
+
+  return new LibraryProvider(analyzer, allSources);
+}
+
+class _SimpleUriResolver implements UriResolver {
+  final Map<String, Source> allSources;
+  _SimpleUriResolver(this.allSources);
+
+  Source resolveAbsolute(Uri uri) => allSources['$uri'];
+
+  Source fromEncoding(UriKind kind, Uri uri) =>
+      throw new UnimplementedError('fromEncoding not implemented');
+
+  Uri restoreAbsolute(Source source) =>
+      throw new UnimplementedError('restoreAbsolute not implemented');
+}
+
+class _SimpleSource extends Source {
+  final String path;
+  final String rawContents;
+  final Map<String, Source> allSources;
+
+  _SimpleSource(this.path, this.rawContents, this.allSources);
+
+  operator ==(other) => other is _SimpleSource &&
+      rawContents == other.rawContents;
+  int get hashCode => rawContents.hashCode;
+
+  bool exists() => true;
+  String get encoding => '$uriKind/$path';
+  String get fullName => path;
+  TimestampedData<String> get contents =>
+      new TimestampedData<String>(modificationStamp, rawContents);
+
+  int get modificationStamp => 1;
+  String get shortName => path;
+  UriKind get uriKind => UriKind.FILE_URI;
+  final bool isInSystemLibrary = false;
+
+  // Since this is just for simple tests we just restricted this mock
+  // to root-relative imports. For more sophisticated stuff, you should be
+  // using the test helpers in `package:code_transformers`.
+  Source resolveRelative(Uri uri) {
+    if (uri.path.startsWith('/')) return allSources['${uri.path}'];
+    throw new UnimplementedError('relative URIs not supported: $uri');
+  }
+
+  void getContentsToReceiver(Source_ContentReceiver receiver) {
+    receiver.accept(rawContents, modificationStamp);
+  }
+}
diff --git a/pkg/smoke/test/common.dart b/pkg/smoke/test/common.dart
index d60679f..35d2248 100644
--- a/pkg/smoke/test/common.dart
+++ b/pkg/smoke/test/common.dart
@@ -215,72 +215,76 @@
   });
 
   group('query', () {
+    _checkQuery(result, names) {
+      expect(result.map((e) => e.name), unorderedEquals(names));
+    }
+
     test('default', () {
       var options = new smoke.QueryOptions();
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j, #j2]);
+      _checkQuery(res, [#i, #j, #j2]);
     });
 
     test('only fields', () {
       var options = new smoke.QueryOptions(includeProperties: false);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j]);
+      _checkQuery(res, [#i, #j]);
     });
 
     test('only properties', () {
       var options = new smoke.QueryOptions(includeFields: false);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#j2]);
+      _checkQuery(res, [#j2]);
     });
 
     test('properties and methods', () {
       var options = new smoke.QueryOptions(includeMethods: true);
       var res = smoke.query(A, options);
-      expect(res.map((e) => e.name), [#i, #j, #j2, #inc0, #inc1, #inc2]);
+      _checkQuery(res, [#i, #j, #j2, #inc0, #inc1, #inc2]);
     });
 
     test('inherited properties and fields', () {
       var options = new smoke.QueryOptions(includeInherited: true);
       var res = smoke.query(D, options);
-      expect(res.map((e) => e.name), [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
+      _checkQuery(res, [#x, #y, #b, #i, #j, #j2, #x2, #i2]);
     });
 
     test('inherited fields only', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           includeProperties: false);
       var res = smoke.query(D, options);
-      expect(res.map((e) => e.name), [#x, #y, #b, #i, #j]);
+      _checkQuery(res, [#x, #y, #b, #i, #j]);
     });
 
     test('exact annotation', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a1]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #f, #g]);
+      _checkQuery(res, [#b, #f, #g]);
 
       options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a2]);
       res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#d, #h]);
+      _checkQuery(res, [#d, #h]);
 
       options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a1, a2]);
       res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #d, #f, #g, #h]);
+      _checkQuery(res, [#b, #d, #f, #g, #h]);
     });
 
     test('type annotation', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [Annot]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #f, #g, #i]);
+      _checkQuery(res, [#b, #f, #g, #i]);
     });
 
     test('mixed annotations (type and exact)', () {
       var options = new smoke.QueryOptions(includeInherited: true,
           withAnnotations: const [a2, Annot]);
       var res = smoke.query(H, options);
-      expect(res.map((e) => e.name), [#b, #d, #f, #g, #h, #i]);
+      _checkQuery(res, [#b, #d, #f, #g, #h, #i]);
     });
 
     test('symbol to name', () {
diff --git a/pkg/smoke/test/static_test.dart b/pkg/smoke/test/static_test.dart
index 9ede138..a92adc4 100644
--- a/pkg/smoke/test/static_test.dart
+++ b/pkg/smoke/test/static_test.dart
@@ -1,113 +1,98 @@
-// 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.
+/// ---- AUTOGENERATED: DO NOT EDIT THIS FILE --------------
+/// To update this test file, call:
+/// > dart codegen/end_to_end_test.dart --update_static_test
+/// --------------------------------------------------------
 
 library smoke.test.static_test;
 
-import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
-import 'package:smoke/static.dart';
 import 'package:unittest/unittest.dart';
-import 'common.dart' hide main;
+import 'package:smoke/smoke.dart' show Declaration, PROPERTY, METHOD;
+import 'package:smoke/static.dart' show useGeneratedCode, StaticConfiguration;
+import 'common.dart' as smoke_0;
 import 'common.dart' as common show main;
 
-// Abstract class used to represent the mixing C&A in the smoke configuration.
-abstract class C_with_A {}
+abstract class _M0 {} // C & A
 
-// Static configuration that declares only the symbols, getters, methods, and
-// super-class relationships we want to preserve. This and the class above
-// should be automatically generated by transformers using smoke.
-var _config = new StaticConfiguration(
-    getters: {
-      #i: (o) => o.i,
-      #j: (o) => o.j,
-      #j2: (o) => o.j2,
-      #inc0: (o) => o.inc0,
-      #inc1: (o) => o.inc1,
-      #inc2: (o) => o.inc2,
-    },
-    setters: {
-      #i: (o, v) { o.i = v; },
-      #j2: (o, v) { o.j2 = v; },
-    },
-    // TODO(sigmund): this could be a const map, but that triggers
-    // dartbug.com/17123
-    // TODO(sigmund): before doing codegen for this, consider changing smoke's
-    // defaults so we don't need to specify obvious things like `int`, or `*:
-    // Object`.
-    parents: {
-      Annot: Object,
-      AnnotB: Annot,
-      A: Object,
-      B: Object,
-      C: Object,
-      C_with_A: C,
-      D: C_with_A,
-      E: Object,
-      E2: E,
-      F: Object,
-      F2: F,
-      G: Object,
-      H: G,
-      int: Object,
-    },
-    declarations: { 
-      B: {
-        #a: const Declaration(#a, A),
-        #w: const Declaration(#w, int, kind: PROPERTY),
-        #f: const Declaration(#f, int, isFinal: true),
+_configure() {
+  useGeneratedCode(new StaticConfiguration(
+      checkedMode: false,
+      getters: {
+        #i: (o) => o.i,
+        #inc0: (o) => o.inc0,
+        #inc1: (o) => o.inc1,
+        #inc2: (o) => o.inc2,
+        #j: (o) => o.j,
+        #j2: (o) => o.j2,
       },
-      A: {
-        #i: const Declaration(#i, int),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #inc1: const Declaration(#inc1, Function, kind: METHOD),
-        #inc2: const Declaration(#inc2, Function, kind: METHOD),
+      setters: {
+        #i: (o, v) { o.i = v; },
+        #j2: (o, v) { o.j2 = v; },
       },
-      C: {
-        #x: const Declaration(#x, int),
-        #y: const Declaration(#y, String),
-        #b: const Declaration(#b, B),
-        #inc: const Declaration(#inc, Function, kind: METHOD),
+      parents: {
+        smoke_0.AnnotB: smoke_0.Annot,
+        smoke_0.D: _M0,
+        smoke_0.E2: smoke_0.E,
+        smoke_0.F2: smoke_0.F,
+        smoke_0.H: smoke_0.G,
+        _M0: smoke_0.C,
       },
-      C_with_A: {
-        #i: const Declaration(#i, int),
-        #j: const Declaration(#j, int),
-        #j2: const Declaration(#j2, int, kind: PROPERTY),
-        #inc0: const Declaration(#inc0, Function, kind: METHOD),
-        #inc1: const Declaration(#inc1, Function, kind: METHOD),
-        #inc2: const Declaration(#inc2, Function, kind: METHOD),
+      declarations: {
+        smoke_0.A: {
+          #i: const Declaration(#i, int),
+          #inc0: const Declaration(#inc0, Function, kind: METHOD),
+          #inc1: const Declaration(#inc1, Function, kind: METHOD),
+          #inc2: const Declaration(#inc2, Function, kind: METHOD),
+          #j: const Declaration(#j, int),
+          #j2: const Declaration(#j2, int, kind: PROPERTY),
+        },
+        smoke_0.B: {
+          #a: const Declaration(#a, smoke_0.A),
+          #f: const Declaration(#f, int, isFinal: true),
+          #w: const Declaration(#w, int, kind: PROPERTY),
+        },
+        smoke_0.C: {
+          #b: const Declaration(#b, smoke_0.B),
+          #inc: const Declaration(#inc, Function, kind: METHOD),
+          #x: const Declaration(#x, int),
+          #y: const Declaration(#y, String),
+        },
+        smoke_0.D: {
+          #i2: const Declaration(#i2, int, kind: PROPERTY, isFinal: true),
+          #x2: const Declaration(#x2, int, kind: PROPERTY, isFinal: true),
+        },
+        smoke_0.E: {
+          #noSuchMethod: const Declaration(#noSuchMethod, Function, kind: METHOD),
+          #y: const Declaration(#y, int, kind: PROPERTY, isFinal: true),
+        },
+        smoke_0.E2: const {},
+        smoke_0.F: {
+          #staticMethod: const Declaration(#staticMethod, Function, kind: METHOD, isStatic: true),
+        },
+        smoke_0.F2: const {},
+        smoke_0.G: {
+          #b: const Declaration(#b, int, annotations: const [smoke_0.a1]),
+          #d: const Declaration(#d, int, annotations: const [smoke_0.a2]),
+        },
+        smoke_0.H: {
+          #f: const Declaration(#f, int, annotations: const [smoke_0.a1]),
+          #g: const Declaration(#g, int, annotations: const [smoke_0.a1]),
+          #h: const Declaration(#h, int, annotations: const [smoke_0.a2]),
+          #i: const Declaration(#i, int, annotations: const [smoke_0.a3]),
+        },
+        _M0: {
+          #i: const Declaration(#i, int),
+          #inc: const Declaration(#inc, Function, kind: METHOD),
+          #inc0: const Declaration(#inc0, Function, kind: METHOD),
+          #j: const Declaration(#j, int),
+          #j2: const Declaration(#j2, int, kind: PROPERTY),
+        },
       },
-      D: {
-        #x2: const Declaration(#x2, int, kind: PROPERTY),
-        #i2: const Declaration(#i2, int, kind: PROPERTY),
-      },
-      E: {
-        #y: const Declaration(#y, int, isFinal: true, kind: PROPERTY),
-        #noSuchMethod:
-           const Declaration(#noSuchMethody, Function, kind: METHOD),
-      },
-      E2: const {},
-      F: {#staticMethod: const Declaration(#staticMethod, Function,
-             kind: METHOD, isStatic: true)},
-      F2: const {},
-      G: {
-        #a: const Declaration(#a, int),
-        #b: const Declaration(#b, int, annotations: const [a1]),
-        #c: const Declaration(#c, int),
-        #d: const Declaration(#d, int, annotations: const [a2]),
-      },
-      H: {
-        #e: const Declaration(#e, int),
-        #f: const Declaration(#f, int, annotations: const [a1]),
-        #g: const Declaration(#g, int, annotations: const [a1]),
-        #h: const Declaration(#h, int, annotations: const [a2]),
-        #i: const Declaration(#i, int, annotations: const [a3]),
-      },
-    },
-    names: {#i: 'i'});
+      names: {
+        #i: 'i',
+      }));
+}
 
 main() {
-  setUp(() => useGeneratedCode(_config));
+  setUp(_configure);
   common.main();
 }
diff --git a/pkg/template_binding/test/utils.dart b/pkg/template_binding/test/utils.dart
index 35e37b3..d2d7379 100644
--- a/pkg/template_binding/test/utils.dart
+++ b/pkg/template_binding/test/utils.dart
@@ -7,6 +7,10 @@
 import 'dart:async';
 import 'dart:html';
 import 'package:observe/observe.dart';
+
+// Note: tests that import 'utils.dart' rely on the following line to make test
+// smaller for dart2js and prevent timeouts in the test bots.
+import 'package:observe/mirrors_used.dart';
 import 'package:template_binding/template_binding.dart';
 export 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index be17c3f..24d6de1 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -79,16 +79,33 @@
   try {
     Uri requestUri = Uri.parse(uri);
     _client.getUrl(requestUri)
-        .then((HttpClientRequest request) => request.close())
+        .then((HttpClientRequest request) {
+          request.persistentConnection = false;
+          return request.close();
+        })
         .then((HttpClientResponse response) {
-          return response
-              .fold(new BytesBuilder(), (b, d) => b..add(d))
-              .then((builder) {
-                _requestCompleted(builder.takeBytes(), response);
-                // This client is only used for a single request. Force closing
-                // it now otherwise we wait around until it times out.
-                _client.close(force:true);
-              });
+          // Only create a ByteBuilder, if multiple chunks are received.
+          var bufferOrBuilder;
+          response.listen(
+            (data) {
+              if (bufferOrBuilder == null) {
+                bufferOrBuilder = data;
+              } else {
+                if (bufferOrBuilder is! BytesBuilder) {
+                  bufferOrBuilder = new BytesBuilder()
+                      ..add(bufferOrBuilder);
+                }
+                bufferOrBuilder.add(data);
+              }
+            },
+            onDone: () {
+              var data = bufferOrBuilder;
+              if (data is BytesBuilder) data = data.takeBytes();
+              _requestCompleted(data, response);
+              // Close the client to stop any timers currently held alive.
+              _client.close();
+            },
+            onError: _requestFailed);
         }).catchError((error) {
           _requestFailed(error);
         });
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 4b4e4cc..2d997bc 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -53,7 +53,6 @@
     'io_buffer.cc',
     'io_buffer.h',
     'isolate_data.h',
-    'signal_blocker.h',
     'thread.h',
     'utils.h',
     'utils_android.cc',
diff --git a/runtime/bin/crypto_android.cc b/runtime/bin/crypto_android.cc
index 61b87a1..8922a5e 100644
--- a/runtime/bin/crypto_android.cc
+++ b/runtime/bin/crypto_android.cc
@@ -11,6 +11,8 @@
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
diff --git a/runtime/bin/crypto_linux.cc b/runtime/bin/crypto_linux.cc
index 849fe71..905bf77 100644
--- a/runtime/bin/crypto_linux.cc
+++ b/runtime/bin/crypto_linux.cc
@@ -10,6 +10,7 @@
 
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -18,8 +19,8 @@
 bool Crypto::GetRandomBytes(intptr_t count, uint8_t* buffer) {
   intptr_t fd = TEMP_FAILURE_RETRY(open("/dev/urandom", O_RDONLY));
   if (fd < 0) return false;
-  intptr_t bytes_read = read(fd, buffer, count);
-  close(fd);
+  intptr_t bytes_read = TEMP_FAILURE_RETRY(read(fd, buffer, count));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return bytes_read == count;
 }
 
diff --git a/runtime/bin/crypto_macos.cc b/runtime/bin/crypto_macos.cc
index 19745fc..36020d4 100644
--- a/runtime/bin/crypto_macos.cc
+++ b/runtime/bin/crypto_macos.cc
@@ -11,6 +11,8 @@
 #include "bin/fdutils.h"
 #include "bin/crypto.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index f87f882..972b36a 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -523,8 +523,16 @@
   // Handle 'part' of IO library.
   if (is_io_library) {
     if (tag == Dart_kSourceTag) {
+      // Prepend the library URI to form a unique script URI for the part.
+      intptr_t len = snprintf(NULL, 0, "%s/%s", library_url_string, url_string);
+      char* part_uri = reinterpret_cast<char*>(malloc(len + 1));
+      snprintf(part_uri, len + 1, "%s/%s", library_url_string, url_string);
+      Dart_Handle part_uri_obj = DartUtils::NewString(part_uri);
+      free(part_uri);
       return Dart_LoadSource(
-          library, url, Builtin::PartSource(Builtin::kIOLibrary, url_string));
+          library,
+          part_uri_obj,
+          Builtin::PartSource(Builtin::kIOLibrary, url_string));
     } else {
       ASSERT(tag == Dart_kImportTag);
       return NewError("Unable to import '%s' ", url_string);
diff --git a/runtime/bin/dbg_connection_android.cc b/runtime/bin/dbg_connection_android.cc
index 92fb7ca5..35154a3 100644
--- a/runtime/bin/dbg_connection_android.cc
+++ b/runtime/bin/dbg_connection_android.cc
@@ -15,6 +15,8 @@
 #include "bin/log.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -69,14 +71,14 @@
 
 
 void DebuggerConnectionImpl::SetupPollQueue() {
-  int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
   static const int kEpollInitialSize = 16;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -85,7 +87,7 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.fd = wakeup_fds_[0];
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(
+  int status = NO_RETRY_EXPECTED(epoll_ctl(
                    epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
   if (status == -1) {
     FATAL("Failed adding wakeup fd to epoll instance");
@@ -94,7 +96,7 @@
   // Register the listener_fd with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = DebuggerConnectionHandler::listener_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
                DebuggerConnectionHandler::listener_fd_, &event));
   if (status == -1) {
     FATAL("Failed adding listener fd to epoll instance");
diff --git a/runtime/bin/dbg_connection_linux.cc b/runtime/bin/dbg_connection_linux.cc
index 020b8cb..59dbd23 100644
--- a/runtime/bin/dbg_connection_linux.cc
+++ b/runtime/bin/dbg_connection_linux.cc
@@ -10,6 +10,7 @@
 #include <stdlib.h>  // NOLINT
 #include <sys/epoll.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/dbg_connection.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
@@ -69,14 +70,14 @@
 
 
 void DebuggerConnectionImpl::SetupPollQueue() {
-  int result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  int result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
   static const int kEpollInitialSize = 16;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -85,8 +86,8 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.fd = wakeup_fds_[0];
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(
-                   epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(
+      epoll_fd_, EPOLL_CTL_ADD, wakeup_fds_[0], &event));
   if (status == -1) {
     FATAL("Failed adding wakeup fd to epoll instance");
   }
@@ -94,8 +95,8 @@
   // Register the listener_fd with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = DebuggerConnectionHandler::listener_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
-               DebuggerConnectionHandler::listener_fd_, &event));
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_, EPOLL_CTL_ADD,
+      DebuggerConnectionHandler::listener_fd_, &event));
   if (status == -1) {
     FATAL("Failed adding listener fd to epoll instance");
   }
diff --git a/runtime/bin/dbg_connection_macos.cc b/runtime/bin/dbg_connection_macos.cc
index 3ee5bf3..f47755d 100644
--- a/runtime/bin/dbg_connection_macos.cc
+++ b/runtime/bin/dbg_connection_macos.cc
@@ -17,6 +17,7 @@
 #include "bin/fdutils.h"
 #include "bin/log.h"
 #include "bin/socket.h"
+#include "platform/signal_blocker.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
 
@@ -132,20 +133,20 @@
 
 void DebuggerConnectionImpl::SetupPollQueue() {
   int result;
-  result = TEMP_FAILURE_RETRY(pipe(wakeup_fds_));
+  result = NO_RETRY_EXPECTED(pipe(wakeup_fds_));
   if (result != 0) {
     FATAL1("Pipe creation failed with error %d\n", result);
   }
   FDUtils::SetNonBlocking(wakeup_fds_[0]);
 
-  kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+  kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
   if (kqueue_fd_ == -1) {
     FATAL("Failed creating kqueue\n");
   }
   // Register the wakeup_fd_ with the kqueue.
   struct kevent event;
   EV_SET(&event, wakeup_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
-  int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -156,7 +157,7 @@
   // Register the listening socket.
   EV_SET(&event, DebuggerConnectionHandler::listener_fd_,
          EVFILT_READ, EV_ADD, 0, 0, NULL);
-  status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
index e89dd05..60458da 100644
--- a/runtime/bin/directory_android.cc
+++ b/runtime/bin/directory_android.cc
@@ -17,6 +17,8 @@
 #include "bin/file.h"
 #include "bin/platform.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -104,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                    &entry,
-                                    &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                            &entry,
+                                            &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -132,7 +134,7 @@
         // the file pointed to.
         struct stat entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -151,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat st;
-  if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
+  while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+                                             &entry,
+                                             &result))) == 0 &&
          result != NULL &&
          success) {
     switch (entry.d_type) {
@@ -282,7 +284,7 @@
           success = false;
           break;
         }
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -316,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat entry_info;
-  int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -357,7 +359,7 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
+  int result = NO_RETRY_EXPECTED(chdir(path));
   return result == 0;
 }
 
@@ -365,7 +367,7 @@
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -430,9 +432,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -446,7 +448,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/directory_linux.cc b/runtime/bin/directory_linux.cc
index c37b58b..f6b09c4 100644
--- a/runtime/bin/directory_linux.cc
+++ b/runtime/bin/directory_linux.cc
@@ -15,6 +15,7 @@
 #include <sys/stat.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/file.h"
 #include "bin/platform.h"
 
@@ -105,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                   &entry,
-                                   &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                  &entry,
+                                  &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -133,7 +134,7 @@
         // the file pointed to.
         struct stat64 entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat64(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -152,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat64(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -196,7 +197,7 @@
 DirectoryListingEntry::~DirectoryListingEntry() {
   ResetLink();
   if (lister_ != 0) {
-    closedir(reinterpret_cast<DIR*>(lister_));
+    VOID_NO_RETRY_EXPECTED(closedir(reinterpret_cast<DIR*>(lister_)));
   }
 }
 
@@ -217,7 +218,8 @@
 
 static bool DeleteFile(char* file_name,
                        PathBuffer* path) {
-  return path->Add(file_name) && unlink(path->AsString()) == 0;
+  return path->Add(file_name) &&
+      NO_RETRY_EXPECTED(unlink(path->AsString())) == 0;
 }
 
 
@@ -233,10 +235,10 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY(lstat64(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat64(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
-    return (unlink(path->AsString()) == 0);
+    return (NO_RETRY_EXPECTED(unlink(path->AsString())) == 0);
   }
 
   if (!path->Add(File::PathSeparator())) return false;
@@ -258,11 +260,10 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
-         result != NULL &&
-         success) {
+  while ((read = NO_RETRY_EXPECTED(
+      readdir_r(dir_pointer, &entry, &result))) == 0 &&
+                result != NULL &&
+                success) {
     switch (entry.d_type) {
       case DT_DIR:
         success = success && DeleteDir(entry.d_name, path);
@@ -283,7 +284,7 @@
         // readdir_r. For those we use lstat to determine the entry
         // type.
         struct stat64 entry_info;
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat64(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -307,8 +308,8 @@
   }
 
   if ((read != 0) ||
-      (closedir(dir_pointer) == -1) ||
-      (remove(path->AsString()) == -1)) {
+      (NO_RETRY_EXPECTED(closedir(dir_pointer)) == -1) ||
+      (NO_RETRY_EXPECTED(remove(path->AsString())) == -1)) {
     return false;
   }
   return success;
@@ -317,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat64 entry_info;
-  int success = TEMP_FAILURE_RETRY(stat64(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat64(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -361,15 +362,14 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
-  return result == 0;
+  return NO_RETRY_EXPECTED(chdir(path)) == 0;
 }
 
 
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -422,9 +422,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return NO_RETRY_EXPECTED(unlink(dir_name)) == 0;
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return NO_RETRY_EXPECTED(rmdir(dir_name)) == 0;
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -438,7 +438,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return NO_RETRY_EXPECTED(rename(path, new_path)) == 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/directory_macos.cc b/runtime/bin/directory_macos.cc
index 94b495d..f75047d 100644
--- a/runtime/bin/directory_macos.cc
+++ b/runtime/bin/directory_macos.cc
@@ -17,6 +17,8 @@
 #include "bin/file.h"
 #include "bin/platform.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -104,9 +106,9 @@
   int status = 0;
   dirent entry;
   dirent* result;
-  if ((status = TEMP_FAILURE_RETRY(readdir_r(reinterpret_cast<DIR*>(lister_),
-                                    &entry,
-                                    &result))) == 0 &&
+  if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
+                                            &entry,
+                                            &result))) == 0 &&
       result != NULL) {
     if (!listing->path_buffer().Add(entry.d_name)) {
       done_ = true;
@@ -132,7 +134,7 @@
         // the file pointed to.
         struct stat entry_info;
         int stat_success;
-        stat_success = TEMP_FAILURE_RETRY(
+        stat_success = NO_RETRY_EXPECTED(
             lstat(listing->path_buffer().AsString(), &entry_info));
         if (stat_success == -1) {
           return kListError;
@@ -151,7 +153,7 @@
             }
             previous = previous->next;
           }
-          stat_success = TEMP_FAILURE_RETRY(
+          stat_success = NO_RETRY_EXPECTED(
               stat(listing->path_buffer().AsString(), &entry_info));
           if (stat_success == -1) {
             // Report a broken link as a link, even if follow_links is true.
@@ -232,7 +234,7 @@
   // Do not recurse into links for deletion. Instead delete the link.
   // If it's a file, delete it.
   struct stat st;
-  if (TEMP_FAILURE_RETRY(lstat(path->AsString(), &st)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(path->AsString(), &st)) == -1) {
     return false;
   } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) {
     return (unlink(path->AsString()) == 0);
@@ -257,9 +259,9 @@
   bool success = true;
   dirent entry;
   dirent* result;
-  while ((read = TEMP_FAILURE_RETRY(readdir_r(dir_pointer,
-                                              &entry,
-                                              &result))) == 0 &&
+  while ((read = NO_RETRY_EXPECTED(readdir_r(dir_pointer,
+                                             &entry,
+                                             &result))) == 0 &&
          result != NULL &&
          success) {
     switch (entry.d_type) {
@@ -282,7 +284,7 @@
           success = false;
           break;
         }
-        int lstat_success = TEMP_FAILURE_RETRY(
+        int lstat_success = NO_RETRY_EXPECTED(
             lstat(path->AsString(), &entry_info));
         if (lstat_success == -1) {
           success = false;
@@ -316,7 +318,7 @@
 
 Directory::ExistsResult Directory::Exists(const char* dir_name) {
   struct stat entry_info;
-  int success = TEMP_FAILURE_RETRY(stat(dir_name, &entry_info));
+  int success = NO_RETRY_EXPECTED(stat(dir_name, &entry_info));
   if (success == 0) {
     if (S_ISDIR(entry_info.st_mode)) {
       return EXISTS;
@@ -349,7 +351,7 @@
 
 
 bool Directory::SetCurrent(const char* path) {
-  int result = TEMP_FAILURE_RETRY(chdir(path));
+  int result = NO_RETRY_EXPECTED(chdir(path));
   return result == 0;
 }
 
@@ -357,7 +359,7 @@
 bool Directory::Create(const char* dir_name) {
   // Create the directory with the permissions specified by the
   // process umask.
-  int result = TEMP_FAILURE_RETRY(mkdir(dir_name, 0777));
+  int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
   // If the directory already exists, treat it as a success.
   if (result == -1 && errno == EEXIST) {
     return (Exists(dir_name) == EXISTS);
@@ -410,9 +412,9 @@
   if (!recursive) {
     if (File::GetType(dir_name, false) == File::kIsLink &&
         File::GetType(dir_name, true) == File::kIsDirectory) {
-      return (TEMP_FAILURE_RETRY(unlink(dir_name)) == 0);
+      return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
     }
-    return (TEMP_FAILURE_RETRY(rmdir(dir_name)) == 0);
+    return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
   } else {
     PathBuffer path;
     if (!path.Add(dir_name)) {
@@ -426,7 +428,7 @@
 bool Directory::Rename(const char* path, const char* new_path) {
   ExistsResult exists = Exists(path);
   if (exists != EXISTS) return false;
-  return (TEMP_FAILURE_RETRY(rename(path, new_path)) == 0);
+  return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
 }
 
 }  // namespace bin
diff --git a/runtime/bin/eventhandler_android.cc b/runtime/bin/eventhandler_android.cc
index ce5171a..8600613 100644
--- a/runtime/bin/eventhandler_android.cc
+++ b/runtime/bin/eventhandler_android.cc
@@ -56,10 +56,10 @@
 
 // Unregister the file descriptor for a SocketData structure with epoll.
 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                    EPOLL_CTL_DEL,
-                                    sd->fd(),
-                                    NULL));
+  VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                   EPOLL_CTL_DEL,
+                                   sd->fd(),
+                                   NULL));
 }
 
 
@@ -67,10 +67,10 @@
   struct epoll_event event;
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            sd->fd(),
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           sd->fd(),
+                                           &event));
   if (status == -1) {
     // Epoll does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -84,7 +84,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -95,7 +95,7 @@
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
   static const int kEpollInitialSize = 64;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL("Failed creating epoll file descriptor");
   }
@@ -104,7 +104,7 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.ptr = NULL;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
                                             EPOLL_CTL_ADD,
                                             interrupt_fds_[0],
                                             &event));
@@ -115,8 +115,8 @@
 
 
 EventHandlerImplementation::~EventHandlerImplementation() {
-  TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
-  TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[0]));
+  VOID_TEMP_FAILURE_RETRY(close(interrupt_fds_[1]));
 }
 
 
diff --git a/runtime/bin/eventhandler_android.h b/runtime/bin/eventhandler_android.h
index 2647164..6b1bec6 100644
--- a/runtime/bin/eventhandler_android.h
+++ b/runtime/bin/eventhandler_android.h
@@ -10,11 +10,13 @@
 #error use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/epoll.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -40,7 +42,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_linux.cc b/runtime/bin/eventhandler_linux.cc
index f87c1a4..d44486e 100644
--- a/runtime/bin/eventhandler_linux.cc
+++ b/runtime/bin/eventhandler_linux.cc
@@ -20,7 +20,7 @@
 #include "bin/dartutils.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "platform/hashmap.h"
+#include "bin/socket.h"
 #include "platform/thread.h"
 #include "platform/utils.h"
 
@@ -49,10 +49,10 @@
 
 // Unregister the file descriptor for a SocketData structure with epoll.
 static void RemoveFromEpollInstance(intptr_t epoll_fd_, SocketData* sd) {
-  VOID_TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                    EPOLL_CTL_DEL,
-                                    sd->fd(),
-                                    NULL));
+  VOID_NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                   EPOLL_CTL_DEL,
+                                   sd->fd(),
+                                   NULL));
 }
 
 
@@ -60,10 +60,10 @@
   struct epoll_event event;
   event.events = sd->GetPollEvents();
   event.data.ptr = sd;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            sd->fd(),
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           sd->fd(),
+                                           &event));
   if (status == -1) {
     // Epoll does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -77,7 +77,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -88,7 +88,7 @@
   // The initial size passed to epoll_create is ignore on newer (>=
   // 2.6.8) Linux versions
   static const int kEpollInitialSize = 64;
-  epoll_fd_ = TEMP_FAILURE_RETRY(epoll_create(kEpollInitialSize));
+  epoll_fd_ = NO_RETRY_EXPECTED(epoll_create(kEpollInitialSize));
   if (epoll_fd_ == -1) {
     FATAL1("Failed creating epoll file descriptor: %i", errno);
   }
@@ -97,24 +97,24 @@
   struct epoll_event event;
   event.events = EPOLLIN;
   event.data.ptr = NULL;
-  int status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                            EPOLL_CTL_ADD,
-                                            interrupt_fds_[0],
-                                            &event));
+  int status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                           EPOLL_CTL_ADD,
+                                           interrupt_fds_[0],
+                                           &event));
   if (status == -1) {
     FATAL("Failed adding interrupt fd to epoll instance");
   }
-  timer_fd_ = TEMP_FAILURE_RETRY(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
+  timer_fd_ = NO_RETRY_EXPECTED(timerfd_create(CLOCK_REALTIME, TFD_CLOEXEC));
   if (timer_fd_ == -1) {
     FATAL1("Failed creating timerfd file descriptor: %i", errno);
   }
   // Register the timer_fd_ with the epoll instance.
   event.events = EPOLLIN;
   event.data.fd = timer_fd_;
-  status = TEMP_FAILURE_RETRY(epoll_ctl(epoll_fd_,
-                                        EPOLL_CTL_ADD,
-                                        timer_fd_,
-                                        &event));
+  status = NO_RETRY_EXPECTED(epoll_ctl(epoll_fd_,
+                                       EPOLL_CTL_ADD,
+                                       timer_fd_,
+                                       &event));
   if (status == -1) {
     FATAL2(
         "Failed adding timerfd fd(%i) to epoll instance: %i", timer_fd_, errno);
@@ -184,7 +184,8 @@
         it.it_value.tv_sec = millis / 1000;
         it.it_value.tv_nsec = (millis % 1000) * 1000000;
       }
-      timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL);
+      VOID_NO_RETRY_EXPECTED(
+          timerfd_settime(timer_fd_, TFD_TIMER_ABSTIME, &it, NULL));
     } else if (msg[i].id == kShutdownId) {
       shutdown_ = true;
     } else {
@@ -192,11 +193,11 @@
       if ((msg[i].data & (1 << kShutdownReadCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownReadCommand));
         // Close the socket for reading.
-        shutdown(sd->fd(), SHUT_RD);
+        VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_RD));
       } else if ((msg[i].data & (1 << kShutdownWriteCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kShutdownWriteCommand));
         // Close the socket for writing.
-        shutdown(sd->fd(), SHUT_WR);
+        VOID_NO_RETRY_EXPECTED(shutdown(sd->fd(), SHUT_WR));
       } else if ((msg[i].data & (1 << kCloseCommand)) != 0) {
         ASSERT(msg[i].data == (1 << kCloseCommand));
         // Close the socket and free system resources and move on to
diff --git a/runtime/bin/eventhandler_linux.h b/runtime/bin/eventhandler_linux.h
index 9341cd1..54f02509 100644
--- a/runtime/bin/eventhandler_linux.h
+++ b/runtime/bin/eventhandler_linux.h
@@ -9,11 +9,13 @@
 #error Do not include eventhandler_linux.h directly; use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/epoll.h>
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -38,7 +40,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/eventhandler_macos.cc b/runtime/bin/eventhandler_macos.cc
index 8024e1c..beeae4b 100644
--- a/runtime/bin/eventhandler_macos.cc
+++ b/runtime/bin/eventhandler_macos.cc
@@ -49,9 +49,9 @@
   static const intptr_t kMaxChanges = 2;
   struct kevent events[kMaxChanges];
   EV_SET(events, sd->fd(), EVFILT_READ, EV_DELETE, 0, 0, NULL);
-  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+  VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
   EV_SET(events, sd->fd(), EVFILT_WRITE, EV_DELETE, 0, 0, NULL);
-  VOID_TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
+  VOID_NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, 1, NULL, 0, NULL));
   sd->set_tracked_by_kqueue(false);
 }
 
@@ -88,7 +88,7 @@
   ASSERT(changes > 0);
   ASSERT(changes <= kMaxChanges);
   int status =
-      TEMP_FAILURE_RETRY(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
+      NO_RETRY_EXPECTED(kevent(kqueue_fd_, events, changes, NULL, 0, NULL));
   if (status == -1) {
     // kQueue does not accept the file descriptor. It could be due to
     // already closed file descriptor, or unuspported devices, such
@@ -104,7 +104,7 @@
 EventHandlerImplementation::EventHandlerImplementation()
     : socket_map_(&HashMap::SamePointerValue, 16) {
   intptr_t result;
-  result = TEMP_FAILURE_RETRY(pipe(interrupt_fds_));
+  result = NO_RETRY_EXPECTED(pipe(interrupt_fds_));
   if (result != 0) {
     FATAL("Pipe creation failed");
   }
@@ -113,7 +113,7 @@
   FDUtils::SetCloseOnExec(interrupt_fds_[1]);
   shutdown_ = false;
 
-  kqueue_fd_ = TEMP_FAILURE_RETRY(kqueue());
+  kqueue_fd_ = NO_RETRY_EXPECTED(kqueue());
   if (kqueue_fd_ == -1) {
     FATAL("Failed creating kqueue");
   }
@@ -121,7 +121,7 @@
   // Register the interrupt_fd with the kqueue.
   struct kevent event;
   EV_SET(&event, interrupt_fds_[0], EVFILT_READ, EV_ADD, 0, 0, NULL);
-  int status = TEMP_FAILURE_RETRY(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
+  int status = NO_RETRY_EXPECTED(kevent(kqueue_fd_, &event, 1, NULL, 0, NULL));
   if (status == -1) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
diff --git a/runtime/bin/eventhandler_macos.h b/runtime/bin/eventhandler_macos.h
index 70a103c..18e463b 100644
--- a/runtime/bin/eventhandler_macos.h
+++ b/runtime/bin/eventhandler_macos.h
@@ -9,11 +9,13 @@
 #error Do not include eventhandler_macos.h directly; use eventhandler.h instead.
 #endif
 
-#include <unistd.h>
+#include <errno.h>
 #include <sys/event.h>  // NOLINT
 #include <sys/socket.h>
+#include <unistd.h>
 
 #include "platform/hashmap.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -44,7 +46,7 @@
   void Close() {
     port_ = 0;
     mask_ = 0;
-    close(fd_);
+    VOID_TEMP_FAILURE_RETRY(close(fd_));
     fd_ = -1;
   }
 
diff --git a/runtime/bin/fdutils_android.cc b/runtime/bin/fdutils_android.cc
index 2048667..ba28199 100644
--- a/runtime/bin/fdutils_android.cc
+++ b/runtime/bin/fdutils_android.cc
@@ -12,18 +12,20 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +34,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +58,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +69,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/fdutils_linux.cc b/runtime/bin/fdutils_linux.cc
index 3bb1ce1..e8984dd 100644
--- a/runtime/bin/fdutils_linux.cc
+++ b/runtime/bin/fdutils_linux.cc
@@ -11,6 +11,7 @@
 #include <sys/ioctl.h>  // NOLINT
 
 #include "bin/fdutils.h"
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -18,12 +19,12 @@
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +33,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +57,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +68,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/fdutils_macos.cc b/runtime/bin/fdutils_macos.cc
index bbc442d..2ecf600 100644
--- a/runtime/bin/fdutils_macos.cc
+++ b/runtime/bin/fdutils_macos.cc
@@ -12,18 +12,20 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
 
 bool FDUtils::SetCloseOnExec(intptr_t fd) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFD));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFD));
   if (status < 0) {
     return false;
   }
   status |= FD_CLOEXEC;
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFD, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFD, status)) < 0) {
     return false;
   }
   return true;
@@ -32,12 +34,12 @@
 
 static bool SetBlockingHelper(intptr_t fd, bool blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
   status = blocking ? (status & ~O_NONBLOCK) : (status | O_NONBLOCK);
-  if (TEMP_FAILURE_RETRY(fcntl(fd, F_SETFL, status)) < 0) {
+  if (NO_RETRY_EXPECTED(fcntl(fd, F_SETFL, status)) < 0) {
     return false;
   }
   return true;
@@ -56,7 +58,7 @@
 
 bool FDUtils::IsBlocking(intptr_t fd, bool* is_blocking) {
   intptr_t status;
-  status = TEMP_FAILURE_RETRY(fcntl(fd, F_GETFL));
+  status = NO_RETRY_EXPECTED(fcntl(fd, F_GETFL));
   if (status < 0) {
     return false;
   }
@@ -67,7 +69,7 @@
 
 intptr_t FDUtils::AvailableBytes(intptr_t fd) {
   int available;  // ioctl for FIONREAD expects an 'int*' argument.
-  int result = TEMP_FAILURE_RETRY(ioctl(fd, FIONREAD, &available));
+  int result = NO_RETRY_EXPECTED(ioctl(fd, FIONREAD, &available));
   if (result < 0) {
     return result;
   }
diff --git a/runtime/bin/file_android.cc b/runtime/bin/file_android.cc
index 6c740c5..fb3a616 100644
--- a/runtime/bin/file_android.cc
+++ b/runtime/bin/file_android.cc
@@ -17,7 +17,8 @@
 
 #include "bin/builtin.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -52,7 +53,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_message[kBufferSize];
@@ -71,47 +72,44 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), 0, SEEK_CUR);
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
 }
 
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
 }
 
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length) != -1);
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd()) != -1);
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -121,7 +119,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (!S_ISREG(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
       return NULL;
@@ -135,7 +133,7 @@
     flags = flags | O_TRUNC;
   }
   flags |= O_CLOEXEC;
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
@@ -157,7 +155,7 @@
 
 bool File::Exists(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -166,9 +164,7 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name,
-                                                 O_RDONLY | O_CREAT | O_CLOEXEC,
-                                                 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
@@ -177,7 +173,7 @@
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+  int status = NO_RETRY_EXPECTED(symlink(target, name));
   return (status == 0);
 }
 
@@ -185,7 +181,7 @@
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -198,7 +194,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -208,7 +204,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -221,7 +217,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -235,25 +231,24 @@
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
     struct stat st;
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(old_path, &st)) != 0) {
+    if (NO_RETRY_EXPECTED(stat(old_path, &st)) != 0) {
       return false;
     }
-    int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(old_path,
-                                                       O_RDONLY | O_CLOEXEC));
+    int old_fd = TEMP_FAILURE_RETRY(open(old_path, O_RDONLY | O_CLOEXEC));
     if (old_fd < 0) {
       return false;
     }
-    int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    int new_fd = TEMP_FAILURE_RETRY(
         open(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
     if (new_fd < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
       return false;
     }
     off_t offset = 0;
     int result = 1;
     while (result > 0) {
       // Loop to ensure we copy everything, and not only up to 2GB.
-      result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      result = NO_RETRY_EXPECTED(
           sendfile(new_fd, old_fd, &offset, kMaxUint32));
     }
     // From sendfile man pages:
@@ -262,10 +257,9 @@
     if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
       const intptr_t kBufferSize = 8 * KB;
       uint8_t buffer[kBufferSize];
-      while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      while ((result = TEMP_FAILURE_RETRY(
           read(old_fd, buffer, kBufferSize))) > 0) {
-        int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
-                                                           result));
+        int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
         if (wrote != result) {
           result = -1;
           break;
@@ -274,9 +268,9 @@
     }
     if (result < 0) {
       int e = errno;
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(new_fd));
+      VOID_NO_RETRY_EXPECTED(unlink(new_path));
       errno = e;
       return false;
     }
@@ -292,7 +286,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -301,7 +295,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -324,7 +318,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -406,11 +400,9 @@
   struct stat entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
-                                                         &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
-                                                          &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -423,8 +415,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat file_1_info;
   struct stat file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_linux.cc b/runtime/bin/file_linux.cc
index 2e79248..92c5637 100644
--- a/runtime/bin/file_linux.cc
+++ b/runtime/bin/file_linux.cc
@@ -15,9 +15,9 @@
 #include <unistd.h>  // NOLINT
 #include <libgen.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/builtin.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 
 
 namespace dart {
@@ -52,7 +52,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    int err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_buf[kBufferSize];
@@ -70,47 +70,44 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Position() {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), 0, SEEK_CUR);
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), 0, SEEK_CUR));
 }
 
 
 bool File::SetPosition(int64_t position) {
   ASSERT(handle_->fd() >= 0);
-  return lseek64(handle_->fd(), position, SEEK_SET) >= 0;
+  return NO_RETRY_EXPECTED(lseek64(handle_->fd(), position, SEEK_SET)) >= 0;
 }
 
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate64(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate64(handle_->fd(), length) != -1);
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat64(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat64(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -120,7 +117,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,12 +132,12 @@
     flags = flags | O_TRUNC;
   }
   flags |= O_CLOEXEC;
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open64(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
   if (((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) {
-    int64_t position = lseek64(fd, 0, SEEK_END);
+    int64_t position = NO_RETRY_EXPECTED(lseek64(fd, 0, SEEK_END));
     if (position < 0) {
       return NULL;
     }
@@ -157,7 +154,7 @@
 
 bool File::Exists(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -166,25 +163,24 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  int fd = TEMP_FAILURE_RETRY(
       open64(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
   if (fd < 0) {
     return false;
   }
-  return (close(fd) == 0);
+  return (TEMP_FAILURE_RETRY(close(fd)) == 0);
 }
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
-  return (status == 0);
+  return NO_RETRY_EXPECTED(symlink(target, name)) == 0;
 }
 
 
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -197,7 +193,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -207,7 +203,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -220,7 +216,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -234,25 +230,24 @@
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
     struct stat64 st;
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(old_path, &st)) != 0) {
+    if (NO_RETRY_EXPECTED(stat64(old_path, &st)) != 0) {
       return false;
     }
-    int old_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open64(old_path,
-                                                         O_RDONLY | O_CLOEXEC));
+    int old_fd = TEMP_FAILURE_RETRY(open64(old_path, O_RDONLY | O_CLOEXEC));
     if (old_fd < 0) {
       return false;
     }
-    int new_fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    int new_fd = TEMP_FAILURE_RETRY(
         open64(new_path, O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, st.st_mode));
     if (new_fd < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
       return false;
     }
     int64_t offset = 0;
     intptr_t result = 1;
     while (result > 0) {
       // Loop to ensure we copy everything, and not only up to 2GB.
-      result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      result = NO_RETRY_EXPECTED(
           sendfile64(new_fd, old_fd, &offset, kMaxUint32));
     }
     // From sendfile man pages:
@@ -261,10 +256,9 @@
     if (result < 0 && (errno == EINVAL || errno == ENOSYS)) {
       const intptr_t kBufferSize = 8 * KB;
       uint8_t buffer[kBufferSize];
-      while ((result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+      while ((result = TEMP_FAILURE_RETRY(
           read(old_fd, buffer, kBufferSize))) > 0) {
-        int wrote = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(new_fd, buffer,
-                                                           result));
+        int wrote = TEMP_FAILURE_RETRY(write(new_fd, buffer, result));
         if (wrote != result) {
           result = -1;
           break;
@@ -273,9 +267,9 @@
     }
     if (result < 0) {
       int e = errno;
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(old_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(new_fd));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(new_path));
+      VOID_TEMP_FAILURE_RETRY(close(old_fd));
+      VOID_TEMP_FAILURE_RETRY(close(new_fd));
+      VOID_NO_RETRY_EXPECTED(unlink(new_path));
       errno = e;
       return false;
     }
@@ -291,7 +285,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -300,7 +294,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -323,7 +317,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat64 st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat64(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -332,14 +326,15 @@
 
 char* File::LinkTarget(const char* pathname) {
   struct stat64 link_stats;
-  if (lstat64(pathname, &link_stats) != 0) return NULL;
+  if (NO_RETRY_EXPECTED(lstat64(pathname, &link_stats)) != 0) return NULL;
   if (!S_ISLNK(link_stats.st_mode)) {
     errno = ENOENT;
     return NULL;
   }
   size_t target_size = link_stats.st_size;
   char* target_name = reinterpret_cast<char*>(malloc(target_size + 1));
-  size_t read_size = readlink(pathname, target_name, target_size + 1);
+  size_t read_size = NO_RETRY_EXPECTED(
+      readlink(pathname, target_name, target_size + 1));
   if (read_size != target_size) {
     free(target_name);
     return NULL;
@@ -379,7 +374,7 @@
 File::StdioHandleType File::GetStdioHandleType(int fd) {
   ASSERT(0 <= fd && fd <= 2);
   struct stat64 buf;
-  int result = fstat64(fd, &buf);
+  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
   if (result == -1) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -398,11 +393,9 @@
   struct stat64 entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat64(pathname,
-                                                           &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat64(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(pathname,
-                                                            &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat64(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -415,8 +408,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat64 file_1_info;
   struct stat64 file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat64(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat64(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat64(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_macos.cc
index 46017fb..b5a1dd0 100644
--- a/runtime/bin/file_macos.cc
+++ b/runtime/bin/file_macos.cc
@@ -18,7 +18,8 @@
 #include "bin/builtin.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 namespace dart {
 namespace bin {
@@ -52,7 +53,7 @@
     VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
     VOID_TEMP_FAILURE_RETRY(close(null_fd));
   } else {
-    intptr_t err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(handle_->fd()));
+    intptr_t err = TEMP_FAILURE_RETRY(close(handle_->fd()));
     if (err != 0) {
       const int kBufferSize = 1024;
       char error_message[kBufferSize];
@@ -71,15 +72,13 @@
 
 int64_t File::Read(void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(handle_->fd(), buffer,
-                                               num_bytes));
+  return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
 }
 
 
 int64_t File::Write(const void* buffer, int64_t num_bytes) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(handle_->fd(), buffer,
-                                                num_bytes));
+  return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
 }
 
 
@@ -97,21 +96,20 @@
 
 bool File::Truncate(int64_t length) {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      ftruncate(handle_->fd(), length) != -1);
+  return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length)) != -1;
 }
 
 
 bool File::Flush() {
   ASSERT(handle_->fd() >= 0);
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fsync(handle_->fd()) != -1);
+  return NO_RETRY_EXPECTED(fsync(handle_->fd())) != -1;
 }
 
 
 int64_t File::Length() {
   ASSERT(handle_->fd() >= 0);
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fstat(handle_->fd(), &st)) == 0) {
+  if (NO_RETRY_EXPECTED(fstat(handle_->fd(), &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -121,7 +119,7 @@
 File* File::Open(const char* name, FileOpenMode mode) {
   // Report errors for non-regular files.
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     // Only accept regular files and character devices.
     if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode)) {
       errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
@@ -135,7 +133,7 @@
   if ((mode & kTruncate) != 0) {
     flags = flags | O_TRUNC;
   }
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, flags, 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
   if (fd < 0) {
     return NULL;
   }
@@ -158,7 +156,7 @@
 
 bool File::Exists(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return S_ISREG(st.st_mode);
   } else {
     return false;
@@ -167,8 +165,7 @@
 
 
 bool File::Create(const char* name) {
-  int fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(open(name, O_RDONLY | O_CREAT,
-                                                 0666));
+  int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT, 0666));
   if (fd < 0) {
     return false;
   }
@@ -177,7 +174,7 @@
 
 
 bool File::CreateLink(const char* name, const char* target) {
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(symlink(target, name));
+  int status = NO_RETRY_EXPECTED(symlink(target, name));
   return (status == 0);
 }
 
@@ -185,7 +182,7 @@
 bool File::Delete(const char* name) {
   File::Type type = File::GetType(name, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -198,7 +195,7 @@
 bool File::DeleteLink(const char* name) {
   File::Type type = File::GetType(name, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(unlink(name)) == 0;
+    return NO_RETRY_EXPECTED(unlink(name)) == 0;
   }
   errno = EINVAL;
   return false;
@@ -208,7 +205,7 @@
 bool File::Rename(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, true);
   if (type == kIsFile) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -221,7 +218,7 @@
 bool File::RenameLink(const char* old_path, const char* new_path) {
   File::Type type = File::GetType(old_path, false);
   if (type == kIsLink) {
-    return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(rename(old_path, new_path)) == 0;
+    return NO_RETRY_EXPECTED(rename(old_path, new_path)) == 0;
   } else if (type == kIsDirectory) {
     errno = EISDIR;
   } else {
@@ -246,7 +243,7 @@
 
 int64_t File::LengthFromPath(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_size;
   }
   return -1;
@@ -255,7 +252,7 @@
 
 void File::Stat(const char* name, int64_t* data) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     if (S_ISREG(st.st_mode)) {
       data[kType] = kIsFile;
     } else if (S_ISDIR(st.st_mode)) {
@@ -278,7 +275,7 @@
 
 time_t File::LastModified(const char* name) {
   struct stat st;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(name, &st)) == 0) {
+  if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
     return st.st_mtime;
   }
   return -1;
@@ -359,11 +356,9 @@
   struct stat entry_info;
   int stat_success;
   if (follow_links) {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(stat(pathname,
-                                                         &entry_info));
+    stat_success = NO_RETRY_EXPECTED(stat(pathname, &entry_info));
   } else {
-    stat_success = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(pathname,
-                                                          &entry_info));
+    stat_success = NO_RETRY_EXPECTED(lstat(pathname, &entry_info));
   }
   if (stat_success == -1) return File::kDoesNotExist;
   if (S_ISDIR(entry_info.st_mode)) return File::kIsDirectory;
@@ -376,8 +371,8 @@
 File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
   struct stat file_1_info;
   struct stat file_2_info;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_1, &file_1_info)) == -1 ||
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(lstat(file_2, &file_2_info)) == -1) {
+  if (NO_RETRY_EXPECTED(lstat(file_1, &file_1_info)) == -1 ||
+      NO_RETRY_EXPECTED(lstat(file_2, &file_2_info)) == -1) {
     return File::kError;
   }
   return (file_1_info.st_ino == file_2_info.st_ino &&
diff --git a/runtime/bin/file_system_watcher_android.cc b/runtime/bin/file_system_watcher_android.cc
index 96fd325..ac2ad5f 100644
--- a/runtime/bin/file_system_watcher_android.cc
+++ b/runtime/bin/file_system_watcher_android.cc
@@ -12,6 +12,8 @@
 
 #include "bin/fdutils.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -22,7 +24,7 @@
 
 
 intptr_t FileSystemWatcher::Init() {
-  int id = TEMP_FAILURE_RETRY(inotify_init());
+  int id = NO_RETRY_EXPECTED(inotify_init());
   if (id < 0 || !FDUtils::SetCloseOnExec(id)) {
     return -1;
   }
@@ -48,7 +50,7 @@
   if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
   if (events & kDelete) list_events |= IN_DELETE;
   if (events & kMove) list_events |= IN_MOVE;
-  int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+  int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
   if (path_id < 0) {
     return -1;
   }
@@ -57,7 +59,7 @@
 
 
 void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
-  VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+  VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
 }
 
 
diff --git a/runtime/bin/file_system_watcher_linux.cc b/runtime/bin/file_system_watcher_linux.cc
index 2a5fee5..9261426 100644
--- a/runtime/bin/file_system_watcher_linux.cc
+++ b/runtime/bin/file_system_watcher_linux.cc
@@ -13,6 +13,8 @@
 #include "bin/fdutils.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -23,7 +25,7 @@
 
 
 intptr_t FileSystemWatcher::Init() {
-  int id = TEMP_FAILURE_RETRY(inotify_init1(IN_CLOEXEC));
+  int id = NO_RETRY_EXPECTED(inotify_init1(IN_CLOEXEC));
   if (id < 0) return -1;
   // Some systems dosn't support setting this as non-blocking. Since watching
   // internals are kept away from the user, we know it's possible to continue,
@@ -47,7 +49,7 @@
   if (events & kModifyContent) list_events |= IN_CLOSE_WRITE | IN_ATTRIB;
   if (events & kDelete) list_events |= IN_DELETE;
   if (events & kMove) list_events |= IN_MOVE;
-  int path_id = TEMP_FAILURE_RETRY(inotify_add_watch(id, path, list_events));
+  int path_id = NO_RETRY_EXPECTED(inotify_add_watch(id, path, list_events));
   if (path_id < 0) {
     return -1;
   }
@@ -56,7 +58,7 @@
 
 
 void FileSystemWatcher::UnwatchPath(intptr_t id, intptr_t path_id) {
-  VOID_TEMP_FAILURE_RETRY(inotify_rm_watch(id, path_id));
+  VOID_NO_RETRY_EXPECTED(inotify_rm_watch(id, path_id));
 }
 
 
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 30322c8..88d98d4 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -18,6 +18,8 @@
 #include "bin/socket.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
 
 #ifndef MAC_OS_X_VERSION_10_7
 enum {
@@ -71,7 +73,7 @@
 
     ~Node() {
       Stop();
-      close(write_fd_);
+      VOID_TEMP_FAILURE_RETRY(close(write_fd_));
       CFRelease(path_ref_);
     }
 
@@ -261,7 +263,7 @@
 
   Node* AddPath(const char* path, int events, bool recursive) {
     int fds[2];
-    VOID_TEMP_FAILURE_RETRY(pipe(fds));
+    VOID_NO_RETRY_EXPECTED(pipe(fds));
     Socket::SetNonBlocking(fds[0]);
     Socket::SetBlocking(fds[1]);
 
diff --git a/runtime/bin/io_natives.cc b/runtime/bin/io_natives.cc
index 7fe5839..86d7c2d 100644
--- a/runtime/bin/io_natives.cc
+++ b/runtime/bin/io_natives.cc
@@ -48,6 +48,7 @@
   V(Process_Wait, 5)                                                           \
   V(Process_Kill, 3)                                                           \
   V(Process_SetExitCode, 1)                                                    \
+  V(Process_GetExitCode, 0)                                                    \
   V(Process_Exit, 1)                                                           \
   V(Process_Sleep, 1)                                                          \
   V(Process_Pid, 1)                                                            \
diff --git a/runtime/bin/process.cc b/runtime/bin/process.cc
index 09476b9..5d392d2 100644
--- a/runtime/bin/process.cc
+++ b/runtime/bin/process.cc
@@ -221,6 +221,11 @@
 }
 
 
+void FUNCTION_NAME(Process_GetExitCode)(Dart_NativeArguments args) {
+  Dart_SetReturnValue(args, Dart_NewInteger(Process::GlobalExitCode()));
+}
+
+
 void FUNCTION_NAME(Process_Sleep)(Dart_NativeArguments args) {
   int64_t milliseconds = 0;
   // Ignore result if passing invalid argument and just set exit code to 0.
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index 18e4b59..fafd749 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -18,9 +18,10 @@
 
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
 
 extern char **environ;
 
@@ -151,7 +152,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -251,7 +252,7 @@
     FDUtils::WriteToBlocking(
         exec_control_fd, os_error_message, strlen(os_error_message) + 1);
   }
-  TEMP_FAILURE_RETRY(close(exec_control_fd));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
   exit(1);
 }
 
@@ -286,8 +287,8 @@
   result = TEMP_FAILURE_RETRY(pipe(read_err));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -296,10 +297,10 @@
   result = TEMP_FAILURE_RETRY(pipe(write_out));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -308,12 +309,12 @@
   result = TEMP_FAILURE_RETRY(pipe(exec_control));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -322,14 +323,14 @@
 
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     Log::PrintErr("fcntl failed: %s\n", *os_error_message);
     return errno;
   }
@@ -350,18 +351,18 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -372,25 +373,25 @@
       exit(1);
     }
 
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
     if (working_directory != NULL &&
         TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
@@ -419,12 +420,12 @@
   result = TEMP_FAILURE_RETRY(pipe(event_fds));
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -445,7 +446,7 @@
   // Read exec result from child. If no data is returned the exec was
   // successful and the exec call closed the pipe. Otherwise the errno
   // is written to the pipe.
-  TEMP_FAILURE_RETRY(close(exec_control[1]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -461,22 +462,22 @@
     message[kMaxMessageSize - 1] = '\0';
     *os_error_message = message;
   }
-  TEMP_FAILURE_RETRY(close(exec_control[0]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
   if (bytes_read != 0) {
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
     // Since exec() failed, we're not interested in the exit code.
     // We close the reading side of the exit code pipe here.
     // GetProcessExitCodes will get a broken pipe error when it tries to write
     // to the writing side of the pipe and it will ignore the error.
-    TEMP_FAILURE_RETRY(close(*exit_event));
+    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
     *exit_event = -1;
 
     if (bytes_read == -1) {
@@ -488,13 +489,13 @@
 
   FDUtils::SetNonBlocking(read_in[0]);
   *in = read_in[0];
-  TEMP_FAILURE_RETRY(close(read_in[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
   FDUtils::SetNonBlocking(write_out[1]);
   *out = write_out[1];
-  TEMP_FAILURE_RETRY(close(write_out[0]));
+  VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
   FDUtils::SetNonBlocking(read_err[0]);
   *err = read_err[0];
-  TEMP_FAILURE_RETRY(close(read_err[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
   *id = pid;
   return 0;
@@ -674,12 +675,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -701,11 +702,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    int status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -742,7 +742,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
 }
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index e2810fc..844d09e 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -16,9 +16,9 @@
 #include <sys/wait.h>  // NOLINT
 #include <unistd.h>  // NOLINT
 
+#include "platform/signal_blocker.h"
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
 
@@ -151,7 +151,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -250,7 +250,7 @@
     FDUtils::WriteToBlocking(
         exec_control_fd, os_error_message, strlen(os_error_message) + 1);
   }
-  TEMP_FAILURE_RETRY(close(exec_control_fd));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control_fd));
   exit(1);
 }
 
@@ -274,7 +274,7 @@
   int exec_control[2];  // Pipe to get the result from exec.
   int result;
 
-  result = TEMP_FAILURE_RETRY(pipe(read_in));
+  result = pipe(read_in);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
@@ -282,37 +282,37 @@
   }
   FDUtils::SetCloseOnExec(read_in[0]);
 
-  result = TEMP_FAILURE_RETRY(pipe(read_err));
+  result = pipe(read_err);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(read_err[0]);
 
-  result = TEMP_FAILURE_RETRY(pipe(write_out));
+  result = pipe(write_out);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
   FDUtils::SetCloseOnExec(write_out[1]);
 
-  result = TEMP_FAILURE_RETRY(pipe(exec_control));
+  result = pipe(exec_control);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -321,14 +321,14 @@
 
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     Log::PrintErr("fcntl failed: %s\n", *os_error_message);
     return errno;
   }
@@ -349,18 +349,18 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
     return errno;
   } else if (pid == 0) {
     // Wait for parent process before setting up the child process.
@@ -371,28 +371,27 @@
       exit(1);
     }
 
-    TEMP_FAILURE_RETRY(close(write_out[1]));
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(exec_control[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(write_out[0], STDIN_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_in[1], STDOUT_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
 
     if (TEMP_FAILURE_RETRY(dup2(read_err[1], STDERR_FILENO)) == -1) {
       ReportChildError(exec_control[1]);
     }
-    TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
-    if (working_directory != NULL &&
-        TEMP_FAILURE_RETRY(chdir(working_directory)) == -1) {
+    if (working_directory != NULL && chdir(working_directory) == -1) {
       ReportChildError(exec_control[1]);
     }
 
@@ -400,8 +399,7 @@
       environ = program_environment;
     }
 
-    TEMP_FAILURE_RETRY(
-        execvp(path, const_cast<char* const*>(program_arguments)));
+    execvp(path, const_cast<char* const*>(program_arguments));
 
     ReportChildError(exec_control[1]);
   }
@@ -415,15 +413,15 @@
   delete[] program_environment;
 
   int event_fds[2];
-  result = TEMP_FAILURE_RETRY(pipe(event_fds));
+  result = pipe(event_fds);
   if (result < 0) {
     SetChildOsErrorMessage(os_error_message);
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
     Log::PrintErr("Error pipe creation failed: %s\n", *os_error_message);
     return errno;
   }
@@ -444,7 +442,7 @@
   // Read exec result from child. If no data is returned the exec was
   // successful and the exec call closed the pipe. Otherwise the errno
   // is written to the pipe.
-  TEMP_FAILURE_RETRY(close(exec_control[1]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[1]));
   int child_errno;
   int bytes_read = -1;
   ASSERT(sizeof(child_errno) == sizeof(errno));
@@ -460,22 +458,22 @@
     message[kMaxMessageSize - 1] = '\0';
     *os_error_message = message;
   }
-  TEMP_FAILURE_RETRY(close(exec_control[0]));
+  VOID_TEMP_FAILURE_RETRY(close(exec_control[0]));
 
   // Return error code if any failures.
   if (bytes_read != 0) {
-    TEMP_FAILURE_RETRY(close(read_in[0]));
-    TEMP_FAILURE_RETRY(close(read_in[1]));
-    TEMP_FAILURE_RETRY(close(read_err[0]));
-    TEMP_FAILURE_RETRY(close(read_err[1]));
-    TEMP_FAILURE_RETRY(close(write_out[0]));
-    TEMP_FAILURE_RETRY(close(write_out[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[0]));
+    VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
+    VOID_TEMP_FAILURE_RETRY(close(write_out[1]));
 
     // Since exec() failed, we're not interested in the exit code.
     // We close the reading side of the exit code pipe here.
     // GetProcessExitCodes will get a broken pipe error when it tries to write
     // to the writing side of the pipe and it will ignore the error.
-    TEMP_FAILURE_RETRY(close(*exit_event));
+    VOID_TEMP_FAILURE_RETRY(close(*exit_event));
     *exit_event = -1;
 
     if (bytes_read == -1) {
@@ -487,13 +485,13 @@
 
   FDUtils::SetNonBlocking(read_in[0]);
   *in = read_in[0];
-  TEMP_FAILURE_RETRY(close(read_in[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_in[1]));
   FDUtils::SetNonBlocking(write_out[1]);
   *out = write_out[1];
-  TEMP_FAILURE_RETRY(close(write_out[0]));
+  VOID_TEMP_FAILURE_RETRY(close(write_out[0]));
   FDUtils::SetNonBlocking(read_err[0]);
   *err = read_err[0];
-  TEMP_FAILURE_RETRY(close(read_err[1]));
+  VOID_TEMP_FAILURE_RETRY(close(read_err[1]));
 
   *id = pid;
   return 0;
@@ -618,7 +616,7 @@
 
 
 bool Process::Kill(intptr_t id, int signal) {
-  return (TEMP_FAILURE_RETRY(kill(id, signal)) != -1);
+  return kill(id, signal) != -1;
 }
 
 
@@ -673,12 +671,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (pipe(fds) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -700,11 +698,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    int status = sigaction(signal, &act, NULL);
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -741,7 +738,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    sigaction(signal, &act, NULL);
   }
 }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 5c85d9a..0e82ce2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -18,9 +18,11 @@
 
 #include "bin/fdutils.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/thread.h"
 
+#include "platform/signal_blocker.h"
+
+
 extern char **environ;
 
 
@@ -150,7 +152,7 @@
     running_ = false;
 
     // Fork to wake up waitpid.
-    if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork()) == 0) {
+    if (TEMP_FAILURE_RETRY(fork()) == 0) {
       exit(0);
     }
 
@@ -349,7 +351,7 @@
     program_environment[environment_length] = NULL;
   }
 
-  pid = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(fork());
+  pid = TEMP_FAILURE_RETRY(fork());
   if (pid < 0) {
     SetChildOsErrorMessage(os_error_message);
     delete[] program_arguments;
@@ -717,12 +719,12 @@
   }
   if (!found) return -1;
   int fds[2];
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(pipe(fds)) != 0) {
+  if (NO_RETRY_EXPECTED(pipe(fds)) != 0) {
     return -1;
   }
   if (!FDUtils::SetNonBlocking(fds[0])) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+    VOID_TEMP_FAILURE_RETRY(close(fds[1]));
     return -1;
   }
   ThreadSignalBlocker blocker(kSignalsCount, kSignals);
@@ -744,11 +746,10 @@
     for (int i = 0; i < kSignalsCount; i++) {
       sigaddset(&act.sa_mask, kSignals[i]);
     }
-    intptr_t status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        sigaction(signal, &act, NULL));
+    intptr_t status = NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
     if (status < 0) {
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[0]));
-      VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fds[1]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[0]));
+      VOID_TEMP_FAILURE_RETRY(close(fds[1]));
       return -1;
     }
   }
@@ -787,7 +788,7 @@
     struct sigaction act;
     bzero(&act, sizeof(act));
     act.sa_handler = SIG_DFL;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(sigaction(signal, &act, NULL));
+    VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
 }
 
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 02a5e86..bb6461e 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -125,6 +125,7 @@
   /* patch */ static void _exit(int status) native "Process_Exit";
   /* patch */ static void _setExitCode(int status)
       native "Process_SetExitCode";
+  /* patch */ static int _getExitCode() native "Process_GetExitCode";
   /* patch */ static void _sleep(int millis) native "Process_Sleep";
   /* patch */ static int _pid(Process process) native "Process_Pid";
   /* patch */ static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 0e5de6b..92cb2d9 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -16,9 +16,10 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -36,13 +37,13 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+                                    salen,
+                                    address,
+                                    len,
+                                    NULL,
+                                    0,
+                                    NI_NUMERICHOST)) != 0) {
     return false;
   }
   return true;
@@ -57,8 +58,7 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -74,14 +74,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -105,8 +103,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -121,9 +118,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -135,8 +131,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -150,10 +145,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+             &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -168,10 +162,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
@@ -186,10 +177,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -272,7 +260,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -307,24 +295,23 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  if (NO_RETRY_EXPECTED(
           bind(fd,
                &addr->addr,
                SocketAddress::GetAddrLength(addr))) < 0) {
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -348,28 +335,27 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   int optval = 1;
-  TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  if (NO_RETRY_EXPECTED(
           bind(fd,
                &addr.addr,
                SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -379,14 +365,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -409,7 +394,7 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+  socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
   if (socket == -1) {
     if (IsTemporaryAcceptError(errno)) {
       // We need to signal to the caller that this is actually not an
@@ -427,7 +412,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -450,11 +435,11 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         IPPROTO_TCP,
+                                         TCP_NODELAY,
+                                         reinterpret_cast<void *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -464,11 +449,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      IPPROTO_TCP,
+                                      TCP_NODELAY,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -478,11 +463,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&on),
+                                   &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -495,25 +480,24 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
-
 bool Socket::GetMulticastHops(intptr_t fd, intptr_t protocol, int* value) {
   uint8_t v;
   socklen_t len = sizeof(v);
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&v),
+                                   &len)) == 0) {
     *value = v;
     return true;
   }
@@ -526,22 +510,22 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&v),
+                                      sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         SOL_SOCKET,
+                                         SO_BROADCAST,
+                                         reinterpret_cast<char *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -551,11 +535,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      SOL_SOCKET,
+                                      SO_BROADCAST,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -565,7 +549,7 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+  return NO_RETRY_EXPECTED(setsockopt(
       fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
@@ -576,7 +560,7 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+  return NO_RETRY_EXPECTED(setsockopt(
       fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index 2c05324..e650c68 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -18,8 +18,8 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
+#include "platform/signal_blocker.h"
 #include "vm/thread.h"
 
 
@@ -39,13 +39,8 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(
+        &addr->addr, salen, address, len, NULL, 0, NI_NUMERICHOST) != 0)) {
     return false;
   }
   return true;
@@ -60,8 +55,8 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
+  fd = NO_RETRY_EXPECTED(
+      socket(addr.ss.ss_family, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -75,14 +70,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -103,8 +96,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -119,9 +111,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -133,8 +124,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -148,10 +138,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+          &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -166,10 +155,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
     Log::PrintErr("Error getsockname: %s\n",
@@ -184,10 +170,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -198,11 +181,8 @@
 void Socket::GetError(intptr_t fd, OSError* os_error) {
   int len = sizeof(errno);
   int err = 0;
-  getsockopt(fd,
-             SOL_SOCKET,
-             SO_ERROR,
-             &err,
-             reinterpret_cast<socklen_t*>(&len));
+  VOID_NO_RETRY_EXPECTED(getsockopt(
+      fd, SOL_SOCKET, SO_ERROR, &err, reinterpret_cast<socklen_t*>(&len)));
   errno = err;
   os_error->SetCodeAndMessage(OSError::kSystem, errno);
 }
@@ -210,7 +190,7 @@
 
 int Socket::GetType(intptr_t fd) {
   struct stat64 buf;
-  int result = fstat64(fd, &buf);
+  int result = NO_RETRY_EXPECTED(fstat64(fd, &buf));
   if (result == -1) return -1;
   if (S_ISCHR(buf.st_mode)) return File::kTerminal;
   if (S_ISFIFO(buf.st_mode)) return File::kPipe;
@@ -235,12 +215,12 @@
   hints.ai_flags = (AI_V4MAPPED | AI_ADDRCONFIG);
   hints.ai_protocol = IPPROTO_TCP;
   struct addrinfo* info = NULL;
-  int status = getaddrinfo(host, 0, &hints, &info);
+  int status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
   if (status != 0) {
     // We failed, try without AI_ADDRCONFIG. This can happen when looking up
     // e.g. '::1', when there are no global IPv6 addresses.
     hints.ai_flags = AI_V4MAPPED;
-    status = getaddrinfo(host, 0, &hints, &info);
+    status = NO_RETRY_EXPECTED(getaddrinfo(host, 0, &hints, &info));
     if (status != 0) {
       ASSERT(*os_error == NULL);
       *os_error = new OSError(status,
@@ -271,7 +251,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -293,10 +273,11 @@
 bool Socket::ParseAddress(int type, const char* address, RawAddr* addr) {
   int result;
   if (type == SocketAddress::TYPE_IPV4) {
-    result = inet_pton(AF_INET, address, &addr->in.sin_addr);
+    result = NO_RETRY_EXPECTED(inet_pton(AF_INET, address, &addr->in.sin_addr));
   } else {
     ASSERT(type == SocketAddress::TYPE_IPV6);
-    result = inet_pton(AF_INET6, address, &addr->in6.sin6_addr);
+    result = NO_RETRY_EXPECTED(
+        inet_pton(AF_INET6, address, &addr->in6.sin6_addr));
   }
   return result == 1;
 }
@@ -306,24 +287,21 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr->addr.sa_family,
-      SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
-      IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family,
+                         SOCK_DGRAM | SOCK_CLOEXEC | SOCK_NONBLOCK,
+                         IPPROTO_UDP));
   if (fd < 0) return -1;
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr->addr,
-               SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
   return fd;
@@ -350,7 +328,7 @@
     OSError** os_error) {
   struct ifaddrs* ifaddr;
 
-  int status = getifaddrs(&ifaddr);
+  int status = NO_RETRY_EXPECTED(getifaddrs(&ifaddr));
   if (status != 0) {
     ASSERT(*os_error == NULL);
     *os_error = new OSError(status,
@@ -387,26 +365,24 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(
-      addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
+  fd = NO_RETRY_EXPECTED(
+      socket(addr.ss.ss_family, SOCK_STREAM | SOCK_CLOEXEC | SOCK_NONBLOCK, 0));
   if (fd < 0) return -1;
 
   int optval = 1;
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr.addr,
-               SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -416,14 +392,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -445,8 +420,8 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept4(
-        fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
+  socket = TEMP_FAILURE_RETRY(accept4(
+      fd, &clientaddr, &addrlen, SOCK_NONBLOCK | SOCK_CLOEXEC));
   if (socket == -1) {
     if (IsTemporaryAcceptError(errno)) {
       // We need to signal to the caller that this is actually not an
@@ -462,7 +437,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_buf[kBufferSize];
@@ -474,11 +449,8 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(
+      fd, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<void *>(&on), &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -488,11 +460,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                           IPPROTO_TCP,
+                           TCP_NODELAY,
+                           reinterpret_cast<char *>(&on),
+                           sizeof(on))) == 0;
 }
 
 
@@ -502,11 +474,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(
+        fd, level, optname, reinterpret_cast<char *>(&on), &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -519,11 +488,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(
+      fd, level, optname, reinterpret_cast<char *>(&on), sizeof(on))) == 0;
 }
 
 
@@ -533,11 +499,8 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(
+          fd, level, optname, reinterpret_cast<char *>(&v), &len)) == 0) {
     *value = v;
     return true;
   }
@@ -550,22 +513,16 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(
+      fd, level, optname, reinterpret_cast<char *>(&v), sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(
+      fd, SOL_SOCKET, SO_BROADCAST, reinterpret_cast<char *>(&on), &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -575,11 +532,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                           SOL_SOCKET,
+                           SO_BROADCAST,
+                           reinterpret_cast<char *>(&on),
+                           sizeof(on))) == 0;
 }
 
 
@@ -589,8 +546,8 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
-      fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
+  return NO_RETRY_EXPECTED(
+      setsockopt(fd, proto, MCAST_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
 
@@ -600,8 +557,8 @@
   struct group_req mreq;
   mreq.gr_interface = interfaceIndex;
   memmove(&mreq.gr_group, &addr->ss, SocketAddress::GetAddrLength(addr));
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
-      fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
+  return NO_RETRY_EXPECTED(
+      setsockopt(fd, proto, MCAST_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
 }
 
 }  // namespace bin
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 1d0198c..04a1413 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -18,9 +18,10 @@
 #include "bin/fdutils.h"
 #include "bin/file.h"
 #include "bin/log.h"
-#include "bin/signal_blocker.h"
 #include "bin/socket.h"
 
+#include "platform/signal_blocker.h"
+
 
 namespace dart {
 namespace bin {
@@ -38,13 +39,13 @@
 
 bool Socket::FormatNumericAddress(RawAddr* addr, char* address, int len) {
   socklen_t salen = SocketAddress::GetAddrLength(addr);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(&addr->addr,
-                                     salen,
-                                     address,
-                                     len,
-                                     NULL,
-                                     0,
-                                     NI_NUMERICHOST)) != 0) {
+  if (NO_RETRY_EXPECTED(getnameinfo(&addr->addr,
+                                    salen,
+                                    address,
+                                    len,
+                                    NULL,
+                                    0,
+                                    NI_NUMERICHOST)) != 0) {
     return false;
   }
   return true;
@@ -59,8 +60,7 @@
 
 intptr_t Socket::Create(RawAddr addr) {
   intptr_t fd;
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = NO_RETRY_EXPECTED(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -76,14 +76,12 @@
 
 intptr_t Socket::Connect(intptr_t fd, RawAddr addr, const intptr_t port) {
   SocketAddress::SetAddrPort(&addr, port);
-  intptr_t result = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      connect(fd,
-              &addr.addr,
-              SocketAddress::GetAddrLength(&addr)));
+  intptr_t result = TEMP_FAILURE_RETRY(
+      connect(fd, &addr.addr, SocketAddress::GetAddrLength(&addr)));
   if (result == 0 || errno == EINPROGRESS) {
     return fd;
   }
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  VOID_TEMP_FAILURE_RETRY(close(fd));
   return -1;
 }
 
@@ -107,8 +105,7 @@
 
 int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t read_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(read(fd, buffer,
-                                                             num_bytes));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
@@ -123,9 +120,8 @@
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
-  ssize_t read_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
+  ssize_t read_bytes = TEMP_FAILURE_RETRY(
+      recvfrom(fd, buffer, num_bytes, 0, &addr->addr, &addr_len));
   if (read_bytes == -1 && errno == EWOULDBLOCK) {
     // If the read would block we need to retry and therefore return 0
     // as the number of bytes written.
@@ -137,8 +133,7 @@
 
 int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(write(fd, buffer,
-                                                                 num_bytes));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -152,10 +147,9 @@
 int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
-  ssize_t written_bytes =
-      TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          sendto(fd, buffer, num_bytes, 0,
-                 &addr.addr, SocketAddress::GetAddrLength(&addr)));
+  ssize_t written_bytes = TEMP_FAILURE_RETRY(
+      sendto(fd, buffer, num_bytes, 0,
+             &addr.addr, SocketAddress::GetAddrLength(&addr)));
   ASSERT(EAGAIN == EWOULDBLOCK);
   if (written_bytes == -1 && errno == EWOULDBLOCK) {
     // If the would block we need to retry and therefore return 0 as
@@ -170,10 +164,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getsockname(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getsockname(fd, &raw.addr, &size))) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
     strerror_r(errno, error_message, kBufferSize);
@@ -188,10 +179,7 @@
   ASSERT(fd >= 0);
   RawAddr raw;
   socklen_t size = sizeof(raw);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          getpeername(fd,
-                      &raw.addr,
-                      &size))) {
+  if (NO_RETRY_EXPECTED(getpeername(fd, &raw.addr, &size))) {
     return NULL;
   }
   *port = SocketAddress::GetAddrPort(&raw);
@@ -267,7 +255,7 @@
                            intptr_t host_len,
                            OSError** os_error) {
   ASSERT(host_len >= NI_MAXHOST);
-  int status = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getnameinfo(
+  int status = NO_RETRY_EXPECTED(getnameinfo(
       &addr.addr,
       SocketAddress::GetAddrLength(&addr),
       host,
@@ -302,24 +290,21 @@
     RawAddr* addr, intptr_t port, bool reuseAddress) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
+  fd = NO_RETRY_EXPECTED(socket(addr->addr.sa_family, SOCK_DGRAM, IPPROTO_UDP));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   if (reuseAddress) {
     int optval = 1;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr->addr,
-               SocketAddress::GetAddrLength(addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr->addr, SocketAddress::GetAddrLength(addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -385,28 +370,25 @@
                                         bool v6_only) {
   intptr_t fd;
 
-  fd = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(socket(addr.ss.ss_family, SOCK_STREAM,
-                                               0));
+  fd = TEMP_FAILURE_RETRY(socket(addr.ss.ss_family, SOCK_STREAM, 0));
   if (fd < 0) return -1;
 
   FDUtils::SetCloseOnExec(fd);
 
   int optval = 1;
-  VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+  VOID_NO_RETRY_EXPECTED(
       setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)));
 
   if (addr.ss.ss_family == AF_INET6) {
     optval = v6_only ? 1 : 0;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
+    VOID_NO_RETRY_EXPECTED(
         setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &optval, sizeof(optval)));
   }
 
   SocketAddress::SetAddrPort(&addr, port);
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-          bind(fd,
-               &addr.addr,
-               SocketAddress::GetAddrLength(&addr))) < 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(
+          bind(fd, &addr.addr, SocketAddress::GetAddrLength(&addr))) < 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -416,14 +398,13 @@
     // that we do not get the bad port number again.
     intptr_t new_fd = CreateBindListen(addr, 0, backlog, v6_only);
     int err = errno;
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     errno = err;
     return new_fd;
   }
 
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-      listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
-    VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  if (NO_RETRY_EXPECTED(listen(fd, backlog > 0 ? backlog : SOMAXCONN)) != 0) {
+    VOID_TEMP_FAILURE_RETRY(close(fd));
     return -1;
   }
 
@@ -436,7 +417,7 @@
   intptr_t socket;
   struct sockaddr clientaddr;
   socklen_t addrlen = sizeof(clientaddr);
-  socket = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(accept(fd, &clientaddr, &addrlen));
+  socket = TEMP_FAILURE_RETRY(accept(fd, &clientaddr, &addrlen));
   if (socket == -1) {
     if (errno == EAGAIN) {
       // We need to signal to the caller that this is actually not an
@@ -454,7 +435,7 @@
 
 void Socket::Close(intptr_t fd) {
   ASSERT(fd >= 0);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(close(fd));
+  int err = TEMP_FAILURE_RETRY(close(fd));
   if (err != 0) {
     const int kBufferSize = 1024;
     char error_message[kBufferSize];
@@ -477,11 +458,11 @@
 bool Socket::GetNoDelay(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          IPPROTO_TCP,
-                                          TCP_NODELAY,
-                                          reinterpret_cast<void *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         IPPROTO_TCP,
+                                         TCP_NODELAY,
+                                         reinterpret_cast<void *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -491,11 +472,11 @@
 
 bool Socket::SetNoDelay(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       IPPROTO_TCP,
-                                       TCP_NODELAY,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      IPPROTO_TCP,
+                                      TCP_NODELAY,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -505,11 +486,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                     level,
-                                     optname,
-                                     reinterpret_cast<char *>(&on),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&on),
+                                   &len)) == 0) {
     *enabled = (on == 1);
     return true;
   }
@@ -522,11 +503,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_LOOP : IPV6_MULTICAST_LOOP;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -536,11 +517,11 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                    level,
-                                    optname,
-                                    reinterpret_cast<char *>(&v),
-                                    &len)) == 0) {
+  if (NO_RETRY_EXPECTED(getsockopt(fd,
+                                   level,
+                                   optname,
+                                   reinterpret_cast<char *>(&v),
+                                   &len)) == 0) {
     *value = v;
     return true;
   }
@@ -553,22 +534,22 @@
   int level = protocol == SocketAddress::TYPE_IPV4 ? IPPROTO_IP : IPPROTO_IPV6;
   int optname = protocol == SocketAddress::TYPE_IPV4
       ? IP_MULTICAST_TTL : IPV6_MULTICAST_HOPS;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       level,
-                                       optname,
-                                       reinterpret_cast<char *>(&v),
-                                       sizeof(v))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      level,
+                                      optname,
+                                      reinterpret_cast<char *>(&v),
+                                      sizeof(v))) == 0;
 }
 
 
 bool Socket::GetBroadcast(intptr_t fd, bool* enabled) {
   int on;
   socklen_t len = sizeof(on);
-  int err = TEMP_FAILURE_RETRY_BLOCK_SIGNALS(getsockopt(fd,
-                                          SOL_SOCKET,
-                                          SO_BROADCAST,
-                                          reinterpret_cast<char *>(&on),
-                                          &len));
+  int err = NO_RETRY_EXPECTED(getsockopt(fd,
+                                         SOL_SOCKET,
+                                         SO_BROADCAST,
+                                         reinterpret_cast<char *>(&on),
+                                         &len));
   if (err == 0) {
     *enabled = on == 1;
   }
@@ -578,11 +559,11 @@
 
 bool Socket::SetBroadcast(intptr_t fd, bool enabled) {
   int on = enabled ? 1 : 0;
-  return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(fd,
-                                       SOL_SOCKET,
-                                       SO_BROADCAST,
-                                       reinterpret_cast<char *>(&on),
-                                       sizeof(on))) == 0;
+  return NO_RETRY_EXPECTED(setsockopt(fd,
+                                      SOL_SOCKET,
+                                      SO_BROADCAST,
+                                      reinterpret_cast<char *>(&on),
+                                      sizeof(on))) == 0;
 }
 
 
@@ -601,10 +582,10 @@
             &interface->in.sin_addr,
             SocketAddress::GetInAddrLength(interface));
     if (join) {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
     } else {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IP, IP_DROP_MEMBERSHIP, &mreq, sizeof(mreq))) == 0;
     }
   } else {
@@ -615,10 +596,10 @@
             SocketAddress::GetInAddrLength(addr));
     mreq.ipv6mr_interface = interfaceIndex;
     if (join) {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq))) == 0;
     } else {
-      return TEMP_FAILURE_RETRY_BLOCK_SIGNALS(setsockopt(
+      return NO_RETRY_EXPECTED(setsockopt(
           fd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq, sizeof(mreq))) == 0;
     }
   }
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 0edd468..144696d 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -836,7 +836,7 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null && !isClosing && !isClosed) {
+    if (eventPort == null) {
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 77c51ef..da82b27 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -12,6 +12,8 @@
 #include "bin/socket.h"
 #include "bin/utils.h"
 
+#include "vm/thread.h"
+
 
 namespace dart {
 namespace bin {
@@ -217,11 +219,15 @@
 }
 
 
+static Mutex* getaddrinfo_mutex = new Mutex();
 AddressList<SocketAddress>* Socket::LookupAddress(const char* host,
                                                   int type,
                                                   OSError** os_error) {
   Initialize();
 
+  // getaddrinfo is not thread-safe on Windows. Use a mutex to get around it.
+  MutexLocker locker(getaddrinfo_mutex);
+
   // Perform a name lookup for a host name.
   struct addrinfo hints;
   memset(&hints, 0, sizeof(hints));
diff --git a/runtime/bin/stdio_android.cc b/runtime/bin/stdio_android.cc
index 25d16c3..d0ba85e 100644
--- a/runtime/bin/stdio_android.cc
+++ b/runtime/bin/stdio_android.cc
@@ -11,7 +11,8 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -66,8 +67,7 @@
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_linux.cc b/runtime/bin/stdio_linux.cc
index 43ece52..dee8c38 100644
--- a/runtime/bin/stdio_linux.cc
+++ b/runtime/bin/stdio_linux.cc
@@ -11,14 +11,15 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
 namespace bin {
 
 int Stdin::ReadByte() {
-  int c = getchar();
+  int c = NO_RETRY_EXPECTED(getchar());
   if (c == EOF) {
     c = -1;
   }
@@ -28,46 +29,45 @@
 
 bool Stdin::GetEchoMode() {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   return (term.c_lflag & ECHO) != 0;
 }
 
 
 void Stdin::SetEchoMode(bool enabled) {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   if (enabled) {
     term.c_lflag |= ECHO|ECHONL;
   } else {
     term.c_lflag &= ~(ECHO|ECHONL);
   }
-  tcsetattr(STDIN_FILENO, TCSANOW, &term);
+  VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
 }
 
 
 bool Stdin::GetLineMode() {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   return (term.c_lflag & ICANON) != 0;
 }
 
 
 void Stdin::SetLineMode(bool enabled) {
   struct termios term;
-  tcgetattr(STDIN_FILENO, &term);
+  VOID_NO_RETRY_EXPECTED(tcgetattr(STDIN_FILENO, &term));
   if (enabled) {
     term.c_lflag |= ICANON;
   } else {
     term.c_lflag &= ~(ICANON);
   }
-  tcsetattr(STDIN_FILENO, TCSANOW, &term);
+  VOID_NO_RETRY_EXPECTED(tcsetattr(STDIN_FILENO, TCSANOW, &term));
 }
 
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w)) == 0 &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/stdio_macos.cc b/runtime/bin/stdio_macos.cc
index 79e34f8..be736bd 100644
--- a/runtime/bin/stdio_macos.cc
+++ b/runtime/bin/stdio_macos.cc
@@ -11,7 +11,8 @@
 
 #include "bin/stdio.h"
 #include "bin/fdutils.h"
-#include "bin/signal_blocker.h"
+
+#include "platform/signal_blocker.h"
 
 
 namespace dart {
@@ -66,8 +67,7 @@
 
 bool Stdout::GetTerminalSize(int size[2]) {
   struct winsize w;
-  if (TEMP_FAILURE_RETRY_BLOCK_SIGNALS(
-        ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
+  if (NO_RETRY_EXPECTED(ioctl(STDOUT_FILENO, TIOCGWINSZ, &w) == 0) &&
       (w.ws_col != 0 || w.ws_row != 0)) {
     size[0] = w.ws_col;
     size[1] = w.ws_row;
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 366b9f6..f8fbd36 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -171,10 +171,11 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -227,44 +228,12 @@
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 
 </polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
-  <template>
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-danger">
-        <div class="panel-heading">{{ error.kind }}</div>
-        <div class="panel-body">
-          <p>{{ error.message }}</p>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
-  </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -307,9 +276,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -333,6 +310,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -340,28 +318,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
@@ -369,184 +353,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
-        </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <style>
-      .content {
-        padding-left: 10%;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      h1 {
-        font: 400 18px 'Montserrat', sans-serif;
-      }
-      .member, .memberHeader {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      .monospace {
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: nowrap;
-      }
-    </style>
-    <div class="content">
-      <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tbody><tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
-            <function-ref ref="{{code.function}}">
-            </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </tbody></table>
-    </div>
-    <hr>
-    <div class="content">
-      <template if="{{ code.hasDisassembly }}">
-        <div class="row">
-            <div class="col-md-2 memberHeader">Inclusive</div>
-            <div class="col-md-2 memberHeader">Exclusive</div>
-            <div class="col-md-2 memberHeader">Address</div>
-            <div class="col-md-6 memberHeader">Disassembly</div>
-        </div>
-      </template>
-      <template repeat="{{ instruction in code.instructions }}">
-        <div class="row">
-          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="col-md-6 monospace">{{ instruction.human }}</div>
-        </div>
-      </template>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay" class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
       .textbox {
@@ -627,7 +434,314 @@
 </polymer-element>
 
 
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+  <template if="{{ ref['final'] }}"> final </template>
+  <template if="{{ ref['const'] }}"> const </template>
+  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
+  var
+  </template>
+  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+  </template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+  <template>
+    <div class="well row">
+      <a on-click="toggleDisplay" class="btn muted unselectable">
+           Raw message... <i class="{{ iconClass }}"></i>
+      </a>
+      <div style="display: {{ displayValue }}" class="well">
+        <content></content>
+      </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+  <template>
+    <div class="row">
+    <div class="col-md-8 col-md-offset-2">
+      <div class="panel panel-danger">
+        <div class="panel-heading">{{ error.kind }}</div>
+        <div class="panel-body">
+          <p>{{ error.message }}</p>
+        </div>
+      </div>
+    </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -743,9 +857,26 @@
   </template>
   
 </polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
@@ -762,14 +893,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -812,6 +936,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
@@ -857,6 +982,158 @@
   </template>
   
 </polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -876,12 +1153,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -896,23 +1175,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tbody><tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template="" if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </tbody></table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -921,44 +1202,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
@@ -1005,6 +1292,28 @@
 </polymer-element>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1012,68 +1321,195 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template="" repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal=""></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
   </template>
   
 </polymer-element>
@@ -1085,38 +1521,81 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
+        </tr>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         </tr><tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </tbody></table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   
 </polymer-element>
@@ -1227,9 +1706,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -1241,15 +1728,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 74565cd..4cd0dff 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -8542,7 +8542,7 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
 (function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
 bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},"call$1","guH",2,0,null,132,[]],
 ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
 aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
 Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 $isList:true,
 $isList:true,
 $aszM:null,
@@ -8992,9 +8990,9 @@
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
 return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
 gbx:function(a){return C.O4},
 $isdouble:true,
 $isnum:true},
-vT:{
+x1:{
 "^":"im;"},
 VP:{
-"^":"vT;"},
+"^":"x1;"},
 BQ:{
 "^":"VP;"},
 O:{
@@ -9063,8 +9062,8 @@
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9075,7 +9074,7 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
 if(J.z8(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
 U:[function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
@@ -9126,15 +9117,15 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
 if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
 zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
 ox:[function(){var z=init.globalState.Xz
 z.GL=z.GL-1},"call$0","q4",0,0,null],
 oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
@@ -9208,7 +9205,7 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -9294,21 +9291,21 @@
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
 "^":"Tp:115;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9356,18 +9353,18 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
 iK:[function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
 Hh:[function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
 MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
 Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
 vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
@@ -9388,11 +9385,11 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
 PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
 else this.UM()},"call$0","gi8",0,0,null],
 UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
 if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
-Iy:{
+dq:{
 "^":"a;",
 $isbC:true},
 Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
 zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
@@ -9483,11 +9480,9 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
@@ -9499,19 +9494,17 @@
 y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
 zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 NO:{
 "^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
@@ -9582,19 +9575,19 @@
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
 Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9606,7 +9599,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
 $isEH:true},
 Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9667,7 +9660,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9678,7 +9671,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9692,8 +9685,8 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
 n:[function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
 y=b.ng
 return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,31,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
-if(b!=null){z.a=0+b.length
+if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
 Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
@@ -9877,26 +9868,27 @@
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
 return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
 C.Nm.FV(r,b)
 y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
 if(a=="double")return C.yX
 if(a=="num")return C.oD
 if(a=="bool")return C.Fm
-if(a=="List")return C.l0
+if(a=="List")return C.E3
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"call$1","EN",2,0,null,6,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -9965,7 +9957,7 @@
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -10001,7 +9993,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -10026,7 +10018,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -10037,7 +10029,7 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
@@ -10049,33 +10041,33 @@
 x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
 ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
 KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
 return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
 return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
 uc:[function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10264,10 +10256,10 @@
 else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+else{z=J.x(b)
+if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10277,12 +10269,11 @@
 w=z.vM+w
 z.vM=w
 z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
 "^":"a;"},
 xQ:{
 "^":"a;"},
@@ -10294,8 +10285,8 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
@@ -10304,10 +10295,10 @@
 di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
 t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
 aN:[function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10331,14 +10322,13 @@
 "^":"a;lK,uk,xI,rq,FX,Nc",
 gWa:function(){var z,y,x
 z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+if(!!J.x(z).$iswv)return z
+y=$.bx().t(0,z)
+if(y!=null){x=y.split(":")
+if(0>=x.length)return H.e(x,0)
+z=x[0]}x=new H.GD(z)
+this.lK=x
+return x},
 glT:function(){return this.xI===1},
 ghB:function(){return this.xI===2},
 gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
 BX:[function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
 Fk:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
 KE:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
 e4:[function(a){var z,y,x,w,v,u,t
 z={}
 if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
 call$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a
@@ -10472,18 +10462,18 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b)
-z.a=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
@@ -10596,11 +10585,9 @@
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
 return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
@@ -10619,11 +10606,11 @@
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
 "^":"a;QW"},
-D2:{
+dN:{
 "^":"a;QW"},
-my:{
+GT:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
 "^":"a;"},
 tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
 return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+if(!!x.$isnr)z.void=true
+else if(!x.$ishJ)z.ret=y.za()
 y=this.Iq
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
@@ -10656,7 +10643,7 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
 hJ:{
-"^":"lb;",
+"^":"lbp;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
 $ishJ:true},
 tu:{
-"^":"lb;oc>",
+"^":"lbp;oc>",
 za:[function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
 za:[function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -10701,7 +10688,7 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
@@ -10720,10 +10707,8 @@
 this.ke=y
 return y},"call$0","gXo",0,0,null],
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
@@ -10733,11 +10718,11 @@
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
 call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
@@ -10758,16 +10743,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10778,13 +10763,13 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
 "^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
@@ -10839,11 +10824,11 @@
 $.NR=z
 return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
 Da:[function(){var z=this.Z6
 z.sec(this)
 z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
 this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
 "^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
 return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
 rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
 df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
 this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
 y=this.Pr()
@@ -10921,10 +10906,10 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -10934,28 +10919,19 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
 F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10990,13 +10967,13 @@
 C.J0.ZL(a)
 C.J0.G6(a)
 return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11011,13 +10988,14 @@
 C.YZ.ZL(a)
 C.YZ.G6(a)
 return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11031,13 +11009,13 @@
 C.kk.ZL(a)
 C.kk.G6(a)
 return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11052,20 +11030,20 @@
 C.IK.ZL(a)
 C.IK.G6(a)
 return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
 J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
 C.YD.ZL(a)
 C.YD.G6(a)
 return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -11104,7 +11082,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11119,29 +11097,29 @@
 C.j8.ZL(a)
 C.j8.G6(a)
 return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
 a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11158,7 +11136,7 @@
 C.O0.ZL(a)
 C.O0.G6(a)
 return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
 if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
 qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
+y=J.x(c)
+if(!y.$isyN)c=y.tt(c,!1)
 y=J.U6(c)
 x=y.gB(c)
 w=a.length
@@ -11220,9 +11199,13 @@
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
 H.qG(a,z,w,a,b)
-for(z=y.gA(c);z.G();b=u){v=z.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[function(a,b,c){var z,y
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+for(z=J.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
@@ -11247,7 +11230,7 @@
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -11357,7 +11340,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
@@ -11414,7 +11397,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
@@ -11479,11 +11462,10 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
 gl:function(){return}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -11579,13 +11564,11 @@
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
 X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
 else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
 if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
 x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
 $.tY[b]=x
-return x}u=H.pL(b)
+return x}u=H.mN(b)
 if(u==null){t=init.functionAliases[b]
 if(t!=null){x=new H.ng(b,null,a)
 x.CM=new H.Ar(init.metadata[t],null,null,null,x)
 $.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
 r=s["@"]
 if(r==null){q=null
 p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
 q=z.t(q,0)}else p=null
 if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
@@ -11657,15 +11638,13 @@
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
 z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
@@ -11686,8 +11665,8 @@
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+if(!!x.$isMs){z.a=y
+break}if(!!x.$isrN)break
 y=y.gXP()}if(b==null)return $.P8()
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
@@ -11696,8 +11675,7 @@
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
 return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
 return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
 if(w===-1)return C.xD;++w
 return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+z=J.x(b)
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -11724,7 +11702,7 @@
 if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
 jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -11776,23 +11754,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
 $isNL:true,
 $isej:true},
 cw:{
 "^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
 gOO:function(){return"LibraryMirror"},
 gUx:function(){return this.If},
 gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+gqh:function(){var z,y,x
 z=this.P8
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
@@ -11847,12 +11822,10 @@
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -11935,7 +11908,6 @@
 this.xO=z
 return z},
 gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isD4:true,
 $isej:true,
 $isNL:true},
@@ -11943,12 +11915,12 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
 "^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
 gJi:function(){return this},
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isMs:true,
 $isej:true,
 $isX9:true,
@@ -11990,7 +11961,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12007,7 +11978,7 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
 return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
 gUx:function(){return this.NK.gUx()},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isbl:true,
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:112;",
@@ -12173,15 +12141,13 @@
 Ax:{
 "^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
 else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
@@ -12211,7 +12177,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12227,7 +12193,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12276,9 +12242,7 @@
 else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
@@ -12310,12 +12274,12 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
 return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
@@ -12336,7 +12300,6 @@
 gw8:function(){return C.hU},
 gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
 return new H.cu(this.Cr,null)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isWf:true,
 $isMs:true,
 $isej:true,
@@ -12346,19 +12309,19 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-Ld:{
+XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
 gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12397,7 +12360,7 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
 return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
 v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+w=J.x(y)
+if(!!w.$isv){u=y.gjm()
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
@@ -12426,7 +12389,6 @@
 y.constructor[z]=s
 return s},
 bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isvr:true,
 $isej:true},
 Zk:{
@@ -12451,10 +12413,7 @@
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
 else{z=this.gXP()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12507,8 +12466,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+if(!!y.$iscw)return H.d(z.Nz)
+if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
 z.fixed$length=init
 return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+if(!!J.x(z).$isb8)return z
+return}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
 $.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
 dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
 b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
 TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
@@ -12761,7 +12720,7 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
 this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
@@ -12866,7 +12825,7 @@
 "^":"Tp;a",
 call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
 b8:{
 "^":"a;",
 $isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
 E6:[function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12937,26 +12904,26 @@
 z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
 R8:[function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
 P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
 OH:[function(a){var z
 if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
 if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
-z.e=q
-y=q
-continue}else P.A9(q,b)
-else P.k3(q,b)
-return}}if(x.b===!0){p=b.L3()
-b.Am(x.c)}else{p=b.L3()
+y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){r=x.c
+if(!!J.x(r).$isvs)if(r.Gv>=4){b.swG(!0)
+z.e=r
+y=r
+continue}else P.A9(r,b)
+else P.k3(r,b)
+return}}if(x.b===!0){q=b.L3()
+b.Am(x.c)}else{q=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
 da:{
 "^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
 call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
@@ -13040,7 +13004,7 @@
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -13100,33 +13064,29 @@
 u=this.b
 if(v)u.c=this.c.e.gcG()
 else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
 "^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
 z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+if(!J.x(z.a).$isvs){y=P.Dt(null)
+z.a=y
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
@@ -13280,7 +13240,7 @@
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
@@ -13293,7 +13253,7 @@
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
@@ -13320,13 +13280,11 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
@@ -13338,18 +13296,18 @@
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
 Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
 Vo:{
 "^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 w4:[function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13492,7 +13450,7 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
 CR:{
 "^":"Tp:115;a,b",
 call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
 call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
 GU:{
@@ -13543,8 +13501,8 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
 vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
 nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -13579,7 +13537,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13591,26 +13549,26 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
 tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
 zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
 hk:function(a,b){return this.E2.call$2(a,b)},
 Gr:function(a){return this.cP.call$1(a)},
 FI:function(a,b){return this.Jl.call$2(a,b)},
 mg:function(a,b,c){return this.pU.call$3(a,b,c)},
 Al:function(a){return this.Fh.call$1(a)},
 cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
 wr:function(a){return this.rb.call$1(a)},
 RK:function(a,b){return this.rb.call$2(a,b)},
 uN:function(a,b){return this.Zq.call$2(a,b)},
 Ch:function(a,b){return this.JS.call$1(b)},
 iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -13643,8 +13601,8 @@
 return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
 return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
 return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
 TF:{
 "^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
 call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
@@ -13724,7 +13682,7 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
 mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
 $isEH:true},
 eM:{
 "^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
-W5:{
+nU:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
 Al:function(a){return this.gFh().call$1(a)},
 gXp:function(){return P.zi()},
 cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
 grb:function(){return P.G2()},
 wr:function(a){return this.grb().call$1(a)},
 RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
 mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -13893,7 +13849,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -13920,7 +13876,7 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
@@ -13930,7 +13886,7 @@
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13951,71 +13907,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14058,8 +14014,8 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
 FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14102,7 +14058,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -14115,17 +14071,17 @@
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14143,13 +14099,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14159,15 +14115,15 @@
 return z},"call$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -14249,7 +14205,7 @@
 this.DM=null
 return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14300,18 +14256,19 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14381,7 +14338,7 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14426,13 +14383,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14451,7 +14409,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14484,11 +14443,11 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
 return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
 $isQV:true,
 $asQV:null},
@@ -14523,13 +14482,13 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
 this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
 this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
 y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
 return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+UZ:[function(a,b,c){var z
+this.pZ(a,b,c)
+z=c-b
+this.YW(a,b,J.xH(this.gB(a),z),a,c)
+this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
 return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){var z,y
+if(b>=0){z=this.gB(a)
+if(typeof z!=="number")return H.s(z)
+z=b>z}else z=!0
+if(z)throw H.b(P.TE(b,0,this.gB(a)))
+z=J.x(c)
+if(!!z.$isyN)c=z.br(c)
+y=J.q8(c)
+this.sB(a,J.WB(this.gB(a),y))
+if(typeof y!=="number")return H.s(y)
+this.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){var z,y
+z=J.x(c)
+if(!!z.$isList){z=z.gB(c)
+if(typeof z!=="number")return H.s(z)
+this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -14662,14 +14639,14 @@
 $isQV:true,
 $asQV:null},
 ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+y=J.mQ(J.xH(y,1),this.v5.length-1)
+if(y>=z.length)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -14702,21 +14678,23 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+z=J.x(b)
+if(!!z.$isList){y=z.gB(b)
+x=this.gB(this)
+if(typeof y!=="number")return H.s(y)
+z=x+y
 w=this.v5
 v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -14724,15 +14702,16 @@
 this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=this.eZ+z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+H.qG(t,x,z,b,0)
+this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
+if(typeof z!=="number")return H.s(z)
+s=v-z
+if(y<s){H.qG(w,z,z+y,b,0)
+this.eZ=J.WB(this.eZ,y)}else{r=y-s
+H.qG(w,z,z+s,b,0)
+z=this.v5
+H.qG(z,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
@@ -14747,38 +14726,33 @@
 this.av=0
 this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
 z=this.v5
 y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
 z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
 this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+z=this.v5.length-1
+if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
+if(u<0||u>=w)return H.e(x,u)
+t=x[u]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+this.av=(y+1&z)>>>0
+return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
+this.eZ=y
+for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
+if(s<0||s>=w)return H.e(x,s)
+t=x[s]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+return a}},"call$1","gzv",2,0,null,456,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14793,25 +14767,29 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
 z=this.av
 y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
+if(typeof y!=="number")return H.s(y)
+if(z<=y){x=y-z
+z=this.v5
+y=this.av
+H.qG(a,0,x,z,y)
+return x}else{y=this.v5
+w=y.length-z
+H.qG(a,0,w,y,z)
 z=this.eZ
+if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
 Ba:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
 V1:[function(a){this.aY=null
 this.P6=0
 this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
 An:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14976,7 +14954,7 @@
 return this.Wb(z)},
 p0:[function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
 tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
 "^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -15073,12 +15051,12 @@
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
 Cf:{
@@ -15121,7 +15099,7 @@
 this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
 WD:[function(a){var z=this.qi
 if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
 rl:[function(a){var z,y,x,w,v
 if(!this.IS(a)){x=a
 w=this.qi
@@ -15144,7 +15122,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
 z=this.Vy
 z.KF("[")
 if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
 z.vM=z.vM+","
 this.rl(y.t(a,x));++x}}z.KF("]")
 this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
 w=this.Vy
 w.KF("{")
 z.a=!0
@@ -15163,13 +15141,13 @@
 w.KF("}")
 this.qi.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
 new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15178,13 +15156,13 @@
 x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:[function(a){var z,y,x
 z=J.U6(a)
@@ -15193,7 +15171,7 @@
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
 fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
 static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
 Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
 FM:function(a){return new P.HG(a)},
 ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
 NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15336,10 +15314,8 @@
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isiP)return!1
 return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
 iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15405,32 +15381,30 @@
 return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1","wI",2,0,null,198,[]]}},
 MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
 g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
 return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
 $isa6:true,
 static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
 return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
@@ -15549,7 +15523,7 @@
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15622,7 +15596,7 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
 V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
 Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
 uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15673,12 +15647,12 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15692,8 +15666,8 @@
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)return!1
+z=J.x(b)
+if(!z.$isiD)return!1
 if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
 z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
@@ -15708,7 +15682,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -15875,18 +15849,18 @@
 if(q&&!p)z.call$1("expected a part after last `:`")
 if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
 y.vM=y.vM+u
 z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
 hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:112;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15938,44 +15912,44 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
 else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
 "^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
 $isEH:true},
 Mx:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
 "^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
 $isEH:true},
 kZ:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -16023,18 +15997,18 @@
 "^":"Tp:112;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
 r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
 It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
 return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -16118,7 +16088,7 @@
 return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -16130,12 +16100,10 @@
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAnchorElement"},
 Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
 Fy:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
-$isGv:true,
 "%":"Comment;CharacterData"},
 Yr:{
 "^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16199,10 +16180,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 "%":";DocumentFragment"},
 cm:{
 "^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
 aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
 gLm:function(a){return C.i3.f0(a)},
 ZL:function(a){},
 $iscv:true,
-$isGv:true,
 $isD0:true,
 "%":";Element"},
 Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16293,14 +16282,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16309,9 +16298,9 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
 zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 In:{
 "^":"qE;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
+pL:{
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -16400,16 +16388,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
 "%":"MIDIOutput"},
-ab:{
+tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 $isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
@@ -16423,15 +16412,11 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
 if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,332,[],333,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
 $isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16475,7 +16465,7 @@
 "^":"qE;t5:type%",
 "%":"HTMLOListElement"},
 G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
-ew:{
+kQ:{
 "^":"ea;",
-$isew:true,
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
 j2:{
 "^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -16548,7 +16538,7 @@
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
 "^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
 "%":"StorageEvent"},
 Lx:{
@@ -16579,7 +16569,7 @@
 r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-xV:{
+R0:{
 "^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
@@ -16592,9 +16582,12 @@
 Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
@@ -16619,41 +16612,35 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 $isu9:true,
-$isGv:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16666,14 +16653,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.yg]},
 $isyN:true,
@@ -16681,19 +16668,19 @@
 $asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
-LO:{
+LOx:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.uj]},
 $isyN:true,
@@ -16703,12 +16690,12 @@
 "%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
 To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
 V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -16760,8 +16742,8 @@
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
 return z}}},
 B1:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -16813,11 +16794,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
 $isEH:true},
 bU:{
 "^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+FV:[function(a,b){var z,y,x,w
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+y=this.NL
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+oF:[function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
@@ -16869,15 +16853,16 @@
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
 GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
 $asar:function(){return[W.KV]},
 $aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
 $asQV:function(){return[W.KV]}},
 Ou:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
 V1:[function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
 OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
 xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
@@ -17002,27 +16986,27 @@
 return z}}},
 FK:{
 "^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
 "^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17032,35 +17016,35 @@
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 $isqh:true},
 ie:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Ea:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 KR:[function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17068,16 +17052,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 $isqh:true},
 i2:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 b0:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
 return},"call$0","gZS",0,0,null],
 Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
@@ -17116,19 +17100,21 @@
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -17143,17 +17129,17 @@
 V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){J.wg(this.xa,b)},
 GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
-$isGv:true,
 static:{P1:[function(a){if(a===window)return a
 else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
@@ -17195,8 +17180,7 @@
 gmH:function(a){return this.WK.href},
 VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -17205,156 +17189,92 @@
 "^":"",
 Dh:{
 "^":"zp;N:target=,mH:href=",
-$isGv:true,
 "%":"SVGAElement"},
 Ue:{
 "^":"Eo;mH:href=",
-$isGv:true,
 "%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
 eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
 "%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
 "^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
 Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
 NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 j24:{
 "^":"d5;t5:type%,mH:href=",
-$isGv:true,
 "%":"SVGScriptElement"},
-Lu:{
+ki:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
@@ -17369,61 +17289,27 @@
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 $isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
 hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $ishy:true,
-$isGv:true,
 "%":"SVGSVGElement"},
-mq:{
+mHq:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
 "%":"SVGTextPathElement"},
 Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
 wD:{
 "^":"d5;mH:href=",
-$isGv:true,
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
 O7:{
 "^":"As;LO",
 lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
 d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
 else z=!0
 else z=!0
 if(z)return a
 else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+if(!!z.$isiP)return H.o2(a)
+else if(!!z.$isE4)return a.eh
+else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
 else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
@@ -17487,12 +17373,10 @@
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
 return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
 giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
 Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
 $isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
@@ -17519,10 +17402,10 @@
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
 return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
@@ -17607,6 +17488,12 @@
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
 J:[function(a,b){var z
 if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -17624,17 +17511,166 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"a;",
+j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+j1:[function(a){var z,y,x
+if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+z=a-1
+if((a&z)===0){this.o2()
+return(this.Bo&z)>>>0}do{this.o2()
+y=this.Bo
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3:function(a){var z,y,x,w,v,u,t,s
+z=J.u6(a,0)?-1:0
+do{y=J.Wx(a)
+x=y.i(a,4294967295)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*1037
+t=(v&4294967295)>>>0
+this.Bo=t
+s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Hz=s
+this.Bo=(t^u)>>>0
+this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
+if(this.Hz===0&&this.Bo===0)this.Bo=23063
+this.o2()
+this.o2()
+this.o2()
+this.o2()},
+static:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(0,z),y))},
+g:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.g()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.W()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+U:[function(a,b){var z,y
+z=this.x
+if(typeof z!=="number")return z.U()
+if(typeof b!=="number")return H.s(b)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
 y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -17692,26 +17728,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
 PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
 gbx:function(a){return C.jV},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-aH:{
+us:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
-LZ:{
+b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
 $isQV:true,
 $asQV:function(){return[J.GW]}},
 Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.GW]},
 $isyN:true,
@@ -17936,9 +17971,8 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
 $isQV:true,
 $asQV:function(){return[J.im]}},
 ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.im]},
 $isyN:true,
@@ -17959,12 +17993,12 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17978,29 +18012,29 @@
 C.OD.ZL(a)
 C.OD.G6(a)
 return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
 J.xW(b)
 z=a.fn
 a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
 A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18027,18 +18061,18 @@
 C.Gh.ZL(a)
 C.Gh.G6(a)
 return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:112;a-82",
 call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18053,14 +18087,14 @@
 C.MC.ZL(a)
 C.MC.G6(a)
 return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
 C.LT.ZL(a)
 C.LT.G6(a)
 return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
 static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.lh=!0
+a.qe=!1
+a.zg=!1
 a.Pe=!1
 a.SO=z
 a.B7=y
@@ -18094,13 +18147,16 @@
 C.Xo.ZL(a)
 C.Xo.G6(a)
 return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18114,37 +18170,154 @@
 C.Yu.ZL(a)
 C.Yu.G6(a)
 return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
 a.q3=y
 y.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.q3),"sortColumn",1)
 J.kW(J.wc(a.q3),"sortAscending",!1)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
 a.kg=z
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
 this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
 a.LY.Gl("number","Allocated Since GC (old)")
 a.LY.Gl("number","Total before GC (old)")
 a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
 a.bV.Gl("number","Total before GC")
 a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18289,44 +18459,51 @@
 C.Vc.G6(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ nx":[489],
+"+ nx":[501],
 jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ jm":[489],
+"+ jm":[501],
 ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ ke":[489],
+"+ ke":[501],
 xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18341,19 +18518,19 @@
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 wO:{
 "^":"Tp:115;",
@@ -18368,14 +18545,14 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
 w=this.UI.call$1(x)
 z.a=w
 if(w!=null)return w
@@ -18383,7 +18560,7 @@
 z.a=w
 this.bK.call$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
 "^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 xL:{
 "^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
 As:{
 "^":"a;",
 bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
 aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
 ez:[function(a,b){var z=this.lF()
 return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
 FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
 return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
 aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
 V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
 return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
 Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18592,7 +18772,7 @@
 C.cp.ZL(a)
 C.cp.G6(a)
 return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
 Js:{
 "^":"Tp:112;a-82",
 call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18621,20 +18801,20 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
 return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
 C.b9.ZL(a)
 C.b9.G6(a)
 return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+z=this.B1
+y=J.UQ(z,"threshold")
+x=this.wd
+w=J.U6(x)
+if(J.z8(w.gB(x),0))return
+for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
+r=J.FW(s.gAv(),v.gAv())
+if(typeof y!=="number")return H.s(y)
+if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
+w.h(x,X.SJ(z,t,s,this))}},"call$0","gz7",0,0,null],
 o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
 a.FT=this.ct(a,C.XU,a.FT,z)
 z=x.bu(0)
 a.vk=this.ct(a,C.Dj,a.vk,z)
+z=J.AG(J.UQ(a.pD,"depth"))
+a.M5=this.ct(a,C.bE,a.M5,z)
+w=J.UQ(a.pD,"period")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,z)
+z=J.AG(J.vX(a.XX,100))+"%"
+a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
+J.kW(a.pD,"threshold",a.XX)
 this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
 if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
 "@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.FT=""
 a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
 a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
 C.XH.ZL(a)
 C.XH.G6(a)
 return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
 $isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+static:{Zg:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18787,39 +19041,60 @@
 C.Qt.ZL(a)
 C.Qt.G6(a)
 return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
 yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
 gvc:[function(a){var z,y
 z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18835,13 +19110,13 @@
 C.Yt.ZL(a)
 C.Yt.G6(a)
 return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18856,14 +19131,15 @@
 C.Z3.ZL(a)
 C.Z3.G6(a)
 return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18876,8 +19152,8 @@
 C.MG.ZL(a)
 C.MG.G6(a)
 return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -18896,7 +19172,7 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
@@ -18906,19 +19182,19 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
 IE:[function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
@@ -18939,10 +19215,8 @@
 qV:{
 "^":"a;oc>,P>",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
 return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:112;",
@@ -18985,22 +19259,22 @@
 A.Ok()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
+jh:{
 "^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
 tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19012,16 +19286,16 @@
 C.kD.ZL(a)
 C.kD.G6(a)
 return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
 aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
 C.SU.ZL(a)
 C.SU.G6(a)
 return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
 "@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19062,27 +19336,27 @@
 C.nn.ZL(a)
 C.nn.G6(a)
 return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
 wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19096,14 +19370,14 @@
 C.J7.ZL(a)
 C.J7.G6(a)
 return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19118,16 +19392,16 @@
 C.lx.ZL(a)
 C.lx.G6(a)
 return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19142,16 +19416,16 @@
 C.RR.ZL(a)
 C.RR.G6(a)
 return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19166,16 +19440,16 @@
 C.ct.ZL(a)
 C.ct.G6(a)
 return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19190,30 +19464,30 @@
 C.xE.ZL(a)
 C.xE.G6(a)
 return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
 z.pC()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
 z.pC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19227,17 +19501,17 @@
 C.k0.G6(a)
 C.k0.ZB(a)
 return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
 A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"formatSize"],
+at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19287,8 +19561,8 @@
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19306,16 +19580,16 @@
 x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 nq:[function(a,b){if(!this.gnz(a))return
 if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19330,7 +19604,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19381,22 +19655,21 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.BN(0)){if(w)y.push([u,t])
 v=!0}$.tW.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.iU()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
 $.Td=!1},"call$0","D6",0,0,null],
 Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -19418,14 +19691,14 @@
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
 return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -19498,10 +19771,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -19512,7 +19785,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -19562,7 +19835,7 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -19581,7 +19854,8 @@
 y=J.WB(z,J.q8(u.ok.G4))
 x=q.jr
 p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
 z=J.xH(q.dM,J.q8(q.ok.G4))
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -19602,11 +19876,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -19616,7 +19890,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,73,[],255,[]],
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
 d3:{
 "^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
 "^":"",
 xh:{
 "^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",368],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
@@ -19737,7 +19951,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -19765,10 +19979,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19791,7 +20015,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19808,7 +20032,7 @@
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
 if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
 x=c-b
 w=this.h3
@@ -19827,14 +20051,31 @@
 z=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+x=z.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(z,x+y)
+w=z.length
+H.qG(z,b+y,w,this,b)
+H.ed(z,b,c)
+this.nU(x,z.length)
+z=this.xg
+if(z!=null){w=z.iE
+z=w==null?z!=null:w!==z}else z=!1
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
 if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
-if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
 oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -19879,7 +20114,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
 qC:{
 "^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -19923,7 +20158,7 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -19933,7 +20168,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -19950,76 +20185,61 @@
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
+if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+if(!!z.$isqI)return J.de(a.oc,b)
+if(!!z.$isHA){z=J.x(b)
+if(!!z.$iswv)b=z.gfN(b)
+return J.de(a.G3,b)}return!1},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){z.PU(b,c)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
 a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
@@ -20042,7 +20262,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20059,7 +20279,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20102,7 +20322,7 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
 z=this.BK
 if(a>=z.length)return H.e(z,a)
 x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
 w.dB=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
 w.dB=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -20156,16 +20375,16 @@
 call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 Md:{
 "^":"Tp:115;",
@@ -20174,16 +20393,16 @@
 "^":"",
 Jk:[function(a){var z,y,x
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
 km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
 yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.x(y)
+if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -20246,36 +20462,34 @@
 w.send()
 w=w.responseText
 return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
 if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
 a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
 ZI:[function(a,b){var z,y
 if(a==null)return
@@ -20283,25 +20497,23 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20333,14 +20545,14 @@
 return d}if(c.tg(0,a))return d
 c.h(c,a)
 for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+v=J.x(w)
+if(!!v.$isQj)A.GA(w.import,w.href,c,d)
+else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
 d.push(u===""?b:u)
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -20392,12 +20604,11 @@
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();){l=z.gl()
 for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+if(!!J.x(k).$isV3){q=k.ns
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -20421,11 +20632,10 @@
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
 z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?z:M.Ky(z))
+else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
@@ -20452,17 +20662,15 @@
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
 v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},"call$0","gGy",0,0,null],
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -20490,14 +20698,14 @@
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
+x=y.gIf().fN
+w=J.rY(x)
+if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
+x=w.Nj(x,0,J.xH(w.gB(x),7))
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -20567,16 +20774,16 @@
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
 "^":"Tp:112;",
@@ -20587,8 +20794,8 @@
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
 "^":"Tp:115;",
@@ -20597,14 +20804,14 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
 $isEH:true},
 yL:{
-"^":"nd;",
+"^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
 x=null}else x=this.Tp(a,y)
 else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
@@ -20649,14 +20854,13 @@
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=z==null
 if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
 this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+if(!!J.x(d).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
@@ -20762,7 +20963,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -20786,7 +20987,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,583,378,[]],
+ea:[function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
 "^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
 $isEH:true},
 TV:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 Oa:{
 "^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -20866,26 +21064,26 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 Rs:{
 "^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+x=J.x(y)
+if(!x.$iszs)return
 w=this.c
 if(0>=w.length)return H.e(w,0)
 if(w[0]==="@"){v=this.d
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 uJ:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:112;",
@@ -20908,16 +21106,15 @@
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
 this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -20931,17 +21128,16 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
 $isEH:true},
 Fn:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
-jh:{
+Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
 W6:{
 "^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:112;a",
 call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
 PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
 o8:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 e9:{
 "^":"ve;",
@@ -21065,65 +21259,60 @@
 y.w5()
 x=y.o9()
 if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
 Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$2:[function(a,b){var z
+if(!J.x(a).$isz6){z=this.a.nF
+a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 uK:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$1:[function(a){var z
+if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
 try{J.UK(y,new K.Ed(this.a9))
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
 $.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
 "^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
 "^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21136,31 +21325,29 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
 x.push(w.gT8())
 z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
 v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
 if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.call$0()
 u=J.vF(z.a)}else{y.call$0()
 u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
 Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
 else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
-if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
 if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
 tI:[function(a){var z
@@ -21286,12 +21472,12 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
 G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21333,21 +21519,21 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
 Os:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21391,27 +21577,27 @@
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21424,21 +21610,20 @@
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+x=J.x(y)
+if(!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21458,7 +21643,7 @@
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x,w
+Qh:[function(a){var z,y,x
 z=this.KL
 y=$.e6().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
 this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
@@ -21491,20 +21672,19 @@
 return}y=this.KL
 x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
+tE:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
 x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
@@ -21553,13 +21732,12 @@
 call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
@@ -21581,11 +21759,11 @@
 call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
 $isfk:true},
 wL:{
 "^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -21600,33 +21778,33 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -21722,12 +21896,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -21771,10 +21943,10 @@
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
 BH:[function(a,b){var z,y,x,w,v
 for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
 z.toString
@@ -21782,25 +21954,21 @@
 z.toString
 a=new U.zX(a,w)}else break
 else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
 this.w5()
 v=this.o9()
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
 qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -21832,7 +22000,7 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
 Ai:[function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -21907,28 +22075,26 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
 yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
 Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -21945,7 +22111,7 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
@@ -21965,14 +22131,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
 hA:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22128,27 +22294,27 @@
 C.Cc.ZL(a)
 C.Cc.G6(a)
 return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
 gD5:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22164,17 +22330,17 @@
 C.c0.ZL(a)
 C.c0.G6(a)
 return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
@@ -22188,9 +22354,9 @@
 y=J.UQ(z.gu9(),J.f2(b))
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22205,16 +22371,16 @@
 C.cJ.ZL(a)
 C.cJ.G6(a)
 return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-qq:{
+l0:{
 "^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
 this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
 $isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
 "^":"",
 Er:[function(a){var z
 if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
 return z},"call$1","XI",2,0,null,190,[]],
 Io:[function(a){var z=J.rY(a)
 if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
 Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
 f3:[function(a,b,c){var z,y,x,w,v
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
 if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
 Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
 if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
 switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
 z.H4(b,c)
@@ -22252,31 +22419,29 @@
 z.$builtinTypeInfo=[null,null]
 z=new D.SI(z,b,null,null,null,null,null,null,null)
 z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
 G8:{
 "^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
 Jb:[function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"id")
 z.t(a,"type")
 if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
 z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
 fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.cI().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
@@ -22284,58 +22449,44 @@
 x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
 $asG8:function(){return[D.rj]},
 static:{"^":"RI"}},
 q1:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
 $isEH:true},
 jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.xN().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
 x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
 pl:[function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
 $asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
 Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
 $isEH:true},
 du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.Yk().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
 $asG8:function(){return[D.SI]},
 static:{"^":"Oi"}},
 xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.uG().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
 return y},"call$1","gUU",2,0,null,98,[]],
 $asG8:function(){return[D.SI]},
 static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
 bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
 gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
 z=D.SI
 y=J.O
 this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
 z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
 ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
 this.fq.toString
 z=$.cI().Ej
 y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
 z=$.uG().Ej
 if(y)H.vh(new P.AT(a))
 if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
 tM:[function(a,b){var z,y,x,w
 D.Ch(b,this.zf,this)
 this.nr=!1
@@ -22432,9 +22660,9 @@
 y=F.Wi(this,C.tP,this.cL,y)
 this.cL=y
 y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
 if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
 x=H.B7([],P.L5(null,null,null,null,null))
 J.kH(z.t(b,"timers"),new D.Qq(x))
 y=this.LE
@@ -22446,33 +22674,71 @@
 w.u(y,"dart",x.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,y)
+y=J.UQ(z.t(b,"heap"),"capacityNew")
+this.p2=F.Wi(this,C.So,this.p2,y)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[function(a,b){this.FF=0
+this.bj=a
+if(a==null)return
+if(J.u6(J.q8(a),3))return
+return this.AW(b)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.bj
+y=this.FF
+if(typeof y!=="number")return y.g()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
 $isbv:true},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
 call$1:[function(a){var z=this.a
 return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 Qq:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
 $isEH:true},
 Qd:{
 "^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
 gzf:function(){return this.Gt},
 VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
 l9:[function(a){var z=[]
 J.kH(this.i2,new D.i6(a,z))
 H.bQ(z,new D.r2(this))
 J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
 AQ:[function(a){var z,y,x,w
 z=this.i2
 y=J.U6(z)
@@ -22480,14 +22746,14 @@
 if(x!=null)return x
 w=P.L5(null,null,null,J.O,J.GW)
 w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
 x.nr=C.xB.nC("@Isolate","@")
 x.mQ=D.Io("@Isolate")
 x.DC(0)
 x.pC()
 y.u(z,a,x)
 x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
 Ze:[function(a){var z,y,x,w,v
 z=J.UQ(a,"id")
 y=this.i2
@@ -22496,21 +22762,21 @@
 if(w!=null){w.eC(a)
 return w}v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 w.H4(null,a)
 w.pC()
 x.u(y,z,w)
 w.xW(0)
 return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
 i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 r2:{
 "^":"Tp:112;c",
 call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
 $isEH:true},
 JB:{
 "^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
 w=J.U6(x)
 if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 u.H4(null,a)
 u.pC()
 N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
 w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
 $isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
 $isEH:true},
 BH:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
 FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
 aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
 u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
 nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 k0:[function(a){return},"call$0","gqw",0,0,114],
 ni:[function(a){this.RF.AP=null
 return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
 $isd3:true},
 pt:{
 "^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
 tM:[function(a,b){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,this.LD,z)
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
 aq:[function(a){var z,y,x,w,v
 if(this.nr)this.xW(0)
 z=J.U6(a)
@@ -22641,7 +22907,7 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
 W8:[function(a){var z,y,x,w,v
 this.nr=!0
 if(a==null)return
@@ -22653,7 +22919,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
 $isrj:true},
 dZL:{
 "^":"af+Pi;",
@@ -22662,50 +22928,56 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
 kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
 PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
 this.Du=0
 this.fF=0
@@ -22727,7 +22999,7 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
 eL:[function(a,b,c){var z,y
 this.jv=F.Wi(this,C.QK,this.jv,c)
 z=J.U6(a)
@@ -22739,8 +23011,8 @@
 if(y!=null)this.pd(y)
 z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
 y=this.Fm
 y=D.Lr(y.zf,y,z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
 x=z.t(b,"disassembly")
 if(x!=null)this.xs(x)
 z=this.va
 y=J.U6(z)
 this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
 xs:[function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
@@ -22774,7 +23049,7 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
 pd:[function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.yP
@@ -22785,117 +23060,49 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
 tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
 dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
 F3:[function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
 Ov:[function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
 UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
 call$2:[function(a,b){var z,y
 z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
 if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
 z6:[function(a,b){var z=this.Yu
 N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
 dT:{
 "^":"Tp:112;",
 call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
 return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
 z6:[function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
 J.X8(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
 case"Function":z=W.r3("function-view",null)
 J.dk(z,a.mC)
 return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
 case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
 case"IsolateList":z=W.r3("isolate-list",null)
 J.oq(z,a.mC)
 return z
@@ -22965,7 +23178,7 @@
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -22988,32 +23201,32 @@
 C.ZO.ZL(a)
 C.ZO.G6(a)
 return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23028,15 +23241,43 @@
 C.wU.ZL(a)
 C.wU.G6(a)
 return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
 "^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"change"],
+"@":function(){return[C.mS]},
+static:{Al:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.fA.ZL(a)
+C.fA.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23050,16 +23291,16 @@
 C.dX.ZL(a)
 C.dX.G6(a)
 return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23073,20 +23314,20 @@
 C.bg.ZL(a)
 C.bg.G6(a)
 return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -23094,7 +23335,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+if(!!z.$iscv)return M.F5(a,b)
+if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],285,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -23124,9 +23365,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23154,7 +23395,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23172,30 +23413,30 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.of(a,"expando$values")
 x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+w=J.x(a)
+if(!!w.$isMi)x=new M.ee(a,null,null)
+else if(!!w.$islp)x=new M.ug(a,null,null)
+else if(!!w.$isAE)x=new M.wl(a,null,null)
+else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
 return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
 "^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
 y=this.gN1()
 if(z){H.Go(y,"$isQl")
 y.toString
@@ -23221,29 +23460,29 @@
 z=d!=null?d:""
 x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v,u
+EC:[function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+y=J.x(z)
+if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
+if(!!J.x(x).$isSA){w=z.value
+v=x}else{w=null
+v=null}}else{w=null
+v=null}M.NP.prototype.EC.call(this,a)
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
 $isEH:true},
 fTP:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
 "^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
 J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
+x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
 z=J.O6(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 jz:{
 "^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
@@ -23347,14 +23585,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:112;",
@@ -23367,8 +23605,7 @@
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23382,7 +23619,7 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
@@ -23392,7 +23629,7 @@
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){var z,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+y=this.N1
+x=d!=null?d:""
+x=new M.SA(null,null,y,c,null,null,b,x)
+x.Og(y,b,c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
 Z1:[function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
@@ -23462,7 +23693,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23495,32 +23726,30 @@
 P.rb(z.gjM())}},"call$0","geB",0,0,null],
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(z)
+x=z.gdv()
+if(x==null){x=M.iX(y,b)
+z.sdv(x)}w=this.IT
+if(w==null){v=J.VN(this.N1)
+w=$.JM()
+u=w.t(0,v)
 if(u==null){u=v.implementation.createHTMLDocument("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+w.u(0,v,u)}this.IT=u
+w=u}t=M.Fz(y,w)
+M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+gnv:function(a){var z,y,x,w
 this.Sy()
 z=J.Vs(this.N1).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.N1)
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
 gjb:function(a){var z
 this.Sy()
 z=this.jH
@@ -23529,43 +23758,38 @@
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+w=J.RE(x)
+x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
+if(x){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
 v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
 v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
 u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
 if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+y=J.x(z)
+if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23580,38 +23804,37 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
 "^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gH:function(){var z=this.ud
+z.toString
+return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.ao(this.lr,this.ay,null)},
 cO:[function(a){var z=this.ud
 if(z==null)return
@@ -23620,7 +23843,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23632,7 +23855,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -23662,7 +23885,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23687,11 +23910,11 @@
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+y=J.x(a)
+if(!!y.$isList){this.xG=a
+x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
-x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
@@ -23709,7 +23932,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
 y=z.N1
-x=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
+w=J.RE(y)
+if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
 return}if(!this.U9){this.U9=!0
-if(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+if(x!=null){this.DO=x.CE(y)
+this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
+for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
+for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
 r=s.gNg()
 if(typeof r!=="number")return H.s(r)
-t-=r}for(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+t-=r}for(w=w.gA(a);w.G();){s=w.gl()
+for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
+n=v.Rz(0,o)
 if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
 m=q.gkU(n)
 l=q.gyT(n)
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
+k=o!=null?z.a5(o,x,m):null
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,650,254,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23783,20 +24004,20 @@
 this.pq=!0},"call$0","gJK",0,0,null]},
 VU:{
 "^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
 Z1:[function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+y=this.N1
+x=d!=null?d:""
+x=new M.NP(null,y,c,null,null,"value",x)
+x.Og(y,"value",c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
 ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
 this.qP=null
 this.ZY=null},"call$0","gJK",0,0,null],
 Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+z=J.x(this.ZY)
+z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
 y=this.ZY
 if(z){this.xS=y
 z=y}else{z=L.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
 VD:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
@@ -24001,9 +24220,9 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
-F.d3.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
+F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
 D.bv.$isaf=true
 D.bv.$isa=true
 D.c2.$isa=true
-D.Vi.$isVi=true
 D.Vi.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
 H.Uz.$isej=true
 H.Uz.$isej=true
 H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
 P.dl.$isdl=true
 P.dl.$isa=true
 V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
+J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lp=function(a,b){return J.RE(a).st5(a,b)}
 J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
+J.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.Mz=function(a){return J.rY(a).hc(a)}
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
+J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
 J.QP=function(a){return J.RE(a).gF1(a)}
-J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
 J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
 J.VN=function(a){return J.RE(a).gM0(a)}
+J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vq=function(a){return J.RE(a).xo(a)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
+J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
+return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
 J.ti=function(a,b){return J.RE(a).sQr(a,b)}
@@ -24308,8 +24543,10 @@
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
 C.J0=B.G6.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
 C.IU=new P.kF()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
 C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
 C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.IK=O.CN.prototype
 C.YD=F.Be.prototype
 C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
 C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.kQ])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
 C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
 C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
 C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
 C.cJ=U.fI.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
 C.dX=K.nm.prototype
 C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
 C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
 C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
 C.VJ=new H.GD("object")
+C.xG=new H.GD("objectPool")
+C.Le=new H.GD("oldHeapCapacity")
 C.ap=new H.GD("oldHeapUsed")
 C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
+C.bE=new H.GD("sampleDepth")
+C.kA=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
 C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
 C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
 C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
 C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
   }
 }())})
 I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?: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))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -24899,7 +25164,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -24910,7 +25175,7 @@
 I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -24918,7 +25183,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
 $desc=$collectedClasses.Ny
 if($desc instanceof Array)$desc=$desc[1]
 Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
 function Zv(){}Zv.builtin$cls="Zv"
 if(!"name" in Zv)Zv.name="Zv"
 $desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
 $desc=$collectedClasses.Fs
 if($desc instanceof Array)$desc=$desc[1]
 Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
 Fs.prototype.goc=function(receiver){return receiver.name}
 Fs.prototype.soc=function(receiver,v){return receiver.name=v}
 Fs.prototype.gLA=function(receiver){return receiver.src}
 Fs.prototype.gt5=function(receiver){return receiver.type}
 Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
 function Ty(){}Ty.builtin$cls="Ty"
 if(!"name" in Ty)Ty.name="Ty"
 $desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
 $desc=$collectedClasses.Uq
 if($desc instanceof Array)$desc=$desc[1]
 Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
 if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
 function Rt(){}Rt.builtin$cls="Rt"
 if(!"name" in Rt)Rt.name="Rt"
 $desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
 function wa(){}wa.builtin$cls="wa"
 if(!"name" in wa)wa.name="wa"
 $desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
 $desc=$collectedClasses.tX
 if($desc instanceof Array)$desc=$desc[1]
 tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
 tX.prototype.goc=function(receiver){return receiver.name}
 tX.prototype.soc=function(receiver,v){return receiver.name=v}
 tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
 function Sg(){}Sg.builtin$cls="Sg"
 if(!"name" in Sg)Sg.name="Sg"
 $desc=$collectedClasses.Sg
 if($desc instanceof Array)$desc=$desc[1]
 Sg.prototype=$desc
 Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
 function pA(){}pA.builtin$cls="pA"
 if(!"name" in pA)pA.name="pA"
 $desc=$collectedClasses.pA
 if($desc instanceof Array)$desc=$desc[1]
 pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
 pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
 function Mi(){}Mi.builtin$cls="Mi"
 if(!"name" in Mi)Mi.name="Mi"
 $desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
 Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
 Mi.prototype.st5=function(receiver,v){return receiver.type=v}
 Mi.prototype.gP=function(receiver){return receiver.value}
 Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
 function Gt(){}Gt.builtin$cls="Gt"
 if(!"name" in Gt)Gt.name="Gt"
 $desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
 In.prototype.goc=function(receiver){return receiver.name}
 In.prototype.soc=function(receiver,v){return receiver.name=v}
 In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
 if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
 function eP(){}eP.builtin$cls="eP"
 if(!"name" in eP)eP.name="eP"
 $desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
 if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
 G7.prototype=$desc
 G7.prototype.gRn=function(receiver){return receiver.data}
 G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
 G7.prototype.goc=function(receiver){return receiver.name}
 G7.prototype.soc=function(receiver,v){return receiver.name=v}
 G7.prototype.gt5=function(receiver){return receiver.type}
 G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
 function l9(){}l9.builtin$cls="l9"
 if(!"name" in l9)l9.name="l9"
 $desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
 Xp.prototype.gt5=function(receiver){return receiver.type}
 Xp.prototype.gP=function(receiver){return receiver.value}
 Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
 if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
 function mX(){}mX.builtin$cls="mX"
 if(!"name" in mX)mX.name="mX"
 $desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
 HD.prototype.soc=function(receiver,v){return receiver.name=v}
 HD.prototype.gP=function(receiver){return receiver.value}
 HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
 if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
 function jg(){}jg.builtin$cls="jg"
 if(!"name" in jg)jg.name="jg"
 $desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
 KR.prototype=$desc
 KR.prototype.gP=function(receiver){return receiver.value}
 KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
 if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
 function fs(){}fs.builtin$cls="fs"
 if(!"name" in fs)fs.name="fs"
 $desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
 lp.prototype.gt5=function(receiver){return receiver.type}
 lp.prototype.gP=function(receiver){return receiver.value}
 lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
 if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
 function I0(){}I0.builtin$cls="I0"
 if(!"name" in I0)I0.name="I0"
 $desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 G5.prototype=$desc
 G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
 if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
 function Lx(){}Lx.builtin$cls="Lx"
 if(!"name" in Lx)Lx.name="Lx"
 $desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
 AE.prototype.gt5=function(receiver){return receiver.type}
 AE.prototype.gP=function(receiver){return receiver.value}
 AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
 if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
 function FH(){}FH.builtin$cls="FH"
 if(!"name" in FH)FH.name="FH"
 $desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
 RH.prototype.gph=function(receiver){return receiver.label}
 RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
 if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
 function OJ(){}OJ.builtin$cls="OJ"
 if(!"name" in OJ)OJ.name="OJ"
 $desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
 $desc=$collectedClasses.dp
 if($desc instanceof Array)$desc=$desc[1]
 dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
 if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
 if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
 $desc=$collectedClasses.tZ
 if($desc instanceof Array)$desc=$desc[1]
 tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
 if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
 function AK(){}AK.builtin$cls="AK"
 if(!"name" in AK)AK.name="AK"
 $desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
 $desc=$collectedClasses.ty
 if($desc instanceof Array)$desc=$desc[1]
 ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
 if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
 function F2(){}F2.builtin$cls="F2"
 if(!"name" in F2)F2.name="F2"
 $desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
 $desc=$collectedClasses.y5
 if($desc instanceof Array)$desc=$desc[1]
 y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
 function jQ(){}jQ.builtin$cls="jQ"
 if(!"name" in jQ)jQ.name="jQ"
 $desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
 function lv(){}lv.builtin$cls="lv"
 if(!"name" in lv)lv.name="lv"
 $desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
 lv.prototype=$desc
 lv.prototype.gt5=function(receiver){return receiver.type}
 lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
 if($desc instanceof Array)$desc=$desc[1]
 pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
 function NV(){}NV.builtin$cls="NV"
 if(!"name" in NV)NV.name="NV"
 $desc=$collectedClasses.NV
 if($desc instanceof Array)$desc=$desc[1]
 NV.prototype=$desc
 NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
 function W1(){}W1.builtin$cls="W1"
 if(!"name" in W1)W1.name="W1"
 $desc=$collectedClasses.W1
 if($desc instanceof Array)$desc=$desc[1]
 W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
 function mCz(){}mCz.builtin$cls="mCz"
 if(!"name" in mCz)mCz.name="mCz"
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
 function kK(){}kK.builtin$cls="kK"
 if(!"name" in kK)kK.name="kK"
 $desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
 kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
 function NdT(){}NdT.builtin$cls="NdT"
 if(!"name" in NdT)NdT.name="NdT"
 $desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
 $desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
 Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
 if($desc instanceof Array)$desc=$desc[1]
 me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
 me.prototype.gmH=function(receiver){return receiver.href}
 function oB(){}oB.builtin$cls="oB"
 if(!"name" in oB)oB.name="oB"
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
 function NY(){}NY.builtin$cls="NY"
 if(!"name" in NY)NY.name="NY"
 $desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
 if($desc instanceof Array)$desc=$desc[1]
 EI.prototype=$desc
 EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
 function MI(){}MI.builtin$cls="MI"
 if(!"name" in MI)MI.name="MI"
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
 function rg(){}rg.builtin$cls="rg"
 if(!"name" in rg)rg.name="rg"
 $desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
 rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
 function eW(){}eW.builtin$cls="eW"
 if(!"name" in eW)eW.name="eW"
 $desc=$collectedClasses.eW
 if($desc instanceof Array)$desc=$desc[1]
 eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
 function kL(){}kL.builtin$cls="kL"
 if(!"name" in kL)kL.name="kL"
 $desc=$collectedClasses.kL
 if($desc instanceof Array)$desc=$desc[1]
 kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
 if($desc instanceof Array)$desc=$desc[1]
 Fu.prototype=$desc
 Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
 function QN(){}QN.builtin$cls="QN"
 if(!"name" in QN)QN.name="QN"
 $desc=$collectedClasses.QN
 if($desc instanceof Array)$desc=$desc[1]
 QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
 QN.prototype.gmH=function(receiver){return receiver.href}
 function N9(){}N9.builtin$cls="N9"
 if(!"name" in N9)N9.name="N9"
 $desc=$collectedClasses.N9
 if($desc instanceof Array)$desc=$desc[1]
 N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
 function BA(){}BA.builtin$cls="BA"
 if(!"name" in BA)BA.name="BA"
 $desc=$collectedClasses.BA
 if($desc instanceof Array)$desc=$desc[1]
 BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
 if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
 function zp(){}zp.builtin$cls="zp"
 if(!"name" in zp)zp.name="zp"
 $desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
 $desc=$collectedClasses.br
 if($desc instanceof Array)$desc=$desc[1]
 br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
 br.prototype.gmH=function(receiver){return receiver.href}
 function PIw(){}PIw.builtin$cls="PIw"
 if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
 if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
 function kN(){}kN.builtin$cls="kN"
 if(!"name" in kN)kN.name="kN"
 $desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
 $desc=$collectedClasses.Gr
 if($desc instanceof Array)$desc=$desc[1]
 Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
 Gr.prototype.gmH=function(receiver){return receiver.href}
 function XE(){}XE.builtin$cls="XE"
 if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
 function j24(){}j24.builtin$cls="j24"
 if(!"name" in j24)j24.name="j24"
 $desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
 $desc=$collectedClasses.rQ
 if($desc instanceof Array)$desc=$desc[1]
 rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
 if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
 function LR(){}LR.builtin$cls="LR"
 if(!"name" in LR)LR.name="LR"
 $desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
 $desc=$collectedClasses.hy
 if($desc instanceof Array)$desc=$desc[1]
 hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
 function mq(){}mq.builtin$cls="mq"
 if(!"name" in mq)mq.name="mq"
 $desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
 $desc=$collectedClasses.CG
 if($desc instanceof Array)$desc=$desc[1]
 CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
 if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
 function y0(){}y0.builtin$cls="y0"
 if(!"name" in y0)y0.name="y0"
 $desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
 function Dn(){}Dn.builtin$cls="Dn"
 if(!"name" in Dn)Dn.name="Dn"
 $desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
 $desc=$collectedClasses.pyk
 if($desc instanceof Array)$desc=$desc[1]
 pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
 pyk.prototype.gmH=function(receiver){return receiver.href}
 function ZD(){}ZD.builtin$cls="ZD"
 if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
 $desc=$collectedClasses.Ja
 if($desc instanceof Array)$desc=$desc[1]
 Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
 if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
 function hW(){}hW.builtin$cls="hW"
 if(!"name" in hW)hW.name="hW"
 $desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
 if($desc instanceof Array)$desc=$desc[1]
 xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
 if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
 function Et(){}Et.builtin$cls="Et"
 if(!"name" in Et)Et.name="Et"
 $desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
 $desc=$collectedClasses.Zn
 if($desc instanceof Array)$desc=$desc[1]
 Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
 if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
 function tG(){}tG.builtin$cls="tG"
 if(!"name" in tG)tG.name="tG"
 $desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
 $desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
 IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
 if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
 $desc=$collectedClasses.GW
 if($desc instanceof Array)$desc=$desc[1]
 GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
 if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
 function VP(){}VP.builtin$cls="VP"
 if(!"name" in VP)VP.name="VP"
 $desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
 f0.prototype.gi2=function(receiver){return this.i2}
 f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
-this.Qy=Qy
+this.um=um
 this.PX=PX
 this.RW=RW
 this.C9=C9
@@ -26901,11 +27326,11 @@
 $desc=$collectedClasses.Vg
 if($desc instanceof Array)$desc=$desc[1]
 Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
 if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
 function Z6(JE,Jz){this.JE=JE
 this.Jz=Jz}Z6.builtin$cls="Z6"
 if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 ku.prototype=$desc
 ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
 if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
 function xQ(){}xQ.builtin$cls="xQ"
 if(!"name" in xQ)xQ.name="xQ"
 $desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
 if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 Eq.prototype=$desc
 Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
 if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
 function tD(dw,Iq,is,p6){this.dw=dw
 this.Iq=Iq
 this.is=is
@@ -27405,8 +27830,7 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
 this.AP=AP
 this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
 function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27459,7 +27883,7 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -27476,15 +27900,15 @@
 $desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
 Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
 function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27524,11 +27948,11 @@
 Be.prototype.gXx.$reflectable=1
 Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
 Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
 function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
@@ -27560,11 +27984,11 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
 function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27677,21 +28101,21 @@
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
 if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
 function SU7(){}SU7.builtin$cls="SU7"
 if(!"name" in SU7)SU7.name="SU7"
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
 if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
 this.jE=jE
 this.Ay=Ay
 this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
 if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
 this.xq=xq}Sz.builtin$cls="Sz"
 if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
 $desc=$collectedClasses.aY
 if($desc instanceof Array)$desc=$desc[1]
 aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
 this.cP=cP
 this.Jl=Jl
 this.pU=pU
 this.Fh=Fh
 this.Xp=Xp
-this.aj=aj
+this.fb=fb
 this.rb=rb
 this.Zq=Zq
 this.rF=rF
@@ -28559,16 +28989,16 @@
 zG.prototype.gpU=function(){return this.pU}
 zG.prototype.gFh=function(){return this.Fh}
 zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
 zG.prototype.grb=function(){return this.rb}
 zG.prototype.gZq=function(){return this.Zq}
 zG.prototype.gJS=function(receiver){return this.JS}
 zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
 if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
 function dl(){}dl.builtin$cls="dl"
 if(!"name" in dl)dl.name="dl"
 $desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
 if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
 $desc=$collectedClasses.by
 if($desc instanceof Array)$desc=$desc[1]
 by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
 if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
 function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
 if(!"name" in Cf)Cf.name="Cf"
 $desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
 $desc=$collectedClasses.z0
 if($desc instanceof Array)$desc=$desc[1]
 z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
 if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
 function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
 $desc=$collectedClasses.I4
 if($desc instanceof Array)$desc=$desc[1]
 I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
 if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
 function RO(uv,Ph,Sg){this.uv=uv
 this.Ph=Ph
 this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
 if(!"name" in bO)bO.name="bO"
 $desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
 $desc=$collectedClasses.QS
 if($desc instanceof Array)$desc=$desc[1]
 QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
 function ej(){}ej.builtin$cls="ej"
 if(!"name" in ej)ej.name="ej"
 $desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
 $desc=$collectedClasses.Nx
 if($desc instanceof Array)$desc=$desc[1]
 Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
 if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
 function Dg(){}Dg.builtin$cls="Dg"
 if(!"name" in Dg)Dg.name="Dg"
 $desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
 function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
 this.Ab=Ab
 this.Ln=Ln
@@ -29904,11 +30369,11 @@
 rm.prototype.gy4.$reflectable=1
 rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
 rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
 function YW(a){this.a=a}YW.builtin$cls="YW"
 if(!"name" in YW)YW.name="YW"
 $desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -29971,11 +30441,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
 function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.Lk=Lk
@@ -29997,11 +30484,81 @@
 mk.prototype.gZ8.$reflectable=1
 mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
 function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
@@ -30068,11 +30625,11 @@
 jY.prototype.gX3.$reflectable=1
 jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
 jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
 $desc=$collectedClasses.xL
 if($desc instanceof Array)$desc=$desc[1]
 xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
 function As(){}As.builtin$cls="As"
 if(!"name" in As)As.name="As"
 $desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -30200,11 +30767,11 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
 if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
 function Js(a){this.a=a}Js.builtin$cls="Js"
 if(!"name" in Js)Js.name="Js"
 $desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
 function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
 this.Lk=Lk
@@ -30257,11 +30824,30 @@
 u7.prototype.gtf.$reflectable=1
 u7.prototype.stf=function(receiver,v){return receiver.tf=v}
 u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
 function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
@@ -30278,17 +30864,15 @@
 qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
 this.FT=FT
 this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
 this.qO=qO
 this.Hm=Hm
 this.AP=AP
@@ -30302,48 +30886,65 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
 if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30355,20 +30956,63 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
 if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
 if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
 function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
@@ -30395,11 +31039,11 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
 function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -30439,11 +31083,11 @@
 KL.prototype.gN7.$reflectable=1
 KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
 KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30497,12 +31141,12 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
 function tzK(){}tzK.builtin$cls="tzK"
 if(!"name" in tzK)tzK.name="tzK"
 $desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
 if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
 function oBi(){}oBi.builtin$cls="oBi"
 if(!"name" in oBi)oBi.name="oBi"
 $desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
 function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
 this.V4=V4
 this.AP=AP
@@ -30600,11 +31244,11 @@
 Qa.prototype.gV4.$reflectable=1
 Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
 Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
 function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.Hq=Hq
@@ -30636,11 +31280,11 @@
 Ww.prototype.gHq.$reflectable=1
 Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
 Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
 function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.Lk=Lk
@@ -30662,11 +31306,11 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
 function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.iy=iy
 this.AP=AP
@@ -30693,11 +31337,11 @@
 fl.prototype.giy.$reflectable=1
 fl.prototype.siy=function(receiver,v){return receiver.iy=v}
 fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
 function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
@@ -30724,11 +31368,11 @@
 Zt.prototype.gJo.$reflectable=1
 Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
 function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
@@ -30755,13 +31399,13 @@
 iL.prototype.gJo.$reflectable=1
 iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30782,15 +31426,15 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
 function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.Lk=Lk
 this.dZ=dZ
@@ -30891,11 +31535,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
 if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
 $desc=$collectedClasses.pM
 if($desc instanceof Array)$desc=$desc[1]
 pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
 if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
 function W6(){}W6.builtin$cls="W6"
 if(!"name" in W6)W6.name="W6"
 $desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
 $desc=$collectedClasses.Ed
 if($desc instanceof Array)$desc=$desc[1]
 Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
 if(!"name" in G1)G1.name="G1"
 $desc=$collectedClasses.G1
 if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
 iT.prototype=$desc
 iT.prototype.ghP=function(){return this.hP}
 iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
 this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
 if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
 function ey(d){this.d=d}ey.builtin$cls="ey"
 if(!"name" in ey)ey.name="ey"
 $desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
 $desc=$collectedClasses.J1
 if($desc instanceof Array)$desc=$desc[1]
 J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
 this.bm=bm}fk.builtin$cls="fk"
 if(!"name" in fk)fk.name="fk"
 $desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
 function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.Lk=Lk
@@ -31906,11 +32550,11 @@
 knI.prototype.gzw.$reflectable=1
 knI.prototype.szw=function(receiver,v){return receiver.zw=v}
 knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
 if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
 function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.HJ=HJ
 this.AP=AP
@@ -31937,25 +32581,25 @@
 fI.prototype.gHJ.$reflectable=1
 fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
 fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
 if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
 function G8(F1){this.F1=F1}G8.builtin$cls="G8"
 if(!"name" in G8)G8.name="G8"
 $desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
 G8.prototype=$desc
 G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
 if(!"name" in fJ)fJ.name="fJ"
 $desc=$collectedClasses.fJ
 if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
 $desc=$collectedClasses.q1
 if($desc instanceof Array)$desc=$desc[1]
 q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
 if(!"name" in jx)jx.name="jx"
 $desc=$collectedClasses.jx
 if($desc instanceof Array)$desc=$desc[1]
 jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
 function Cn(){}Cn.builtin$cls="Cn"
 if(!"name" in Cn)Cn.name="Cn"
 $desc=$collectedClasses.Cn
 if($desc instanceof Array)$desc=$desc[1]
 Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
 if(!"name" in du)du.name="du"
 $desc=$collectedClasses.du
 if($desc instanceof Array)$desc=$desc[1]
 du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
 if(!"name" in xc)xc.name="xc"
 $desc=$collectedClasses.xc
 if($desc instanceof Array)$desc=$desc[1]
 xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
 this.fq=fq
 this.ne=ne
 this.PH=PH
@@ -32006,7 +32674,12 @@
 this.LE=LE
 this.Cf=Cf
 this.W1=W1
+this.p2=p2
+this.Hw=Hw
 this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
 this.AP=AP
 this.Lk=Lk
 this.Fm=Fm
@@ -32028,16 +32701,20 @@
 bv.prototype.sGR=function(v){return this.f5=v}
 bv.prototype.gLE=function(){return this.LE}
 bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
 function D3(){}D3.builtin$cls="D3"
 if(!"name" in D3)D3.name="D3"
 $desc=$collectedClasses.D3
 if($desc instanceof Array)$desc=$desc[1]
 D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
 if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
 function Qq(a){this.a=a}Qq.builtin$cls="Qq"
 if(!"name" in Qq)Qq.name="Qq"
 $desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
 $desc=$collectedClasses.JB
 if($desc instanceof Array)$desc=$desc[1]
 JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
 function BH(a){this.a=a}BH.builtin$cls="BH"
 if(!"name" in BH)BH.name="BH"
 $desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
 Vi.prototype=$desc
 Vi.prototype.gtT=function(receiver){return this.tT}
 Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
 this.jv=jv
 this.Du=Du
 this.fF=fF
@@ -32208,6 +32896,7 @@
 this.yP=yP
 this.mM=mM
 this.qH=qH
+this.Ni=Ni
 this.MO=MO
 this.oc=oc
 this.zz=zz
@@ -32264,16 +32953,6 @@
 $desc=$collectedClasses.fx
 if($desc instanceof Array)$desc=$desc[1]
 fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
 function UZ(a,b,c){this.a=a
 this.b=b
 this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
 $desc=$collectedClasses.UZ
 if($desc instanceof Array)$desc=$desc[1]
 UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
 if(!"name" in XK)XK.name="XK"
 $desc=$collectedClasses.XK
 if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
 $desc=$collectedClasses.dT
 if($desc instanceof Array)$desc=$desc[1]
 dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
 this.yb=yb
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
 if(!"name" in ho)ho.name="ho"
 $desc=$collectedClasses.ho
 if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
 ob.prototype.gmC.$reflectable=1
 ob.prototype.smC=function(receiver,v){return receiver.mC=v}
 ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
 if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
 function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -32379,11 +33035,47 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
 function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.Lk=Lk
@@ -32405,11 +33097,11 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
 if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
 function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
 this.Lk=Lk
@@ -32431,11 +33123,11 @@
 Vu.prototype.gB3.$reflectable=1
 Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
 Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
 if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 7edc4c9..c0f9dc6 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -170,10 +170,11 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}" anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}" anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}" anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -226,44 +227,12 @@
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 
 </polymer-element>
-<polymer-element name="error-view" extends="observatory-element">
-  <template>
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-danger">
-        <div class="panel-heading">{{ error.kind }}</div>
-        <div class="panel-body">
-          <p>{{ error.message }}</p>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="field-ref" extends="service-ref">
-<template>
-<div>
-  <template if="{{ ref['final'] }}"> final </template>
-  <template if="{{ ref['const'] }}"> const </template>
-  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
-  var
-  </template>
-  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
-  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
-  </template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</div>
-</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="curly-block">
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -306,9 +275,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -332,6 +309,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -339,28 +317,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tbody><tr template="" repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
@@ -368,184 +352,7 @@
   </template>
   
 </polymer-element>
-<polymer-element name="library-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="class-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
-      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
-        </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template="" repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template="" repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal=""></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
-        </div>
-      </div>
-    </div>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="code-ref" extends="service-ref">
-<template>
-  <a href="{{ url }}">{{ name }}</a>
-</template>
-
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
-  <template>
-    <nav-bar>
-      <top-nav-menu></top-nav-menu>
-      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
-      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
-      <nav-refresh callback="{{ refresh }}"></nav-refresh>
-    </nav-bar>
-    <style>
-      .content {
-        padding-left: 10%;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      h1 {
-        font: 400 18px 'Montserrat', sans-serif;
-      }
-      .member, .memberHeader {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
-      }
-      .monospace {
-        font-family: consolas, courier, monospace;
-        font-size: 1em;
-        line-height: 1.2em;
-        white-space: nowrap;
-      }
-    </style>
-    <div class="content">
-      <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tbody><tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
-            <function-ref ref="{{code.function}}">
-            </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </tbody></table>
-    </div>
-    <hr>
-    <div class="content">
-      <template if="{{ code.hasDisassembly }}">
-        <div class="row">
-            <div class="col-md-2 memberHeader">Inclusive</div>
-            <div class="col-md-2 memberHeader">Exclusive</div>
-            <div class="col-md-2 memberHeader">Address</div>
-            <div class="col-md-6 memberHeader">Disassembly</div>
-        </div>
-      </template>
-      <template repeat="{{ instruction in code.instructions }}">
-        <div class="row">
-          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
-          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
-          <div class="col-md-6 monospace">{{ instruction.human }}</div>
-        </div>
-      </template>
-    </div>
-  </template>
-  
-</polymer-element>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay" class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  
-</polymer-element><polymer-element name="eval-box" extends="observatory-element">
+<polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
       .textbox {
@@ -626,7 +433,314 @@
 </polymer-element>
 
 
-<polymer-element name="field-view" extends="observatory-element">
+<polymer-element name="field-ref" extends="service-ref">
+<template>
+<div>
+  <template if="{{ ref['final'] }}"> final </template>
+  <template if="{{ ref['const'] }}"> const </template>
+  <template if="{{ (ref['declared_type']['name'] == 'dynamic' &amp;&amp; !ref['final'] &amp;&amp; !ref['const']) }}">
+  var
+  </template>
+  <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
+  <class-ref ref="{{ ref['declared_type'] }}"></class-ref>
+  </template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</div>
+</template>  </polymer-element><polymer-element name="function-ref" extends="service-ref">
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified &amp;&amp; hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
+
+</polymer-element>
+<polymer-element name="library-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="script-ref" extends="service-ref">
+<template>
+  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element>
+<polymer-element name="class-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
+      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
+        </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="code-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ name }}</a>
+</template>
+
+</polymer-element><polymer-element name="code-view" extends="observatory-element">
+  <template>
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
+      <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Code for {{ code.name }}</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
+            <function-ref ref="{{code.function}}">
+            </function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <div class="content">
+      <template if="{{ code.hasDisassembly }}">
+        <div class="row">
+            <div class="col-md-2 memberHeader">Inclusive</div>
+            <div class="col-md-2 memberHeader">Exclusive</div>
+            <div class="col-md-2 memberHeader">Address</div>
+            <div class="col-md-6 memberHeader">Disassembly</div>
+        </div>
+      </template>
+      <template repeat="{{ instruction in code.instructions }}">
+        <div class="row">
+          <div class="col-md-2 monospace">{{ instruction.formattedInclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedExclusive(code) }}</div>
+          <div class="col-md-2 monospace">{{ instruction.formattedAddress() }}</div>
+          <div class="col-md-6 monospace">{{ instruction.human }}</div>
+        </div>
+      </template>
+    </div>
+  </template>
+  
+</polymer-element>
+<polymer-element name="collapsible-content" extends="observatory-element">
+  <template>
+    <div class="well row">
+      <a on-click="toggleDisplay" class="btn muted unselectable">
+           Raw message... <i class="{{ iconClass }}"></i>
+      </a>
+      <div style="display: {{ displayValue }}" class="well">
+        <content></content>
+      </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="error-view" extends="observatory-element">
+  <template>
+    <div class="row">
+    <div class="col-md-8 col-md-offset-2">
+      <div class="panel panel-danger">
+        <div class="panel-heading">{{ error.kind }}</div>
+        <div class="panel-body">
+          <p>{{ error.message }}</p>
+        </div>
+      </div>
+    </div>
+    </div>
+  </template>
+  
+</polymer-element><polymer-element name="field-view" extends="observatory-element">
   <template>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -742,9 +856,26 @@
   </template>
   
 </polymer-element>
-<polymer-element name="script-ref" extends="service-ref">
+<polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+
+</polymer-element>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
@@ -761,14 +892,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -811,6 +935,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
@@ -856,6 +981,158 @@
   </template>
   
 </polymer-element>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}" line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -875,12 +1152,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -895,23 +1174,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tbody><tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template="" if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </tbody></table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -920,44 +1201,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tbody><tr template="" repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </tbody></table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
@@ -1004,6 +1291,28 @@
 </polymer-element>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -1011,68 +1320,195 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template="" repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template="" repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal=""></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  
+</polymer-element>
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox" class="hide" id="slide-switch" on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
   </template>
   
 </polymer-element>
@@ -1084,38 +1520,81 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedindex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template="" repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
+        <tbody><tr>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
+        </tr>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         </tr><tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </tbody></table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template="" repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}" class="{{ coloring(row) }}" style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   
 </polymer-element>
@@ -1226,9 +1705,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -1240,15 +1727,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tbody><tr template="" repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </tbody></table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index 8bf51c1..decdb06 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -8542,7 +8542,7 @@
 function DartObject(o) {
   this.o = o;
 }
-// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.3.2.
+// Generated by dart2js, the Dart to JavaScript compiler version: 1.3.0-dev.4.1.
 (function($){function dart(){this.x=0}var A=new dart
 delete A.x
 var B=new dart
@@ -8597,7 +8597,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBA:"__$methodCountSelected",gBW:"__$msg",gCO:"_oldPieChart",gDt:"topExclusiveCodes",gDu:"exclusiveTicks",gF0:"__$cls",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gMb:"endAddress",gN7:"__$library",gOc:"_oldPieDataTable",gOl:"__$profile",gP:"value",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXh:"__$instance",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",geb:"__$json",gfF:"inclusiveTicks",gfb:"methodCounts",gfn:"__$text",ghw:"callees",gi2:"isolates",giy:"__$isolate",gk5:"__$devtools",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gxH:"__$app",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzh:"__$iconClass",gzw:"__$line"};init.mangledGlobalNames={BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",WY:"LIVE_AFTER_GC",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC"};(function (reflectionData) {
+;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBW:"__$msg",gCO:"_oldPieChart",gDu:"exclusiveTicks",gFT:"__$sampleCount",gGQ:"_newPieDataTable",gGV:"__$expanded",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gIK:"__$checkedText",gJ0:"_newPieChart",gJo:"__$last",gKM:"$",gKU:"__$link",gKx:"__$callGraphChecked",gL4:"human",gLE:"timers",gLY:"_fullDataTable",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gN7:"__$library",gNo:"__$uncheckedText",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gRd:"line",gSB:"__$active",gSF:"root",gSw:"lines",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVS:"callers",gVa:"__$frame",gWT:"rows",gX3:"_first",gXX:"displayThreshold",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ6:"locationManager",gZ8:"__$function",ga:"a",ga4:"text",gb:"b",gbV:"_combinedDataTable",gc:"c",gd:"d",geb:"__$json",gfF:"inclusiveTicks",gfn:"__$text",ghi:"_fragmentationCanvas",ghw:"callees",gi2:"isolates",gik:"__$displayCutoff",giy:"__$isolate",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gkf:"_count",gkg:"_combinedChart",glb:"__$cls",glh:"__$qualified",gm7:"machine",gmC:"__$object",gnx:"__$callback",goH:"columns",goY:"__$isolate",gpD:"__$profile",gq3:"_fullChart",gqO:"_id",gqe:"__$hasParent",grU:"__$callback",gtT:"code",gtY:"__$ref",gtf:"__$isolates",gtl:"_isolates",gu9:"hits",gvH:"index",gva:"instructions",gvg:"startAddress",gvk:"__$refreshTime",gvt:"__$field",gwd:"children",gy4:"__$results",gyP:"addressTicks",gyt:"depth",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked",gzw:"__$line"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",CF:"_closeIconClass",DP:"ACCUMULATED_SIZE",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",bQj:"ALLOCATED_BEFORE_GC_SIZE",d6:"ALLOCATED_SINCE_GC_SIZE",he:"hitStyleNone",iJN:"hitStyleExecuted",oM:"hitStyleNotExecuted",pC:"ACCUMULATED",r1:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function (reflectionData) {
   "use strict";
   function map(x){x={x:x};delete x.x;return x}
     function processStatics(descriptor) {
@@ -8839,10 +8839,9 @@
 n:[function(a,b){return a===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(a)},
 bu:[function(a){return H.a5(a)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
-$isGv:true,
-"%":"DOMImplementation|SVGAnimatedEnumeration|SVGAnimatedNumberList|SVGAnimatedString"},
+"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
 kn:{
 "^":"bool/Gv;",
 bu:[function(a){return String(a)},"call$0","gXo",0,0,null],
@@ -8866,20 +8865,19 @@
 Q:{
 "^":"List/Gv;",
 h:[function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},"call$1","ght",2,0,null,28,[]],
-KI:[function(a,b){if(b<0||b>=a.length)throw H.b(new P.bJ("value "+b))
-if(!!a.fixed$length)H.vh(P.f("removeAt"))
-return a.splice(b,1)[0]},"call$1","gNM",2,0,null,52,[]],
+a.push(b)},"call$1","ght",2,0,null,30,[]],
 xe:[function(a,b,c){if(b<0||b>a.length)throw H.b(new P.bJ("value "+b))
 if(!!a.fixed$length)H.vh(P.f("insert"))
-a.splice(b,0,c)},"call$2","gQG",4,0,null,52,[],28,[]],
+a.splice(b,0,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
+H.IC(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z
 if(!!a.fixed$length)H.vh(P.f("remove"))
 for(z=0;z<a.length;++z)if(J.de(a[z],b)){a.splice(z,1)
 return!0}return!1},"call$1","guH",2,0,null,132,[]],
 ev:[function(a,b){return H.VM(new H.U5(a,b),[null])},"call$1","gIR",2,0,null,117,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,281,[]],
+for(z=J.GP(b);z.G();)this.h(a,z.gl())},"call$1","gDY",2,0,null,283,[]],
 V1:[function(a){this.sB(a,0)},"call$0","gRa",0,0,null],
 aN:[function(a,b){return H.bQ(a,b)},"call$1","gjw",2,0,null,117,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
@@ -8889,10 +8887,10 @@
 y.fixed$length=init
 for(x=0;x<a.length;++x){w=H.d(a[x])
 if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,330,331,[]],
+y[x]=w}return y.join(b)},"call$1","gNU",0,2,null,340,341,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,198,[]],
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 D6:[function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
 if(c==null)c=a.length
@@ -8920,7 +8918,7 @@
 Vr:[function(a,b){return H.Ck(a,b)},"call$1","gG2",2,0,null,117,[]],
 GT:[function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return H.TK(a,b,c,a.length)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return H.lO(a,b,a.length-1)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
 tg:[function(a,b){var z
 for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
@@ -8932,7 +8930,7 @@
 if(b)return H.VM(a.slice(),[H.Kp(a,0)])
 else{z=H.VM(a.slice(),[H.Kp(a,0)])
 z.fixed$length=init
-return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z}},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
 giO:function(a){return H.eQ(a)},
 gB:function(a){return a.length},
@@ -8942,11 +8940,11 @@
 a.length=b},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){if(!!a.immutable$list)H.vh(P.f("indexed set"))
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 $isList:true,
 $isList:true,
 $aszM:null,
@@ -8992,9 +8990,9 @@
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
-return z},"call$1","gfE",2,0,null,335,[]],
+return z},"call$1","gfE",2,0,null,345,[]],
 WZ:[function(a,b){if(b<2||b>36)throw H.b(P.C3(b))
-return a.toString(b)},"call$1","gEI",2,0,null,33,[]],
+return a.toString(b)},"call$1","gEI",2,0,null,34,[]],
 bu:[function(a){if(a===0&&1/a<0)return"-0.0"
 else return""+a},"call$0","gXo",0,0,null],
 giO:function(a){return a&0x1FFFFFFF},
@@ -9013,7 +9011,8 @@
 if(b<0)return z-b
 else return z+b},"call$1","gQR",2,0,null,109,[]],
 Z:[function(a,b){if((a|0)===a&&(b|0)===b&&0!==b&&-1!==b)return a/b|0
-else return this.yu(a/b)},"call$1","guP",2,0,null,109,[]],
+else{if(typeof b!=="number")H.vh(new P.AT(b))
+return this.yu(a/b)}},"call$1","guP",2,0,null,109,[]],
 cU:[function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},"call$1","gPf",2,0,null,109,[]],
 O:[function(a,b){if(b<0)throw H.b(new P.AT(b))
 return b>31?0:a<<b>>>0},"call$1","gq8",2,0,null,109,[]],
@@ -9040,7 +9039,7 @@
 F:[function(a,b){if(typeof b!=="number")throw H.b(new P.AT(b))
 return a>=b},"call$1","gNH",2,0,null,109,[]],
 $isnum:true,
-static:{"^":"SAz,LN"}},
+static:{"^":"SAz,N6l"}},
 im:{
 "^":"int/P;",
 gbx:function(a){return C.yw},
@@ -9052,10 +9051,10 @@
 gbx:function(a){return C.O4},
 $isdouble:true,
 $isnum:true},
-vT:{
+x1:{
 "^":"im;"},
 VP:{
-"^":"vT;"},
+"^":"x1;"},
 BQ:{
 "^":"VP;"},
 O:{
@@ -9063,8 +9062,8 @@
 j:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},"call$1","gSu",2,0,null,52,[]],
-dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,336,[]],
+return a.charCodeAt(b)},"call$1","gSu",2,0,null,15,[]],
+dd:[function(a,b){return H.ZT(a,b)},"call$1","gYv",2,0,null,346,[]],
 wL:[function(a,b,c){var z,y,x,w
 if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
 z=a.length
@@ -9075,7 +9074,7 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,332,31,[],123,[]],
+if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},"call$2","grS",2,2,null,342,14,[],123,[]],
 g:[function(a,b){if(typeof b!=="string")throw H.b(new P.AT(b))
 return a+b},"call$1","gF1n",2,0,null,109,[]],
 Tc:[function(a,b){var z,y
@@ -9089,7 +9088,7 @@
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
 z=c+b.length
 if(z>a.length)return!1
-return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,332,103,[],52,[]],
+return b===a.substring(c,z)},function(a,b){return this.Qi(a,b,0)},"nC","call$2",null,"gcV",2,2,null,342,103,[],15,[]],
 Nj:[function(a,b,c){var z
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
 if(c==null)c=a.length
@@ -9100,24 +9099,16 @@
 if(J.z8(c,a.length))throw H.b(P.N(c))
 return a.substring(b,c)},function(a,b){return this.Nj(a,b,null)},"yn","call$2",null,"gKj",2,2,null,82,85,[],133,[]],
 hc:[function(a){return a.toLowerCase()},"call$0","gCW",0,0,null],
-bS:[function(a){var z,y,x,w,v,u,t,s
+bS:[function(a){var z,y,x,w,v
 z=a.trim()
 y=z.length
 if(y===0)return z
-x=this.j(z,0)
-if(x===133||x===65279){for(w=1;w<y;){if(w>=y)H.vh(P.N(w))
-v=z.charCodeAt(w)
-if(v===32||v===13||J.Ga(v))++w
-else break}if(w===y)return""}else w=0
-u=y-1
-t=this.j(z,u)
-if(t===133||t===65279)for(;!0;u=s){s=u-1
-if(s<0)H.vh(P.N(s))
-if(s>=y)H.vh(P.N(s))
-v=z.charCodeAt(s)
-if(v===32||v===13||J.Ga(v));else break}else u=y
-if(w===0&&u===y)return z
-return z.substring(w,u)},"call$0","gZH",0,0,null],
+if(this.j(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.j(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},"call$0","gZH",0,0,null],
 U:[function(a,b){var z,y
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
@@ -9126,15 +9117,15 @@
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
-z+=z}return y},"call$1","gEH",2,0,null,337,[]],
+z+=z}return y},"call$1","gEH",2,0,null,347,[]],
 XU:[function(a,b,c){var z,y,x,w
 if(b==null)H.vh(new P.AT(null))
 if(c<0||c>a.length)throw H.b(P.TE(c,0,a.length))
 if(typeof b==="string")return a.indexOf(b,c)
-z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){y=b.yk(a,c)
+z=J.x(b)
+if(!!z.$isVR){y=b.yk(a,c)
 return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,103,[],123,[]],
+return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,103,[],123,[]],
 Pk:[function(a,b,c){var z,y,x
 c=a.length
 if(typeof b==="string"){z=b.length
@@ -9148,7 +9139,7 @@
 if(z.wL(b,a,x)!=null)return x;--x}return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,103,[],123,[]],
 Is:[function(a,b,c){if(b==null)H.vh(new P.AT(null))
 if(c>a.length)throw H.b(P.TE(c,0,a.length))
-return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,332,109,[],85,[]],
+return H.m2(a,b,c)},function(a,b){return this.Is(a,b,0)},"tg","call$2",null,"gdj",2,2,null,342,109,[],85,[]],
 gl0:function(a){return a.length===0},
 gor:function(a){return a.length!==0},
 iM:[function(a,b){var z
@@ -9167,15 +9158,22 @@
 gB:function(a){return a.length},
 t:[function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(new P.AT(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 $isString:true,
 static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"call$1","BD",2,0,null,13,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+default:return!1}},"call$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
+y=a.charCodeAt(b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"call$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+for(z=a.length;b>0;b=y){y=b-1
+if(y>=z)H.vh(P.N(y))
+x=a.charCodeAt(y)
+if(x!==32&&x!==13&&!J.Ga(x))break}return b},"call$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
 zd:[function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"call$2","Ag",4,0,null,14,[],15,[]],
+return z},"call$2","Ag",4,0,null,16,[],17,[]],
 ox:[function(){var z=init.globalState.Xz
 z.GL=z.GL-1},"call$0","q4",0,0,null],
 oT:[function(a,b){var z,y,x,w,v,u
@@ -9186,8 +9184,7 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-x=J.x(y)
-if(typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isList)throw H.b(new P.AT("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
@@ -9208,7 +9205,7 @@
 if(x)u.vV(0,new H.PK(z,a))
 else{y=H.KT(y,[y,y]).BD(a)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,16,[],17,[]],
+else u.vV(0,a)}init.globalState.Xz.bL()},"call$2","wr",4,0,null,18,[],19,[]],
 yl:[function(){var z=init.currentScript
 if(z!=null)return String(z.src)
 if(typeof version=="function"&&typeof os=="object"&&"system" in os)return H.fU()
@@ -9279,14 +9276,14 @@
 self.postMessage(q)}else P.JS(y.t(z,"msg"))
 break
 case"error":throw H.b(y.t(z,"msg"))
-default:}},"call$2","NB",4,0,null,18,[],19,[]],
+default:}},"call$2","NB",4,0,null,20,[],21,[]],
 ZF:[function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
 x=H.Gy(H.B7(["command","log","msg",a],P.L5(null,null,null,null,null)))
 y.toString
 self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
 z=new H.XO(w,null)
-throw H.b(P.FM(z))}},"call$1","o3",2,0,null,20,[]],
+throw H.b(P.FM(z))}},"call$1","o3",2,0,null,22,[]],
 Ws:[function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
@@ -9294,21 +9291,21 @@
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
+w=z.um
 J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
 x=new H.Vg(a,b,c,d)
 if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,21,[],17,[],22,[],23,[],24,[],25,[]],
+init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.call$0()},"call$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
 Gy:[function(a){var z
 if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
 z.il=new H.fP(null)
 return z.h7(a)}else{z=new H.NO(new H.X1())
 z.il=new H.fP(null)
-return z.h7(a)}},"call$1","hX",2,0,null,22,[]],
+return z.h7(a)}},"call$1","hX",2,0,null,24,[]],
 Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"call$1","jr",2,0,null,22,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","vP",2,0,null,26,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,26,[]],
+else return a},"call$1","jr",2,0,null,24,[]],
+VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","lF",2,0,null,28,[]],
+ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"call$1","dD",2,0,null,28,[]],
 PK:{
 "^":"Tp:115;a,b",
 call$0:[function(){this.b.call$1(this.a.a)},"call$0",null,0,0,null,"call"],
@@ -9337,10 +9334,10 @@
 $.jk().onmessage=w
 $.jk().dartPrint = function (object) {}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,pa",
-v8:[function(a,b){if(!this.Qy.n(0,a))return
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,RW<,C9<,lJ,Jp,pa",
+v8:[function(a,b){if(!this.um.n(0,a))return
 if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
-this.PC()},"call$2","gfU",4,0,null,338,[],339,[]],
+this.PC()},"call$2","gfU",4,0,null,348,[],349,[]],
 NR:[function(a){var z,y,x,w,v,u
 if(!this.RW)return
 z=this.lJ
@@ -9356,18 +9353,18 @@
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
 if(w===y.eZ)y.VW()
-y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,339,[]],
+y.qT=y.qT+1}this.RW=!1}this.PC()},"call$1","gtS",2,0,null,349,[]],
 iK:[function(a){var z=this.Jp
 if(z==null){z=[]
 this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},"call$1","gYd",2,0,null,340,[]],
+this.Jp.push(a)},"call$1","gYd",2,0,null,350,[]],
 Hh:[function(a){var z=this.Jp
 if(z==null)return
-J.V1(z,a)},"call$1","gr9",2,0,null,340,[]],
+J.V1(z,a)},"call$1","gr9",2,0,null,350,[]],
 MZ:[function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},"call$2","gvm",4,0,null,338,[],341,[]],
+this.pa=b},"call$2","gvm",4,0,null,348,[],351,[]],
 Wq:[function(a,b){if(J.de(b,2))init.globalState.Xz.Rk.NZ(0,new H.IY(this,new H.oU(a),"ping"))
-else J.Sq(a,null)},"call$2","gWL",4,0,null,340,[],342,[]],
+else J.Sq(a,null)},"call$2","gWL",4,0,null,350,[],352,[]],
 vV:[function(a,b){var z,y
 z=init.globalState.N0
 init.globalState.N0=this
@@ -9388,11 +9385,11 @@
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
-default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gNo",2,0,null,22,[]],
-Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,343,[]],
+default:P.JS("UNKNOWN MESSAGE: "+H.d(a))}},"call$1","gEd",2,0,null,24,[]],
+Zt:[function(a){return this.Gx.t(0,a)},"call$1","gQB",2,0,null,353,[]],
 aU:[function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},"call$2","gPn",4,0,null,343,[],344,[]],
+z.u(0,a,b)},"call$2","gPn",4,0,null,353,[],354,[]],
 PC:[function(){if(this.Gx.X5-this.fW.X5>0||this.RW)J.kW(init.globalState.i2,this.jO,this)
 else this.UM()},"call$0","gi8",0,0,null],
 UM:[function(){J.V1(init.globalState.i2,this.jO)
@@ -9465,11 +9462,11 @@
 if(y)z.call$1(this.b)
 else z.call$0()}}},"call$0",null,0,0,null,"call"],
 $isEH:true},
-Iy:{
+dq:{
 "^":"a;",
 $isbC:true},
 Z6:{
-"^":"Iy;JE,Jz",
+"^":"dq;JE,Jz",
 zY:[function(a,b){var z,y,x,w,v
 z={}
 y=this.Jz
@@ -9483,11 +9480,9 @@
 if(x.gEE()===w){x.Ds(z.a)
 return}y=init.globalState.Xz
 w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
+y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.td(this.JE)},
 $isZ6:true,
 $isbC:true},
@@ -9499,19 +9494,17 @@
 y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 ns:{
-"^":"Iy;hQ,bv,Jz",
+"^":"dq;hQ,bv,Jz",
 zY:[function(a,b){var z,y
 z=H.Gy(H.B7(["command","message","port",this,"msg",b],P.L5(null,null,null,null,null)))
 if(init.globalState.EF===!0){init.globalState.vd.toString
 self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
-if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,22,[]],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
+if(y!=null)y.postMessage(z)}},"call$1","gX8",2,0,null,24,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y,x
-z=J.c1(this.hQ,16)
-y=J.c1(this.Jz,8)
+z=J.Eh(this.hQ,16)
+y=J.Eh(this.Jz,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
@@ -9530,23 +9523,23 @@
 z.fW.Rz(0,y)
 z.PC()},"call$0","gJK",0,0,null],
 FL:[function(a,b){if(this.P0)return
-this.wy(b)},"call$1","gT5",2,0,null,345,[]],
+this.wy(b)},"call$1","gT5",2,0,null,355,[]],
 $isyo:true,
 static:{"^":"Vz"}},
 NA:{
 "^":"Tf;CN,il",
 DE:[function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
 if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return["capability",a.ng]
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 NO:{
 "^":"Nt;il",
 DE:[function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
 if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
-throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,26,[]],
+throw H.b("Illegal underlying port "+H.d(a))},"call$1","goi",2,0,null,28,[]],
 yf:[function(a){if(!!a.$isku)return new H.ku(a.ng)
-throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,26,[]]},
+throw H.b("Capability not serializable: "+H.d(a))},"call$1","gbM",2,0,null,28,[]]},
 II:{
 "^":"AP;RZ",
 Vf:[function(a){var z,y,x,w,v,u
@@ -9564,7 +9557,7 @@
 "^":"a;MD",
 t:[function(a,b){return b.__MessageTraverser__attached_info__},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],346,[]],
+b.__MessageTraverser__attached_info__=c},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){this.MD=[]},"call$0","gb6",0,0,null],
 Xq:[function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
@@ -9573,7 +9566,7 @@
 X1:{
 "^":"a;",
 t:[function(a,b){return},"call$1","gIA",2,0,null,6,[]],
-u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],346,[]],
+u:[function(a,b,c){},"call$2","gj3",4,0,null,6,[],356,[]],
 Hn:[function(a){},"call$0","gb6",0,0,null],
 Xq:[function(){},"call$0","gt6",0,0,null]},
 HU:{
@@ -9582,19 +9575,19 @@
 if(H.VO(a))return this.Pq(a)
 this.il.Hn(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,26,[]],
+try{z=this.I8(a)}finally{this.il.Xq()}return z},"call$1","gyU",2,0,null,28,[]],
 I8:[function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isList))return this.wb(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)return this.TI(a)
-if(typeof a==="object"&&a!==null&&!!z.$isbC)return this.DE(a)
-if(typeof a==="object"&&a!==null&&!!z.$ishq)return this.yf(a)
-return this.YZ(a)},"call$1","gRQ",2,0,null,26,[]],
-YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,26,[]]},
+if(!!z.$isList)return this.wb(a)
+if(!!z.$isZ0)return this.TI(a)
+if(!!z.$isbC)return this.DE(a)
+if(!!z.$ishq)return this.yf(a)
+return this.YZ(a)},"call$1","gRQ",2,0,null,28,[]],
+YZ:[function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")},"call$1","gSG",2,0,null,28,[]]},
 Nt:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y,x,w,v,u
 z=this.il.t(0,a)
 if(z!=null)return z
@@ -9606,7 +9599,7 @@
 this.il.u(0,a,z)
 for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
 if(v>=w)return H.e(z,v)
-z[v]=u}return z},"call$1","gHc",2,0,null,73,[]],
+z[v]=u}return z},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z={}
 y=this.il.t(0,a)
@@ -9617,23 +9610,23 @@
 this.il.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},"call$1","gnM",2,0,null,151,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 OW:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,47,[],347,[],"call"],
+J.kW(this.a.a,z.I8(a),z.I8(b))},"call$2",null,4,0,null,48,[],357,[],"call"],
 $isEH:true},
 Tf:{
 "^":"HU;",
-Pq:[function(a){return a},"call$1","gKz",2,0,null,26,[]],
+Pq:[function(a){return a},"call$1","gKz",2,0,null,28,[]],
 wb:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
 y=this.CN
 this.CN=y+1
 this.il.u(0,a,y)
-return["list",y,this.mE(a)]},"call$1","gHc",2,0,null,73,[]],
+return["list",y,this.mE(a)]},"call$1","gqb",2,0,null,73,[]],
 TI:[function(a){var z,y
 z=this.il.t(0,a)
 if(z!=null)return["ref",z]
@@ -9651,13 +9644,13 @@
 for(;w<y;++w){v=this.I8(z.t(a,w))
 if(w>=x.length)return H.e(x,w)
 x[w]=v}return x},"call$1","gEa",2,0,null,73,[]],
-DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,26,[]],
-yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,26,[]]},
+DE:[function(a){return H.vh(P.SY(null))},"call$1","goi",2,0,null,28,[]],
+yf:[function(a){return H.vh(P.SY(null))},"call$1","gbM",2,0,null,28,[]]},
 AP:{
 "^":"a;",
 QS:[function(a){if(H.ZR(a))return a
 this.RZ=P.Py(null,null,null,null,null)
-return this.XE(a)},"call$1","gia",2,0,null,26,[]],
+return this.XE(a)},"call$1","gia",2,0,null,28,[]],
 XE:[function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
 z=J.U6(a)
@@ -9667,7 +9660,7 @@
 case"map":return this.tv(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
-default:return this.PR(a)}},"call$1","gn0",2,0,null,26,[]],
+default:return this.PR(a)}},"call$1","gn0",2,0,null,28,[]],
 Dj:[function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.t(a,1)
@@ -9678,7 +9671,7 @@
 if(typeof w!=="number")return H.s(w)
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
-return x},"call$1","gMS",2,0,null,26,[]],
+return x},"call$1","gMS",2,0,null,28,[]],
 tv:[function(a){var z,y,x,w,v,u,t,s
 z=P.L5(null,null,null,null,null)
 y=J.U6(a)
@@ -9692,8 +9685,8 @@
 t=J.U6(v)
 s=0
 for(;s<u;++s)z.u(0,this.XE(y.t(w,s)),this.XE(t.t(v,s)))
-return z},"call$1","gwq",2,0,null,26,[]],
-PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,26,[]]},
+return z},"call$1","gwq",2,0,null,28,[]],
+PR:[function(a){throw H.b("Unexpected serialized object")},"call$1","gw1",2,0,null,28,[]]},
 yH:{
 "^":"a;Kf,zu,p9",
 ed:[function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
@@ -9743,17 +9736,15 @@
 n:[function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isku){z=this.ng
+if(!!J.x(b).$isku){z=this.ng
 y=b.ng
 return z==null?y==null:z===y}return!1},"call$1","gUJ",2,0,null,109,[]],
 $isku:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z,y
+wV:[function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}y=J.x(a)
-return typeof a==="object"&&a!==null&&!!y.$isXj},"call$2","b3",4,0,null,6,[],27,[]],
+if(z!=null)return z}return!!J.x(a).$isXj},"call$2","b3",4,0,null,6,[],29,[]],
 d:[function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
@@ -9761,12 +9752,12 @@
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"call$1","mQ",2,0,null,28,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,29,[]],
+return z},"call$1","Sa",2,0,null,30,[]],
+Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"call$1","IT",2,0,null,31,[]],
 eQ:[function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
 a.$identityHash=z}return z},"call$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,30,31,[]],
+vx:[function(a){throw H.b(P.cD(a))},"call$1","Rm",2,0,32,14,[]],
 BU:[function(a,b,c){var z,y,x,w,v,u
 if(c==null)c=H.Rm()
 if(typeof a!=="string")H.vh(new P.AT(a))
@@ -9793,7 +9784,7 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.call$1(a);++v}}}}if(z==null)return c.call$1(a)
-return parseInt(a,b)},"call$3","Yv",6,0,null,32,[],33,[],34,[]],
+return parseInt(a,b)},"call$3","Yv",6,0,null,33,[],34,[],35,[]],
 IH:[function(a,b){var z,y
 if(typeof a!=="string")H.vh(new P.AT(a))
 if(b==null)b=H.Rm()
@@ -9801,7 +9792,7 @@
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.call$1(a)}return z},"call$2","zb",4,0,null,32,[],34,[]],
+return b.call$1(a)}return z},"call$2","zb",4,0,null,33,[],35,[]],
 lh:[function(a){var z,y,x
 z=C.AS(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
@@ -9815,7 +9806,7 @@
 for(y=z<=500,x="",w=0;w<z;w+=500){if(y)v=a
 else{u=w+500
 u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,35,[]],
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},"call$1","Zl",2,0,null,36,[]],
 Cq:[function(a){var z,y,x
 z=[]
 z.$builtinTypeInfo=[J.im]
@@ -9825,12 +9816,12 @@
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,36,[]],
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.VK(z)},"call$1","AL",2,0,null,37,[]],
 eT:[function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,37,[]],
+if(y>65535)return H.Cq(a)}return H.VK(a)},"call$1","Wb",2,0,null,38,[]],
 zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
 if(typeof a!=="number"||Math.floor(a)!==a)H.vh(new P.AT(a))
 if(typeof b!=="number"||Math.floor(b)!==b)H.vh(new P.AT(b))
@@ -9845,22 +9836,22 @@
 if(x.E(a,0)||x.C(a,100)){w=new Date(y)
 if(h)w.setUTCFullYear(a)
 else w.setFullYear(a)
-return w.valueOf()}return y},"call$8","mV",16,0,null,38,[],39,[],40,[],41,[],42,[],43,[],44,[],45,[]],
+return w.valueOf()}return y},"call$8","mV",16,0,null,39,[],40,[],41,[],42,[],43,[],44,[],45,[],46,[]],
 o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"call$1","j1",2,0,null,46,[]],
+return a.date},"call$1","j1",2,0,null,47,[]],
 of:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-return a[b]},"call$2","De",4,0,null,6,[],47,[]],
+return a[b]},"call$2","De",4,0,null,6,[],48,[]],
 aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(new P.AT(a))
-a[b]=c},"call$3","WJ",6,0,null,6,[],47,[],28,[]],
+a[b]=c},"call$3","WJ",6,0,null,6,[],48,[],30,[]],
 zo:[function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
-if(b!=null){z.a=0+b.length
+if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
 if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,15,[],48,[],49,[]],
+return J.jf(a,new H.LI(C.Ka,"call$"+z.a+z.b,0,y,x,null))},"call$3","pT",6,0,null,17,[],49,[],50,[]],
 Ek:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
@@ -9877,26 +9868,27 @@
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
 return y.apply(a,b)}r=[]
-q=0+b.length
+q=b.length
 C.Nm.FV(r,b)
 y=a["call$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"call$3","ra",6,0,null,15,[],48,[],49,[]],
-pL:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.wq
+return y.apply(a,r)},"call$3","ra",6,0,null,17,[],49,[],50,[]],
+mN:[function(a){if(a=="String")return C.Kn
+if(a=="int")return C.c1
 if(a=="double")return C.yX
 if(a=="num")return C.oD
 if(a=="bool")return C.Fm
-if(a=="List")return C.l0
+if(a=="List")return C.E3
 if(a=="Null")return C.x0
-return init.allClasses[a]},"call$1","aC",2,0,null,50,[]],
+return init.allClasses[a]},"call$1","JL",2,0,null,51,[]],
+SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"call$1","EN",2,0,null,6,[]],
 Pq:[function(){var z={x:0}
 delete z.x
 return z},"call$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,51,[]],
+s:[function(a){throw H.b(P.u(a))},"call$1","Ff",2,0,null,52,[]],
 e:[function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"call$2","x3",4,0,null,46,[],52,[]],
+throw H.b(P.N(b))},"call$2","x3",4,0,null,47,[],15,[]],
 b:[function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
@@ -9965,7 +9957,7 @@
 else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
 else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
 else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","Le",14,0,null,57,[],14,[],58,[],59,[],60,[],61,[],62,[]],
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"call$7","mD",14,0,null,57,[],16,[],58,[],59,[],60,[],61,[],62,[]],
 tR:[function(a,b){var z
 if(a==null)return
 z=a.$identity
@@ -10001,7 +9993,7 @@
 n=o.$callName
 if(n!=null){m=d?o:H.SD(o,t)
 w[n]=m}}w["call*"]=z
-return v},"call$6","Eh",12,0,null,46,[],64,[],65,[],66,[],67,[],68,[]],
+return v},"call$6","Xd",12,0,null,47,[],64,[],65,[],66,[],67,[],68,[]],
 vq:[function(a,b){var z=H.eZ
 switch(a){case 0:return function(F,S){return function(){return F.call(S(this))}}(b,z)
 case 1:return function(F,S){return function(a){return F.call(S(this),a)}}(b,z)
@@ -10009,7 +10001,7 @@
 case 3:return function(F,S){return function(a,b,c){return F.call(S(this),a,b,c)}}(b,z)
 case 4:return function(F,S){return function(a,b,c,d){return F.call(S(this),a,b,c,d)}}(b,z)
 case 5:return function(F,S){return function(a,b,c,d,e){return F.call(S(this),a,b,c,d,e)}}(b,z)
-default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],15,[]],
+default:return function(f,s){return function(){return f.apply(s(this),arguments)}}(b,z)}},"call$2","X5",4,0,null,63,[],17,[]],
 SD:[function(a,b){var z,y,x,w
 if(b)return H.Oj(a)
 z=a.length
@@ -10026,7 +10018,7 @@
 $.bf=x}x=y+H.d(x)+","+w+");"
 y=$.OK
 $.OK=J.WB(y,1)
-return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,15,[],69,[]],
+return new Function("F",x+H.d(y)+"}")(a)}else return H.vq(z,a)},"call$2","jI",4,0,null,17,[],69,[]],
 Z4:[function(a,b,c){var z,y
 z=H.eZ
 y=H.yS
@@ -10037,7 +10029,7 @@
 case 4:return function(n,s,r){return function(a,b,c){return s(this)[n](r(this),a,b,c)}}(b,z,y)
 case 5:return function(n,s,r){return function(a,b,c,d){return s(this)[n](r(this),a,b,c,d)}}(b,z,y)
 case 6:return function(n,s,r){return function(a,b,c,d,e){return s(this)[n](r(this),a,b,c,d,e)}}(b,z,y)
-default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],15,[]],
+default:return function(f,s,r,a){return function(){a=[r(this)];Array.prototype.push.apply(a,arguments);return f.apply(s(this),a)}}(c,z,y)}},"call$3","VT",6,0,null,63,[],12,[],17,[]],
 Oj:[function(a){var z,y,x,w,v
 z=a.$stubName
 y=a.length
@@ -10049,33 +10041,33 @@
 x="return function("+v+"){return this."+H.d(H.oN())+"."+H.d(z)+"(this."+H.d(H.Wz())+","+v+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,15,[]],
+return new Function(x+H.d(w)+"}")()}else return H.Z4(y,z,a)},"call$1","n9",2,0,null,17,[]],
 Kq:[function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,46,[],64,[],65,[],66,[],67,[],12,[]],
+return H.iA(a,b,c,!!d,e,f)},"call$6","lu",12,0,null,47,[],64,[],65,[],66,[],67,[],12,[]],
 SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,28,[],71,[]],
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"call$2","H7",4,0,null,30,[],71,[]],
 Go:[function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"call$2","SR",4,0,null,28,[],71,[]],
+H.SE(a,b)},"call$2","CY",4,0,null,30,[],71,[]],
 ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"call$1","RK",2,0,null,72,[]],
 KT:[function(a,b,c){return new H.tD(a,b,c,null)},"call$3","HN",6,0,null,74,[],75,[],76,[]],
 Og:[function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
 return new H.fw(z,b,null)},"call$2","rK",4,0,null,77,[],78,[]],
-N7:[function(){return C.KZ},"call$0","Se",0,0,null],
-mm:[function(a){return new H.cu(a,null)},"call$1","ut",2,0,null,12,[]],
+N7:[function(){return C.KZ},"call$0","BmC",0,0,null],
+uV:[function(a){return new H.cu(a,null)},"call$1","IZ",2,0,null,12,[]],
 VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
 return a},"call$2","Ub",4,0,null,79,[],80,[]],
 oX:[function(a){if(a==null)return
 return a.$builtinTypeInfo},"call$1","Qn",2,0,null,79,[]],
 IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"call$2","PE",4,0,null,79,[],81,[]],
 ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],52,[]],
+return z==null?null:z[c]},"call$3","Pk",6,0,null,79,[],81,[],15,[]],
 Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],52,[]],
+return z==null?null:z[b]},"call$2","tC",4,0,null,79,[],15,[]],
 Ko:[function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
@@ -10179,11 +10171,11 @@
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"call$2","Sj",4,0,null,91,[],92,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,15,[],46,[],87,[]],
+ml:[function(a,b,c){return a.apply(b,c)},"call$3","fW",6,0,null,17,[],47,[],87,[]],
 uc:[function(a){var z=$.NF
 return"Instance of "+(z==null?"<Unknown>":z.call$1(a))},"call$1","zB",2,0,null,98,[]],
 wzi:[function(a){return H.eQ(a)},"call$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],28,[]],
+iw:[function(a,b,c){Object.defineProperty(a, b, {value: c, enumerable: false, writable: true, configurable: true})},"call$3","OU",6,0,null,98,[],71,[],30,[]],
 w3:[function(a){var z,y,x,w,v,u
 z=$.NF.call$1(a)
 y=$.nw[z]
@@ -10264,10 +10256,10 @@
 else w=v===u?w+1:u}return z},"call$2","tl",4,0,null,107,[],108,[]],
 m2:[function(a,b,c){var z,y
 if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.rY(b)
-if(typeof b==="object"&&b!==null&&!!z.$isVR){z=C.xB.yn(a,c)
+else{z=J.x(b)
+if(!!z.$isVR){z=C.xB.yn(a,c)
 y=b.Ej
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,46,[],109,[],85,[]],
+return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"call$3","WL",6,0,null,47,[],109,[],85,[]],
 ys:[function(a,b,c){var z,y,x,w,v
 if(typeof b==="string")if(b==="")if(a==="")return c
 else{z=P.p9("")
@@ -10277,12 +10269,11 @@
 w=z.vM+w
 z.vM=w
 z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else{w=J.x(b)
-if(typeof b==="object"&&b!==null&&!!w.$isVR){v=b.gF4()
+else if(!!J.x(b).$isVR){v=b.gF4()
 v.lastIndex=0
 return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(new P.AT(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}}},"call$3","uF",6,0,null,46,[],110,[],111,[]],
-Zd:{
+throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"call$3","uF",6,0,null,47,[],110,[],111,[]],
+L1:{
 "^":"a;"},
 xQ:{
 "^":"a;"},
@@ -10294,8 +10285,8 @@
 gor:function(a){return!J.de(this.gB(this),0)},
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 Ix:[function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},"call$0","gPb",0,0,null],
-u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,47,[],347,[]],
-Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,47,[]],
+u:[function(a,b,c){return this.Ix()},"call$2","gj3",4,0,null,48,[],357,[]],
+Rz:[function(a,b){return this.Ix()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return this.Ix()},"call$0","gRa",0,0,null],
 FV:[function(a,b){return this.Ix()},"call$1","gDY",2,0,null,109,[]],
 $isZ0:true},
@@ -10304,10 +10295,10 @@
 di:[function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},"call$1","gmc",2,0,null,107,[]],
 x4:[function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,47,[]],
+return this.HV.hasOwnProperty(a)},"call$1","gV9",2,0,null,48,[]],
 t:[function(a,b){if(!this.x4(b))return
-return this.TZ(b)},"call$1","gIA",2,0,null,47,[]],
-TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,47,[]],
+return this.TZ(b)},"call$1","gIA",2,0,null,48,[]],
+TZ:[function(a){return this.HV[a]},"call$1","grz",2,0,null,48,[]],
 aN:[function(a,b){var z,y,x
 z=this.tc
 for(y=0;y<z.length;++y){x=z[y]
@@ -10317,12 +10308,12 @@
 $isyN:true},
 LD:{
 "^":"Tp;a,b",
-call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){return J.de(a,this.b)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
 jJ:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,47,[],"call"],
+call$1:[function(a){return this.a.TZ(a)},"call$1",null,2,0,null,48,[],"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
@@ -10331,14 +10322,13 @@
 "^":"a;lK,uk,xI,rq,FX,Nc",
 gWa:function(){var z,y,x
 z=this.lK
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iswv)return z
-x=$.bx().t(0,z)
-if(x!=null){y=x.split(":")
-if(0>=y.length)return H.e(y,0)
-z=y[0]}y=new H.GD(z)
-this.lK=y
-return y},
+if(!!J.x(z).$iswv)return z
+y=$.bx().t(0,z)
+if(y!=null){x=y.split(":")
+if(0>=x.length)return H.e(x,0)
+z=x[0]}x=new H.GD(z)
+this.lK=x
+return x},
 glT:function(){return this.xI===1},
 ghB:function(){return this.xI===2},
 gnd:function(){var z,y,x,w
@@ -10415,22 +10405,22 @@
 "^":"a;e0",
 gpf:function(){return!0},
 Bj:[function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],329,[]]},
+return J.jf(z==null?a:z,b)},"call$2","gUT",4,0,null,147,[],339,[]]},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,349,[]],
+XL:[function(a){return init.metadata[this.Rn[2*a+this.hG+3]]},"call$1","gZj",2,0,null,359,[]],
 BX:[function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
 if(b<z)return
-return this.Rn[3+b-z]},"call$1","gkv",2,0,null,349,[]],
+return this.Rn[3+b-z]},"call$1","gkv",2,0,null,359,[]],
 Fk:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,349,[]],
+return this.BX(0,this.e4(a-z))},"call$1","gtW",2,0,null,359,[]],
 KE:[function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,349,[]],
+return this.XL(this.e4(a-z))},"call$1","gX4",2,0,null,359,[]],
 e4:[function(a){var z,y,x,w,v,u,t
 z={}
 if(this.NE==null){y=this.hG
@@ -10443,13 +10433,13 @@
 H.rd(y,null)
 H.bQ(y,new H.Nv(z,this,x))}z=this.NE
 if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},"call$1","gIK",2,0,null,350,[]],
+return z[a]},"call$1","gQF",2,0,null,360,[]],
 hl:[function(a){var z,y
 z=this.AM
 if(typeof z=="number")return init.metadata[z]
 else if(typeof z=="function"){y=new a()
 H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,351,[]],
+return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},"call$1","gIX",2,0,null,361,[]],
 gx5:function(){return this.mr.$reflectionName},
 static:{"^":"t4,FV,C1,H6",zh:function(a){var z,y,x,w
 z=a.$reflectionInfo
@@ -10461,7 +10451,7 @@
 w=z[1]
 return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
 Nv:{
-"^":"Tp:30;a,b,c",
+"^":"Tp:32;a,b,c",
 call$1:[function(a){var z,y,x
 z=this.b.NE
 y=this.a
@@ -10472,18 +10462,18 @@
 z[x]=y},"call$1",null,2,0,null,12,[],"call"],
 $isEH:true},
 Cj:{
-"^":"Tp:352;a,b,c",
+"^":"Tp:362;a,b,c",
 call$2:[function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
 this.b.push(b)
-z.a=z.a+1},"call$2",null,4,0,null,12,[],51,[],"call"],
+z.a=z.a+1},"call$2",null,4,0,null,12,[],52,[],"call"],
 $isEH:true},
 u8:{
-"^":"Tp:352;a,b",
+"^":"Tp:362;a,b",
 call$2:[function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"call$2",null,4,0,null,349,[],28,[],"call"],
+else this.a.a=!0},"call$2",null,4,0,null,359,[],30,[],"call"],
 $isEH:true},
 Zr:{
 "^":"a;bT,rq,Xs,Fa,Ga,EP",
@@ -10501,7 +10491,7 @@
 if(x!==-1)y.method=z[x+1]
 x=this.EP
 if(x!==-1)y.receiver=z[x+1]
-return y},"call$1","gul",2,0,null,22,[]],
+return y},"call$1","gul",2,0,null,24,[]],
 static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
 a=a.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
@@ -10511,7 +10501,7 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,22,[]],S7:[function(a){return function($expr$) {
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"call$1","dx",2,0,null,24,[]],S7:[function(a){return function($expr$) {
   var $argumentsExpr$ = '$arguments$'
   try {
     $expr$.$method$($argumentsExpr$);
@@ -10553,8 +10543,7 @@
 return C.xB.gl0(z)?"Error":"Error: "+z},"call$0","gXo",0,0,null]},
 Am:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+call$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
 return a},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 XO:{
@@ -10596,11 +10585,9 @@
 "^":"Tp;"},
 v:{
 "^":"Bp;nw<,jm<,EP,RA>",
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isv)return!1
+if(!J.x(b).$isv)return!1
 return this.nw===b.nw&&this.jm===b.jm&&this.EP===b.EP},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=this.EP
@@ -10619,11 +10606,11 @@
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
 if(z[v]===a)return v}},"call$1","ec",2,0,null,70,[]]}},
-Ll:{
+qq:{
 "^":"a;QW"},
-D2:{
+dN:{
 "^":"a;QW"},
-my:{
+GT:{
 "^":"a;oc>"},
 Pe:{
 "^":"Ge;G1>",
@@ -10634,10 +10621,10 @@
 "^":"Ge;G1>",
 bu:[function(a){return"RuntimeError: "+H.d(this.G1)},"call$0","gXo",0,0,null],
 static:{Ef:function(a){return new H.Eq(a)}}},
-lb:{
+lbp:{
 "^":"a;"},
 tD:{
-"^":"lb;dw,Iq,is,p6",
+"^":"lbp;dw,Iq,is,p6",
 BD:[function(a){var z=this.rP(a)
 return z==null?!1:H.Ly(z,this.za())},"call$1","gQ4",2,0,null,54,[]],
 rP:[function(a){var z=J.x(a)
@@ -10646,8 +10633,8 @@
 z={ "func": "dynafunc" }
 y=this.dw
 x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isnr)z.void=true
-else if(typeof y!=="object"||y===null||!x.$ishJ)z.ret=y.za()
+if(!!x.$isnr)z.void=true
+else if(!x.$ishJ)z.ret=y.za()
 y=this.Iq
 if(y!=null&&y.length!==0)z.args=H.Dz(y)
 y=this.is
@@ -10656,7 +10643,7 @@
 if(y!=null){w={}
 v=H.kU(y)
 for(x=v.length,u=0;u<x;++u){t=v[u]
-w[t]=y[t].za()}z.named=w}return z},"call$0","gpA",0,0,null],
+w[t]=y[t].za()}z.named=w}return z},"call$0","gyv",0,0,null],
 bu:[function(a){var z,y,x,w,v,u,t,s
 z=this.Iq
 if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
@@ -10676,22 +10663,22 @@
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"call$1","At",2,0,null,73,[]]}},
+return z},"call$1","eL",2,0,null,73,[]]}},
 hJ:{
-"^":"lb;",
+"^":"lbp;",
 bu:[function(a){return"dynamic"},"call$0","gXo",0,0,null],
-za:[function(){return},"call$0","gpA",0,0,null],
+za:[function(){return},"call$0","gyv",0,0,null],
 $ishJ:true},
 tu:{
-"^":"lb;oc>",
+"^":"lbp;oc>",
 za:[function(){var z,y
 z=this.oc
 y=init.allClasses[z]
 if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null]},
 fw:{
-"^":"lb;oc>,re<,Et",
+"^":"lbp;oc>,re<,Et",
 za:[function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -10701,7 +10688,7 @@
 if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
-return y},"call$0","gpA",0,0,null],
+return y},"call$0","gyv",0,0,null],
 bu:[function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"},"call$0","gXo",0,0,null]},
 Zz:{
 "^":"Ge;K9",
@@ -10720,10 +10707,8 @@
 this.ke=y
 return y},"call$0","gXo",0,0,null],
 giO:function(a){return J.v1(this.LU)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},"call$1","gUJ",2,0,null,109,[]],
 $iscu:true,
 $isuq:true},
 Lm:{
@@ -10733,11 +10718,11 @@
 call$1:[function(a){return this.a(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true},
 wN:{
-"^":"Tp:353;b",
+"^":"Tp:363;b",
 call$2:[function(a,b){return this.b(a,b)},"call$2",null,4,0,null,96,[],99,[],"call"],
 $isEH:true},
 VX:{
-"^":"Tp:30;c",
+"^":"Tp:32;c",
 call$1:[function(a){return this.c(a)},"call$1",null,2,0,null,99,[],"call"],
 $isEH:true},
 VR:{
@@ -10758,16 +10743,16 @@
 if(typeof a!=="string")H.vh(new P.AT(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},"call$1","gvz",2,0,null,336,[]],
+return H.yx(this,z)},"call$1","gvz",2,0,null,346,[]],
 zD:[function(a){if(typeof a!=="string")H.vh(new P.AT(a))
-return this.Ej.test(a)},"call$1","guf",2,0,null,336,[]],
-dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,336,[]],
+return this.Ej.test(a)},"call$1","guf",2,0,null,346,[]],
+dd:[function(a,b){return new H.KW(this,b)},"call$1","gYv",2,0,null,346,[]],
 yk:[function(a,b){var z,y
 z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},"call$2","gow",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gow",4,0,null,14,[],123,[]],
 Bh:[function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -10778,13 +10763,13 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 J.wg(y,w)
-return H.yx(this,y)},"call$2","gm4",4,0,null,31,[],123,[]],
+return H.yx(this,y)},"call$2","gm4",4,0,null,14,[],123,[]],
 wL:[function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
 z=c>z}else z=!0
 if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,332,31,[],123,[]],
+return this.Bh(b,c)},function(a,b){return this.wL(a,b,0)},"R4","call$2",null,"grS",2,2,null,342,14,[],123,[]],
 $isVR:true,
 $isSP:true,
 static:{v4:[function(a,b,c,d){var z,y,x,w,v
@@ -10799,7 +10784,7 @@
 "^":"a;zO,QK",
 t:[function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 VO:function(a,b){},
 $isOd:true,
 static:{yx:function(a,b){var z=new H.EK(a,b)
@@ -10830,7 +10815,7 @@
 tQ:{
 "^":"a;M,J9,zO",
 t:[function(a,b){if(!J.de(b,0))H.vh(P.N(b))
-return this.zO},"call$1","gIA",2,0,null,354,[]],
+return this.zO},"call$1","gIA",2,0,null,364,[]],
 $isOd:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
@@ -10839,11 +10824,11 @@
 $.NR=z
 return z},"call$1","vN",2,0,112,113,[]],
 mL:{
-"^":["Pi;Z6<-355,zf<-356,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,357,"isolate",358,359],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,360,28,[],"isolate",358],
-gn9:[function(a){return this.AJ},null,null,1,0,361,"response",358,359],
-sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,362,28,[],"response",358],
+"^":["Pi;Z6<-365,zf<-366,Eb,AJ,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},null,null,null,null],
+gF1:[function(a){return this.Eb},null,null,1,0,367,"isolate",368,369],
+sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,370,30,[],"isolate",368],
+gn9:[function(a){return this.AJ},null,null,1,0,371,"response",368,369],
+sn9:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,372,30,[],"response",368],
 Da:[function(){var z=this.Z6
 z.sec(this)
 z.kI()},"call$0","gLW",0,0,null],
@@ -10853,12 +10838,12 @@
 "^":"a;Yb<",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
 gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],363,[]],
-lb:[function(){var z=this.Yb
+Gl:[function(a,b){this.Yb.V7("addColumn",[a,b])},"call$2","gGU",4,0,null,11,[],373,[]],
+Ti:[function(){var z=this.Yb
 z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},"call$0","gA6",0,0,null],
 RP:[function(a,b){var z=[]
 C.Nm.FV(z,H.VM(new H.A8(b,P.En()),[null,null]))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,364,[]]},
+this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])},"call$1","gJW",2,0,null,374,[]]},
 qu:{
 "^":"a;vR,bG>",
 u5:[function(){var z,y,x
@@ -10871,8 +10856,8 @@
 this.vR.V7("draw",[a.gYb(),z])},"call$1","gnS",2,0,null,185,[]]},
 dZ:{
 "^":"Pi;ec?,JL,AP,Lk",
-gjW:[function(){return this.JL},null,null,1,0,365,"currentHash",358,359],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,30,28,[],"currentHash",358],
+gjW:[function(){return this.JL},null,null,1,0,375,"currentHash",368,369],
+sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",368],
 kI:[function(){var z=C.PP.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(!this.S7())this.df()},"call$0","gV3",0,0,null],
@@ -10898,16 +10883,16 @@
 return C.xB.Nj(x,2,w+y)},"call$0","gKo",0,0,null],
 Pr:[function(){var z=this.R6()
 if(z==="")return
-return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,357,"currentIsolate",359],
-S7:[function(){var z=J.Co(C.ol.gmW(window))
+return J.dm(this.ec.zf).AQ(z)},"call$0","gjf",0,0,367,"currentIsolate",369],
+S7:[function(){var z=J.Co(C.ol.gyH(window))
 z=F.Wi(this,C.h1,this.JL,z)
 this.JL=z
-if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gmW(window),"#/isolates/")
+if(J.de(z,"")||J.de(this.JL,"#")){J.We(C.ol.gyH(window),"#/isolates/")
 return!0}return!1},"call$0","goO",0,0,null],
 rR:[function(a){var z=this.ec
-z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,366,367,[]],
+z.AJ=F.Wi(z,C.mE,z.AJ,a)},"call$1","gf8",2,0,376,377,[]],
 df:[function(){var z,y,x
-z=J.Co(C.ol.gmW(window))
+z=J.Co(C.ol.gyH(window))
 this.JL=F.Wi(this,C.h1,this.JL,z)
 z=this.ec
 y=this.Pr()
@@ -10921,10 +10906,10 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 if(z.S7())return
-z.df()},"call$1",null,2,0,null,368,[],"call"],
+z.df()},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-369,wd>-370,oH<-371",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
+"^":["Pi;eT>,yt<-379,wd>-380,oH<-381",null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]}],
 goE:function(a){return this.z3},
 soE:function(a,b){var z=this.z3
 this.z3=b
@@ -10934,28 +10919,19 @@
 return this.z3},"call$0","gMk",0,0,null],
 $isY2:true},
 XN:{
-"^":["Pi;rI,WT>-370,AP,Lk",null,function(){return[C.mI]},null,null],
+"^":["Pi;WT>-380,AP,Lk",function(){return[C.mI]},null,null],
 rT:[function(a){var z,y
 z=this.WT
 y=J.w1(z)
 y.V1(z)
-y.FV(z,a)},"call$1","gcr",2,0,null,372,[]],
-qU:[function(a){var z=J.UQ(this.WT,a)
-if(z.r8())this.VE(z)
-else this.PP(z)},"call$1","gMk",2,0,null,373,[]],
-VE:[function(a){var z,y,x,w,v,u,t
+a.C4(0)
+y.FV(z,a.wd)},"call$1","gcr",2,0,null,382,[]],
+qU:[function(a){var z,y,x
 z=this.WT
 y=J.U6(z)
-x=y.u8(z,a)
-w=J.RE(a)
-v=0
-while(!0){u=J.q8(w.gwd(a))
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-u=x+v+1
-t=J.UQ(w.gwd(a),v)
-if(u===-1)y.h(z,t)
-else y.xe(z,u,t);++v}},"call$1","gxY",2,0,null,364,[]],
+x=y.t(z,a)
+if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
+else this.PP(x)},"call$1","gMk",2,0,null,383,[]],
 PP:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.q8(z.gwd(a))
@@ -10966,17 +10942,18 @@
 z.soE(a,!1)
 z=this.WT
 w=J.U6(z)
-for(v=w.u8(z,a)+1,x=0;x<y;++x)w.KI(z,v)},"call$1","gNu",2,0,null,364,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
+v=w.u8(z,a)+1
+w.UZ(z,v,v+y)},"call$1","gNu",2,0,null,374,[]]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
+YF:[function(){$.x2=["package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_list.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","main.dart"]
 $.uP=!1
 F.E2()},"call$0","nE",0,0,114]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
 "^":"",
 G6:{
-"^":["Vf;BW%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,376,"msg",358,377],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,378,28,[],"msg",358],
-yv:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Ds;BW%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grs:[function(a){return a.BW},null,null,1,0,386,"msg",368,387],
+srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,388,30,[],"msg",368],
+pA:[function(a,b){J.am(a.BW).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.jy]},
 static:{Dw:[function(a){var z,y,x,w
 z=$.Nd()
@@ -10990,13 +10967,13 @@
 C.J0.ZL(a)
 C.J0.G6(a)
 return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[380],
-Vf:{
+"+BreakpointListElement":[390],
+Ds:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
 Tg:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.OS]},
 static:{rt:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11011,13 +10988,14 @@
 C.YZ.ZL(a)
 C.YZ.G6(a)
 return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[383]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+"+ClassRefElement":[393]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
 Jc:{
-"^":["pv;F0%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.F0},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.F0=this.ct(a,C.XA,a.F0,b)},null,null,3,0,378,28,[],"cls",358],
-yv:[function(a,b){J.am(a.F0).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["Vfx;lb%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.lb},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},null,null,3,0,388,30,[],"cls",368],
+vV:[function(a,b){return J.QP(a.lb).ox(J.WB(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.lb).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.oY]},
 static:{zg:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11031,13 +11009,13 @@
 C.kk.ZL(a)
 C.kk.G6(a)
 return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[384],
-pv:{
+"+ClassViewElement":[395],
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
 CN:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.U8]},
 static:{On:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11052,20 +11030,20 @@
 C.IK.ZL(a)
 C.IK.G6(a)
 return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[383]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+"+CodeRefElement":[393]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["Vfx;Xx%-385,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,386,"code",358,377],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,387,28,[],"code",358],
+"^":["Dsd;Xx%-396,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtT:[function(a){return a.Xx},null,null,1,0,397,"code",368,387],
+stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,398,30,[],"code",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Xx
 if(z==null)return
 J.SK(z)},"call$0","gQd",0,0,114,"enteredView"],
-yv:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-grK:[function(a){return"panel panel-success"},null,null,1,0,365,"cssPanelClass"],
-"@":function(){return[C.xz]},
+pA:[function(a,b){J.am(a.Xx).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+grK:[function(a){return"panel panel-success"},null,null,1,0,375,"cssPanelClass"],
+"@":function(){return[C.h2]},
 static:{Fe:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -11078,25 +11056,25 @@
 C.YD.ZL(a)
 C.YD.G6(a)
 return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[388],
-Vfx:{
+"+CodeViewElement":[399],
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 E0:{
-"^":["Dsd;zh%-389,HX%-389,Uy%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gl7:[function(a){return a.zh},null,null,1,0,365,"iconClass",358,359],
-sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,30,28,[],"iconClass",358],
-gai:[function(a){return a.HX},null,null,1,0,365,"displayValue",358,359],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,30,28,[],"displayValue",358],
-gxj:[function(a){return a.Uy},null,null,1,0,390,"collapsed"],
+"^":["tuj;zh%-400,HX%-400,Uy%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gl7:[function(a){return a.zh},null,null,1,0,375,"iconClass",368,369],
+sl7:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",368],
+gai:[function(a){return a.HX},null,null,1,0,375,"displayValue",368,369],
+sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",368],
+gxj:[function(a){return a.Uy},null,null,1,0,401,"collapsed"],
 sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,391,392,[],"collapsed"],
+this.SS(a)},null,null,3,0,402,403,[],"collapsed"],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 this.SS(a)},"call$0","gQd",0,0,114,"enteredView"],
 jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
 this.SS(a)
-this.SS(a)},"call$3","gl8",6,0,393,19,[],304,[],79,[],"toggleDisplay"],
+this.SS(a)},"call$3","gl8",6,0,404,21,[],313,[],79,[],"toggleDisplay"],
 SS:[function(a){var z,y
 z=a.Uy
 y=a.zh
@@ -11104,7 +11082,7 @@
 a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
 a.HX=this.ct(a,C.Jw,a.HX,"block")}},"call$0","glg",0,0,114,"_refresh"],
 "@":function(){return[C.Gu]},
-static:{"^":"Vl<-389,CF<-389",Hv:[function(a){var z,y,x,w
+static:{"^":"Vl<-400,CF<-400",Hv:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -11119,29 +11097,29 @@
 C.j8.ZL(a)
 C.j8.G6(a)
 return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[394],
-Dsd:{
+"+CollapsibleContentElement":[405],
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
 lw:{
-"^":["LP;GV%-382,Hu%-382,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,390,"expanded",358,359],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,391,28,[],"expanded",358],
-gO9:[function(a){return a.Hu},null,null,1,0,390,"busy",358,359],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,391,28,[],"busy",358],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",358,377],
+"^":["LP;GV%-392,Hu%-392,nx%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+goE:[function(a){return a.GV},null,null,1,0,401,"expanded",368,369],
+soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,402,30,[],"expanded",368],
+gO9:[function(a){return a.Hu},null,null,1,0,401,"busy",368,369],
+sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,402,30,[],"busy",368],
+gFR:[function(a){return a.nx},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 AV:function(a,b,c){return this.gFR(a).call$2(b,c)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,28,[],"callback",358],
-PA:[function(a){var z=a.GV
+sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,112,30,[],"callback",368],
+Ey:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
 a.Hu=this.ct(a,C.S4,a.Hu,!1)},"call$0","goJ",0,0,114,"doneCallback"],
 AZ:[function(a,b,c,d){var z=a.Hu
 if(z===!0)return
 if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
 this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gHw",6,0,395,131,[],187,[],278,[],"toggleExpand"],
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"call$3","gmd",6,0,406,131,[],187,[],280,[],"toggleExpand"],
 "@":function(){return[C.DKS]},
 static:{fR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -11158,7 +11136,7 @@
 C.O0.ZL(a)
 C.O0.G6(a)
 return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[396],
+"+CurlyBlockElement":[407],
 LP:{
 "^":"ir+Pi;",
 $isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
@@ -11201,9 +11179,8 @@
 if(z.C(c,b)||z.D(c,a.length))throw H.b(P.TE(c,b,a.length))},"call$3","Ze",6,0,null,73,[],123,[],124,[]],
 qG:[function(a,b,c,d,e){var z,y
 H.K0(a,b,c)
-if(typeof b!=="number")return H.s(b)
-z=c-b
-if(z===0)return
+z=J.xH(c,b)
+if(J.de(z,0))return
 y=J.Wx(e)
 if(y.C(e,0))throw H.b(new P.AT(e))
 if(J.z8(y.g(e,z),J.q8(d)))throw H.b(new P.lj("Not enough elements"))
@@ -11211,6 +11188,8 @@
 IC:[function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
+y=J.x(c)
+if(!y.$isyN)c=y.tt(c,!1)
 y=J.U6(c)
 x=y.gB(c)
 w=a.length
@@ -11220,9 +11199,13 @@
 w=a.length
 if(!!a.immutable$list)H.vh(P.f("set range"))
 H.qG(a,z,w,a,b)
-for(z=y.gA(c);z.G();b=u){v=z.lo
+for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],52,[],116,[]],
+C.Nm.u(a,b,v)}},"call$3","QB",6,0,null,73,[],15,[],116,[]],
+ed:[function(a,b,c){var z,y
+if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
+for(z=J.GP(c);z.G();b=y){y=b+1
+C.Nm.u(a,b,z.gl())}},"call$3","Y1",6,0,null,73,[],15,[],116,[]],
 tb:[function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
@@ -11247,7 +11230,7 @@
 while(!0){u=J.Wx(v)
 if(!(u.D(v,b)&&J.z8(d.call$2(y.t(a,u.W(v,1)),w),0)))break
 y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"call$4","zc",8,0,null,131,[],134,[],135,[],122,[]],
+v=u.W(v,1)}y.u(a,v,w)}},"call$4","f7",8,0,null,131,[],134,[],135,[],122,[]],
 d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
 z=J.Wx(a0)
 y=J.Ts(J.WB(z.W(a0,b),1),6)
@@ -11357,7 +11340,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.Zv(0,y))
-if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(this),0)},
 grZ:function(a){if(J.de(this.gB(this),0))throw H.b(new P.lj("No elements"))
 return this.Zv(0,J.xH(this.gB(this),1))},
@@ -11372,7 +11355,7 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z,y,x,w,v,u
 z=this.gB(this)
 if(b.length!==0){y=J.x(z)
@@ -11392,8 +11375,8 @@
 for(;v<z;++v){u=this.Zv(0,v)
 u=typeof u==="string"?u:H.d(u)
 w.vM=w.vM+u
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,398,[]],
+if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return P.mW.prototype.ev.call(this,this,b)},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 es:[function(a,b,c){var z,y,x
 z=this.gB(this)
@@ -11414,7 +11397,7 @@
 if(!(x<y))break
 y=this.Zv(0,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 $isyN:true},
 nH:{
 "^":"aL;l6,SH,AN",
@@ -11437,7 +11420,7 @@
 return J.xH(x,y)},
 Zv:[function(a,b){var z=J.WB(this.gjX(),b)
 if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i4(this.l6,z)},"call$1","goY",2,0,null,52,[]],
+return J.i4(this.l6,z)},"call$1","gRV",2,0,null,15,[]],
 qZ:[function(a,b){var z,y,x
 if(J.u6(b,0))throw H.b(new P.bJ("value "+H.d(b)))
 z=this.AN
@@ -11479,11 +11462,10 @@
 gB:function(a){return J.q8(this.l6)},
 gl0:function(a){return J.FN(this.l6)},
 grZ:function(a){return this.mb(J.MQ(this.l6))},
-Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.l6,b))},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
-static:{K1:function(a,b,c,d){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isyN)return H.VM(new H.xy(a,b),[c,d])
+static:{K1:function(a,b,c,d){if(!!J.x(a).$isyN)return H.VM(new H.xy(a,b),[c,d])
 return H.VM(new H.i1(a,b),[c,d])}}},
 xy:{
 "^":"i1;l6,T6",
@@ -11501,7 +11483,7 @@
 "^":"aL;CR,T6",
 mb:function(a){return this.T6.call$1(a)},
 gB:function(a){return J.q8(this.CR)},
-Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.mb(J.i4(this.CR,b))},"call$1","gRV",2,0,null,15,[]],
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
 $asQV:function(a,b){return[b]},
@@ -11536,38 +11518,41 @@
 z=J.GP(this.mb(y.gl()))
 this.C2=z}else return!1}this.lo=this.C2.gl()
 return!0},"call$0","gqy",0,0,null]},
-SJ:{
+yq:{
 "^":"a;",
 G:[function(){return!1},"call$0","gqy",0,0,null],
 gl:function(){return}},
 SU7:{
 "^":"a;",
 sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","guH",2,0,null,132,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$1","gNM",2,0,null,52,[]]},
-Tv:{
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))},"call$2","gYH",4,0,null,123,[],124,[]]},
+JJ:{
 "^":"a;",
-u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,28,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,52,[],28,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$2","ghV",4,0,null,410,[],116,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","ght",2,0,null,30,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$2","gFD",4,0,null,410,[],116,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},"call$1","gDY",2,0,null,116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","guH",2,0,null,132,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$1","gH7",0,2,null,82,122,[]],
 V1:[function(a){throw H.b(P.f("Cannot clear an unmodifiable list"))},"call$0","gRa",0,0,null],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot modify an unmodifiable list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 w2Y:{
-"^":"ar+Tv;",
+"^":"ar+JJ;",
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -11579,13 +11564,11 @@
 Zv:[function(a,b){var z,y
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","goY",2,0,null,52,[]]},
+return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))},"call$1","gRV",2,0,null,15,[]]},
 GD:{
 "^":"a;fN>",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
@@ -11604,8 +11587,7 @@
 YC:[function(a){if(a==null)return
 return new H.GD(a)},"call$1","Rc",2,0,null,12,[]],
 X7:[function(a){return H.YC(H.d(a.fN)+"=")},"call$1","JP",2,0,null,136,[]],
-vn:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isTp)return new H.Sz(a,4)
+vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
 else return new H.iu(a,4)},"call$1","Yf",2,0,137,138,[]],
 jO:[function(a){var z,y
 z=$.Sl().t(0,a)
@@ -11626,18 +11608,17 @@
 if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
 x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
 $.tY[b]=x
-return x}u=H.pL(b)
+return x}u=H.mN(b)
 if(u==null){t=init.functionAliases[b]
 if(t!=null){x=new H.ng(b,null,a)
 x.CM=new H.Ar(init.metadata[t],null,null,null,x)
 $.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}z=J.x(u)
-s=typeof u==="object"&&u!==null&&!!z.$isGv?u.constructor:u
+return x}throw H.b(P.f("Cannot find class for: "+H.d(a.fN)))}s=H.SG(u)?u.constructor:u
 r=s["@"]
 if(r==null){q=null
 p=null}else{q=r["^"]
-z=J.U6(q)
-if(typeof q==="object"&&q!==null&&(q.constructor===Array||!!z.$isList)){p=z.Mu(q,1,z.gB(q)).br(0)
+z=J.x(q)
+if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
 q=z.t(q,0)}else p=null
 if(typeof q!=="string")q=""}z=J.uH(q,";")
 if(0>=z.length)return H.e(z,0)
@@ -11657,15 +11638,13 @@
 z=P.L5(null,null,null,null,null)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.gxV())z.u(0,x.gIf(),x)}return z},"call$1","Pj",2,0,null,140,[]],
-vE:[function(a,b){var z,y,x,w,v,u
+vE:[function(a,b){var z,y,x,w,v
 z=P.L5(null,null,null,null,null)
 z.FV(0,b)
 for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
 if(x.ghB()){w=x.gIf().fN
 v=J.U6(w)
-v=z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isRY)continue}if(x.gxV())continue
+if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
 z.to(x.gIf(),new H.YX(x))}return z},"call$2","un",4,0,null,140,[],141,[]],
 MJ:[function(a,b){var z,y,x,w
 z=[]
@@ -11686,8 +11665,8 @@
 z={}
 z.a=null
 for(y=a;y!=null;){x=J.x(y)
-if(typeof y==="object"&&y!==null&&!!x.$isMs){z.a=y
-break}if(typeof y==="object"&&y!==null&&!!x.$isrN)break
+if(!!x.$isMs){z.a=y
+break}if(!!x.$isrN)break
 y=y.gXP()}if(b==null)return $.P8()
 else{x=z.a
 if(x==null)w=H.Ko(b,null)
@@ -11696,8 +11675,7 @@
 return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
 else{z=new H.rh(z)
 if(typeof b==="number"){t=z.call$1(b)
-x=J.x(t)
-if(typeof t==="object"&&t!==null&&!!x.$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
+if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.jB(z))}}if(w!=null)return H.jO(w)
 return P.re(C.yQ)},"call$2","na",4,0,null,145,[],11,[]],
 fb:[function(a,b){if(a==null)return b
 return H.YC(H.d(a.gUx().fN)+"."+H.d(b.fN))},"call$2","WS",4,0,null,145,[],146,[]],
@@ -11712,8 +11690,8 @@
 if(w===-1)return C.xD;++w
 return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"call$1","C7",2,0,null,147,[]],
 jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.U6(b)
-if(typeof b==="object"&&b!==null&&(b.constructor===Array||!!z.$isList)){y=H.Mk(z.t(b,0),",")
+z=J.x(b)
+if(!!z.$isList){y=H.Mk(z.t(b,0),",")
 x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
 x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
 if(w){t=v+1
@@ -11724,7 +11702,7 @@
 if(r!=null)d.push(r)}},"call$4","Sv",8,0,null,145,[],148,[],66,[],56,[]],
 Mk:[function(a,b){var z=J.U6(a)
 if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"call$2","nK",4,0,null,31,[],103,[]],
+return z.Fr(a,b)},"call$2","nK",4,0,null,14,[],103,[]],
 BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
 default:return!1}},"call$1","IX",2,0,null,12,[]],
 Y6:[function(a){var z,y
@@ -11732,7 +11710,7 @@
 if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
 y=z.t(a,0)
 z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,47,[]],
+return z.n(y,"*")||z.n(y,"+")},"call$1","zn",2,0,null,48,[]],
 Sn:{
 "^":"a;L5,F1>",
 gvU:function(){var z,y,x,w
@@ -11766,8 +11744,8 @@
 jU:{
 "^":"a;",
 bu:[function(a){return this.gOO()},"call$0","gXo",0,0,null],
-IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,46,[]],
-Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,46,[],172,[]],
+IB:[function(a){throw H.b(P.SY(null))},"call$1","gft",2,0,null,47,[]],
+Hy:[function(a,b){throw H.b(P.SY(null))},"call$2","gdk",4,0,null,47,[],172,[]],
 $isej:true},
 Lj:{
 "^":"jU;MA",
@@ -11776,23 +11754,21 @@
 return z.gUQ(z).XG(0,new H.mb())},
 $isej:true},
 mb:{
-"^":"Tp:400;",
-call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,399,[],"call"],
+"^":"Tp:412;",
+call$1:[function(a){return a.gGD()},"call$1",null,2,0,null,411,[],"call"],
 $isEH:true},
 cb:{
 "^":"jU;If<",
 gUx:function(){return H.fb(this.gXP(),this.gIf())},
 gq4:function(){return J.co(this.gIf().fN,"_")},
 bu:[function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},"call$0","gXo",0,0,null],
-jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,48,[],49,[]],
+jd:[function(a,b){throw H.b(H.Ef("Should not call _invoke"))},"call$2","gZ7",4,0,null,49,[],50,[]],
 $isNL:true,
 $isej:true},
 cw:{
 "^":"EE;XP<,yG,Nz,LQ,If",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){var z,y
 z=J.v1(C.Gp.LU)
 if(typeof z!=="number")return H.s(z)
@@ -11823,13 +11799,12 @@
 gOO:function(){return"LibraryMirror"},
 gUx:function(){return this.If},
 gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x,w
+gqh:function(){var z,y,x
 z=this.P8
 if(z!=null)return z
 y=P.L5(null,null,null,null,null)
 for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isMs){x=x.gJi()
+if(!!J.x(x).$isMs){x=x.gJi()
 if(!!x.$isWf){y.u(0,x.If,x)
 x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
 this.P8=z
@@ -11847,12 +11822,10 @@
 rN:[function(a){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,[],null,null))
 return H.vn(z.IB(this))},"call$1","gPo",2,0,null,70,[]],
-F2:[function(a,b,c){var z,y
-z=this.gQH().nb.t(0,a)
+F2:[function(a,b,c){var z=this.gQH().nb.t(0,a)
 if(z==null)throw H.b(P.lr(this,a,b,c,null))
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+if(!!J.x(z).$isZk&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
 z=this.SD
 if(z!=null)return z
@@ -11935,7 +11908,6 @@
 this.xO=z
 return z},
 gXP:function(){return},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isD4:true,
 $isej:true,
 $isNL:true},
@@ -11943,12 +11915,12 @@
 "^":"cb+M2;",
 $isej:true},
 IB:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 oP:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 YX:{
 "^":"Tp:115;a",
@@ -11967,7 +11939,7 @@
 return z},
 gUx:function(){return this.gIf()},
 gYK:function(){return this.XW.gYK()},
-F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 PU:[function(a,b){throw H.b(P.lr(this,H.X7(a),[b],null,null))},"call$2","gtd",4,0,null,70,[],172,[]],
 gkZ:function(){return[this.XW]},
@@ -11975,7 +11947,6 @@
 gJi:function(){return this},
 gNy:function(){throw H.b(P.SY(null))},
 gw8:function(){return C.hU},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isMs:true,
 $isej:true,
 $isX9:true,
@@ -11990,7 +11961,7 @@
 "^":"M2;Ax<,xq",
 gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
 F2:[function(a,b,c){var z=J.GL(a)
-return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return this.tu(a,0,z+":"+b.length+":0",b)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gK8:function(){var z,y,x
 z=$.eb
 y=this.Ax
@@ -12007,7 +11978,7 @@
 y=v.ZU(this.Ax)
 z[c]=y}else v=null
 if(y.gpf()){if(v==null)v=new H.LI(a,$.I6().t(0,c),b,d,[],null)
-return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],402,[],87,[]],
+return H.vn(y.Bj(this.Ax,v))}else return H.vn(y.Bj(this.Ax,d))},"call$4","gZ7",8,0,null,12,[],11,[],414,[],87,[]],
 PU:[function(a,b){var z=H.d(a.gfN(a))+"="
 this.tu(H.YC(z),2,z,[b])
 return H.vn(b)},"call$2","gtd",4,0,null,70,[],172,[]],
@@ -12040,33 +12011,31 @@
 t.v=t.m=w
 return y},"call$1","gFf",2,0,null,70,[]],
 ds:[function(a,b){if(b)return(function(b){return eval(b)})("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,279,[],403,[]],
+else return(function(n){return(function(c){return c[n]})})(a)},"call$2","gfu",4,0,null,281,[],415,[]],
 x0:[function(a,b){if(!b)return(function(n){return(function(o){return o[n]()})})(a)
-return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],403,[]],
+return(function(b){return eval(b)})("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},"call$2","gRr",4,0,null,12,[],415,[]],
 QN:[function(a,b){var z=J.x(this.Ax)
 if(!b)return(function(n,i){return(function(o){return i[n](o)})})(a,z)
-return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gj1",4,0,null,12,[],403,[]],
+return(function(b,i){return eval(b)})("(function "+z.constructor.name+"$"+H.d(a)+"(o){return i."+H.d(a)+"(o)})",z)},"call$2","gDw",4,0,null,12,[],415,[]],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$isiu){z=this.Ax
+if(!!J.x(b).$isiu){z=this.Ax
 y=b.Ax
 y=z==null?y==null:z===y
 z=y}else z=!1
 return z},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
 bu:[function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isiu:true,
 $isvr:true,
 $isej:true},
 mg:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z,y
 z=a.gfN(a)
 y=this.a
 if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],28,[],"call"],
+else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 bl:{
 "^":"cb;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,RH,If",
@@ -12135,7 +12104,7 @@
 z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
 this.qN=z
 return z},
-F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return this.NK.F2(a,b,c)},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!1},
 gJi:function(){return this.NK},
 gkZ:function(){var z=this.qm
@@ -12147,20 +12116,19 @@
 gUx:function(){return this.NK.gUx()},
 gYj:function(){return new H.cu(this.gCr(),null)},
 gIf:function(){return this.NK.gIf()},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isbl:true,
 $isMs:true,
 $isej:true,
 $isX9:true,
 $isNL:true},
 tB:{
-"^":"Tp:30;a",
+"^":"Tp:32;a",
 call$1:[function(a){var z,y,x
 z=H.BU(a,null,new H.Oo())
 y=this.a
 if(J.de(z,-1))y.push(H.jO(J.rr(a)))
 else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,405,[],"call"],
+y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"call$1",null,2,0,null,417,[],"call"],
 $isEH:true},
 Oo:{
 "^":"Tp:112;",
@@ -12173,15 +12141,13 @@
 Ax:{
 "^":"Tp:112;a",
 call$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 Wf:{
 "^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,RH,jE,If",
 gOO:function(){return"ClassMirror"},
-gaB:function(){var z,y
-z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)return z.constructor
+gaB:function(){var z=this.Tx
+if(H.SG(z))return z.constructor
 else return z},
 gEz:function(){var z=this.b0
 if(z!=null)return z
@@ -12211,7 +12177,7 @@
 p=H.ys(n,"$",".")}}else continue
 s=H.Sd(p,q,!o,o)
 x.push(s)
-s.jE=a}return x},"call$1","gN4",2,0,null,407,[]],
+s.jE=a}return x},"call$1","gN4",2,0,null,419,[]],
 gEO:function(){var z=this.qu
 if(z!=null)return z
 z=this.ly(this)
@@ -12227,7 +12193,7 @@
 C.Nm.FV(x,y)}H.jw(a,x,!1,z)
 w=init.statics[this.Cr]
 if(w!=null)H.jw(a,w["^"],!0,z)
-return z},"call$1","gap",2,0,null,408,[]],
+return z},"call$1","gap",2,0,null,420,[]],
 gTH:function(){var z=this.zE
 if(z!=null)return z
 z=this.ws(this)
@@ -12276,9 +12242,7 @@
 else return H.vn($[y])}throw H.b(P.lr(this,a,null,null,null))},"call$1","gPo",2,0,null,70,[]],
 gXP:function(){var z,y
 z=this.jE
-if(z==null){z=this.Tx
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isGv)this.jE=H.jO(C.nY.LU).gXP()
+if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
 else{z=$.vK()
 z=z.gUQ(z)
 y=new H.MH(null,J.GP(z.l6),z.T6)
@@ -12310,12 +12274,12 @@
 F2:[function(a,b,c){var z=this.ghp().nb.t(0,a)
 if(z==null||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
 if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+return H.vn(z.jd(b,c))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 gHA:function(){return!0},
 gJi:function(){return this},
 MR:[function(a){var z,y
 z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Pr(z,1),new H.t0(a)),[null,null]).br(0):C.Me
+y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
 return H.VM(new P.Yp(y),[P.Ms])},"call$1","gki",2,0,null,145,[]],
 gkZ:function(){var z=this.qm
 if(z!=null)return z
@@ -12336,7 +12300,6 @@
 gw8:function(){return C.hU},
 gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
 return new H.cu(this.Cr,null)},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isWf:true,
 $isMs:true,
 $isej:true,
@@ -12346,19 +12309,19 @@
 "^":"EE+M2;",
 $isej:true},
 Ei:{
-"^":"Tp:401;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:413;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Ci:{
 "^":"Tp:112;b",
 call$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"call$1",null,2,0,null,406,[],"call"],
+return a},"call$1",null,2,0,null,418,[],"call"],
 $isEH:true},
 t0:{
-"^":"Tp:410;a",
-call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:422;a",
+call$1:[function(a){return H.Jf(this.a,init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
-Ld:{
+XJ:{
 "^":"cb;ao<,V5>,Fo<,n6,jE,Ay>,le,If",
 gOO:function(){return"VariableMirror"},
 gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
@@ -12367,9 +12330,9 @@
 if(z==null){z=this.n6
 z=z==null?C.xD:z()
 this.le=z}return J.C0(z,H.Yf()).br(0)},
-IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,46,[]],
+IB:[function(a){return $[this.ao]},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.V5)throw H.b(P.lr(this,H.X7(this.If),[b],null,null))
-$[this.ao]=b},"call$2","gdk",4,0,null,46,[],172,[]],
+$[this.ao]=b},"call$2","gdk",4,0,null,47,[],172,[]],
 $isRY:true,
 $isNL:true,
 $isej:true,
@@ -12397,7 +12360,7 @@
 v.$builtinTypeInfo=[H.Kp(y,0)]
 for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
 break}}if(1>=z.length)return H.e(z,1)
-return new H.Ld(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
+return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
 if(a>=123&&a<=126)return a-117
 if(a>=37&&a<=43)return a-27
 return 0},"call$1","fS",2,0,null,143,[]]}},
@@ -12417,8 +12380,8 @@
 w=x.split("$")
 if(1>=w.length)return H.e(w,1)
 v=H.BU(w[1],null,null)
-w=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!w.$isv){u=y.gjm()
+w=J.x(y)
+if(!!w.$isv){u=y.gjm()
 H.eZ(y)
 t=$.bx().t(0,w.gRA(y))
 if(t==null)H.Hz(t)
@@ -12426,7 +12389,6 @@
 y.constructor[z]=s
 return s},
 bu:[function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},"call$0","gXo",0,0,null],
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
 $isvr:true,
 $isej:true},
 Zk:{
@@ -12451,10 +12413,7 @@
 if(v!=null){u=v.AM
 if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
 else{z=this.gXP()
-if(z!=null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isD4
-z=x}else z=!1
-t=z?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
+t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
 else this.wM=t.gdw()
 s=v.Mo
 for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.hG,q=v.Rn,p=0;z.G();p=i){o=z.lo
@@ -12470,11 +12429,11 @@
 this.le=z}return z},
 jd:[function(a,b){if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
 if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,48,[],49,[]],
+return this.dl.apply($,P.F(a,!0,null))},"call$2","gZ7",4,0,null,49,[],50,[]],
 IB:[function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,46,[]],
+else throw H.b(P.SY("getField on "+H.d(a)))},"call$1","gft",2,0,null,47,[]],
 Hy:[function(a,b){if(this.hB)return this.jd([b],null)
-else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,46,[],172,[]],
+else throw H.b(P.lr(this,H.X7(this.If),[],null,null))},"call$2","gdk",4,0,null,47,[],172,[]],
 guU:function(){return!this.lT&&!this.hB&&!this.xV},
 $isZk:true,
 $isRS:true,
@@ -12507,8 +12466,8 @@
 $isNL:true,
 $isej:true},
 wt:{
-"^":"Tp:411;",
-call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return H.vn(init.metadata[a])},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 ng:{
 "^":"cb;Cr<,CM,If",
@@ -12529,10 +12488,9 @@
 gAY:function(){return H.vh(P.SY(null))},
 gkZ:function(){return H.vh(P.SY(null))},
 gYK:function(){return H.vh(P.SY(null))},
-t:[function(a,b){return H.vh(P.SY(null))},"call$1","gIA",2,0,null,12,[]],
-F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,29,[],48,[],49,[]],
+F2:[function(a,b,c){return H.vh(P.SY(null))},function(a,b){return this.F2(a,b,null)},"CI","call$3",null,"gb2",4,2,null,82,31,[],49,[],50,[]],
 rN:[function(a){return H.vh(P.SY(null))},"call$1","gPo",2,0,null,70,[]],
-PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],28,[]],
+PU:[function(a,b){return H.vh(P.SY(null))},"call$2","gtd",4,0,null,70,[],30,[]],
 gNy:function(){return H.vh(P.SY(null))},
 gw8:function(){return H.vh(P.SY(null))},
 gJi:function(){return H.vh(P.SY(null))},
@@ -12589,48 +12547,48 @@
 $isX9:true,
 $isNL:true},
 rh:{
-"^":"Tp:412;a",
+"^":"Tp:424;a",
 call$1:[function(a){var z,y,x
 z=init.metadata[a]
 y=this.a
 x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,52,[],"call"],
+return J.UQ(y.a.gw8(),x)},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 jB:{
-"^":"Tp:413;b",
+"^":"Tp:425;b",
 call$1:[function(a){var z,y
 z=this.b.call$1(a)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscw)return H.d(z.Nz)
-if((typeof z!=="object"||z===null||!y.$isWf)&&(typeof z!=="object"||z===null||!y.$isbl))if(y.n(z,$.P8()))return"dynamic"
+if(!!y.$iscw)return H.d(z.Nz)
+if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
 else if(y.n(z,$.oj()))return"void"
 else return"dynamic"
-return z.gCr()},"call$1",null,2,0,null,52,[],"call"],
+return z.gCr()},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 ye:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 O1:{
-"^":"Tp:411;",
-call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,409,[],"call"],
+"^":"Tp:423;",
+call$1:[function(a){return init.metadata[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 Oh:{
 "^":"a;nb",
 gB:function(a){return this.nb.X5},
 gl0:function(a){return this.nb.X5===0},
 gor:function(a){return this.nb.X5!==0},
-t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,28,[]],
+t:[function(a,b){return this.nb.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+x4:[function(a){return this.nb.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.nb.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){return this.nb.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gvc:function(a){var z=this.nb
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gUQ:function(a){var z=this.nb
 return z.gUQ(z)},
-u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return H.kT()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return H.kT()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){H.kT()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return H.kT()},"call$0","gRa",0,0,null],
 $isZ0:true,
 static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"call$0","lY",0,0,null]}},
@@ -12657,18 +12615,21 @@
 z.fixed$length=init
 return z},"call$1","wp",2,0,null,147,[]],
 Xh:{
-"^":"Tp:414;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],402,[],"call"],
+"^":"Tp:426;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,139,[],414,[],"call"],
 $isEH:true}}],["dart.async","dart:async",,P,{
 "^":"",
 VH:[function(a,b){var z=H.N7()
 z=H.KT(z,[z,z]).BD(a)
 if(z)return b.O8(a)
 else return b.cR(a)},"call$2","p3",4,0,null,152,[],153,[]],
+e4:function(a,b){var z=P.Dt(b)
+P.rT(C.ny,new P.ZC(a,z))
+return z},
 Cx:[function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"call$0","So",0,0,null],
+$.S6=z}$.k8=null},"call$0","BN",0,0,null],
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
 P.jL(C.ny,P.qZ())
@@ -12692,17 +12653,15 @@
 z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v,u
+ot:[function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.call$0()
-w=z
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isb8)return z
-return}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
+if(!!J.x(z).$isb8)return z
+return}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
 $.X3.hk(y,x)}},"call$1","DC",2,0,null,156,[]],
-YE:[function(a){},"call$1","bZ",2,0,157,28,[]],
+YE:[function(a){},"call$1","bZ",2,0,157,30,[]],
 SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"call$2","call$1","AY",2,2,158,82,159,[],160,[]],
 dL:[function(){},"call$0","v3",0,0,114],
 FE:[function(a,b,c){var z,y,x,w
@@ -12714,7 +12673,7 @@
 b.K5(c,d)},"call$4","QD",8,0,null,164,[],165,[],159,[],160,[]],
 TB:[function(a,b){return new P.uR(a,b)},"call$2","cH",4,0,null,164,[],165,[]],
 Bb:[function(a,b,c){a.ed()
-b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],28,[]],
+b.rX(c)},"call$3","iB",6,0,null,164,[],165,[],30,[]],
 rT:function(a,b){var z
 if(J.de($.X3,C.NU))return $.X3.uN(a,b)
 z=$.X3
@@ -12761,7 +12720,7 @@
 gY8:function(){return this.Y8},
 uR:[function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
-return(z&1)===a},"call$1","gLM",2,0,null,415,[]],
+return(z&1)===a},"call$1","gLM",2,0,null,427,[]],
 Ac:[function(){var z=this.Ae
 if(typeof z!=="number")return z.w()
 this.Ae=z^1},"call$0","gUe",0,0,null],
@@ -12802,7 +12761,7 @@
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
 this.Iv(b)},"call$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},235,[]],
 fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,416,82,159,[],160,[]],
+this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","call$2","call$1","gGj",2,2,428,82,159,[],160,[]],
 cO:[function(a){var z,y
 z=this.Gv
 if((z&4)!==0)return this.Ip
@@ -12836,7 +12795,7 @@
 y.sAe(z&4294967293)
 y=w}else y=y.giE()
 this.Gv=this.Gv&4294967293
-if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,397,[]],
+if(this.iE===this)this.Of()},"call$1","gxd",2,0,null,408,[]],
 Of:[function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
 P.ot(this.QC)},"call$0","gVg",0,0,null]},
 dz:{
@@ -12866,7 +12825,7 @@
 "^":"Tp;a",
 call$1:[function(a){a.Qj()},"call$1",null,2,0,null,164,[],"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.JI,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"GJ",args:[[P.JI,a]]}},this.a,"dz")}},
 DL:{
 "^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
 Iv:[function(a){var z,y
@@ -12881,18 +12840,26 @@
 b8:{
 "^":"a;",
 $isb8:true},
+ZC:{
+"^":"Tp:115;a,b",
+call$0:[function(){var z,y,x,w
+try{this.b.rX(this.a.call$0())}catch(x){w=H.Ru(x)
+z=w
+y=new H.XO(x,null)
+this.b.K5(z,y)}},"call$0",null,0,0,null,"call"],
+$isEH:true},
 Ia:{
 "^":"a;"},
 Zf:{
 "^":"Ia;MM",
 oo:[function(a,b){var z=this.MM
 if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,417,82,28,[]],
+z.OH(b)},function(a){return this.oo(a,null)},"tZ","call$1","call$0","gv6",0,2,429,82,30,[]],
 w0:[function(a,b){var z
 if(a==null)throw H.b(new P.AT("Error must not be null"))
 z=this.MM
 if(z.Gv!==0)throw H.b(new P.lj("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,416,82,159,[],160,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"pm","call$2","call$1","gYJ",2,2,428,82,159,[],160,[]]},
 vs:{
 "^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
 gcg:function(){return this.Gv>=4},
@@ -12914,22 +12881,22 @@
 y=P.VH(a,z)
 x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
 this.au(x)
-return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],398,[]],
+return x},function(a){return this.yd(a,null)},"OA","call$2$test",null,"gue",2,3,null,82,163,[],409,[]],
 YM:[function(a){var z,y
 z=$.X3
 y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
-return y},"call$1","gBv",2,0,null,397,[]],
+return y},"call$1","gBv",2,0,null,408,[]],
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
 Am:[function(a){this.Gv=4
-this.jk=a},"call$1","goU",2,0,null,28,[]],
+this.jk=a},"call$1","goU",2,0,null,30,[]],
 E6:[function(a,b){this.Gv=8
 this.jk=new P.Ca(a,b)},"call$2","gM6",4,0,null,159,[],160,[]],
 au:[function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
 else{a.sBQ(this.jk)
-this.jk=a}},"call$1","gXA",2,0,null,295,[]],
+this.jk=a}},"call$1","gXA",2,0,null,304,[]],
 L3:[function(){var z,y,x
 z=this.jk
 this.jk=null
@@ -12937,26 +12904,26 @@
 z.sBQ(y)}return y},"call$0","gAw",0,0,null],
 rX:[function(a){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8)if(typeof a==="object"&&a!==null&&!!z.$isvs)P.A9(a,this)
+if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
 this.Am(a)
-P.HZ(this,y)}},"call$1","gBO",2,0,null,28,[]],
+P.HZ(this,y)}},"call$1","gBO",2,0,null,30,[]],
 R8:[function(a){var z=this.L3()
 this.Am(a)
-P.HZ(this,z)},"call$1","gPN",2,0,null,28,[]],
+P.HZ(this,z)},"call$1","gPN",2,0,null,30,[]],
 K5:[function(a,b){var z=this.L3()
 this.E6(a,b)
 P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","call$2","call$1","gbY",2,2,158,82,159,[],160,[]],
 OH:[function(a){var z
 if(a==null);else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isb8){if(typeof a==="object"&&a!==null&&!!z.$isvs){z=a.Gv
+if(!!z.$isb8){if(!!z.$isvs){z=a.Gv
 if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
 return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
 this.Gv=1
-this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,28,[]],
+this.Lj.wr(new P.cX(this,a))},"call$1","gZV",2,0,null,30,[]],
 CG:[function(a,b){if(this.Gv!==0)H.vh(new P.lj("Future already completed"))
 this.Gv=1
 this.Lj.wr(new P.ZL(this,a,b))},"call$2","glC",4,0,null,159,[],160,[]],
@@ -12966,14 +12933,14 @@
 static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,32,[],79,[]],A9:[function(a,b){b.swG(!0)
+a.Rx(new P.pV(b),new P.U7(b))},"call$2","KP",4,0,null,33,[],79,[]],A9:[function(a,b){b.swG(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"call$2","dd",4,0,null,32,[],79,[]],yE:[function(a,b){var z
+else a.au(b)},"call$2","dd",4,0,null,33,[],79,[]],yE:[function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"call$2","cN",4,0,null,32,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+continue}else break}while(!0)},"call$2","cN",4,0,null,33,[],154,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
 z={}
 z.e=a
 for(y=a;!0;){x={}
@@ -12999,32 +12966,29 @@
 if(s!=null)$.X3=s
 if(x.d)return
 if(x.b===!0){y=x.c
-if(u==null?y!=null:u!==y){r=J.x(y)
-r=typeof y==="object"&&y!==null&&!!r.$isb8
-y=r}else y=!1}else y=!1
-if(y){q=x.c
-y=J.x(q)
-if(typeof q==="object"&&q!==null&&!!y.$isvs)if(q.Gv>=4){b.swG(!0)
-z.e=q
-y=q
-continue}else P.A9(q,b)
-else P.k3(q,b)
-return}}if(x.b===!0){p=b.L3()
-b.Am(x.c)}else{p=b.L3()
+y=(u==null?y!=null:u!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){r=x.c
+if(!!J.x(r).$isvs)if(r.Gv>=4){b.swG(!0)
+z.e=r
+y=r
+continue}else P.A9(r,b)
+else P.k3(r,b)
+return}}if(x.b===!0){q=b.L3()
+b.Am(x.c)}else{q=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=p}},"call$2","XX",4,0,null,32,[],154,[]]}},
+b=q}},"call$2","XX",4,0,null,33,[],154,[]]}},
 da:{
 "^":"Tp:115;a,b",
 call$0:[function(){P.HZ(this.a,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){this.a.R8(a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 U7:{
-"^":"Tp:418;b",
+"^":"Tp:430;b",
 call$2:[function(a,b){this.b.K5(a,b)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 rH:{
@@ -13040,7 +13004,7 @@
 call$0:[function(){this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:390;b,d,e,f",
+"^":"Tp:401;b,d,e,f",
 call$0:[function(){var z,y,x,w
 try{this.b.c=this.f.FI(this.d.gO1(),this.e)
 return!0}catch(x){w=H.Ru(x)
@@ -13100,33 +13064,29 @@
 u=this.b
 if(v)u.c=this.c.e.gcG()
 else u.c=new P.Ca(y,x)
-u.b=!1}v=z.a
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isb8){v=this.Rm
+u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
 v.swG(!0)
 this.b.d=!0
 z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"call$0",null,0,0,null,"call"],
 $isEH:true},
 jZ:{
 "^":"Tp:112;c,HZ",
-call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,419,[],"call"],
+call$1:[function(a){P.HZ(this.c.e,this.HZ)},"call$1",null,2,0,null,431,[],"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:418;a,mG",
-call$2:[function(a,b){var z,y,x,w
+"^":"Tp:430;a,mG",
+call$2:[function(a,b){var z,y
 z=this.a
-y=z.a
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isvs){w=P.Dt(null)
-z.a=w
-w.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
+if(!J.x(z.a).$isvs){y=P.Dt(null)
+z.a=y
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.call$2(a,null)},"call$1","call$2",null,null,2,2,null,82,159,[],160,[],"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.call$0()}},
 qh:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,420,[]],
+ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"call$1","gIr",2,0,null,432,[]],
 tg:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
@@ -13138,13 +13098,13 @@
 y=P.Dt(null)
 z.a=null
 z.a=this.KR(new P.lz(z,this,b,y),!0,new P.M4(y),y.gbY())
-return y},"call$1","gjw",2,0,null,397,[]],
+return y},"call$1","gjw",2,0,null,408,[]],
 Vr:[function(a,b){var z,y
 z={}
 y=P.Dt(J.kn)
 z.a=null
 z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gbY())
-return y},"call$1","gG2",2,0,null,398,[]],
+return y},"call$1","gG2",2,0,null,409,[]],
 gB:function(a){var z,y
 z={}
 y=P.Dt(J.im)
@@ -13161,7 +13121,7 @@
 z=H.VM([],[H.ip(this,"qh",0)])
 y=P.Dt([J.Q,H.ip(this,"qh",0)])
 this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gbY())
-return y},"call$0","gRV",0,0,null],
+return y},"call$0","gdn",0,0,null],
 gtH:function(a){var z,y
 z={}
 y=P.Dt(H.ip(this,"qh",0))
@@ -13182,7 +13142,7 @@
 y=P.Dt(H.ip(this,"qh",0))
 z.b=null
 z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gbY())
-return y},"call$1","goY",2,0,null,52,[]],
+return y},"call$1","gRV",2,0,null,15,[]],
 $isqh:true},
 YJ:{
 "^":"Tp;a,b,c,d",
@@ -13197,8 +13157,8 @@
 call$0:[function(){return J.de(this.f,this.e)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 LB:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 DO:{
 "^":"Tp:115;bK",
@@ -13234,8 +13194,8 @@
 call$0:[function(){return this.e.call$1(this.f)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 pr:{
-"^":"Tp:391;a,UI",
-call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,421,[],"call"],
+"^":"Tp:402;a,UI",
+call$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"call$1",null,2,0,null,433,[],"call"],
 $isEH:true},
 eN:{
 "^":"Tp:115;bK",
@@ -13269,7 +13229,7 @@
 $isEH:true},
 lU:{
 "^":"Tp;a,b,c",
-call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,28,[],"call"],
+call$1:[function(a){P.Bb(this.a.a,this.c,a)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 OC:{
@@ -13280,7 +13240,7 @@
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"call$1",null,2,0,null,28,[],"call"],
+z.a=a},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 Z5:{
@@ -13293,7 +13253,7 @@
 "^":"Tp;a,b,c",
 call$1:[function(a){var z=this.a
 if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,28,[],"call"],
+return}z.a=J.xH(z.a,1)},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
 ii:{
@@ -13320,13 +13280,11 @@
 z.SJ=w
 w.Ae=z.Gv&1
 if(z.iE===w)P.ot(z.nL)
-return w},"call$1","gmn",2,0,null,422,[]],
+return w},"call$1","gmn",2,0,null,434,[]],
 giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:[function(a,b){var z
-if(b==null)return!1
+n:[function(a,b){if(b==null)return!1
 if(this===b)return!0
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isO9)return!1
+if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},"call$1","gUJ",2,0,null,109,[]],
 $isO9:true},
 yU:{
@@ -13338,18 +13296,18 @@
 "^":"a;"},
 KA:{
 "^":"a;dB,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,423,[]],
+fe:[function(a){this.dB=this.Lj.cR(a)},"call$1","gqd",2,0,null,435,[]],
 fm:[function(a,b){if(b==null)b=P.AY()
-this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,34,[]],
+this.o7=P.VH(b,this.Lj)},"call$1","geO",2,0,null,35,[]],
 y5:[function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,424,[]],
+this.Bd=this.Lj.Al(a)},"call$1","gNS",2,0,null,436,[]],
 Fv:[function(a,b){var z,y,x
 z=this.Gv
 if((z&8)!==0)return
 y=(z+128|4)>>>0
 this.Gv=y
 if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 QE:[function(){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
@@ -13394,7 +13352,7 @@
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
 this.Gv=y
-if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,368,[]],
+if(y<128)this.Ri.t2(this)}},"call$1","gnX",2,0,null,378,[]],
 Iv:[function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 this.Lj.m1(this.dB,a)
@@ -13430,9 +13388,9 @@
 if(x)this.uO()
 else this.LP()
 z=(this.Gv&4294967263)>>>0
-this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,426,[]],
+this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},"call$1","ghE",2,0,null,438,[]],
 $isMO:true,
-static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,f9"}},
+static:{"^":"ry,bG,Q9,Ir,Kt,Dr,HX,GC,bsZ"}},
 Vo:{
 "^":"Tp:114;a,b,c",
 call$0:[function(){var z,y,x,w,v
@@ -13465,25 +13423,25 @@
 z.fe(a)
 z.fm(0,d)
 z.y5(c)
-return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return z},function(a){return this.KR(a,null,null,null)},"yI",function(a,b,c){return this.KR(a,null,b,c)},"zC","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 w4:[function(a){var z,y
 z=$.X3
 y=a?1:0
 y=new P.KA(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
-return y},"call$1","gmn",2,0,null,422,[]]},
+return y},"call$1","gmn",2,0,null,434,[]]},
 fIm:{
 "^":"a;aw@"},
 LV:{
 "^":"fIm;P>,aw",
 r6:function(a,b){return this.P.call$1(b)},
-dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.Iv(this.P)},"call$1","gqp",2,0,null,441,[]]},
 DS:{
 "^":"fIm;kc>,I4<,aw",
-dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,429,[]]},
+dP:[function(a){a.pb(this.kc,this.I4)},"call$1","gqp",2,0,null,441,[]]},
 JF:{
 "^":"a;",
-dP:[function(a){a.SY()},"call$1","gqp",2,0,null,429,[]],
+dP:[function(a){a.SY()},"call$1","gqp",2,0,null,441,[]],
 gaw:function(){return},
 saw:function(a){throw H.b(new P.lj("No events after a done."))}},
 ht:{
@@ -13492,7 +13450,7 @@
 if(z===1)return
 if(z>=1){this.Gv=1
 return}P.rb(new P.CR(this,a))
-this.Gv=1},"call$1","gQu",2,0,null,429,[]]},
+this.Gv=1},"call$1","gQu",2,0,null,441,[]]},
 CR:{
 "^":"Tp:115;a,b",
 call$0:[function(){var z,y
@@ -13508,13 +13466,13 @@
 h:[function(a,b){var z=this.N6
 if(z==null){this.N6=b
 this.zR=b}else{z.saw(b)
-this.N6=b}},"call$1","ght",2,0,null,368,[]],
+this.N6=b}},"call$1","ght",2,0,null,378,[]],
 TO:[function(a){var z,y
 z=this.zR
 y=z.gaw()
 this.zR=y
 if(y==null)this.N6=null
-z.dP(a)},"call$1","gTn",2,0,null,429,[]],
+z.dP(a)},"call$1","gTn",2,0,null,441,[]],
 V1:[function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null},"call$0","gRa",0,0,null]},
@@ -13523,7 +13481,7 @@
 call$0:[function(){return this.a.K5(this.b,this.c)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 uR:{
-"^":"Tp:430;a,b",
+"^":"Tp:442;a,b",
 call$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"call$2",null,4,0,null,159,[],160,[],"call"],
 $isEH:true},
 GU:{
@@ -13543,8 +13501,8 @@
 v.fe(a)
 v.fm(0,d)
 v.y5(c)
-return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
-Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],431,[]],
+return v},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
+Ml:[function(a,b){b.Rg(0,a)},"call$2","gOa",4,0,null,235,[],443,[]],
 $asqh:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,dB,o7,Bd,Lj,Gv,lz,Ri",
@@ -13562,7 +13520,7 @@
 if(z!=null){this.Ee=null
 z.ed()}return},"call$0","gQC",0,0,null],
 vx:[function(a){this.UY.Ml(a,this)},"call$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},235,[]],
-xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,432,159,[],160,[]],
+xL:[function(a,b){this.V8(a,b)},"call$2","gRE",4,0,444,159,[],160,[]],
 nn:[function(){this.Qj()},"call$0","gH1",0,0,114],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
@@ -13579,7 +13537,7 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,433,[],431,[]],
+return}if(z===!0)J.QM(b,a)},"call$2","gOa",4,0,null,445,[],443,[]],
 $asYR:function(a){return[a,a]},
 $asqh:null},
 t3:{
@@ -13591,26 +13549,26 @@
 y=v
 x=new H.XO(w,null)
 b.V8(y,x)
-return}J.QM(b,z)},"call$2","gOa",4,0,null,433,[],431,[]]},
+return}J.QM(b,z)},"call$2","gOa",4,0,null,445,[],443,[]]},
 tU:{
 "^":"a;"},
 aY:{
 "^":"a;"},
 zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,aj<,rb<,Zq<,rF,JS>,iq<",
+"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
 hk:function(a,b){return this.E2.call$2(a,b)},
 Gr:function(a){return this.cP.call$1(a)},
 FI:function(a,b){return this.Jl.call$2(a,b)},
 mg:function(a,b,c){return this.pU.call$3(a,b,c)},
 Al:function(a){return this.Fh.call$1(a)},
 cR:function(a){return this.Xp.call$1(a)},
-O8:function(a){return this.aj.call$1(a)},
+O8:function(a){return this.fb.call$1(a)},
 wr:function(a){return this.rb.call$1(a)},
 RK:function(a,b){return this.rb.call$2(a,b)},
 uN:function(a,b){return this.Zq.call$2(a,b)},
 Ch:function(a,b){return this.JS.call$1(b)},
 iT:function(a){return this.iq.call$1$specification(a)}},
-e4:{
+qK:{
 "^":"a;"},
 dl:{
 "^":"a;"},
@@ -13643,8 +13601,8 @@
 return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gXp",4,0,null,153,[],117,[]],
 mz:[function(a,b){var z,y
 z=this.oh
-for(;y=z.gzU().gaj(),y==null;)z=z.geT(z)
-return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gaj",4,0,null,153,[],117,[]],
+for(;y=z.gzU().gfb(),y==null;)z=z.geT(z)
+return y.call$4(z,new P.Id(z.geT(z)),a,b)},"call$2","gfb",4,0,null,153,[],117,[]],
 RK:[function(a,b){var z,y,x
 z=this.oh
 for(;y=z.gzU(),y.grb()==null;)z=z.geT(z)
@@ -13665,7 +13623,7 @@
 return y.giq().call$5(z,new P.Id(x),a,b,c)},"call$3","giq",6,0,null,153,[],183,[],184,[]]},
 WH:{
 "^":"a;",
-fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,434,[]],
+fC:[function(a){return this.gC5()===a.gC5()},"call$1","gRX",2,0,null,446,[]],
 bH:[function(a){var z,y,x,w
 try{x=this.Gr(a)
 return x}catch(w){x=H.Ru(w)
@@ -13686,13 +13644,13 @@
 return this.hk(z,y)}},"call$3","gLG",6,0,null,117,[],59,[],60,[]],
 xi:[function(a,b){var z=this.Al(a)
 if(b)return new P.TF(this,z)
-else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,333,117,[],435,[]],
+else return new P.K5(this,z)},function(a){return this.xi(a,!0)},"ce","call$2$runGuarded",null,"gAX",2,3,null,343,117,[],447,[]],
 oj:[function(a,b){var z=this.cR(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,333,117,[],435,[]],
+else return new P.Hs(this,z)},"call$2$runGuarded","gVF",2,3,null,343,117,[],447,[]],
 PT:[function(a,b){var z=this.O8(a)
 if(b)return new P.dv(this,z)
-else return new P.ph(this,z)},"call$2$runGuarded","gzg",2,3,null,333,117,[],435,[]]},
+else return new P.ph(this,z)},"call$2$runGuarded","gQt",2,3,null,343,117,[],447,[]]},
 TF:{
 "^":"Tp:115;a,b",
 call$0:[function(){return this.a.bH(this.b)},"call$0",null,0,0,null,"call"],
@@ -13710,11 +13668,11 @@
 call$1:[function(a){return this.c.FI(this.d,a)},"call$1",null,2,0,null,172,[],"call"],
 $isEH:true},
 dv:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){return this.a.z8(this.b,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 ph:{
-"^":"Tp:348;c,d",
+"^":"Tp:358;c,d",
 call$2:[function(a,b){return this.c.mg(this.d,a,b)},"call$2",null,4,0,null,59,[],60,[],"call"],
 $isEH:true},
 uo:{
@@ -13724,7 +13682,7 @@
 z=this.R1
 y=z.t(0,b)
 if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},"call$1","gIA",2,0,null,47,[]],
+return this.eT.t(0,b)},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return new P.Id(this).c1(this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return new P.Id(this).ld(this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return new P.Id(this).Vn(this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13732,7 +13690,7 @@
 mg:[function(a,b,c){return new P.Id(this).nA(this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return new P.Id(this).TE(this,a)},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return new P.Id(this).V6(this,a)},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return new P.Id(this).mz(this,a)},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){new P.Id(this).RK(this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return new P.Id(this).pX(this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){new P.Id(this).RB(0,this,b)},"call$1","gJS",2,0,null,180,[]]},
@@ -13742,22 +13700,20 @@
 $isEH:true},
 eM:{
 "^":"Tp:115;c,d",
-call$0:[function(){var z,y,x
+call$0:[function(){var z,y
 z=this.c
 P.JS("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null){x=J.x(z)
-x=typeof z==="object"&&z!==null&&!!x.$isGe}else x=!1
-if(x)y=z.gI4()
+if(y==null&&!!J.x(z).$isGe)y=z.gI4()
 if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Ha:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){if(a==null)throw H.b(new P.AT("ZoneValue key must not be null"))
-this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
-W5:{
+nU:{
 "^":"a;",
 gE2:function(){return P.xP()},
 hk:function(a,b){return this.gE2().call$2(a,b)},
@@ -13771,8 +13727,8 @@
 Al:function(a){return this.gFh().call$1(a)},
 gXp:function(){return P.zi()},
 cR:function(a){return this.gXp().call$1(a)},
-gaj:function(){return P.uu()},
-O8:function(a){return this.gaj().call$1(a)},
+gfb:function(){return P.uu()},
+O8:function(a){return this.gfb().call$1(a)},
 grb:function(){return P.G2()},
 wr:function(a){return this.grb().call$1(a)},
 RK:function(a,b){return this.grb().call$2(a,b)},
@@ -13787,8 +13743,8 @@
 geT:function(a){return},
 gzU:function(){return C.v8},
 gC5:function(){return this},
-fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,434,[]],
-t:[function(a,b){return},"call$1","gIA",2,0,null,47,[]],
+fC:[function(a){return a.gC5()===this},"call$1","gRX",2,0,null,446,[]],
+t:[function(a,b){return},"call$1","gIA",2,0,null,48,[]],
 hk:[function(a,b){return P.L2(this,null,this,a,b)},"call$2","gE2",4,0,null,159,[],160,[]],
 c6:[function(a,b){return P.UA(this,null,this,a,b)},function(a){return this.c6(a,null)},"iT","call$2$specification$zoneValues",null,"giq",0,5,null,82,82,183,[],184,[]],
 Gr:[function(a){return P.T8(this,null,this,a)},"call$1","gcP",2,0,null,117,[]],
@@ -13796,7 +13752,7 @@
 mg:[function(a,b,c){return P.Qx(this,null,this,a,b,c)},"call$3","gpU",6,0,null,117,[],59,[],60,[]],
 Al:[function(a){return a},"call$1","gFh",2,0,null,117,[]],
 cR:[function(a){return a},"call$1","gXp",2,0,null,117,[]],
-O8:[function(a){return a},"call$1","gaj",2,0,null,117,[]],
+O8:[function(a){return a},"call$1","gfb",2,0,null,117,[]],
 wr:[function(a){P.Tk(this,null,this,a)},"call$1","grb",2,0,null,117,[]],
 uN:[function(a,b){return P.h8(this,null,this,a,b)},"call$2","gZq",4,0,null,166,[],117,[]],
 Ch:[function(a,b){H.qw(b)
@@ -13877,11 +13833,11 @@
 return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
 return y==null?!1:y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
 di:[function(a){var z=this.Ig()
 z.toString
-return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,28,[]],
-FV:[function(a,b){H.bQ(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
+return H.Ck(z,new P.ce(this,a))},"call$1","gmc",2,0,null,30,[]],
+FV:[function(a,b){J.kH(b,new P.DJ(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u,t
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -13893,7 +13849,7 @@
 if(v==null)return
 u=v[this.nm(b)]
 t=this.aH(u,b)
-return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,47,[]],
+return t<0?null:u[t+1]}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.a0()
@@ -13909,7 +13865,7 @@
 if(u>=0)v[u+1]=c
 else{v.push(b,c)
 this.X5=this.X5+1
-this.wV=null}}}},"call$2","gj3",4,0,null,47,[],28,[]],
+this.wV=null}}}},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -13920,7 +13876,7 @@
 if(x<0)return
 this.X5=this.X5-1
 this.wV=null
-return y.splice(x,2)[1]}},"call$1","guH",2,0,null,47,[]],
+return y.splice(x,2)[1]}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.wV=null
 this.OB=null
 this.OX=null
@@ -13930,7 +13886,7 @@
 z=this.Ig()
 for(y=z.length,x=0;x<y;++x){w=z[x]
 b.call$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.wV)throw H.b(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 Ig:[function(){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.wV
 if(z!=null)return z
@@ -13951,71 +13907,71 @@
 for(o=0;o<p;o+=2){y[u]=q[o];++u}}}this.wV=y
 return y},"call$0","gtL",0,0,null],
 dg:[function(a,b,c){if(a[b]==null){this.X5=this.X5+1
-this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+this.wV=null}P.cW(a,b,c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a!=null&&a[b]!=null){z=P.vL(a,b)
 delete a[b]
 this.X5=this.X5-1
 this.wV=null
-return z}else return},"call$2","got",4,0,null,185,[],47,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return z}else return},"call$2","got",4,0,null,185,[],48,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 $isZ0:true,
 static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"call$2","ME",4,0,null,185,[],47,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"call$3","rn",6,0,null,185,[],47,[],28,[]],a0:[function(){var z=Object.create(null)
+return z===a?null:z},"call$2","ME",4,0,null,185,[],48,[]],cW:[function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},"call$3","rn",6,0,null,185,[],48,[],30,[]],a0:[function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
 return z},"call$0","Vd",0,0,null]}},
 oi:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ce:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 DJ:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
 PL:{
 "^":"k6;X5,vv,OX,OB,wV",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],47,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],48,[]]},
 Fq:{
 "^":"k6;m6,Q6,ac,X5,vv,OX,OB,wV",
 WV:function(a,b){return this.m6.call$2(a,b)},
 H5:function(a){return this.Q6.call$1(a)},
 Ef:function(a){return this.ac.call$1(a)},
 t:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,47,[]],
+return P.k6.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,48,[]],
 x4:[function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,47,[]],
+return P.k6.prototype.x4.call(this,a)},"call$1","gV9",2,0,null,48,[]],
 Rz:[function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,47,[]],
-nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+return P.k6.prototype.Rz.call(this,this,b)},"call$1","guH",2,0,null,48,[]],
+nm:[function(a){return this.H5(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -14058,8 +14014,8 @@
 if(y==null)return!1
 return y[a]!=null}else{x=this.OB
 if(x==null)return!1
-return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,28,[]],
+return this.aH(x[this.nm(a)],a)>=0}},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},"call$1","gmc",2,0,null,30,[]],
 FV:[function(a,b){J.kH(b,new P.S9(this))},"call$1","gDY",2,0,null,109,[]],
 t:[function(a,b){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
@@ -14073,7 +14029,7 @@
 v=w[this.nm(b)]
 u=this.aH(v,b)
 if(u<0)return
-return v[u].gS4()}},"call$1","gIA",2,0,null,47,[]],
+return v[u].gS4()}},"call$1","gIA",2,0,null,48,[]],
 u:[function(a,b,c){var z,y,x,w,v,u
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null){z=P.Qs()
@@ -14086,12 +14042,12 @@
 if(v==null)x[w]=[this.pE(b,c)]
 else{u=this.aH(v,b)
 if(u>=0)v[u].sS4(c)
-else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,47,[],28,[]],
+else v.push(this.pE(b,c))}}},"call$2","gj3",4,0,null,48,[],30,[]],
 to:[function(a,b){var z
 if(this.x4(a))return this.t(0,a)
 z=b.call$0()
 this.u(0,a,z)
-return z},"call$2","gMs",4,0,null,47,[],438,[]],
+return z},"call$2","gME",4,0,null,48,[],450,[]],
 Rz:[function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14102,7 +14058,7 @@
 if(x<0)return
 w=y.splice(x,1)[0]
 this.Vb(w)
-return w.gS4()}},"call$1","guH",2,0,null,47,[]],
+return w.gS4()}},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){if(this.X5>0){this.lX=null
 this.H9=null
 this.OB=null
@@ -14115,17 +14071,17 @@
 y=this.zN
 for(;z!=null;){b.call$2(z.gkh(),z.gS4())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 dg:[function(a,b,c){var z=a[b]
 if(z==null)a[b]=this.pE(b,c)
-else z.sS4(c)},"call$3","gLa",6,0,null,185,[],47,[],28,[]],
+else z.sS4(c)},"call$3","gLa",6,0,null,185,[],48,[],30,[]],
 Nv:[function(a,b){var z
 if(a==null)return
 z=a[b]
 if(z==null)return
 this.Vb(z)
 delete a[b]
-return z.gS4()},"call$2","got",4,0,null,185,[],47,[]],
+return z.gS4()},"call$2","got",4,0,null,185,[],48,[]],
 pE:[function(a,b){var z,y
 z=new P.db(a,b,null,null)
 if(this.H9==null){this.lX=z
@@ -14134,7 +14090,7 @@
 y.sDG(z)
 this.lX=z}this.X5=this.X5+1
 this.zN=this.zN+1&67108863
-return z},"call$2","gTM",4,0,null,47,[],28,[]],
+return z},"call$2","gTM",4,0,null,48,[],30,[]],
 Vb:[function(a){var z,y
 z=a.gzQ()
 y=a.gDG()
@@ -14143,13 +14099,13 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
-nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
+nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],47,[]],
+return-1},"call$2","gSP",4,0,null,448,[],48,[]],
 bu:[function(a){return P.vW(this)},"call$0","gXo",0,0,null],
 $isFo:true,
 $isZ0:true,
@@ -14159,15 +14115,15 @@
 return z},"call$0","Bs",0,0,null]}},
 a1:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return this.a.t(0,a)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 ou:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,437,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),this.b)},"call$1",null,2,0,null,449,[],"call"],
 $isEH:true},
 S9:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
 db:{
@@ -14249,7 +14205,7 @@
 this.DM=null
 return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14300,18 +14256,19 @@
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y],b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
 YO:{
 "^":"UB;X5,vv,OX,OB,DM",
-nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,47,[]],
+nm:[function(a){return H.CU(a)&0x3ffffff},"call$1","gtU",2,0,null,48,[]],
 aH:[function(a,b){var z,y,x
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y){x=a[y]
-if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,436,[],132,[]]},
+if(x==null?b==null:x===b)return y}return-1},"call$2","gSP",4,0,null,448,[],132,[]]},
 oz:{
 "^":"a;O2,DM,zi,fD",
 gl:function(){return this.fD},
@@ -14355,7 +14312,7 @@
 y=this.zN
 for(;z!=null;){b.call$1(z.gGc())
 if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},"call$1","gjw",2,0,null,397,[]],
+z=z.gDG()}},"call$1","gjw",2,0,null,408,[]],
 grZ:function(a){var z=this.lX
 if(z==null)throw H.b(new P.lj("No elements"))
 return z.gGc()},
@@ -14381,7 +14338,7 @@
 else{if(this.aH(u,b)>=0)return!1
 u.push(this.xf(b))}return!0}},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,440,[]],
+for(z=J.GP(b);z.G();)this.h(0,z.gl())},"call$1","gDY",2,0,null,452,[]],
 Rz:[function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
 else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
@@ -14426,13 +14383,14 @@
 if(y==null)this.lX=z
 else y.szQ(z)
 this.X5=this.X5-1
-this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,439,[]],
+this.zN=this.zN+1&67108863},"call$1","glZ",2,0,null,451,[]],
 nm:[function(a){return J.v1(a)&0x3ffffff},"call$1","gtU",2,0,null,132,[]],
 aH:[function(a,b){var z,y
 if(a==null)return-1
 z=a.length
 for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
-return-1},"call$2","gSP",4,0,null,436,[],132,[]],
+return-1},"call$2","gSP",4,0,null,448,[],132,[]],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14451,7 +14409,7 @@
 Yp:{
 "^":"w2Y;G4",
 gB:function(a){return J.q8(this.G4)},
-t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,52,[]]},
+t:[function(a,b){return J.i4(this.G4,b)},"call$1","gIA",2,0,null,15,[]]},
 lN:{
 "^":"mW;",
 tt:[function(a,b){var z,y,x,w,v
@@ -14461,8 +14419,9 @@
 z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
 v=x+1
 if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=w}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
+$isz5:true,
 $isyN:true,
 $isQV:true,
 $asQV:null},
@@ -14484,11 +14443,11 @@
 else{y.KF(H.d(z.gl()))
 for(;z.G();){y.vM=y.vM+b
 x=H.d(z.gl())
-y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,330,331,[]],
+y.vM=y.vM+x}}return y.vM},"call$1","gNU",0,2,null,340,341,[]],
 Vr:[function(a,b){var z
 for(z=this.gA(this);z.G();)if(b.call$1(z.gl())===!0)return!0
 return!1},"call$1","gG2",2,0,null,117,[]],
-tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+tt:[function(a,b){return P.F(this,b,H.ip(this,"mW",0))},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 gB:function(a){var z,y
 z=this.gA(this)
 for(y=0;z.G();)++y
@@ -14503,13 +14462,13 @@
 return y},
 qA:[function(a,b,c){var z,y
 for(z=this.gA(this);z.G();){y=z.gl()
-if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,398,[],441,[]],
+if(b.call$1(y)===!0)return y}throw H.b(new P.lj("No matching element"))},function(a,b){return this.qA(a,b,null)},"XG","call$2$orElse",null,"gyo",2,3,null,82,409,[],453,[]],
 Zv:[function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 w=J.x(y)
 if(w.n(y,0))return x
-y=w.W(y,1)}throw H.b(P.N(b))},"call$1","goY",2,0,null,52,[]],
+y=w.W(y,1)}throw H.b(P.N(b))},"call$1","gRV",2,0,null,15,[]],
 bu:[function(a){return P.FO(this)},"call$0","gXo",0,0,null],
 $isQV:true,
 $asQV:null},
@@ -14523,13 +14482,13 @@
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:[function(a,b){return this.t(a,b)},"call$1","goY",2,0,null,52,[]],
+Zv:[function(a,b){return this.t(a,b)},"call$1","gRV",2,0,null,15,[]],
 aN:[function(a,b){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){b.call$1(this.t(a,y))
-if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return J.de(this.gB(a),0)},
 gor:function(a){return!this.gl0(a)},
 grZ:function(a){if(J.de(this.gB(a),0))throw H.b(new P.lj("No elements"))
@@ -14548,13 +14507,13 @@
 if(typeof z!=="number")return H.s(z)
 y=0
 for(;y<z;++y){if(b.call$1(this.t(a,y))===!0)return!0
-if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,398,[]],
+if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},"call$1","gG2",2,0,null,409,[]],
 zV:[function(a,b){var z
 if(J.de(this.gB(a),0))return""
 z=P.p9("")
 z.We(a,b)
-return z.vM},"call$1","gNU",0,2,null,330,331,[]],
-ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,398,[]],
+return z.vM},"call$1","gNU",0,2,null,340,341,[]],
+ev:[function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},"call$1","gIR",2,0,null,409,[]],
 ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"call$1","gIr",2,0,null,117,[]],
 eR:[function(a,b){return H.q9(a,b,null,null)},"call$1","gZo",2,0,null,130,[]],
 tt:[function(a,b){var z,y,x
@@ -14569,12 +14528,12 @@
 if(!(x<y))break
 y=this.t(a,x)
 if(x>=z.length)return H.e(z,x)
-z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+z[x]=y;++x}return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){var z=this.gB(a)
 this.sB(a,J.WB(z,1))
 this.u(a,z,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
+for(z=J.GP(b);z.G();){y=z.gl()
 x=this.gB(a)
 this.sB(a,J.WB(x,1))
 this.u(a,x,y)}},"call$1","gDY",2,0,null,116,[]],
@@ -14605,8 +14564,13 @@
 y[x]=w}return y},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 Mu:[function(a,b,c){this.pZ(a,b,c)
 return H.q9(a,b,c,null)},"call$2","gYf",4,0,null,123,[],124,[]],
+UZ:[function(a,b,c){var z
+this.pZ(a,b,c)
+z=c-b
+this.YW(a,b,J.xH(this.gB(a),z),a,c)
+this.sB(a,J.xH(this.gB(a),z))},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x,w
-if(b>=0){z=this.gB(a)
+if(!(b<0)){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,this.gB(a)))
@@ -14621,7 +14585,7 @@
 if(typeof x!=="number")return H.s(x)
 if(e+y>x)throw H.b(new P.lj("Not enough elements"))
 if(e<b)for(w=y-1;w>=0;--w)this.u(a,b+w,z.t(d,e+w))
-else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+else for(w=0;w<y;++w)this.u(a,b+w,z.t(d,e+w))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 XU:[function(a,b,c){var z,y
 z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
@@ -14631,24 +14595,37 @@
 while(!0){z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
 if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],85,[]],
+if(J.de(this.t(a,y),b))return y;++y}return-1},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],85,[]],
 Pk:[function(a,b,c){var z,y
 c=J.xH(this.gB(a),1)
 for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
 return-1},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],85,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=this.gB(a)
+xe:[function(a,b,c){var z=this.gB(a)
 if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
+z=b>z
 if(z)throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
 return}this.sB(a,J.WB(this.gB(a),1))
 this.YW(a,b+1,this.gB(a),a,b)
-this.u(a,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z=this.t(a,b)
-this.YW(a,b,J.xH(this.gB(a),1),a,b+1)
-this.sB(a,J.xH(this.gB(a),1))
-return z},"call$1","gNM",2,0,null,52,[]],
+this.u(a,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){var z,y
+if(b>=0){z=this.gB(a)
+if(typeof z!=="number")return H.s(z)
+z=b>z}else z=!0
+if(z)throw H.b(P.TE(b,0,this.gB(a)))
+z=J.x(c)
+if(!!z.$isyN)c=z.br(c)
+y=J.q8(c)
+this.sB(a,J.WB(this.gB(a),y))
+if(typeof y!=="number")return H.s(y)
+this.YW(a,b+y,this.gB(a),a,b)
+this.Mh(a,b,c)},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){var z,y
+z=J.x(c)
+if(!!z.$isList){z=z.gB(c)
+if(typeof z!=="number")return H.s(z)
+this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+this.u(a,b,z.gl())}},"call$2","ghV",4,0,null,15,[],116,[]],
 bu:[function(a){var z
 if($.xb().tg(0,a))return"[...]"
 z=P.p9("")
@@ -14662,14 +14639,14 @@
 $isQV:true,
 $asQV:null},
 ZQ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+z.KF(b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
@@ -14681,17 +14658,16 @@
 for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
 if(y<0||y>=x.length)return H.e(x,y)
 b.call$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,397,[]],
+if(z!==this.qT)H.vh(P.a4(this))}},"call$1","gjw",2,0,null,408,[]],
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
+gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
+grZ:function(a){var z,y
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(new P.lj("No elements"))
 z=this.v5
-x=z.length
-y=(y-1&x-1)>>>0
-if(y<0||y>=x)return H.e(z,y)
+y=J.mQ(J.xH(y,1),this.v5.length-1)
+if(y>=z.length)return H.e(z,y)
 return z[y]},
 Zv:[function(a,b){var z,y,x
 z=J.Wx(b)
@@ -14702,21 +14678,23 @@
 x=z.length
 y=(y+b&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
-return z[y]},"call$1","goY",2,0,null,52,[]],
+return z[y]},"call$1","gRV",2,0,null,15,[]],
 tt:[function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
 z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
-return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
+return z},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
 h:[function(a,b){this.NZ(0,b)},"call$1","ght",2,0,null,132,[]],
 FV:[function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
+z=J.x(b)
+if(!!z.$isList){y=z.gB(b)
+x=this.gB(this)
+if(typeof y!=="number")return H.s(y)
+z=x+y
 w=this.v5
 v=w.length
-if(x>=v){u=P.ua(x)
+if(z>=v){u=P.ua(z)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
@@ -14724,15 +14702,16 @@
 this.eZ=this.wR(t)
 this.v5=t
 this.av=0
-H.qG(t,y,x,b,0)
-this.eZ=this.eZ+z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ=this.eZ+z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}this.qT=this.qT+1},"call$1","gDY",2,0,null,443,[]],
+H.qG(t,x,z,b,0)
+this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
+if(typeof z!=="number")return H.s(z)
+s=v-z
+if(y<s){H.qG(w,z,z+y,b,0)
+this.eZ=J.WB(this.eZ,y)}else{r=y-s
+H.qG(w,z,z+s,b,0)
+z=this.v5
+H.qG(z,0,r,b,s)
+this.eZ=r}}this.qT=this.qT+1}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},"call$1","gDY",2,0,null,455,[]],
 Rz:[function(a,b){var z,y
 for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
 if(z<0||z>=y.length)return H.e(y,z)
@@ -14747,38 +14726,33 @@
 this.av=0
 this.qT=this.qT+1}},"call$0","gRa",0,0,null],
 bu:[function(a){return H.mx(this,"{","}")},"call$0","gXo",0,0,null],
-NZ:[function(a,b){var z,y,x
+NZ:[function(a,b){var z,y
 z=this.v5
 y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
 z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.VW()
+y=(y+1&this.v5.length-1)>>>0
+this.eZ=y
+if(this.av===y)this.VW()
 this.qT=this.qT+1},"call$1","gXk",2,0,null,132,[]],
 bB:[function(a){var z,y,x,w,v,u,t,s
-z=this.v5
-y=z.length
-x=y-1
-w=this.av
-v=this.eZ
-if((a-w&x)>>>0<(v-a&x)>>>0){for(u=a;u!==w;u=t){t=(u-1&x)>>>0
-if(t<0||t>=y)return H.e(z,t)
-v=z[t]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w>=y)return H.e(z,w)
-z[w]=null
-this.av=(w+1&x)>>>0
-return(a+1&x)>>>0}else{w=(v-1&x)>>>0
-this.eZ=w
-for(u=a;u!==w;u=s){s=(u+1&x)>>>0
-if(s<0||s>=y)return H.e(z,s)
-v=z[s]
-if(u<0||u>=y)return H.e(z,u)
-z[u]=v}if(w<0||w>=y)return H.e(z,w)
-z[w]=null
-return a}},"call$1","gzv",2,0,null,444,[]],
+z=this.v5.length-1
+if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
+if(u<0||u>=w)return H.e(x,u)
+t=x[u]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+this.av=(y+1&z)>>>0
+return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
+this.eZ=y
+for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
+if(s<0||s>=w)return H.e(x,s)
+t=x[s]
+if(v<0||v>=w)return H.e(x,v)
+x[v]=t}if(y>=w)return H.e(x,y)
+x[y]=null
+return a}},"call$1","gzv",2,0,null,456,[]],
 VW:[function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
@@ -14793,25 +14767,29 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},"call$0","gJm",0,0,null],
-wR:[function(a){var z,y,x,w,v
+wR:[function(a){var z,y,x,w
 z=this.av
 y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
+if(typeof y!=="number")return H.s(y)
+if(z<=y){x=y-z
+z=this.v5
+y=this.av
+H.qG(a,0,x,z,y)
+return x}else{y=this.v5
+w=y.length-z
+H.qG(a,0,w,y,z)
 z=this.eZ
+if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},"call$1","gLR",2,0,null,79,[]],
+H.qG(a,w,w+z,y,0)
+return J.WB(this.eZ,w)}},"call$1","gLR",2,0,null,79,[]],
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
 $isQV:true,
 $asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+static:{"^":"PO",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
 z.Eo(a,b)
 return z},ua:[function(a){var z
 if(typeof a!=="number")return a.O()
@@ -14875,10 +14853,10 @@
 y.T8=null
 y.Bb=null
 this.bb=this.bb+1
-return v},"call$1","gST",2,0,null,47,[]],
+return v},"call$1","gST",2,0,null,48,[]],
 Xu:[function(a){var z,y
 for(z=a;y=z.T8,y!=null;z=y){z.T8=y.Bb
-y.Bb=z}return z},"call$1","gug",2,0,null,260,[]],
+y.Bb=z}return z},"call$1","gug",2,0,null,263,[]],
 bB:[function(a){var z,y,x
 if(this.aY==null)return
 if(!J.de(this.vh(a),0))return
@@ -14890,7 +14868,7 @@
 else{y=this.Xu(y)
 this.aY=y
 y.T8=x}this.qT=this.qT+1
-return z},"call$1","gzv",2,0,null,47,[]],
+return z},"call$1","gzv",2,0,null,48,[]],
 fS:[function(a,b){var z,y
 this.P6=this.P6+1
 this.qT=this.qT+1
@@ -14901,27 +14879,27 @@
 a.T8=y.T8
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
-y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,260,[],445,[]]},
+y.Bb=null}this.aY=a},"call$2","gSx",4,0,null,263,[],457,[]]},
 Ba:{
 "^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.call$2(a,b)},
 Ef:function(a){return this.ac.call$1(a)},
-yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,446,[],447,[]],
+yV:[function(a,b){return this.wS(a,b)},"call$2","gNA",4,0,null,458,[],459,[]],
 t:[function(a,b){if(b==null)throw H.b(new P.AT(b))
 if(this.Ef(b)!==!0)return
 if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},"call$1","gIA",2,0,null,47,[]],
+return},"call$1","gIA",2,0,null,48,[]],
 Rz:[function(a,b){var z
 if(this.Ef(b)!==!0)return
 z=this.bB(b)
 if(z!=null)return z.P
-return},"call$1","guH",2,0,null,47,[]],
+return},"call$1","guH",2,0,null,48,[]],
 u:[function(a,b,c){var z
 if(b==null)throw H.b(new P.AT(b))
 z=this.vh(b)
 if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,47,[],28,[]],
-FV:[function(a,b){H.bQ(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
+return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},"call$2","gj3",4,0,null,48,[],30,[]],
+FV:[function(a,b){J.kH(b,new P.bF(this))},"call$1","gDY",2,0,null,109,[]],
 gl0:function(a){return this.aY==null},
 gor:function(a){return this.aY!=null},
 aN:[function(a,b){var z,y,x
@@ -14935,8 +14913,8 @@
 V1:[function(a){this.aY=null
 this.P6=0
 this.qT=this.qT+1},"call$0","gRa",0,0,null],
-x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return new P.BW(this,a,this.bb).call$1(this.aY)},"call$1","gmc",2,0,null,30,[]],
 gvc:function(a){return H.VM(new P.OG(this),[H.Kp(this,0)])},
 gUQ:function(a){var z=new P.uM(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
@@ -14953,21 +14931,21 @@
 An:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=H.XY(a,this.a)
-return z},"call$1",null,2,0,null,272,[],"call"],
+return z},"call$1",null,2,0,null,275,[],"call"],
 $isEH:true},
 bF:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 BW:{
-"^":"Tp:448;a,b,c",
+"^":"Tp:460;a,b,c",
 call$1:[function(a){var z,y,x,w
 for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
 if(z!==y.bb)throw H.b(P.a4(y))
 w=a.T8
 if(w!=null&&this.call$1(w)===!0)return!0
-a=a.Bb}return!1},"call$1",null,2,0,null,260,[],"call"],
+a=a.Bb}return!1},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 S6B:{
 "^":"a;",
@@ -14976,7 +14954,7 @@
 return this.Wb(z)},
 p0:[function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},"call$1","gBl",2,0,null,260,[]],
+a=a.Bb}},"call$1","gBl",2,0,null,263,[]],
 G:[function(){var z,y,x
 z=this.Dn
 if(this.qT!==z.qT)throw H.b(P.a4(z))
@@ -15018,14 +14996,14 @@
 $isyN:true},
 DN:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,260,[]]},
+Wb:[function(a){return a.G3},"call$1","gBL",2,0,null,263,[]]},
 ZM:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a.P},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a.P},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a,b){return[b]}},
 HW:{
 "^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:[function(a){return a},"call$1","gBL",2,0,null,260,[]],
+Wb:[function(a){return a},"call$1","gBL",2,0,null,263,[]],
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
 VQ:[function(a,b){var z=new P.JC()
@@ -15036,11 +15014,11 @@
 z=null
 try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,32,[],193,[]],
+throw H.b(P.cD(String(y)))}return P.VQ(z,b)},"call$2","H4",4,0,null,33,[],193,[]],
 tp:[function(a){return a.Lt()},"call$1","BC",2,0,194,6,[]],
 JC:{
-"^":"Tp:348;",
-call$2:[function(a,b){return b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 f1:{
 "^":"Tp:112;a",
@@ -15053,7 +15031,7 @@
 for(y=this.a,x=0;x<w.length;++x){u=w[x]
 v.u(0,u,y.call$2(u,this.call$1(a[u])))}t=a.__proto__
 if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.call$2("__proto__",this.call$1(t)))
-return v},"call$1",null,2,0,null,19,[],"call"],
+return v},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Uk:{
 "^":"a;"},
@@ -15073,12 +15051,12 @@
 static:{TP:function(a){return new P.K8(a,null)}}},
 by:{
 "^":"Uk;N5,iY",
-c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,32,[],193,[]],
-Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,28,[],195,[]],
+c8:[function(a,b){return P.BS(a,this.gHe().N5)},function(a){return this.c8(a,null)},"kV","call$2$reviver",null,"gzL",2,3,null,82,33,[],193,[]],
+Co:[function(a,b){return P.Ks(a,this.gZE().Xi)},function(a){return this.Co(a,null)},"KP","call$2$toEncodable",null,"gV0",2,3,null,82,30,[],195,[]],
 gZE:function(){return C.Ap},
 gHe:function(){return C.A3},
 $asUk:function(){return[P.a,J.O]}},
-pD:{
+dI:{
 "^":"zF;Xi",
 $aszF:function(){return[P.a,J.O]}},
 Cf:{
@@ -15121,7 +15099,7 @@
 this.Vy.KF(z)},"call$1","gOx",2,0,null,91,[]],
 WD:[function(a){var z=this.qi
 if(z.tg(0,a))throw H.b(P.TP(a))
-z.h(0,a)},"call$1","gUW",2,0,null,6,[]],
+z.h(0,a)},"call$1","gaS",2,0,null,6,[]],
 rl:[function(a){var z,y,x,w,v
 if(!this.IS(a)){x=a
 w=this.qi
@@ -15144,7 +15122,7 @@
 this.aK(a)
 z.KF("\"")
 return!0}else{y=J.x(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.WD(a)
+if(!!y.$isList){this.WD(a)
 z=this.Vy
 z.KF("[")
 if(J.z8(y.gB(a),0)){this.rl(y.t(a,0))
@@ -15155,7 +15133,7 @@
 z.vM=z.vM+","
 this.rl(y.t(a,x));++x}}z.KF("]")
 this.qi.Rz(0,a)
-return!0}else if(typeof a==="object"&&a!==null&&!!y.$isZ0){this.WD(a)
+return!0}else if(!!y.$isZ0){this.WD(a)
 w=this.Vy
 w.KF("{")
 z.a=!0
@@ -15163,13 +15141,13 @@
 w.KF("}")
 this.qi.Rz(0,a)
 return!0}else return!1}},"call$1","gjQ",2,0,null,6,[]],
-static:{"^":"P3,Ib,FC,Yz,ij,fg,SW,eJ,MU,ql,NXu,PBv,QVv",Ks:[function(a,b){var z
+static:{"^":"P3,Ib,FC,Yz,ij,fg,bz,eJ,MU,ql,vO,PBv,QVv",Ks:[function(a,b){var z
 b=P.BC()
 z=P.p9("")
 new P.Sh(b,z,P.yv(null)).rl(a)
-return z.vM},"call$2","nB",4,0,null,6,[],195,[]]}},
+return z.vM},"call$2","tq",4,0,null,6,[],195,[]]}},
 tF:{
-"^":"Tp:449;a,b",
+"^":"Tp:461;a,b",
 call$2:[function(a,b){var z,y,x
 z=this.a
 y=this.b
@@ -15178,13 +15156,13 @@
 x.KF("\"")}y.aK(a)
 x.KF("\":")
 y.rl(b)
-z.a=!1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.a=!1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 z0:{
 "^":"Zi;lH",
 goc:function(a){return"utf-8"},
-gZE:function(){return new P.E3()}},
-E3:{
+gZE:function(){return new P.om()}},
+om:{
 "^":"zF;",
 WJ:[function(a){var z,y,x
 z=J.U6(a)
@@ -15193,7 +15171,7 @@
 y=H.VM(Array(y),[J.im])
 x=new P.Rw(0,0,y)
 if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,31,[]],
+return C.Nm.D6(y,0,x.ZP)},"call$1","gj5",2,0,null,14,[]],
 $aszF:function(){return[J.O,[J.Q,J.im]]}},
 Rw:{
 "^":"a;WF,ZP,EN",
@@ -15229,7 +15207,7 @@
 this.ZP=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
-return!1}},"call$2","gkL",4,0,null,450,[],451,[]],
+return!1}},"call$2","gkL",4,0,null,462,[],463,[]],
 fJ:[function(a,b,c){var z,y,x,w,v,u,t,s
 if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
@@ -15262,10 +15240,10 @@
 z[s]=128|v>>>6&63
 this.ZP=u+1
 if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,336,[],123,[],124,[]],
+z[u]=128|v&63}}return w},"call$3","gkH",6,0,null,346,[],123,[],124,[]],
 static:{"^":"Ni"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"call$1","Ex",2,0,null,49,[]],
+Te:[function(a){return},"call$1","Ex",2,0,null,50,[]],
 Wc:[function(a,b){return J.oE(a,b)},"call$2","n4",4,0,196,131,[],187,[]],
 hl:[function(a){var z,y,x,w,v,u
 if(typeof a==="number"||typeof a==="boolean"||null==a)return J.AG(a)
@@ -15294,7 +15272,7 @@
 FM:function(a){return new P.HG(a)},
 ad:[function(a,b){return a==null?b==null:a===b},"call$2","N3",4,0,199,131,[],187,[]],
 NS:[function(a){return H.CU(a)},"call$1","cE",2,0,200,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,32,[],33,[],163,[]],
+QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"call$3$onError$radix","call$1","call$2$onError","ya",2,5,201,82,82,33,[],34,[],163,[]],
 O8:function(a,b,c){var z,y,x
 z=J.Qi(a,c)
 if(a!==0&&b!=null)for(y=z.length,x=0;x<y;++x)z[x]=b
@@ -15313,17 +15291,17 @@
 HM:function(a){return H.eT(a)},
 fc:function(a){return P.HM(P.O8(1,a,J.im))},
 HB:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"call$2",null,4,0,null,136,[],30,[],"call"],
 $isEH:true},
 CL:{
-"^":"Tp:404;a",
+"^":"Tp:416;a",
 call$2:[function(a,b){var z=this.a
 if(z.b>0)z.a.KF(", ")
 z.a.KF(J.GL(a))
 z.a.KF(": ")
 z.a.KF(P.hl(b))
-z.b=z.b+1},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.b=z.b+1},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 p4:{
 "^":"a;OF",
@@ -15336,10 +15314,8 @@
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isiP)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isiP)return!1
 return this.y3===b.y3&&this.aL===b.aL},"call$1","gUJ",2,0,null,109,[]],
 iM:[function(a,b){return C.CD.iM(this.y3,b.gy3())},"call$1","gYc",2,0,null,109,[]],
 giO:function(a){return this.y3},
@@ -15358,7 +15334,7 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(new P.AT(a))},
 $isiP:true,
-static:{"^":"aV,bI,Hq,Kw,oA,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,Nr,bm,FI,hZ,PW,dM,lme",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+static:{"^":"aV,bI,Hq,Kw,xz,mo,EQe,DU,tp1,Gi,fo,cR,Sx,KeL,Ne,NrX,bm,FI,Kz,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
 z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
@@ -15405,32 +15381,30 @@
 return"00"+a},"call$1","Dv",2,0,null,198,[]],h0:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1","wI",2,0,null,198,[]]}},
 MF:{
-"^":"Tp:453;",
+"^":"Tp:465;",
 call$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.BU(a,null,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 Rq:{
-"^":"Tp:454;",
+"^":"Tp:466;",
 call$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"call$1",null,2,0,null,452,[],"call"],
+return H.IH(a,null)},"call$1",null,2,0,null,464,[],"call"],
 $isEH:true},
 a6:{
 "^":"a;Fq<",
 g:[function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},"call$1","gF1n",2,0,null,109,[]],
 W:[function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},"call$1","gTG",2,0,null,109,[]],
 U:[function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,455,[]],
+return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},"call$1","gEH",2,0,null,467,[]],
 Z:[function(a,b){if(b===0)throw H.b(P.ts())
-return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,456,[]],
+return P.k5(0,0,C.jn.Z(this.Fq,b),0,0,0)},"call$1","guP",2,0,null,468,[]],
 C:[function(a,b){return this.Fq<b.gFq()},"call$1","gix",2,0,null,109,[]],
 D:[function(a,b){return this.Fq>b.gFq()},"call$1","gh1",2,0,null,109,[]],
 E:[function(a,b){return this.Fq<=b.gFq()},"call$1","gER",2,0,null,109,[]],
 F:[function(a,b){return this.Fq>=b.gFq()},"call$1","gNH",2,0,null,109,[]],
 gVs:function(){return C.jn.cU(this.Fq,1000)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isa6)return!1
+n:[function(a,b){if(b==null)return!1
+if(!J.x(b).$isa6)return!1
 return this.Fq===b.Fq},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:[function(a,b){return C.jn.iM(this.Fq,b.gFq())},"call$1","gYc",2,0,null,109,[]],
@@ -15445,7 +15419,7 @@
 $isa6:true,
 static:{"^":"Kl,S4d,pk,LoB,RD,b2,jS,ll,Do,f4,kTB,IJZ,iI,Vk,fm,yW",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
 P7:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=100000)return""+a
 if(a>=10000)return"0"+a
 if(a>=1000)return"00"+a
@@ -15454,7 +15428,7 @@
 return"00000"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 DW:{
-"^":"Tp:413;",
+"^":"Tp:425;",
 call$1:[function(a){if(a>=10)return""+a
 return"0"+a},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
@@ -15549,7 +15523,7 @@
 return z==null?null:H.of(z,this.Qz())},"call$1","gIA",2,0,null,6,[]],
 u:[function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],28,[]],
+H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},"call$2","gj3",4,0,null,6,[],30,[]],
 Qz:[function(){var z,y
 z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
@@ -15577,7 +15551,7 @@
 n:[function(a,b){return this===b},"call$1","gUJ",2,0,null,109,[]],
 giO:function(a){return H.eQ(this)},
 bu:[function(a){return H.a5(this)},"call$0","gXo",0,0,null],
-T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,329,[]],
+T:[function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},"call$1","gxK",2,0,null,339,[]],
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -15622,7 +15596,7 @@
 for(;z.G();){this.vM=this.vM+b
 y=z.gl()
 y=typeof y==="string"?y:H.d(y)
-this.vM=this.vM+y}}},"call$2","gCA",2,2,null,330,440,[],331,[]],
+this.vM=this.vM+y}}},"call$2","gCA",2,2,null,340,452,[],341,[]],
 V1:[function(a){this.vM=""},"call$0","gRa",0,0,null],
 bu:[function(a){return this.vM},"call$0","gXo",0,0,null],
 PD:function(a){if(typeof a==="string")this.vM=a
@@ -15656,11 +15630,11 @@
 z=!z
 if(z);y=z?P.Xc(a):C.jN.ez(b,new P.Kd()).zV(0,"/")
 if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},"call$2","gbQ",4,0,null,261,[],457,[]],
+return y},"call$2","gbQ",4,0,null,264,[],469,[]],
 Ky:[function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,458,[],459,[]],
+return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},"call$2","gAj",4,0,null,470,[],471,[]],
 uo:[function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,261,[]],
+return J.UU(a,"/.")!==-1},"call$1","gaO",2,0,null,264,[]],
 SK:[function(a){var z,y,x,w,v
 if(!this.uo(a))return a
 z=[]
@@ -15673,12 +15647,12 @@
 z.pop()}x=!0}else if("."===w)x=!0
 else{z.push(w)
 x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,261,[]],
+return C.Nm.zV(z,"/")},"call$1","ghK",2,0,null,264,[]],
 tb:[function(a){var z=this.ku
 if(""!==z){a.KF(z)
 a.KF("@")}a.KF(this.NN)
 if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,460,[]],
+a.KF(J.AG(this.HC))}},"call$1","gyL",2,0,null,472,[]],
 bu:[function(a){var z,y
 z=P.p9("")
 y=this.Fi
@@ -15692,8 +15666,8 @@
 z.KF(y)}return z.vM},"call$0","gXo",0,0,null],
 n:[function(a,b){var z,y
 if(b==null)return!1
-z=J.RE(b)
-if(typeof b!=="object"||b===null||!z.$isiD)return!1
+z=J.x(b)
+if(!z.$isiD)return!1
 if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
 y=b.r0
 z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
@@ -15708,7 +15682,7 @@
 else this.HC=e
 this.r0=this.x6(c,d)},
 $isiD:true,
-static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,eq,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,wb,eK,ws,Sp,aJ,JA7,dN,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
+static:{"^":"y2,q7,tv,ux,vI,SF,fd,IL,dH,zk,yt,fC,O5,lf,qf,ML,j3,r5,R1,qs,lL,WT,t2,H5,zst,eK,ws,Sp,aJ,JA7,wo,SQU,ne",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
 x=new P.hP()
 w=new P.Uo(a1)
 v=J.U6(a1)
@@ -15875,18 +15849,18 @@
 if(q&&!p)z.call$1("expected a part after last `:`")
 if(!q)try{J.bi(x,y.call$2(w,J.q8(a)))}catch(o){H.Ru(o)
 try{v=P.q5(J.ZZ(a,w))
-s=J.c1(J.UQ(v,0),8)
+s=J.Eh(J.UQ(v,0),8)
 r=J.UQ(v,1)
 if(typeof r!=="number")return H.s(r)
 J.bi(x,(s|r)>>>0)
-r=J.c1(J.UQ(v,2),8)
+r=J.Eh(J.UQ(v,2),8)
 s=J.UQ(v,3)
 if(typeof s!=="number")return H.s(s)
 J.bi(x,(r|s)>>>0)}catch(o){H.Ru(o)
 z.call$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.call$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.call$1("an address without a wildcard must contain exactly 8 parts")
 s=new H.kV(x,new P.d9(x))
 s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"call$1","kS",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+return P.F(s,!0,H.ip(s,"mW",0))},"call$1","y9",2,0,null,203,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t,s
 z=new P.rI()
 y=P.p9("")
 x=c.gZE().WJ(b)
@@ -15904,33 +15878,33 @@
 y.vM=y.vM+u
 z.call$2(v,y)}}return y.vM},"call$4$encoding$spaceToPlus","jd",4,5,null,209,210,211,[],212,[],213,[],214,[]]}},
 hP:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.aa,z)
 z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Uo:{
-"^":"Tp:463;a",
+"^":"Tp:475;a",
 call$1:[function(a){a=J.aK(this.a,"]",a)
 if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"call$1",null,2,0,null,52,[],"call"],
+return a+1},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 hb:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=a>>>4
 if(z>=8)return H.e(C.HE,z)
 z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 Kd:{
 "^":"Tp:112;",
 call$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 yZ:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z=this.a
 if(!z.a)this.b.KF("&")
 z.a=!1
@@ -15938,44 +15912,44 @@
 z.KF(P.jW(C.kg,a,C.xM,!0))
 b.gl0(b)
 z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.KF(P.jW(C.kg,b,C.xM,!0))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 Gs:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(!(48<=a&&a<=57))z=65<=a&&a<=70
 else z=!0
-return z},"call$1",null,2,0,null,464,[],"call"],
+return z},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 pm:{
-"^":"Tp:462;",
-call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,464,[],"call"],
+"^":"Tp:474;",
+call$1:[function(a){return 97<=a&&a<=102},"call$1",null,2,0,null,476,[],"call"],
 $isEH:true},
 Tw:{
-"^":"Tp:462;",
+"^":"Tp:474;",
 call$1:[function(a){var z
 if(a<128){z=C.jn.GG(a,4)
 if(z>=8)return H.e(C.kg,z)
 z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"call$1",null,2,0,null,461,[],"call"],
+return z},"call$1",null,2,0,null,473,[],"call"],
 $isEH:true},
 wm:{
-"^":"Tp:463;b,c,d",
+"^":"Tp:475;b,c,d",
 call$1:[function(a){var z,y
 z=this.b
 y=C.xB.j(z,a)
 if(this.d.call$1(y)===!0)return y-32
 else if(this.c.call$1(y)!==!0)throw H.b(new P.AT("Invalid URI component: "+z))
-else return y},"call$1",null,2,0,null,52,[],"call"],
+else return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 FB:{
-"^":"Tp:463;e",
+"^":"Tp:475;e",
 call$1:[function(a){var z,y,x,w
 for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
 if(48<=w&&w<=57)y=y*16+w-48
 else{w|=32
 if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,52,[],"call"],
+else throw H.b(new P.AT("Invalid percent-encoding in URI component: "+z))}}return y},"call$1",null,2,0,null,15,[],"call"],
 $isEH:true},
 Lk:{
 "^":"Tp:114;a,f",
@@ -15989,14 +15963,14 @@
 else y.KF(C.xB.Nj(w,x,v))},"call$0",null,0,0,null,"call"],
 $isEH:true},
 XZ:{
-"^":"Tp:466;",
+"^":"Tp:478;",
 call$2:[function(a,b){var z=J.v1(a)
 if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"call$2",null,4,0,null,465,[],241,[],"call"],
+return b*31+z&1073741823},"call$2",null,4,0,null,477,[],244,[],"call"],
 $isEH:true},
 Mx:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 C9:{
 "^":"Tp:112;a",
@@ -16004,14 +15978,14 @@
 z=H.BU(a,null,null)
 y=J.Wx(z)
 if(y.C(z,0)||y.D(z,255))this.a.call$1("each part must be in the range of `0..255`")
-return z},"call$1",null,2,0,null,467,[],"call"],
+return z},"call$1",null,2,0,null,479,[],"call"],
 $isEH:true},
 kZ:{
 "^":"Tp:181;",
-call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,20,[],"call"],
+call$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"call$1",null,2,0,null,22,[],"call"],
 $isEH:true},
 JT:{
-"^":"Tp:468;a,b",
+"^":"Tp:480;a,b",
 call$2:[function(a,b){var z,y
 if(b-a>4)this.b.call$1("an IPv6 part can only contain a maximum of 4 hex digits")
 z=H.BU(C.xB.Nj(this.a,a,b),16,null)
@@ -16023,18 +15997,18 @@
 "^":"Tp:112;c",
 call$1:[function(a){var z=J.x(a)
 if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,28,[],"call"],
+else return[z.m(a,8)&255,z.i(a,255)]},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rI:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=J.Wx(a)
 b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,469,[],470,[],"call"],
+b.KF(P.fc(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"call$2",null,4,0,null,481,[],482,[],"call"],
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
 UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
 else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"call$1","pq",2,0,215,19,[]],
+return"transitionend"},"call$1","pq",2,0,215,21,[]],
 r3:[function(a,b){return document.createElement(a)},"call$2","Oe",4,0,null,99,[],216,[]],
 It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"call$3$onProgress$withCredentials","xF",2,5,null,82,82,217,[],218,[],219,[]],
 lt:[function(a,b,c,d,e,f,g,h){var z,y,x
@@ -16051,27 +16025,23 @@
 ED:function(a){var z,y
 z=document.createElement("input",null)
 if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-uC:[function(a){var z,y,x
-try{z=a
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$iscS}catch(x){H.Ru(x)
-return!1}},"call$1","tn",2,0,null,225,[]],
+uC:[function(a){var z
+try{return!!J.x(a).$iscS}catch(z){H.Ru(z)
+return!1}},"call$1","pR",2,0,null,225,[]],
 Pv:[function(a){if(a==null)return
 return W.P1(a)},"call$1","Ie",2,0,null,226,[]],
-qc:[function(a){var z,y
+qc:[function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isD0)return z
-return}else return a},"call$1","Wq",2,0,null,19,[]],
-qr:[function(a){return a},"call$1","Ku",2,0,null,19,[]],
-Z9:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF)return a
+if(!!J.x(z).$isD0)return z
+return}else return a},"call$1","Wq",2,0,null,21,[]],
+qr:[function(a){return a},"call$1","Ku",2,0,null,21,[]],
+Z9:[function(a){if(!!J.x(a).$isQF)return a
 return P.o7(a,!0)},"call$1","cj",2,0,null,96,[]],
 YT:[function(a,b){return new W.vZ(a,b)},"call$2","AD",4,0,null,227,[],7,[]],
-GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,46,[]],
-Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,46,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,46,[],12,[],229,[],230,[]],
+GO:[function(a){return J.TD(a)},"call$1","V5",2,0,112,47,[]],
+Yb:[function(a){return J.Vq(a)},"call$1","cn",2,0,112,47,[]],
+Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"call$4","A6",8,0,228,47,[],12,[],229,[],230,[]],
 wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
 z=J.Xr(d)
 if(z==null)throw H.b(new P.AT(d))
@@ -16118,7 +16088,7 @@
 return $.X3.PT(a,!0)},"call$1","ZJ",2,0,null,155,[]],
 qE:{
 "^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;Sa|GN|ir|uL|Vf|G6|Ds|xI|Tg|pv|Jc|CN|Vfx|Be|Dsd|E0|LP|lw|tuj|E9|Vct|rm|m8|D13|Gk|qW|WZq|mk|pva|jY|pR|cda|hx|waa|u7|V4|E7|V9|Kz|V10|vj|LU|V11|KL|F1|V12|aQ|V13|Qa|V14|Ww|V15|tz|V16|fl|V17|Zt|V18|iL|V19|lI|XP|V20|JG|T5|knI|V21|fI|V22|ob|V23|nm|V24|Vu"},
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|GN|ir|uL|Ds|G6|pv|xI|Tg|Vfx|Jc|CN|Dsd|Be|tuj|E0|LP|lw|Vct|E9|D13|rm|m8|WZq|Gk|T5|AX|pva|mk|cda|lb|waa|jY|NG|V4|hx|V9|u7|V10|kKl|oO|V11|St|V12|qkb|V13|vj|LU|V14|KL|F1|V15|aQ|V16|Qa|V17|Ww|V18|tz|V19|fl|V20|Zt|V21|iL|V22|lI|XP|V23|JG|qe|knI|V24|fI|V25|ob|Nr|Uj|V26|nm|V27|Vu"},
 zw:{
 "^":"Gv;",
 $isList:true,
@@ -16130,12 +16100,10 @@
 Ps:{
 "^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAnchorElement"},
 Sb:{
 "^":"qE;N:target=,cC:hash%,mH:href=",
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
-$isGv:true,
 "%":"HTMLAreaElement"},
 Xk:{
 "^":"qE;mH:href=,N:target=",
@@ -16150,15 +16118,28 @@
 Fy:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLBodyElement"},
 QW:{
 "^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLButtonElement"},
+Ny:{
+"^":"qE;fg:height%,R:width%",
+gVE:function(a){return a.getContext("2d")},
+"%":"HTMLCanvasElement"},
+Yd:{
+"^":"Gv;",
+"%":";CanvasRenderingContext"},
+mj:{
+"^":"Yd;",
+A8:[function(a,b,c,d,e,f,g,h){var z
+if(g!=null)z=!0
+else z=!1
+if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
+return}throw H.b(new P.AT("Incorrect number or type of arguments"))},"call$7","gFg",6,8,null,82,82,82,82,293,[],294,[],295,[],296,[],297,[],298,[],299,[]],
+"%":"CanvasRenderingContext2D"},
 Zv:{
 "^":"KV;Rn:data=,B:length=",
-$isGv:true,
 "%":"Comment;CharacterData"},
 Yr:{
 "^":"ea;tT:code=",
@@ -16179,14 +16160,14 @@
 QF:{
 "^":"KV;",
 JP:[function(a){return a.createDocumentFragment()},"call$0","gL9",0,0,null],
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
-ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,260,[],292,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
+ek:[function(a,b,c){return a.importNode(b,c)},"call$2","gPp",2,2,null,82,263,[],301,[]],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 $isQF:true,
 "%":"Document|HTMLDocument|SVGDocument"},
 Aj:{
@@ -16199,10 +16180,9 @@
 x=J.w1(y)
 x.V1(y)
 x.FV(y,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
-$isGv:true,
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 "%":";DocumentFragment"},
 cm:{
 "^":"Gv;G1:message=,oc:name=",
@@ -16225,10 +16205,20 @@
 y=this.gwd(a)
 y.V1(0)
 y.FV(0,z)},
-Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,293,[]],
-Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,294,[]],
-pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,294,[]],
+Md:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gnk",2,0,null,302,[]],
+Ja:[function(a,b){return a.querySelector(b)},"call$1","gtP",2,0,null,303,[]],
+pr:[function(a,b){return W.vD(a.querySelectorAll(b),null)},"call$1","gTU",2,0,null,303,[]],
 gDD:function(a){return new W.I4(a)},
+gwl:function(a){var z,y,x,w
+z=a.clientLeft
+y=a.clientTop
+x=a.clientWidth
+w=a.clientHeight
+if(typeof x!=="number")return x.F()
+if(x>=0);else x=-x*0
+if(typeof w!=="number")return w.F()
+if(w>=0);else w=-w*0
+return H.VM(new P.tn(z,y,x,w),[null])},
 i4:[function(a){},"call$0","gQd",0,0,null],
 xo:[function(a){},"call$0","gbt",0,0,null],
 aC:[function(a,b,c,d){},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
@@ -16239,11 +16229,11 @@
 else if(!!a.mozMatchesSelector)return a.mozMatchesSelector(b)
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
-else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,293,[]],
+else throw H.b(P.f("Not supported on this platform"))},"call$1","grM",2,0,null,302,[]],
 bA:[function(a,b){var z=a
 do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
-return!1},"call$1","gMn",2,0,null,293,[]],
+return!1},"call$1","gMn",2,0,null,302,[]],
 er:[function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},"call$0","gzd",0,0,null],
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
@@ -16253,11 +16243,10 @@
 gLm:function(a){return C.i3.f0(a)},
 ZL:function(a){},
 $iscv:true,
-$isGv:true,
 $isD0:true,
 "%":";Element"},
 Fs:{
-"^":"qE;oc:name%,LA:src=,t5:type%",
+"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
@@ -16265,14 +16254,14 @@
 ea:{
 "^":"Gv;It:_selector},Xt:bubbles=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-e6:[function(a){return a.preventDefault()},"call$0","gwl",0,0,null],
+e6:[function(a){return a.preventDefault()},"call$0","gkC",0,0,null],
 $isea:true,
 "%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
 D0:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
-On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+On:[function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
 "%":";EventTarget"},
 as:{
@@ -16293,14 +16282,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16309,9 +16298,9 @@
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
 zU:{
-"^":"wa;iC:responseText=",
+"^":"wa;iC:responseText=,ys:status=",
 gn9:function(a){return W.Z9(a.response)},
-R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],297,[],298,[],299,[]],
+R3:[function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},function(a,b,c,d){return a.open(b,c,d)},"eo","call$5$async$password$user",null,"gnI",4,7,null,82,82,82,220,[],217,[],306,[],307,[],308,[]],
 zY:[function(a,b){return a.send(b)},"call$1","gX8",0,2,null,82,235,[]],
 $iszU:true,
 "%":"XMLHttpRequest"},
@@ -16319,30 +16308,29 @@
 "^":"D0;",
 "%":";XMLHttpRequestEventTarget"},
 tX:{
-"^":"qE;oc:name%,LA:src=",
+"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
 "%":"HTMLIFrameElement"},
 Sg:{
-"^":"Gv;Rn:data=",
+"^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;LA:src=",
+"^":"qE;fg:height%,LA:src=,R:width%",
 oo:function(a,b){return a.complete.call$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,o6:list=,oc:name%,LA:src=,t5:type%,P:value%",
+"^":"qE;Tq:checked%,MB:form=,fg:height%,o6:list=,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
 RR:function(a,b){return a.accept.call$1(b)},
 r6:function(a,b){return a.value.call$1(b)},
 $isMi:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true,
 "%":"HTMLInputElement"},
 In:{
 "^":"qE;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
+pL:{
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLLIElement"},
@@ -16368,7 +16356,7 @@
 El:{
 "^":"qE;kc:error=,LA:src=",
 xW:[function(a){return a.load()},"call$0","gnB",0,0,null],
-"%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+"%":"HTMLAudioElement;HTMLMediaElement"},
 zm:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
@@ -16400,16 +16388,17 @@
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
 bn:{
-"^":"ab;",
-LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],300,[]],
+"^":"tH;",
+LV:[function(a,b,c){return a.send(b,c)},function(a,b){return a.send(b)},"zY","call$2",null,"gX8",2,2,null,82,235,[],309,[]],
 "%":"MIDIOutput"},
-ab:{
+tH:{
 "^":"D0;jO:id=,oc:name=,t5:type=",
 "%":"MIDIInput;MIDIPort"},
 Wp:{
 "^":"Mf;",
 nH:[function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
-return},"call$15","gEx",30,0,null,11,[],301,[],302,[],303,[],304,[],305,[],306,[],307,[],308,[],309,[],310,[],311,[],312,[],313,[],314,[]],
+return},"call$15","gEx",30,0,null,11,[],310,[],311,[],312,[],313,[],314,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[],322,[],323,[]],
+gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 $isWp:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
 H9:{
@@ -16423,15 +16412,11 @@
 y.call$2("subtree",i)
 y.call$2("attributeOldValue",d)
 y.call$2("characterDataOldValue",g)
-a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],315,[],316,[],317,[],318,[],319,[],320,[],321,[]],
+a.observe(b,z)},function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},"yN","call$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree",null,"gTT",2,15,null,82,82,82,82,82,82,82,79,[],324,[],325,[],326,[],327,[],328,[],329,[],330,[]],
 "%":"MutationObserver|WebKitMutationObserver"},
 o4:{
 "^":"Gv;jL:oldValue=,N:target=,t5:type=",
 "%":"MutationRecord"},
-Q0:{
-"^":"Gv;",
-$isGv:true,
-"%":"Navigator"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
@@ -16442,28 +16427,33 @@
 if(z!=null)z.removeChild(a)},"call$0","guH",0,0,null],
 Tk:[function(a,b){var z,y
 try{z=a.parentNode
-J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,322,[]],
+J.ky(z,b,a)}catch(y){H.Ru(y)}return a},"call$1","gdA",2,0,null,331,[]],
+aD:[function(a,b,c){var z,y,x
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+if(z===a)throw H.b(new P.AT(b))
+for(y=z.childNodes.length,x=0;x<y;++x)a.insertBefore(z.firstChild,c)}else for(z=z.gA(b);z.G();)a.insertBefore(z.gl(),c)},"call$2","gZM",4,0,null,332,[],333,[]],
 bu:[function(a){var z=a.nodeValue
 return z==null?J.Gv.prototype.bu.call(this,a):z},"call$0","gXo",0,0,null],
-jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,323,[]],
+jx:[function(a,b){return a.appendChild(b)},"call$1","gp3",2,0,null,334,[]],
 tg:[function(a,b){return a.contains(b)},"call$1","gdj",2,0,null,109,[]],
-mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gys",4,0,null,323,[],324,[]],
-dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,323,[],325,[]],
+mK:[function(a,b,c){return a.insertBefore(b,c)},"call$2","gHc",4,0,null,334,[],333,[]],
+dR:[function(a,b,c){return a.replaceChild(b,c)},"call$2","ghn",4,0,null,334,[],335,[]],
 $isKV:true,
-"%":"Entity|Notation;Node"},
+"%":"DocumentType|Entity|Notation;Node"},
 yk:{
 "^":"ma;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16475,7 +16465,7 @@
 "^":"qE;t5:type%",
 "%":"HTMLOListElement"},
 G7:{
-"^":"qE;Rn:data=,MB:form=,oc:name%,t5:type%",
+"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
 "%":"HTMLObjectElement"},
 l9:{
 "^":"qE;ph:label%",
@@ -16503,12 +16493,12 @@
 "^":"qE;P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"HTMLProgressElement"},
-ew:{
+kQ:{
 "^":"ea;",
-$isew:true,
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
 LY:{
-"^":"ew;O3:url=",
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
 j2:{
 "^":"qE;LA:src=,t5:type%",
@@ -16524,7 +16514,7 @@
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;pQ:applyAuthorStyles=",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
@@ -16548,7 +16538,7 @@
 G5:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
-bk:{
+wb:{
 "^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
 "%":"StorageEvent"},
 Lx:{
@@ -16579,7 +16569,7 @@
 r6:function(a,b){return a.value.call$1(b)},
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-xV:{
+R0:{
 "^":"Mf;Rn:data=",
 "%":"TextEvent"},
 RH:{
@@ -16592,9 +16582,12 @@
 Mf:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
+SW:{
+"^":"El;fg:height%,R:width%",
+"%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%",
-gmW:function(a){var z=a.location
+"^":"D0;oc:name%,ys:status%",
+gyH:function(a){var z=a.location
 if(W.uC(z)===!0)return z
 if(null==a._location_wrapper)a._location_wrapper=new W.Dk(z)
 return a._location_wrapper},
@@ -16619,41 +16612,35 @@
 geT:function(a){return W.Pv(a.parent)},
 cO:[function(a){return a.close()},"call$0","gJK",0,0,null],
 xc:[function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
+return},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
 bu:[function(a){return a.toString()},"call$0","gXo",0,0,null],
 gi9:function(a){return C.mt.aM(a)},
 gVl:function(a){return C.pi.aM(a)},
 gLm:function(a){return C.i3.aM(a)},
 $isu9:true,
-$isGv:true,
 $isD0:true,
 "%":"DOMWindow|Window"},
 Bn:{
 "^":"KV;oc:name=,P:value%",
 r6:function(a,b){return a.value.call$1(b)},
 "%":"Attr"},
-Eb:{
-"^":"KV;",
-$isGv:true,
-"%":"DocumentType"},
-Nf:{
+SC:{
 "^":"qE;",
 $isD0:true,
-$isGv:true,
 "%":"HTMLFrameSetElement"},
 Cy:{
 "^":"ecX;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.KV]},
 $isyN:true,
@@ -16666,14 +16653,14 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.yg]},
 $isyN:true,
@@ -16681,19 +16668,19 @@
 $asQV:function(){return[W.yg]},
 $isXj:true,
 "%":"SpeechInputResultList"},
-LO:{
+LOx:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,52,[],28,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
 grZ:function(a){var z=a.length
 if(z>0)return a[z-1]
 throw H.b(new P.lj("No elements"))},
 Zv:[function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},"call$1","goY",2,0,null,52,[]],
+return a[b]},"call$1","gRV",2,0,null,15,[]],
 $isList:true,
 $aszM:function(){return[W.uj]},
 $isyN:true,
@@ -16703,12 +16690,12 @@
 "%":"SpeechRecognitionResultList"},
 QZ:{
 "^":"a;",
-HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,471,172,[]],
-Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,471,172,[]],
+HH:[function(a){return typeof console!="undefined"?console.count(a):null},"call$1","gAv",2,0,483,172,[]],
+Z3:[function(a,b){return typeof console!="undefined"?console.error(b):null},"call$1","gkc",2,0,483,172,[]],
 To:[function(a){return typeof console!="undefined"?console.info(a):null},"call$1","gqa",2,0,null,172,[]],
-De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,472,[]],
-uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,472,[]],
-wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,471,172,[]],
+De:[function(a,b){return typeof console!="undefined"?console.profile(b):null},"call$1","gB1",2,0,181,484,[]],
+uj:[function(a){return typeof console!="undefined"?console.time(a):null},"call$1","gFl",2,0,181,484,[]],
+wn:[function(a,b){return typeof console!="undefined"?console.trace(b):null},"call$1","gtN",2,0,483,172,[]],
 static:{"^":"wk"}},
 VG:{
 "^":"ar;MW,vG",
@@ -16717,38 +16704,33 @@
 gB:function(a){return this.vG.length},
 t:[function(a,b){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.vG
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+this.MW.replaceChild(c,z[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
 h:[function(a,b){this.MW.appendChild(b)
-return b},"call$1","ght",2,0,null,28,[]],
+return b},"call$1","ght",2,0,null,30,[]],
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort element lists"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b==="object"&&b!==null&&!!z.$iscv){z=this.MW
+YW:[function(a,b,c,d,e){throw H.b(P.SY(null))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+Rz:[function(a,b){var z
+if(!!J.x(b).$iscv){z=this.MW
 if(b.parentNode===z){z.removeChild(b)
 return!0}}return!1},"call$1","guH",2,0,null,6,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
+if(b>this.vG.length)throw H.b(P.TE(b,0,this.vG.length))
 z=this.vG
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
-else{if(b<0||b>=y)return H.e(z,b)
-x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,52,[],132,[]],
+else{if(b>=y)return H.e(z,b)
+x.insertBefore(c,z[b])}},"call$2","gQG",4,0,null,15,[],132,[]],
+Mh:[function(a,b,c){throw H.b(P.SY(null))},"call$2","ghV",4,0,null,15,[],116,[]],
 V1:[function(a){J.c9(this.MW,"")},"call$0","gRa",0,0,null],
-KI:[function(a,b){var z,y
-z=this.vG
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.MW.removeChild(y)
-return y},"call$1","gNM",2,0,null,52,[]],
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
@@ -16760,8 +16742,8 @@
 gB:function(a){return this.Sn.length},
 t:[function(a,b){var z=this.Sn
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
-u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,52,[],28,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+u:[function(a,b,c){throw H.b(P.f("Cannot modify list"))},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
 GT:[function(a,b){throw H.b(P.f("Cannot sort list"))},"call$1","gH7",0,2,null,82,122,[]],
 grZ:function(a){return C.t5.grZ(this.Sn)},
@@ -16781,8 +16763,7 @@
 return z}}},
 B1:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 M5:{
 "^":"Gv;"},
@@ -16813,11 +16794,11 @@
 $asQV:function(){return[W.KV]}},
 Kx:{
 "^":"Tp:112;",
-call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,473,[],"call"],
+call$1:[function(a){return J.EC(a)},"call$1",null,2,0,null,485,[],"call"],
 $isEH:true},
 iO:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,474,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.setRequestHeader(a,b)},"call$2",null,4,0,null,486,[],30,[],"call"],
 $isEH:true},
 bU:{
 "^":"Tp:112;b,c",
@@ -16829,37 +16810,40 @@
 x=this.b
 if(y){y=x.MM
 if(y.Gv!==0)H.vh(new P.lj("Future already completed"))
-y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,19,[],"call"],
+y.OH(z)}else x.pm(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Yg:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(b!=null)this.a[a]=b},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 e7:{
 "^":"ar;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(new P.lj("No elements"))
 return z},
-h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
-FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+h:[function(a,b){this.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
+FV:[function(a,b){var z,y,x,w
+z=J.x(b)
+if(!!z.$ise7){z=b.NL
+y=this.NL
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 xe:[function(a,b,c){var z,y,x
-if(b<0||b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
+if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.NL.childNodes.length))
 z=this.NL
 y=z.childNodes
 x=y.length
 if(b===x)z.appendChild(c)
-else{if(b<0||b>=x)return H.e(y,b)
-z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,52,[],260,[]],
-KI:[function(a,b){var z,y,x
+else{if(b>=x)return H.e(y,b)
+z.insertBefore(c,y[b])}},"call$2","gQG",4,0,null,15,[],263,[]],
+oF:[function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-x=y[b]
-z.removeChild(x)
-return x},"call$1","gNM",2,0,null,52,[]],
-Rz:[function(a,b){var z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$isKV)return!1
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},"call$2","ghV",4,0,null,15,[],116,[]],
+Rz:[function(a,b){var z
+if(!J.x(b).$isKV)return!1
 z=this.NL
 if(z!==b.parentNode)return!1
 z.removeChild(b)
@@ -16869,15 +16853,16 @@
 z=this.NL
 y=z.childNodes
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,52,[],28,[]],
+z.replaceChild(c,y[b])},"call$2","gj3",4,0,null,15,[],30,[]],
 gA:function(a){return C.t5.gA(this.NL.childNodes)},
 GT:[function(a,b){throw H.b(P.f("Cannot sort Node list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on Node list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 gB:function(a){return this.NL.childNodes.length},
 sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
 t:[function(a,b){var z=this.NL.childNodes
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
+$ise7:true,
 $asar:function(){return[W.KV]},
 $aszM:function(){return[W.KV]},
 $asQV:function(){return[W.KV]}},
@@ -16897,8 +16882,7 @@
 $asQV:function(){return[W.KV]}},
 Ou:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isQl},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return!!J.x(a).$isQl},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 yoo:{
 "^":"Gv+lD;",
@@ -16944,9 +16928,9 @@
 $asQV:function(){return[W.uj]}},
 tJ:{
 "^":"a;",
-FV:[function(a,b){H.bQ(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
+FV:[function(a,b){J.kH(b,new W.Zc(this))},"call$1","gDY",2,0,null,109,[]],
 di:[function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,28,[]],
+for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},"call$1","gmc",2,0,null,30,[]],
 V1:[function(a){var z
 for(z=this.gvc(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},"call$0","gRa",0,0,null],
 aN:[function(a,b){var z,y
@@ -16969,21 +16953,21 @@
 $isZ0:true,
 $asZ0:function(){return[J.O,J.O]}},
 Zc:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 i7:{
 "^":"tJ;MW",
-x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,47,[]],
-t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+x4:[function(a){return this.MW.hasAttribute(a)},"call$1","gV9",2,0,null,48,[]],
+t:[function(a,b){return this.MW.getAttribute(b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.MW.setAttribute(b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 Rz:[function(a,b){var z,y
 z=this.MW
 y=z.getAttribute(b)
 z.removeAttribute(b)
-return y},"call$1","guH",2,0,null,47,[]],
+return y},"call$1","guH",2,0,null,48,[]],
 gB:function(a){return this.gvc(this).length},
-FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,260,[]]},
+FJ:[function(a){return a.namespaceURI==null},"call$1","giG",2,0,null,263,[]]},
 nF:{
 "^":"As;QX,Kd",
 lF:[function(){var z=P.Ls(null,null,null,J.O)
@@ -16993,8 +16977,8 @@
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},"call$1","gVH",2,0,null,91,[]],
 OS:[function(a){this.Kd.aN(0,new W.vf(a))},"call$1","gFd",2,0,null,117,[]],
-O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
-Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,28,[]],
+O4:[function(a,b){return this.xz(new W.Iw(a,b))},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
+Rz:[function(a,b){return this.xz(new W.Fc(b))},"call$1","guH",2,0,null,30,[]],
 xz:[function(a){return this.Kd.es(0,!1,new W.hD(a))},"call$1","gVz",2,0,null,117,[]],
 yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.QX,!0,null),new W.FK()),[null,null])},
 static:{or:function(a){var z=new W.nF(a,null)
@@ -17002,27 +16986,27 @@
 return z}}},
 FK:{
 "^":"Tp:112;",
-call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return new W.I4(a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Si:{
 "^":"Tp:112;a",
-call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return this.a.FV(0,a.lF())},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 vf:{
 "^":"Tp:112;a",
-call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.OS(this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Iw:{
 "^":"Tp:112;a,b",
-call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return a.O4(this.a,this.b)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Fc:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){return J.V1(a,this.a)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 hD:{
-"^":"Tp:348;a",
-call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,476,[],132,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){return this.a.call$1(b)===!0||a===!0},"call$2",null,4,0,null,488,[],132,[],"call"],
 $isEH:true},
 I4:{
 "^":"As;MW",
@@ -17032,35 +17016,35 @@
 if(x.length!==0)z.h(0,x)}return z},"call$0","gt8",0,0,null],
 p5:[function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))},"call$1","gVH",2,0,null,91,[]]},
-e0:{
+UC:{
 "^":"a;Ph",
-zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]],
-Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gAW",2,3,null,210,19,[],296,[]],
-jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,19,[],296,[]]},
+zc:[function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]],
+Qm:[function(a,b){return H.VM(new W.eu(a,this.Ph,b),[null])},function(a){return this.Qm(a,!1)},"f0","call$2$useCapture",null,"gVX",2,3,null,210,21,[],305,[]],
+jl:[function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},function(a){return this.jl(a,!1)},"vo","call$2$useCapture",null,"gcJ",2,3,null,210,21,[],305,[]]},
 RO:{
 "^":"qh;uv,Ph,Sg",
 KR:[function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
-return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]]},
+return z},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]]},
 eu:{
 "^":"RO;uv,Ph,Sg",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 $isqh:true},
 ie:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 Ea:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 pu:{
 "^":"qh;DI,Sg,Ph",
 WO:[function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,477,[]],
+return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},"call$1","grM",2,0,null,489,[]],
 KR:[function(a,b,c,d){var z,y,x,w,v
 z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
 z.KS(null)
@@ -17068,16 +17052,16 @@
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
-return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,427,[],163,[],428,[],422,[]],
+return H.VM(new P.Ik(y),[H.Kp(y,0)]).KR(a,b,c,d)},function(a,b,c){return this.KR(a,null,b,c)},"zC",function(a){return this.KR(a,null,null,null)},"yI","call$4$cancelOnError$onDone$onError",null,null,"gp8",2,7,null,82,82,82,439,[],163,[],440,[],434,[]],
 $isqh:true},
 i2:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,368,[],"call"],
+call$1:[function(a){return J.NQ(J.l2(a),this.a)},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 b0:{
 "^":"Tp:112;b",
 call$1:[function(a){J.og(a,this.b)
-return a},"call$1",null,2,0,null,19,[],"call"],
+return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Ov:{
 "^":"MO;VP,uv,Ph,u7,Sg",
@@ -17088,7 +17072,7 @@
 return},"call$0","gZS",0,0,null],
 Fv:[function(a,b){if(this.uv==null)return
 this.VP=this.VP+1
-this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,425,[]],
+this.Ns()},function(a){return this.Fv(a,null)},"yy","call$1",null,"gAK",0,2,null,82,437,[]],
 gRW:function(){return this.VP>0},
 QE:[function(){if(this.uv==null||this.VP<=0)return
 this.VP=this.VP-1
@@ -17103,9 +17087,9 @@
 z=this.eM
 if(z.x4(b))return
 y=this.aV
-z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,478,[]],
+z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},"call$1","ght",2,0,null,490,[]],
 Rz:[function(a,b){var z=this.eM.Rz(0,b)
-if(z!=null)z.ed()},"call$1","guH",2,0,null,478,[]],
+if(z!=null)z.ed()},"call$1","guH",2,0,null,490,[]],
 cO:[function(a){var z,y
 for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
@@ -17116,19 +17100,21 @@
 call$0:[function(){return this.a.Rz(0,this.b)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 bO:{
-"^":"a;Ob",
-cN:function(a){return this.Ob.call$1(a)},
-zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,19,[],296,[]]},
+"^":"a;xY",
+cN:function(a){return this.xY.call$1(a)},
+zc:[function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},function(a){return this.zc(a,!1)},"aM","call$2$useCapture",null,"gII",2,3,null,210,21,[],305,[]]},
 Gm:{
 "^":"a;",
 gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){throw H.b(P.f("Cannot add to immutable List."))},"call$1","gDY",2,0,null,116,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort immutable List."))},"call$1","gH7",0,2,null,82,122,[]],
-xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","gNM",2,0,null,479,[]],
+xe:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gQG",4,0,null,15,[],132,[]],
+oF:[function(a,b,c){throw H.b(P.f("Cannot add to immutable List."))},"call$2","gFD",4,0,null,15,[],116,[]],
+Mh:[function(a,b,c){throw H.b(P.f("Cannot modify an immutable List."))},"call$2","ghV",4,0,null,15,[],116,[]],
 Rz:[function(a,b){throw H.b(P.f("Cannot remove from immutable List."))},"call$1","guH",2,0,null,6,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},"call$2","gYH",4,0,null,123,[],124,[]],
 $isList:true,
 $aszM:null,
 $isyN:true,
@@ -17143,17 +17129,17 @@
 V1:[function(a){J.U2(this.xa)},"call$0","gRa",0,0,null],
 t:[function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+z[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){J.wg(this.xa,b)},
 GT:[function(a,b){J.LH(this.xa,b)},"call$1","gH7",0,2,null,82,122,[]],
-XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,332,132,[],123,[]],
+XU:[function(a,b,c){return J.aK(this.xa,b,c)},function(a,b){return this.XU(a,b,0)},"u8","call$2",null,"gIz",2,2,null,342,132,[],123,[]],
 Pk:[function(a,b,c){return J.ff(this.xa,b,c)},function(a,b){return this.Pk(a,b,null)},"cn","call$2",null,"gcb",2,2,null,82,132,[],123,[]],
-xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){return J.tH(this.xa,b)},"call$1","gNM",2,0,null,52,[]],
-YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]]},
+xe:[function(a,b,c){return J.BM(this.xa,b,c)},"call$2","gQG",4,0,null,15,[],132,[]],
+YW:[function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
+UZ:[function(a,b,c){J.Y8(this.xa,b,c)},"call$2","gYH",4,0,null,123,[],124,[]]},
 Qg:{
 "^":"a;je",
 G:[function(){return this.je.G()},"call$0","gqy",0,0,null],
@@ -17174,18 +17160,17 @@
 call$1:[function(a){var z=H.Va(this.b)
 Object.defineProperty(a, init.dispatchPropertyName, {value: z, enumerable: false, writable: true, configurable: true})
 a.constructor=a.__proto__.constructor
-return this.a(a)},"call$1",null,2,0,null,46,[],"call"],
+return this.a(a)},"call$1",null,2,0,null,47,[],"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
 cO:[function(a){return this.Ui.close()},"call$0","gJK",0,0,null],
-xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,22,[],326,[],327,[]],
-gI:function(a){return H.vh(P.SY(null))},
-On:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gIV",4,2,null,82,11,[],295,[],296,[]],
-Y9:[function(a,b,c,d){return H.vh(P.SY(null))},"call$3","gcF",4,2,null,82,11,[],295,[],296,[]],
+xc:[function(a,b,c,d){this.Ui.postMessage(b,c)},function(a,b,c){return this.xc(a,b,c,null)},"X6","call$3",null,"gmF",4,2,null,82,24,[],336,[],337,[]],
+gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
+On:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gIV",4,2,null,82,11,[],304,[],305,[]],
+Y9:[function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},"call$3","gcF",4,2,null,82,11,[],304,[],305,[]],
 $isD0:true,
-$isGv:true,
 static:{P1:[function(a){if(a===window)return a
 else return new W.dW(a)},"call$1","lG",2,0,null,233,[]]}},
 Dk:{
@@ -17195,8 +17180,7 @@
 gmH:function(a){return this.WK.href},
 VD:[function(a){return this.WK.reload()},"call$0","gQU",0,0,null],
 bu:[function(a){return this.WK.toString()},"call$0","gXo",0,0,null],
-$iscS:true,
-$isGv:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+$iscS:true}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
@@ -17205,156 +17189,92 @@
 "^":"",
 Dh:{
 "^":"zp;N:target=,mH:href=",
-$isGv:true,
 "%":"SVGAElement"},
 Ue:{
 "^":"Eo;mH:href=",
-$isGv:true,
 "%":"SVGAltGlyphElement"},
-ui:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},
-vO:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGCircleElement"},
-DQ:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGClipPathElement"},
-Sm:{
-"^":"zp;",
-$isGv:true,
-"%":"SVGDefsElement"},
-es:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGEllipseElement"},
 eG:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEBlendElement"},
 lv:{
-"^":"d5;t5:type=,UQ:values=",
-$isGv:true,
+"^":"d5;t5:type=,UQ:values=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
 pf:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
 NV:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFECompositeElement"},
 W1:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
 mCz:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
 kK:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
 bb:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEFloodElement"},
 Ob:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
 me:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
 oB:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEMergeElement"},
 EI:{
-"^":"d5;kp:operator=",
-$isGv:true,
+"^":"d5;kp:operator=,fg:height=,R:width=,x=,y=",
 "%":"SVGFEMorphologyElement"},
 MI:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFEOffsetElement"},
+rg:{
+"^":"d5;x=,y=",
+"%":"SVGFEPointLightElement"},
 um:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
+eW:{
+"^":"d5;x=,y=",
+"%":"SVGFESpotLightElement"},
 kL:{
-"^":"d5;",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=",
-$isGv:true,
+"^":"d5;t5:type=,fg:height=,R:width=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGFilterElement"},
 N9:{
-"^":"zp;",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=",
 "%":"SVGForeignObjectElement"},
-BA:{
+TQ:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGGElement"},
-d0:{
-"^":"zp;",
-"%":";SVGGeometryElement"},
+"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
 "^":"d5;",
-$isGv:true,
-"%":";SVGGraphicsElement"},
+"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
 br:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGImageElement"},
-PIw:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGLineElement"},
-Jq:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMarkerElement"},
-Yd:{
-"^":"d5;",
-$isGv:true,
+NBZ:{
+"^":"d5;fg:height=,R:width=,x=,y=",
 "%":"SVGMaskElement"},
-AW:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPathElement"},
 Gr:{
-"^":"d5;mH:href=",
-$isGv:true,
+"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-XE:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolygonElement"},
-GH:{
-"^":"d0;",
-$isGv:true,
-"%":"SVGPolylineElement"},
 NJ:{
-"^":"d0;",
-$isGv:true,
+"^":"TQ;fg:height=,R:width=,x=,y=",
 "%":"SVGRectElement"},
 j24:{
 "^":"d5;t5:type%,mH:href=",
-$isGv:true,
 "%":"SVGScriptElement"},
-Lu:{
+ki:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
@@ -17369,61 +17289,27 @@
 gVl:function(a){return C.pi.f0(a)},
 gLm:function(a){return C.i3.f0(a)},
 $isD0:true,
-$isGv:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGTitleElement|SVGVKernElement;SVGElement"},
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateColorElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement"},
 hy:{
-"^":"zp;",
-Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,291,[]],
+"^":"zp;fg:height=,R:width=,x=,y=",
+Kb:[function(a,b){return a.getElementById(b)},"call$1","giu",2,0,null,300,[]],
 $ishy:true,
-$isGv:true,
 "%":"SVGSVGElement"},
-mq:{
+mHq:{
 "^":"zp;",
-$isGv:true,
-"%":"SVGSwitchElement"},
-Ke:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGSymbolElement"},
-Xe:{
-"^":"zp;",
-$isGv:true,
 "%":";SVGTextContentElement"},
 Rk4:{
-"^":"Xe;bP:method=,mH:href=",
-$isGv:true,
+"^":"mHq;bP:method=,mH:href=",
 "%":"SVGTextPathElement"},
 Eo:{
-"^":"Xe;",
+"^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
 pyk:{
-"^":"zp;mH:href=",
-$isGv:true,
+"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
 "%":"SVGUseElement"},
-ZD:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGViewElement"},
 wD:{
 "^":"d5;mH:href=",
-$isGv:true,
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-mj:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGCursorElement"},
-hW:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGFEDropShadowElement"},
-nb:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGGlyphRefElement"},
-xt:{
-"^":"d5;",
-$isGv:true,
-"%":"SVGMPathElement"},
 O7:{
 "^":"As;LO",
 lF:[function(){var z,y,x,w
@@ -17450,20 +17336,20 @@
 d=z}return P.wY(H.Ek(a,P.F(J.C0(d,P.Xl()),!0,null),P.Te(null)))},"call$4","qH",8,0,null,155,[],234,[],168,[],87,[]],
 Dm:[function(a,b,c){var z
 if(Object.isExtensible(a))try{Object.defineProperty(a, b, { value: c})
-return!0}catch(z){H.Ru(z)}return!1},"call$3","bE",6,0,null,96,[],12,[],28,[]],
+return!0}catch(z){H.Ru(z)}return!1},"call$3","Iy",6,0,null,96,[],12,[],30,[]],
 Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
 return},"call$2","Cb",4,0,null,96,[],12,[]],
 wY:[function(a){var z
 if(a==null)return
 else{if(typeof a!=="string")if(typeof a!=="number")if(typeof a!=="boolean"){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!0
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!0
 else z=!0
 else z=!0
 if(z)return a
 else{z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return H.o2(a)
-else if(typeof a==="object"&&a!==null&&!!z.$isE4)return a.eh
-else if(typeof a==="object"&&a!==null&&!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
+if(!!z.$isiP)return H.o2(a)
+else if(!!z.$isE4)return a.eh
+else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
 else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}}},"call$1","En",2,0,112,96,[]],
 hE:[function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.call$1(a)
@@ -17471,7 +17357,7 @@
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=typeof a==="object"&&a!==null&&!!z.$isAz||typeof a==="object"&&a!==null&&!!z.$isea||typeof a==="object"&&a!==null&&!!z.$ishF||typeof a==="object"&&a!==null&&!!z.$isSg||typeof a==="object"&&a!==null&&!!z.$isKV||typeof a==="object"&&a!==null&&!!z.$isHY||typeof a==="object"&&a!==null&&!!z.$isu9}else z=!1
+z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
@@ -17487,12 +17373,10 @@
 t:[function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
 return P.dU(this.eh[b])},"call$1","gIA",2,0,null,71,[]],
 u:[function(a,b,c){if(typeof b!=="string"&&typeof b!=="number")throw H.b(new P.AT("property is not a String or num"))
-this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],28,[]],
+this.eh[b]=P.wY(c)},"call$2","gj3",4,0,null,71,[],30,[]],
 giO:function(a){return 0},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isE4&&this.eh===b.eh},"call$1","gUJ",2,0,null,109,[]],
 Bm:[function(a){return a in this.eh},"call$1","gVOe",2,0,null,71,[]],
 bu:[function(a){var z,y
 try{z=String(this.eh)
@@ -17500,11 +17384,10 @@
 return P.a.prototype.bu.call(this,this)}},"call$0","gXo",0,0,null],
 V7:[function(a,b){var z,y
 z=this.eh
-if(b==null)y=null
-else{b.toString
-y=P.F(H.VM(new H.A8(b,P.En()),[null,null]),!0,null)}return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],17,[]],
+y=b==null?null:P.F(J.C0(b,P.En()),!0,null)
+return P.dU(z[a].apply(z,y))},function(a){return this.V7(a,null)},"nQ","call$2",null,"gah",2,2,null,82,220,[],19,[]],
 $isE4:true,
-static:{uw:function(a,b){var z,y,x
+static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
@@ -17519,10 +17402,10 @@
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x={}
+if(!!y.$isZ0){x={}
 z.u(0,a,x)
 for(z=J.GP(y.gvc(a));z.G();){w=z.gl()
-x[w]=this.call$1(y.t(a,w))}return x}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){v=[]
+x[w]=this.call$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
 z.u(0,a,v)
 C.Nm.FV(v,y.ez(a,this))
 return v}else return P.wY(a)},"call$1",null,2,0,null,96,[],"call"],
@@ -17531,38 +17414,38 @@
 "^":"E4;eh"},
 Tz:{
 "^":"Wk;eh",
-fz:[function(a,b){var z
-if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
+Lu:[function(a,b){var z
+if(!(a<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
-else z=!1
-if(z)throw H.b(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))},"call$1","gvs",2,0,null,52,[]],
+z=a>z}else z=!0
+if(z)throw H.b(P.TE(a,0,P.E4.prototype.t.call(this,this,"length")))
+z=J.Wx(b)
+if(z.C(b,a)||z.D(b,P.E4.prototype.t.call(this,this,"length")))throw H.b(P.TE(b,a,P.E4.prototype.t.call(this,this,"length")))},"call$2","goA",4,0,null,123,[],124,[]],
 t:[function(a,b){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,52,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}return P.E4.prototype.t.call(this,this,b)},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z
 if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>=z}else z=!0
 else z=!1
-if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,52,[],28,[]],
+if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))}P.E4.prototype.u.call(this,this,b,c)},"call$2","gj3",4,0,null,15,[],30,[]],
 gB:function(a){return P.E4.prototype.t.call(this,this,"length")},
 sB:function(a,b){P.E4.prototype.u.call(this,this,"length",b)},
-h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.V7("push",[b])},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){this.V7("push",b instanceof Array?b:P.F(b,!0,null))},"call$1","gDY",2,0,null,116,[]],
-xe:[function(a,b,c){var z
-if(b>=0){z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
+xe:[function(a,b,c){var z=J.WB(P.E4.prototype.t.call(this,this,"length"),1)
 if(typeof z!=="number")return H.s(z)
-z=b>=z}else z=!0
+z=b>=z
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
-this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){this.fz(0,b)
-return J.UQ(this.V7("splice",[b,1]),0)},"call$1","gNM",2,0,null,52,[]],
+this.V7("splice",[b,0,c])},"call$2","gQG",4,0,null,15,[],132,[]],
+UZ:[function(a,b,c){this.Lu(b,c)
+this.V7("splice",[b,c-b])},"call$2","gYH",4,0,null,123,[],124,[]],
 YW:[function(a,b,c,d,e){var z,y,x
-if(b>=0){z=P.E4.prototype.t.call(this,this,"length")
+if(!(b<0)){z=P.E4.prototype.t.call(this,this,"length")
 if(typeof z!=="number")return H.s(z)
 z=b>z}else z=!0
 if(z)H.vh(P.TE(b,0,P.E4.prototype.t.call(this,this,"length")))
@@ -17572,10 +17455,8 @@
 if(J.de(y,0))return
 if(e<0)throw H.b(new P.AT(e))
 x=[b,y]
-z=new H.nH(d,e,null)
-z.$builtinTypeInfo=[null]
-C.Nm.FV(x,z.qZ(0,y))
-this.V7("splice",x)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.V7("splice",x)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 GT:[function(a,b){this.V7("sort",[b])},"call$1","gH7",0,2,null,82,122,[]]},
 Wk:{
 "^":"E4+lD;",
@@ -17607,6 +17488,12 @@
 call$1:[function(a){return new P.E4(a)},"call$1",null,2,0,null,96,[],"call"],
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
+Zd:[function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},"call$2","ro",4,0,null,237,[],30,[]],
+OT:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","KD",2,0,null,237,[]],
 J:[function(a,b){var z
 if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
@@ -17616,7 +17503,7 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"call$2","If",4,0,null,131,[],187,[]],
+return a}return a},"call$2","yT",4,0,null,131,[],187,[]],
 y:[function(a,b){if(typeof a!=="number")throw H.b(new P.AT(a))
 if(typeof b!=="number")throw H.b(new P.AT(b))
 if(a>b)return a
@@ -17624,17 +17511,166 @@
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"call$2","Rb",4,0,null,131,[],187,[]]}],["dart.mirrors","dart:mirrors",,P,{
+return a},"call$2","Rb",4,0,null,131,[],187,[]],
+hR:{
+"^":"a;",
+j1:[function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+return Math.random()*a>>>0},"call$1","gRD",2,0,null,491,[]]},
+vY:{
+"^":"a;Bo,Hz",
+o2:[function(){var z,y,x,w,v,u
+z=this.Bo
+y=4294901760*z
+x=(y&4294967295)>>>0
+w=55905*z
+v=(w&4294967295)>>>0
+u=v+x+this.Hz
+z=(u&4294967295)>>>0
+this.Bo=z
+this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},"call$0","gKC",0,0,null],
+j1:[function(a){var z,y,x
+if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
+z=a-1
+if((a&z)===0){this.o2()
+return(this.Bo&z)>>>0}do{this.o2()
+y=this.Bo
+x=y%a}while(y-x+a>=4294967296)
+return x},"call$1","gRD",2,0,null,491,[]],
+c3:function(a){var z,y,x,w,v,u,t,s
+z=J.u6(a,0)?-1:0
+do{y=J.Wx(a)
+x=y.i(a,4294967295)
+a=J.Ts(y.W(a,x),4294967296)
+y=J.Wx(a)
+w=y.i(a,4294967295)
+a=J.Ts(y.W(a,w),4294967296)
+v=((~x&4294967295)>>>0)+(x<<21>>>0)
+u=(v&4294967295)>>>0
+w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
+v=((u^(u>>>24|w<<8))>>>0)*265
+x=(v&4294967295)>>>0
+w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
+v=((x^(x>>>14|w<<18))>>>0)*21
+x=(v&4294967295)>>>0
+w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
+x=(x^(x>>>28|w<<4))>>>0
+w=(w^w>>>28)>>>0
+v=(x<<31>>>0)+x
+u=(v&4294967295)>>>0
+y=C.jn.cU(v-u,4294967296)
+v=this.Bo*1037
+t=(v&4294967295)>>>0
+this.Bo=t
+s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.Hz=s
+this.Bo=(t^u)>>>0
+this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
+if(this.Hz===0&&this.Bo===0)this.Bo=23063
+this.o2()
+this.o2()
+this.o2()
+this.o2()},
+static:{"^":"tg,PZ,r6",n2:function(a){var z=new P.vY(0,0)
+z.c3(a)
+return z}}},
+hL:{
+"^":"a;x>,y>",
+bu:[function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y
+if(b==null)return!1
+if(!J.x(b).$ishL)return!1
+z=this.x
+y=b.x
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y
+z=J.v1(this.x)
+y=J.v1(this.y)
+return P.OT(P.Zd(P.Zd(0,z),y))},
+g:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.g()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z+x,w+y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gF1n",2,0,null,109,[]],
+W:[function(a,b){var z,y,x,w
+z=this.x
+y=J.RE(b)
+x=y.gx(b)
+if(typeof z!=="number")return z.W()
+if(typeof x!=="number")return H.s(x)
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.hL(z-x,w-y)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gTG",2,0,null,109,[]],
+U:[function(a,b){var z,y
+z=this.x
+if(typeof z!=="number")return z.U()
+if(typeof b!=="number")return H.s(b)
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.hL(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},"call$1","gEH",2,0,null,467,[]],
+$ishL:true},
+HDe:{
+"^":"a;",
+gT8:function(){var z=this.gBb()
+if(typeof z!=="number")return z.g()
+return z+this.R},
+bu:[function(a){return"Rectangle ("+H.d(this.gBb())+", "+H.d(this.eA)+") "+this.R+" x "+this.fg},"call$0","gXo",0,0,null],
+n:[function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(!J.x(b).$istn)return!1
+z=this.gBb()
+y=b.Bb
+if(z==null?y==null:z===y){z=this.eA
+x=b.eA
+if(z==null?x==null:z===x){w=this.Bb
+if(typeof w!=="number")return w.g()
+v=b.R
+if(typeof y!=="number")return y.g()
+if(w+this.R===y+v){if(typeof z!=="number")return z.g()
+y=b.fg
+if(typeof x!=="number")return x.g()
+y=z+this.fg===x+y
+z=y}else z=!1}else z=!1}else z=!1
+return z},"call$1","gUJ",2,0,null,109,[]],
+giO:function(a){var z,y,x,w
+z=J.v1(this.gBb())
+y=this.eA
+x=J.v1(y)
+w=this.Bb
+if(typeof w!=="number")return w.g()
+w=w+this.R&0x1FFFFFFF
+if(typeof y!=="number")return y.g()
+y=y+this.fg&0x1FFFFFFF
+return P.OT(P.Zd(P.Zd(P.Zd(P.Zd(0,z),x),w),y))}},
+tn:{
+"^":"HDe;Bb<,eA,R>,fg>",
+$istn:true}}],["dart.mirrors","dart:mirrors",,P,{
 "^":"",
 re:[function(a){var z,y
 z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+if(!z.$isuq||z.n(a,C.HH))throw H.b(new P.AT(H.d(a)+" does not denote a class"))
 y=P.o1(a)
-z=J.x(y)
-if(typeof y!=="object"||y===null||!z.$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
-return y.gJi()},"call$1","vG",2,0,null,47,[]],
+if(!J.x(y).$isMs)throw H.b(new P.AT(H.d(a)+" does not denote a class"))
+return y.gJi()},"call$1","vG",2,0,null,48,[]],
 o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,47,[]],
+return $.P8()}return H.jO(a.gLU())},"call$1","o9",2,0,null,48,[]],
 ej:{
 "^":"a;",
 $isej:true},
@@ -17692,26 +17728,26 @@
 $isZ0:true},
 B8q:{
 "^":"a;",
-u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,47,[],28,[]],
+u:[function(a,b,c){return Q.ah()},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){return Q.ah()},"call$1","gDY",2,0,null,109,[]],
-Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){Q.ah()},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){return Q.ah()},"call$0","gRa",0,0,null],
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,47,[]],
-u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,47,[],28,[]],
+t:[function(a,b){return this.EV.t(0,b)},"call$1","gIA",2,0,null,48,[]],
+u:[function(a,b,c){this.EV.u(0,b,c)},"call$2","gj3",4,0,null,48,[],30,[]],
 FV:[function(a,b){this.EV.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){this.EV.V1(0)},"call$0","gRa",0,0,null],
-x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,47,[]],
-di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,28,[]],
+x4:[function(a){return this.EV.x4(a)},"call$1","gV9",2,0,null,48,[]],
+di:[function(a){return this.EV.di(a)},"call$1","gmc",2,0,null,30,[]],
 aN:[function(a,b){this.EV.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
 gl0:function(a){return this.EV.X5===0},
 gor:function(a){return this.EV.X5!==0},
 gvc:function(a){var z=this.EV
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
 gB:function(a){return this.EV.X5},
-Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
+Rz:[function(a,b){return this.EV.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
 gUQ:function(a){var z=this.EV
 return z.gUQ(z)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
@@ -17731,13 +17767,13 @@
 "^":"Gv;",
 J2:[function(a,b,c){var z=J.Wx(b)
 if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,52,[],328,[]],
-ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,52,[],328,[]],
+else throw H.b(new P.AT("Invalid list index "+H.d(b)))},"call$2","gYE",4,0,null,15,[],338,[]],
+ZF:[function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},"call$2","gDR",4,0,null,15,[],338,[]],
 PZ:[function(a,b,c,d){this.ZF(a,b,d+1)
-return d},"call$3","gyD",6,0,null,123,[],124,[],328,[]],
+return d},"call$3","gyD",6,0,null,123,[],124,[],338,[]],
 $ispF:true,
 $isHY:true,
-"%":";ArrayBufferView;LZ|Ui|Ip|Dg|ObS|nA|Pg"},
+"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
 df:{
 "^":"pF;",
 gbx:function(a){return C.T1},
@@ -17748,10 +17784,10 @@
 gbx:function(a){return C.hN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17765,10 +17801,10 @@
 gbx:function(a){return C.lk},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17782,10 +17818,10 @@
 gbx:function(a){return C.jV},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17799,10 +17835,10 @@
 gbx:function(a){return C.Im},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17816,10 +17852,10 @@
 gbx:function(a){return C.la},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17828,15 +17864,15 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":"Int8Array"},
-aH:{
+us:{
 "^":"Pg;",
 gbx:function(a){return C.iN},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17850,10 +17886,10 @@
 gbx:function(a){return C.Vh},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17868,10 +17904,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17886,10 +17922,10 @@
 gB:function(a){return a.length},
 t:[function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},"call$1","gIA",2,0,null,52,[]],
+return a[b]},"call$1","gIA",2,0,null,15,[]],
 u:[function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},"call$2","gj3",4,0,null,52,[],28,[]],
+a[b]=c},"call$2","gj3",4,0,null,15,[],30,[]],
 D6:[function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},function(a,b){return this.D6(a,b,null)},"Jk","call$2",null,"gli",2,2,null,82,123,[],124,[]],
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17898,7 +17934,7 @@
 $asQV:function(){return[J.im]},
 $isHY:true,
 "%":";Uint8Array"},
-LZ:{
+b0B:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:[function(a,b,c,d,e){var z,y,x
@@ -17912,13 +17948,12 @@
 x=d.length
 if(x-e<y)throw H.b(new P.lj("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],32,[],125,[]],
+a.set(d,b)},"call$4","gP7",8,0,null,123,[],124,[],33,[],125,[]],
 $isXj:true},
 Dg:{
 "^":"Ip;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isDg:true,
 $isList:true,
 $aszM:function(){return[J.GW]},
@@ -17926,7 +17961,7 @@
 $isQV:true,
 $asQV:function(){return[J.GW]}},
 Ui:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.GW]},
 $isyN:true,
@@ -17936,9 +17971,8 @@
 "^":"Ui+SU7;"},
 Pg:{
 "^":"nA;",
-YW:[function(a,b,c,d,e){var z=J.x(d)
-if(!!z.$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
+return}P.lD.prototype.YW.call(this,a,b,c,d,e)},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 $isPg:true,
 $isList:true,
 $aszM:function(){return[J.im]},
@@ -17946,7 +17980,7 @@
 $isQV:true,
 $asQV:function(){return[J.im]}},
 ObS:{
-"^":"LZ+lD;",
+"^":"b0B+lD;",
 $isList:true,
 $aszM:function(){return[J.im]},
 $isyN:true,
@@ -17959,12 +17993,12 @@
 return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
 return}if(typeof window=="object")return
 if(typeof print=="function"){print(a)
-return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,31,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw "Unable to print message: " + String(a)},"call$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
 E9:{
-"^":["tuj;Py%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,361,"error",358,377],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,362,28,[],"error",358],
+"^":["Vct;Py%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gkc:[function(a){return a.Py},null,null,1,0,371,"error",368,387],
+skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,372,30,[],"error",368],
 "@":function(){return[C.uW]},
 static:{TW:[function(a){var z,y,x,w
 z=$.Nd()
@@ -17978,29 +18012,29 @@
 C.OD.ZL(a)
 C.OD.G6(a)
 return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[480],
-tuj:{
+"+ErrorViewElement":[492],
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
 rm:{
-"^":["Vct;fn%-389,Ab%-389,Ln%-481,y4%-482,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.fn},null,null,1,0,365,"text",358,359],
-sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,30,28,[],"text",358],
-gzW:[function(a){return a.Ab},null,null,1,0,365,"lineMode",358,359],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,30,28,[],"lineMode",358],
-gFR:[function(a){return a.Ln},null,null,1,0,483,"callback",358,377],
+"^":["D13;fn%-400,Ab%-400,Ln%-493,y4%-494,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+ga4:[function(a){return a.fn},null,null,1,0,375,"text",368,369],
+sa4:[function(a,b){a.fn=this.ct(a,C.mi,a.fn,b)},null,null,3,0,32,30,[],"text",368],
+gzW:[function(a){return a.Ab},null,null,1,0,375,"lineMode",368,369],
+szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",368],
+gFR:[function(a){return a.Ln},null,null,1,0,495,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,484,28,[],"callback",358],
-gPK:[function(a){return a.y4},null,null,1,0,485,"results",358,359],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,486,28,[],"results",358],
+sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,496,30,[],"callback",368],
+gPK:[function(a){return a.y4},null,null,1,0,497,"results",368,369],
+sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,498,30,[],"results",368],
 az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
 z=this.ct(a,C.eh,a.Ab,z)
 a.Ab=z
 if(J.de(z,"1-line")){z=J.JA(a.fn,"\n"," ")
-a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,393,19,[],304,[],79,[],"updateLineMode"],
-lp:[function(a,b,c,d){var z,y,x
+a.fn=this.ct(a,C.mi,a.fn,z)}},"call$3","gxb",6,0,404,21,[],313,[],79,[],"updateLineMode"],
+kk:[function(a,b,c,d){var z,y,x
 J.xW(b)
 z=a.fn
 a.fn=this.ct(a,C.mi,z,"")
@@ -18008,9 +18042,9 @@
 x=R.Jk(y)
 J.kW(x,"expr",z)
 J.BM(a.y4,0,x)
-this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,393,19,[],304,[],79,[],"eval"],
+this.VN(a,z).ml(new L.YW(x))}},"call$3","gZm",6,0,404,21,[],313,[],79,[],"eval"],
 A3:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,487,19,[],"selectExpr"],
+a.fn=this.ct(a,C.mi,a.fn,z)},"call$1","gHo",2,0,499,21,[],"selectExpr"],
 "@":function(){return[C.Qz]},
 static:{Rp:[function(a){var z,y,x,w,v
 z=R.Jk([])
@@ -18027,18 +18061,18 @@
 C.Gh.ZL(a)
 C.Gh.G6(a)
 return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[488],
-Vct:{
+"+EvalBoxElement":[500],
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
 "^":"Tp:112;a-82",
 call$1:[function(a){J.kW(this.a,"value",a)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ YW":[489]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+"+ YW":[501]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
 "^":"",
 m8:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.E6]},
 static:{zY:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18053,14 +18087,14 @@
 C.MC.ZL(a)
 C.MC.G6(a)
 return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[383]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+"+FieldRefElement":[393]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
 Gk:{
-"^":["D13;vt%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,376,"field",358,377],
-st0:[function(a,b){a.vt=this.ct(a,C.WQ,a.vt,b)},null,null,3,0,378,28,[],"field",358],
-yv:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.My]},
+"^":["WZq;vt%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gt0:[function(a){return a.vt},null,null,1,0,386,"field",368,387],
+st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,388,30,[],"field",368],
+pA:[function(a,b){J.am(a.vt).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Tq]},
 static:{bH:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18073,20 +18107,39 @@
 C.LT.ZL(a)
 C.LT.G6(a)
 return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[490],
-D13:{
+"+FieldViewElement":[502],
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.R0]},
+AX:{
+"^":["T5;lh%-392,qe%-392,zg%-392,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gU4:[function(a){return a.lh},null,null,1,0,401,"qualified",368,387],
+sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,402,30,[],"qualified",368],
+aZ:[function(a,b){var z
+Q.xI.prototype.aZ.call(this,a,b)
+this.ct(a,C.D2,0,1)
+this.ct(a,C.Mo,0,1)
+z=a.tY
+z=z!=null&&J.UQ(z,"parent")!=null
+a.qe=this.ct(a,C.D2,a.qe,z)
+z=a.tY
+z=z!=null&&J.UQ(z,"class")!=null&&J.UQ(J.UQ(a.tY,"class"),"name")!=null&&!J.de(J.UQ(J.UQ(a.tY,"class"),"name"),"::")
+a.zg=this.ct(a,C.Mo,a.zg,z)},"call$1","gLe",2,0,157,229,[],"refChanged"],
+gQs:[function(a){return a.qe},null,null,1,0,401,"hasParent",368,369],
+sQs:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,402,30,[],"hasParent",368],
+gE7:[function(a){return a.zg},null,null,1,0,401,"hasClass",368,369],
+sE7:[function(a,b){a.zg=this.ct(a,C.Mo,a.zg,b)},null,null,3,0,402,30,[],"hasClass",368],
+"@":function(){return[C.YQ]},
 static:{ZV:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
 w=W.cv
 w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.lh=!0
+a.qe=!1
+a.zg=!1
 a.Pe=!1
 a.SO=z
 a.B7=y
@@ -18094,13 +18147,16 @@
 C.Xo.ZL(a)
 C.Xo.G6(a)
 return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[383]}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
+"+FunctionRefElement":[503],
+T5:{
+"^":"xI+Pi;",
+$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
 mk:{
-"^":["WZq;Z8%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.Z8},null,null,1,0,376,"function",358,377],
-sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,378,28,[],"function",358],
-yv:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["pva;Z8%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gMj:[function(a){return a.Z8},null,null,1,0,386,"function",368,387],
+sMj:[function(a,b){a.Z8=this.ct(a,C.nf,a.Z8,b)},null,null,3,0,388,30,[],"function",368],
+pA:[function(a,b){J.am(a.Z8).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.nu]},
 static:{N0:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18114,37 +18170,154 @@
 C.Yu.ZL(a)
 C.Yu.G6(a)
 return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[491],
-WZq:{
+"+FunctionViewElement":[504],
+pva:{
 "^":"uL+Pi;",
-$isd3:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
+"^":"",
+lb:{
+"^":["cda;hi%-82,An%-82,PA%-400,Oh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gys:[function(a){return a.PA},null,null,1,0,375,"status",368,369],
+sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",368],
+gyw:[function(a){return a.Oh},null,null,1,0,386,"fragmentation",368,387],
+syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,388,30,[],"fragmentation",368],
+i4:[function(a){Z.uL.prototype.i4.call(this,a)
+a.hi=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")},"call$0","gQd",0,0,114,"enteredView"],
+LI:[function(a,b){var z
+if(J.de(b,J.UQ(a.Oh,"free_class_id")))return[255,255,255,255]
+else{z=b==null?C.vT:P.n2(b)
+return[z.j1(128),z.j1(128),z.j1(128),255]}},"call$1","gz4",2,0,505,506,[],"_classIdToRGBA"],
+My:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+z=a.Oh
+if(z==null||a.hi==null)return
+y=J.UQ(z,"pages")
+x=H.B7([],P.L5(null,null,null,null,null))
+for(z=J.GP(y),w=0;z.G();){v=z.gl()
+u=J.U6(v)
+t=0
+while(!0){s=u.gB(v)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+s=u.t(v,t)
+if(typeof s!=="number")return H.s(s)
+w+=s
+r=u.t(v,t+1)
+x.to(r,new O.nB(a,r))
+t+=2}}z=J.Q5(J.u3(a.hi))
+q=z.gR(z)
+p=C.CD.Z(w+q-1,q)
+z=P.f9(J.Vf(a.hi).createImageData(q,p))
+a.An=z
+J.No(a.hi,J.AH(z))
+J.OE(a.hi,J.kd(a.An))
+this.Ar(a,0,0,x)},"call$0","gCT",0,0,114,"_updateFragmentationData"],
+Ar:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
+z={}
+z.a=c
+y=J.UQ(a.Oh,"pages")
+x=J.U6(y)
+w="Loaded "+H.d(b)+" of "+H.d(x.gB(y))+" pages"
+a.PA=this.ct(a,C.PM,a.PA,w)
+if(J.J5(b,x.gB(y)))return
+v=J.AH(a.An)
+w=J.FW(z.a,4)
+if(typeof v!=="number")return H.s(v)
+u=C.CD.Z(w,v)
+t=x.t(y,b)
+x=J.U6(t)
+w=J.U6(d)
+s=0
+while(!0){r=x.gB(t)
+if(typeof r!=="number")return H.s(r)
+if(!(s<r))break
+q=x.t(t,s)
+p=w.t(d,x.t(t,s+1))
+if(typeof q!=="number")return H.s(q)
+r=J.w1(p)
+o=0
+for(;o<q;++o)for(n=r.gA(p);n.G();){m=n.gl()
+l=J.jD(a.An)
+k=z.a
+z.a=J.WB(k,1)
+J.kW(l,k,m)}s+=2}j=C.CD.Z(J.FW(z.a,4)+v-1,v)
+J.My(J.Vf(a.hi),a.An,0,0,0,u,v,j-u)
+P.e4(new O.WQ(z,a,b,d),null)},"call$3","guq",6,0,507,508,[],509,[],510,[],"_renderPages"],
+pA:[function(a,b){var z=a.Oh
+if(z==null)return
+J.QP(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+YS:[function(a,b){P.e4(new O.oc(a),null)},"call$1","gR2",2,0,157,229,[],"fragmentationChanged"],
+"@":function(){return[C.Yl]},
+static:{d0:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.pJ.ZL(a)
+C.pJ.G6(a)
+return a},null,null,0,0,115,"new HeapMapElement$created"]}},
+"+HeapMapElement":[511],
+cda:{
+"^":"uL+Pi;",
+$isd3:true},
+nB:{
+"^":"Tp:115;a-82,b-82",
+call$0:[function(){return J.fv(this.a,this.b)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ nB":[501],
+WQ:{
+"^":"Tp:115;a-82,b-82,c-379,d-82",
+call$0:[function(){J.LO(this.b,J.WB(this.c,1),this.a.a,this.d)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ WQ":[501],
+aG:{
+"^":"Tp:388;a-82",
+call$1:[function(a){var z,y
+z=this.a
+y=J.RE(z)
+y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"call$1",null,2,0,388,512,[],"call"],
+$isEH:true},
+"+ aG":[501],
+aO:{
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
+$isEH:true},
+"+ aO":[501],
+oc:{
+"^":"Tp:115;a-82",
+call$0:[function(){J.vP(this.a)},"call$0",null,0,0,115,"call"],
+$isEH:true},
+"+ oc":[501]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
 jY:{
-"^":["pva;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-374,X3%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.Ol},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,378,28,[],"profile",358],
+"^":["waa;GQ%-82,J0%-82,Oc%-82,CO%-82,bV%-82,kg%-82,LY%-82,q3%-82,Ol%-384,X3%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.Ol},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,388,30,[],"profile",368],
 i4:[function(a){var z,y
 Z.uL.prototype.i4.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#table")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"Table"),[z])
+y.vR=P.zV(J.UQ($.NR,"Table"),[z])
 a.q3=y
 y.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.q3),"sortColumn",1)
 J.kW(J.wc(a.q3),"sortAscending",!1)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"PieChart"),[y])
+z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
 a.J0=z
 z.bG.u(0,"title","New Space")
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
 y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.uw(J.UQ($.NR,"PieChart"),[z])
+y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
 a.CO=y
 y.bG.u(0,"title","Old Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#simpleTable")
 z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.uw(J.UQ($.NR,"Table"),[y])
+z.vR=P.zV(J.UQ($.NR,"Table"),[y])
 a.kg=z
 z.bG.u(0,"allowHtml",!0)
 J.kW(J.wc(a.kg),"sortColumn",1)
@@ -18152,25 +18325,22 @@
 this.uB(a)},"call$0","gQd",0,0,114,"enteredView"],
 hZ:[function(a){var z,y,x,w,v,u
 z=a.Ol
-if(z!=null){z=J.UQ(z,"members")
-y=J.x(z)
-z=typeof z!=="object"||z===null||z.constructor!==Array&&!y.$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0)}else z=!0
-if(z)return
-a.LY.lb()
-a.bV.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){x=z.gl()
-if(this.K1(a,x))continue
-y=J.U6(x)
-w=J.UQ(y.t(x,"class"),"name")
-v=y.t(x,"class").gHP()
-J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,x,0))+"</a>",this.iF(a,x,1),this.iF(a,x,2),this.iF(a,x,3),this.iF(a,x,4),this.iF(a,x,5),this.iF(a,x,6),this.iF(a,x,7),this.iF(a,x,8)])
-J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,x,0))+"</a>",this.VI(a,x,1),this.VI(a,x,2),this.VI(a,x,3),this.VI(a,x,4),this.VI(a,x,5),this.VI(a,x,6)])}a.GQ.lb()
+if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
+a.LY.Ti()
+a.bV.Ti()
+for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(this.K1(a,y))continue
+x=J.U6(y)
+w=J.UQ(x.t(y,"class"),"name")
+v=x.t(y,"class").gHP()
+J.N5(a.LY,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.iF(a,y,0))+"</a>",this.iF(a,y,1),this.iF(a,y,2),this.iF(a,y,3),this.iF(a,y,4),this.iF(a,y,5),this.iF(a,y,6),this.iF(a,y,7),this.iF(a,y,8)])
+J.N5(a.bV,["<a title=\""+H.d(w)+"\" href=\""+v+"\">"+H.d(this.VI(a,y,0))+"</a>",this.VI(a,y,1),this.VI(a,y,2),this.VI(a,y,3),this.VI(a,y,4),this.VI(a,y,5),this.VI(a,y,6)])}a.GQ.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"new")
 z=J.U6(u)
 J.N5(a.GQ,["Used",z.t(u,"used")])
 J.N5(a.GQ,["Free",J.xH(z.t(u,"capacity"),z.t(u,"used"))])
 J.N5(a.GQ,["External",z.t(u,"external")])
-a.Oc.lb()
+a.Oc.Ti()
 u=J.UQ(J.UQ(a.Ol,"heaps"),"old")
 z=J.U6(u)
 J.N5(a.Oc,["Used",z.t(u,"used")])
@@ -18190,7 +18360,7 @@
 x=z.t(b,"old")
 for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
 for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"call$1","gbU",2,0,492,272,[],"_classHasNoAllocations"],
+return!0},"call$1","gbU",2,0,514,275,[],"_classHasNoAllocations"],
 iF:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18203,7 +18373,7 @@
 case 6:return J.UQ(J.UQ(b,"old"),5)
 case 7:return J.UQ(J.UQ(b,"old"),1)
 case 8:return J.UQ(J.UQ(b,"old"),3)
-default:}throw H.b(P.hS())},"call$2","gym",4,0,493,272,[],52,[],"_fullTableColumnValue"],
+default:}throw H.b(P.hS())},"call$2","gym",4,0,515,275,[],15,[],"_fullTableColumnValue"],
 VI:[function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:z=J.U6(b)
@@ -18218,13 +18388,13 @@
 return J.WB(J.UQ(z.t(b,"new"),1),J.UQ(z.t(b,"old"),1))
 case 6:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"old"),3))
-default:}throw H.b(P.hS())},"call$2","gcY",4,0,493,272,[],52,[],"_combinedTableColumnValue"],
-yv:[function(a,b){var z=a.Ol
+default:}throw H.b(P.hS())},"call$2","gcY",4,0,515,275,[],15,[],"_combinedTableColumnValue"],
+pA:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+J.QP(z).ox("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 ii:[function(a,b,c,d){var z=a.Ol
 if(z==null)return
-J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,393,19,[],304,[],79,[],"resetAccumulator"],
+J.QP(z).ox("/allocationprofile/reset").ml(new K.ke(a)).OA(new K.xj())},"call$3","gNb",6,0,404,21,[],313,[],79,[],"resetAccumulator"],
 pM:[function(a,b){this.hZ(a)
 this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
@@ -18235,18 +18405,18 @@
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,494,495,[],"formattedAverage",359],
+return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"call$1","gOd",2,0,516,517,[],"formattedAverage",369],
 NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,494,495,[],"formattedCollections",359],
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"call$1","gJN",2,0,516,517,[],"formattedCollections",369],
 Q0:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,494,495,[],"formattedTotalCollectionTime",359],
-Dd:[function(a){var z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"call$1","goN",2,0,516,517,[],"formattedTotalCollectionTime",369],
+Dd:[function(a){var z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.LY=z
 z.Gl("string","Class")
 a.LY.Gl("number","Current (new)")
@@ -18257,15 +18427,15 @@
 a.LY.Gl("number","Allocated Since GC (old)")
 a.LY.Gl("number","Total before GC (old)")
 a.LY.Gl("number","Survivors (old)")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.GQ=z
 z.Gl("string","Type")
 a.GQ.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.Oc=z
 z.Gl("string","Type")
 a.Oc.Gl("number","Size")
-z=new G.Kf(P.uw(J.UQ($.NR,"DataTable"),null))
+z=new G.Kf(P.zV(J.UQ($.NR,"DataTable"),null))
 a.bV=z
 z.Gl("string","Class")
 a.bV.Gl("number","Accumulator")
@@ -18275,7 +18445,7 @@
 a.bV.Gl("number","Total before GC")
 a.bV.Gl("number","Survivors after GC")},null,null,0,0,115,"created"],
 "@":function(){return[C.dA]},
-static:{"^":"BO<-82,bQj<-82,WY<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
+static:{"^":"BO<-82,bQj<-82,xK<-82,V1g<-82,r1<-82,d6<-82,pC<-82,DP<-82",US:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -18289,44 +18459,51 @@
 C.Vc.G6(a)
 C.Vc.Dd(a)
 return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[496],
-pva:{
+"+HeapProfileElement":[518],
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
 nx:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ nx":[489],
+"+ nx":[501],
 jm:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ jm":[489],
+"+ jm":[501],
 ke:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,378,497,[],"call"],
+y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"call$1",null,2,0,388,512,[],"call"],
 $isEH:true},
-"+ ke":[489],
+"+ ke":[501],
 xj:{
-"^":"Tp:348;",
-call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,348,19,[],498,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"call$2",null,4,0,358,21,[],513,[],"call"],
 $isEH:true},
-"+ xj":[489]}],["html_common","dart:html_common",,P,{
+"+ xj":[501]}],["html_common","dart:html_common",,P,{
 "^":"",
 bL:[function(a){var z,y
 z=[]
 y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).call$1(a)
 new P.wO().call$0()
-return y},"call$1","Lq",2,0,null,28,[]],
+return y},"call$1","Lq",2,0,null,30,[]],
 o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],237,[]],
+return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).call$1(a)},"call$2$mustCopy","A1",2,3,null,210,6,[],238,[]],
+f9:[function(a){var z,y
+z=J.x(a)
+if(!!z.$isSg){y=z.gRn(a)
+if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
+y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"call$1","Yq",2,0,null,239,[]],
+QO:[function(a){if(!!J.x(a).$isqS)return{data: a.Rn, height: a.fg, width: a.R}
+return a},"call$1","Gg",2,0,null,240,[]],
 dg:function(){var z=$.L4
 if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
 $.L4=z}return z},
@@ -18341,19 +18518,19 @@
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 rG:{
-"^":"Tp:411;d",
+"^":"Tp:423;d",
 call$1:[function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 yh:{
-"^":"Tp:499;e",
+"^":"Tp:519;e",
 call$2:[function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 wO:{
 "^":"Tp:115;",
@@ -18368,14 +18545,14 @@
 if(typeof a==="number")return a
 if(typeof a==="string")return a
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isiP)return new Date(a.y3)
-if(typeof a==="object"&&a!==null&&!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(typeof a==="object"&&a!==null&&!!y.$ishH)return a
-if(typeof a==="object"&&a!==null&&!!y.$isAz)return a
-if(typeof a==="object"&&a!==null&&!!y.$isSg)return a
-if(typeof a==="object"&&a!==null&&!!y.$isWZ)return a
-if(typeof a==="object"&&a!==null&&!!y.$ispF)return a
-if(typeof a==="object"&&a!==null&&!!y.$isZ0){x=this.f.call$1(a)
+if(!!y.$isiP)return new Date(a.y3)
+if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$ishH)return a
+if(!!y.$isAz)return a
+if(!!y.$isSg)return a
+if(!!y.$isWZ)return a
+if(!!y.$ispF)return a
+if(!!y.$isZ0){x=this.f.call$1(a)
 w=this.UI.call$1(x)
 z.a=w
 if(w!=null)return w
@@ -18383,7 +18560,7 @@
 z.a=w
 this.bK.call$2(x,w)
 y.aN(a,new P.ib(z,this))
-return z.a}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){v=y.gB(a)
+return z.a}if(!!y.$isList){v=y.gB(a)
 x=this.f.call$1(a)
 w=this.UI.call$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
@@ -18393,11 +18570,11 @@
 u=0
 for(;u<v;++u){z=this.call$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,19,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ib:{
-"^":"Tp:348;a,Gq",
-call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+"^":"Tp:358;a,Gq",
+call$2:[function(a,b){this.a.a[a]=this.Gq.call$1(b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true},
 CA:{
 "^":"Tp:188;a,b",
@@ -18407,19 +18584,19 @@
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"call$1",null,2,0,null,28,[],"call"],
+return y},"call$1",null,2,0,null,30,[],"call"],
 $isEH:true},
 YL:{
-"^":"Tp:411;c",
+"^":"Tp:423;c",
 call$1:[function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"call$1",null,2,0,null,409,[],"call"],
+return z[a]},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true},
 KC:{
-"^":"Tp:499;d",
+"^":"Tp:519;d",
 call$2:[function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"call$2",null,4,0,null,409,[],26,[],"call"],
+z[a]=b},"call$2",null,4,0,null,421,[],28,[],"call"],
 $isEH:true},
 xL:{
 "^":"Tp:112;e,f,UI,bK",
@@ -18447,8 +18624,12 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.call$1(x.t(a,t)))
-return y}return a},"call$1",null,2,0,null,19,[],"call"],
+return y}return a},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
+qS:{
+"^":"a;Rn>,fg>,R>",
+$isqS:true,
+$isSg:true},
 As:{
 "^":"a;",
 bu:[function(a){return this.lF().zV(0," ")},"call$0","gXo",0,0,null],
@@ -18457,13 +18638,13 @@
 if(!z.tg(0,a)===!0){z.h(0,a)
 y=!0}else{z.Rz(0,a)
 y=!1}this.p5(z)
-return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,28,[],475,[]],
+return y},function(a){return this.O4(a,null)},"qU","call$2",null,"gMk",2,2,null,82,30,[],487,[]],
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
 aN:[function(a,b){this.lF().aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,330,331,[]],
+zV:[function(a,b){return this.lF().zV(0,b)},"call$1","gNU",0,2,null,340,341,[]],
 ez:[function(a,b){var z=this.lF()
 return H.K1(z,b,H.ip(z,"mW",0),null)},"call$1","gIr",2,0,null,117,[]],
 ev:[function(a,b){var z=this.lF()
@@ -18472,27 +18653,29 @@
 gl0:function(a){return this.lF().X5===0},
 gor:function(a){return this.lF().X5!==0},
 gB:function(a){return this.lF().X5},
-tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,28,[]],
-Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,28,[]],
-h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,28,[]],
+tg:[function(a,b){return this.lF().tg(0,b)},"call$1","gdj",2,0,null,30,[]],
+Zt:[function(a){return this.lF().tg(0,a)?a:null},"call$1","gQB",2,0,null,30,[]],
+h:[function(a,b){return this.OS(new P.GE(b))},"call$1","ght",2,0,null,30,[]],
 Rz:[function(a,b){var z,y
 if(typeof b!=="string")return!1
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
-return y},"call$1","guH",2,0,null,28,[]],
+return y},"call$1","guH",2,0,null,30,[]],
 FV:[function(a,b){this.OS(new P.rl(b))},"call$1","gDY",2,0,null,116,[]],
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(new P.lj("No elements"))
 return z.gGc()},
-tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gRV",0,3,null,333,334,[]],
-Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","goY",2,0,null,52,[]],
+tt:[function(a,b){return this.lF().tt(0,b)},function(a){return this.tt(a,!0)},"br","call$1$growable",null,"gdn",0,3,null,343,344,[]],
+Zv:[function(a,b){return this.lF().Zv(0,b)},"call$1","gRV",2,0,null,15,[]],
 V1:[function(a){this.OS(new P.uQ())},"call$0","gRa",0,0,null],
 OS:[function(a){var z,y
 z=this.lF()
 y=a.call$1(z)
 this.p5(z)
 return y},"call$1","gFd",2,0,null,117,[]],
+$isz5:true,
+$asz5:function(){return[J.O]},
 $isyN:true,
 $isQV:true,
 $asQV:function(){return[J.O]}},
@@ -18515,69 +18698,66 @@
 aN:[function(a,b){H.bQ(this.gzT(),b)},"call$1","gjw",2,0,null,117,[]],
 u:[function(a,b,c){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},"call$2","gj3",4,0,null,52,[],28,[]],
+J.ZP(z[b],c)},"call$2","gj3",4,0,null,15,[],30,[]],
 sB:function(a,b){var z,y
 z=this.gzT().length
 y=J.Wx(b)
 if(y.F(b,z))return
 else if(y.C(b,0))throw H.b(new P.AT("Invalid list length"))
 this.UZ(0,b,z)},
-h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,28,[]],
+h:[function(a,b){this.h2.NL.appendChild(b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.h2.NL;z.G();)y.appendChild(z.lo)},"call$1","gDY",2,0,null,116,[]],
+for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},"call$1","gDY",2,0,null,116,[]],
 tg:[function(a,b){return!1},"call$1","gdj",2,0,null,107,[]],
 GT:[function(a,b){throw H.b(P.f("Cannot sort filtered list"))},"call$1","gH7",0,2,null,82,122,[]],
-YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},"call$4","gam",6,2,null,332,123,[],124,[],116,[],125,[]],
+YW:[function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on filtered list"))},function(a,b,c,d){return this.YW(a,b,c,d,0)},"zB","call$4",null,"gam",6,2,null,342,123,[],124,[],116,[],125,[]],
 UZ:[function(a,b,c){H.bQ(C.Nm.D6(this.gzT(),b,c),new P.GS())},"call$2","gYH",4,0,null,123,[],124,[]],
 V1:[function(a){J.c9(this.h2.NL,"")},"call$0","gRa",0,0,null],
-xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,52,[],28,[]],
-KI:[function(a,b){var z,y
-z=this.gzT()
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-J.QC(y)
-return y},"call$1","gNM",2,0,null,52,[]],
+xe:[function(a,b,c){this.h2.xe(0,b,c)},"call$2","gQG",4,0,null,15,[],30,[]],
+oF:[function(a,b,c){var z,y
+z=this.h2.NL
+y=z.childNodes
+if(b<0||b>=y.length)return H.e(y,b)
+J.nt(z,c,y[b])},"call$2","gFD",4,0,null,15,[],116,[]],
 Rz:[function(a,b){var z,y,x
-z=J.x(b)
-if(typeof b!=="object"||b===null||!z.$iscv)return!1
-for(y=0;y<this.gzT().length;++y){z=this.gzT()
-if(y>=z.length)return H.e(z,y)
-x=z[y]
-if(x==null?b==null:x===b){J.QC(x)
+if(!J.x(b).$iscv)return!1
+for(z=0;z<this.gzT().length;++z){y=this.gzT()
+if(z>=y.length)return H.e(y,z)
+x=y[z]
+if(x===b){J.QC(x)
 return!0}}return!1},"call$1","guH",2,0,null,132,[]],
 gB:function(a){return this.gzT().length},
 t:[function(a,b){var z=this.gzT()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,null,52,[]],
+return z[b]},"call$1","gIA",2,0,null,15,[]],
 gA:function(a){var z=this.gzT()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$iscv},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){return!!J.x(a).$iscv},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 GS:{
 "^":"Tp:112;",
-call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,287,[],"call"],
+call$1:[function(a){return J.QC(a)},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
-pR:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+NG:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 gD5:[function(a){var z=a.tY
 if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
 else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
 else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
 else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
 else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,365,"hoverText"],
+return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,375,"hoverText"],
 Qx:[function(a){return this.gNe(a)},"call$0","gyX",0,0,115,"expander"],
-SF:[function(a,b,c){var z,y
+vQ:[function(a,b,c){var z,y
 z=a.tY
 if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.call$0()}},"call$2","gNe",4,0,500,501,[],379,[],"expandEvent"],
+c.call$0()}},"call$2","gNe",4,0,520,521,[],389,[],"expandEvent"],
 "@":function(){return[C.VW]},
 static:{b4:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18592,7 +18772,7 @@
 C.cp.ZL(a)
 C.cp.G6(a)
 return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[383],
+"+InstanceRefElement":[393],
 Js:{
 "^":"Tp:112;a-82",
 call$1:[function(a){var z,y
@@ -18603,14 +18783,14 @@
 y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
 y.ct(z,C.kY,0,1)},"call$1",null,2,0,112,56,[],"call"],
 $isEH:true},
-"+ Js":[489]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+"+ Js":[501]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["cda;Xh%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,376,"instance",358,377],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,378,28,[],"instance",358],
-vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,502,212,[],"eval"],
-yv:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V4;Xh%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gQr:[function(a){return a.Xh},null,null,1,0,386,"instance",368,387],
+sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,388,30,[],"instance",368],
+vV:[function(a,b){return J.QP(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.Xh).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.be]},
 static:{HC:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18621,20 +18801,20 @@
 a.SO=z
 a.B7=y
 a.X0=w
-C.yK.ZL(a)
-C.yK.G6(a)
+C.pU.ZL(a)
+C.pU.G6(a)
 return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[503],
-cda:{
+"+InstanceViewElement":[522],
+V4:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_list_element","package:observatory/src/elements/isolate_list.dart",,L,{
 "^":"",
 u7:{
-"^":["waa;tf%-504,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gi2:[function(a){return a.tf},null,null,1,0,505,"isolates",358,377],
-si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,506,28,[],"isolates",358],
-yv:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.jF]},
+"^":["V9;tf%-523,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gi2:[function(a){return a.tf},null,null,1,0,524,"isolates",368,387],
+si2:[function(a,b){a.tf=this.ct(a,C.za,a.tf,b)},null,null,3,0,525,30,[],"isolates",368],
+pA:[function(a,b){J.am(a.tf).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.jFV]},
 static:{Cu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18647,47 +18827,91 @@
 C.b9.ZL(a)
 C.b9.G6(a)
 return a},null,null,0,0,115,"new IsolateListElement$created"]}},
-"+IsolateListElement":[507],
-waa:{
+"+IsolateListElement":[526],
+V9:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
-qm:{
-"^":["Y2;B1>,tT>-385,eT,yt-369,wd-370,oH-371,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
-C4:[function(a){if(J.z8(J.q8(this.wd),0))return
-J.kH(this.tT.gVS(),new X.TI(this))},"call$0","gz7",0,0,null],
+Se:{
+"^":["Y2;B1>,SF<-527,H<-527,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+gtT:[function(a){return J.on(this.H)},null,null,1,0,397,"code",368],
+C4:[function(a){var z,y,x,w,v,u,t,s,r
+z=this.B1
+y=J.UQ(z,"threshold")
+x=this.wd
+w=J.U6(x)
+if(J.z8(w.gB(x),0))return
+for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
+r=J.FW(s.gAv(),v.gAv())
+if(typeof y!=="number")return H.s(y)
+if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
+w.h(x,X.SJ(z,t,s,this))}},"call$0","gz7",0,0,null],
 o8:[function(){},"call$0","gDT",0,0,null],
-Af:function(a,b,c){var z,y,x,w,v
-z=J.UQ(this.B1,"samples")
-y=this.oH
-x=this.tT
-w=J.w1(y)
-w.h(y,X.eI(x.gDu(),z))
-if(c==null)w.h(y,"")
-else{v=c.tT
-w.h(y,X.eI(v.dJ(x),v.QQ()))}},
-static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],238,[]],Tl:function(a,b,c){var z,y
+mW:function(a,b,c,d){var z,y,x,w
+z=this.SF
+y=z.gAv()
+x=this.oH
+w=this.H
+if(d==null)J.bi(x,X.j6(w.gAv(),z.gAv()))
+else J.bi(x,X.j6(w.gAv(),d.H.gAv()))
+J.bi(x,X.j6(J.on(w).gDu(),y))},
+static:{j6:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","E7",4,0,null,131,[],241,[]],SJ:function(a,b,c,d){var z,y
+z=H.VM([],[G.Y2])
+y=d!=null?J.WB(d.yt,1):0
+z=new X.Se(a,b,c,d,y,z,[],!1,null,null)
+z.mW(a,b,c,d)
+return z}}},
+qm:{
+"^":["Y2;B1>,tT>-396,eT,yt-379,wd-380,oH-381,z3,AP,Lk",null,function(){return[C.Nw]},null,function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null,null],
+C4:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"threshold")
+w=y.t(z,"samples")
+y=this.wd
+v=J.U6(y)
+if(J.z8(v.gB(y),0))return
+for(u=this.tT,t=J.GP(u.gVS());t.G();){s=t.gl()
+r=J.RE(s)
+q=J.FW(u.dJ(r.gtT(s)),u.QQ())
+if(typeof x!=="number")return H.s(x)
+if(!(q>x||J.FW(r.gtT(s).gDu(),w)>x))continue
+v.h(y,X.Tl(z,r.gtT(s),this))}},"call$0","gz7",0,0,null],
+o8:[function(){},"call$0","gDT",0,0,null],
+Af:function(a,b,c){var z,y,x,w,v,u
+z=this.B1
+y=J.U6(z)
+x=y.t(z,"samples")
+w=this.tT
+v=this.oH
+if(c==null){u=y.gF1(z).gZ0().Qy.Zp.t(0,"code/tag-0")
+J.bi(v,X.eI(u.dJ(w),u.QQ()))}else{z=c.tT
+J.bi(v,X.eI(z.dJ(w),z.QQ()))}J.bi(v,X.eI(w.gDu(),x))},
+static:{eI:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","rC",4,0,null,131,[],241,[]],Tl:function(a,b,c){var z,y
 z=H.VM([],[G.Y2])
 y=c!=null?J.WB(c.yt,1):0
 z=new X.qm(a,b,c,y,z,[],!1,null,null)
 z.Af(a,b,c)
 return z}}},
-TI:{
-"^":"Tp:509;a",
-call$1:[function(a){var z=this.a
-J.bi(z.wd,X.Tl(z.B1,J.on(a),z))},"call$1",null,2,0,null,508,[],"call"],
-$isEH:true},
-E7:{
-"^":["V4;pD%-374,Dt=-82,BA%-369,FT%-389,vk%-389,fb=-510,qO=-82,Hm%-511,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,376,"profile",358,377],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,378,28,[],"profile",358],
-gXc:[function(a){return a.BA},null,null,1,0,512,"methodCountSelected",358,359],
-sXc:[function(a,b){a.BA=this.ct(a,C.fQ,a.BA,b)},null,null,3,0,411,28,[],"methodCountSelected",358],
-gJy:[function(a){return a.FT},null,null,1,0,365,"sampleCount",358,359],
-sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,30,28,[],"sampleCount",358],
-gUo:[function(a){return a.vk},null,null,1,0,365,"refreshTime",358,359],
-sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,30,28,[],"refreshTime",358],
-pM:[function(a,b){var z,y,x
+kKl:{
+"^":["V10;pD%-384,Kx%-392,zt%-392,FT%-400,vk%-400,Xv%-400,M5%-400,ik%-400,XX%-528,qO=-82,Hm%-529,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gB1:[function(a){return a.pD},null,null,1,0,386,"profile",368,387],
+sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,388,30,[],"profile",368],
+gJQ:[function(a){return a.Kx},null,null,1,0,401,"callGraphChecked",368,369],
+sJQ:[function(a,b){a.Kx=this.ct(a,C.Hx,a.Kx,b)},null,null,3,0,402,30,[],"callGraphChecked",368],
+gPL:[function(a){return a.zt},null,null,1,0,401,"hideTagsChecked",368,369],
+sPL:[function(a,b){a.zt=this.ct(a,C.Ai,a.zt,b)},null,null,3,0,402,30,[],"hideTagsChecked",368],
+gJy:[function(a){return a.FT},null,null,1,0,375,"sampleCount",368,369],
+sJy:[function(a,b){a.FT=this.ct(a,C.XU,a.FT,b)},null,null,3,0,32,30,[],"sampleCount",368],
+gUo:[function(a){return a.vk},null,null,1,0,375,"refreshTime",368,369],
+sUo:[function(a,b){a.vk=this.ct(a,C.Dj,a.vk,b)},null,null,3,0,32,30,[],"refreshTime",368],
+gEly:[function(a){return a.Xv},null,null,1,0,375,"sampleRate",368,369],
+sEly:[function(a,b){a.Xv=this.ct(a,C.kA,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",368],
+gnZ:[function(a){return a.M5},null,null,1,0,375,"sampleDepth",368,369],
+snZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",368],
+gNG:[function(a){return a.ik},null,null,1,0,375,"displayCutoff",368,369],
+sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",368],
+pM:[function(a,b){var z,y,x,w
 z=a.pD
 if(z==null)return
 y=J.UQ(z,"samples")
@@ -18697,83 +18921,113 @@
 a.FT=this.ct(a,C.XU,a.FT,z)
 z=x.bu(0)
 a.vk=this.ct(a,C.Dj,a.vk,z)
+z=J.AG(J.UQ(a.pD,"depth"))
+a.M5=this.ct(a,C.bE,a.M5,z)
+w=J.UQ(a.pD,"period")
+if(typeof w!=="number")return H.s(w)
+z=C.CD.yM(1000000/w,0)
+a.Xv=this.ct(a,C.kA,a.Xv,z)
+z=J.AG(J.vX(a.XX,100))+"%"
+a.ik=this.ct(a,C.aH,a.ik,z)
 J.QP(a.pD).N3(a.pD)
+J.kW(a.pD,"threshold",a.XX)
 this.Cx(a)},"call$1","gwm",2,0,157,229,[],"profileChanged"],
-i4:[function(a){var z,y
-z=[]
-y=R.Jk([])
-C.Nm.FV(z,["Method","Exclusive","Caller"])
-a.Hm=new G.XN(z,y,null,null)
+Cs:[function(a,b){this.Cx(a)},"call$1","gS5",2,0,157,229,[],"callGraphCheckedChanged"],
+i4:[function(a){var z=R.Jk([])
+a.Hm=new G.XN(z,null,null)
 this.Cx(a)},"call$0","gQd",0,0,114,"enteredView"],
-wW:[function(a,b){this.Cx(a)},"call$1","ghj",2,0,112,229,[],"methodCountSelectedChanged"],
-yv:[function(a,b){J.QP(a.pD).ox("profile").ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-Cx:[function(a){var z,y,x
+na:[function(a,b){this.pA(a,null)},"call$1","gDJ",2,0,157,229,[],"hideTagsCheckedChanged"],
+pA:[function(a,b){var z,y
+z=a.zt
+y=z!=null&&z===!0?"profile"+"?tags=hide":"profile"
+J.QP(a.pD).ox(y).ml(new X.SV(a)).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+Cx:[function(a){var z
 if(a.pD==null)return
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))
-this.zr(a)},"call$0","gBn",0,0,114,"_update"],
-Ti:[function(a){var z,y,x
-z=J.UQ(a.fb,a.BA)
-y=a.Dt
-x=J.w1(y)
-x.V1(y)
-x.FV(y,J.QP(a.pD).gZ0().T0(z))},"call$0","guE",0,0,114,"_refreshTopMethods"],
-zr:[function(a){var z,y,x
-z=[]
-for(y=J.GP(a.Dt);y.G();){x=y.gl()
-z.push(X.Tl(a.pD,x,null))}a.Hm.rT(z)
-this.ct(a,C.ep,null,a.Hm)},"call$0","gdX",0,0,114,"_rebuildTree"],
-ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,513,364,[],"padding",359],
+z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gBn",0,0,114,"_update"],
+QI:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gZ0().Qy.Zp.t(0,"code/tag-0")
+if(z==null)N.Jx("").j2("No profile root tag.")
+try{a.Hm.rT(X.Tl(a.pD,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildCallersTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","geF",0,0,114,"_buildCallersTree"],
+EX:[function(a){var z,y,x,w,v
+z=J.QP(a.pD).gBC()
+if(z==null)N.Jx("").j2("No profile trie root.")
+try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
+y=v
+x=new H.XO(w,null)
+N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"call$0","gzo",0,0,114,"_buildStackTree"],
+ba:[function(a){var z=a.Kx
+if(z!=null&&z===!0)this.QI(a)
+else this.EX(a)},"call$0","gvr",0,0,114,"_buildTree"],
+ub:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"call$1","gGX",2,0,530,374,[],"padding",369],
 ZZ:[function(a,b){var z=J.bY(b.gyt(),5)
 if(z>>>0!==z||z>=5)return H.e(C.PQ,z)
-return C.PQ[z]},"call$1","gth",2,0,513,364,[],"coloring",359],
+return C.PQ[z]},"call$1","gth",2,0,530,374,[],"coloring",369],
 YF:[function(a,b,c,d){var z,y,x
 z=J.u3(d)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$istV){y=a.Hm
+if(!!J.x(z).$istV){y=a.Hm
 x=z.rowIndex
 if(typeof x!=="number")return x.W()
-y.qU(x-1)}},"call$3","gpR",6,0,514,19,[],304,[],79,[],"toggleExpanded",359],
+y.qU(x-1)}},"call$3","gpR",6,0,531,21,[],313,[],79,[],"toggleExpanded",369],
 "@":function(){return[C.jR]},
-static:{jD:[function(a){var z,y,x,w,v
-z=Q.uX(null,D.kx)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Dt=z
-a.BA=0
+static:{"^":"B6<-82",Tv:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
 a.FT=""
 a.vk=""
-a.fb=[10,20,50]
+a.Xv=""
+a.M5=""
+a.ik=""
+a.XX=0.0001
 a.qO="#tableTree"
-a.SO=y
-a.B7=x
-a.X0=v
+a.SO=z
+a.B7=y
+a.X0=w
 C.XH.ZL(a)
 C.XH.G6(a)
 return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[515],
-V4:{
+"+IsolateProfileElement":[532],
+V10:{
 "^":"uL+Pi;",
 $isd3:true},
 SV:{
-"^":"Tp:378;a-82",
+"^":"Tp:388;a-82",
 call$1:[function(a){var z,y
 z=this.a
 y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,378,190,[],"call"],
+y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"call$1",null,2,0,388,190,[],"call"],
 $isEH:true},
-"+ SV":[489]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"+ SV":[501]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
 "^":"",
-Kz:{
-"^":["V9;Pw%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,360,28,[],"isolate",358],
+oO:{
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"@":function(){return[C.X0]},
+static:{Zg:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.SO=z
+a.B7=y
+a.X0=w
+C.LN.ZL(a)
+C.LN.G6(a)
+return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
+"+IsolateRefElement":[393]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":["V11;Pw%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.Pw},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.aM]},
 static:{JR:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18787,39 +19041,60 @@
 C.Qt.ZL(a)
 C.Qt.G6(a)
 return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[517],
-V9:{
+"+IsolateSummaryElement":[534],
+V11:{
+"^":"uL+Pi;",
+$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
+"^":"",
+qkb:{
+"^":["V12;oY%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gF1:[function(a){return a.oY},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,370,30,[],"isolate",368],
+vV:[function(a,b){var z=a.oY
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.oY).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.fO]},
+static:{uD:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.Xe.ZL(a)
+C.Xe.G6(a)
+return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
+"+IsolateViewElement":[535],
+V12:{
 "^":"uL+Pi;",
 $isd3:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
 vj:{
-"^":["V10;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gvL:[function(a){return a.eb},null,null,1,0,115,"json",358,377],
-svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,28,[],"json",358],
+"^":["V13;eb%-82,kf%-82,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gvL:[function(a){return a.eb},null,null,1,0,115,"json",368,387],
+svL:[function(a,b){a.eb=this.ct(a,C.Gd,a.eb,b)},null,null,3,0,112,30,[],"json",368],
 i4:[function(a){Z.uL.prototype.i4.call(this,a)
 a.kf=0},"call$0","gQd",0,0,114,"enteredView"],
 yC:[function(a,b){this.ct(a,C.eR,"a","b")},"call$1","gHl",2,0,157,229,[],"jsonChanged"],
-gW0:[function(a){return J.AG(a.eb)},null,null,1,0,365,"primitiveString"],
-gmm:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return"Map"
-else if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return"List"
-return"Primitive"},null,null,1,0,365,"valueType"],
+gW0:[function(a){return J.AG(a.eb)},null,null,1,0,375,"primitiveString"],
+gmm:[function(a){var z=J.x(a.eb)
+if(!!z.$isZ0)return"Map"
+else if(!!z.$isList)return"List"
+return"Primitive"},null,null,1,0,375,"valueType"],
 gkG:[function(a){var z=a.kf
 a.kf=J.WB(z,1)
-return z},null,null,1,0,512,"counter"],
-go6:[function(a){var z,y
-z=a.eb
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&(z.constructor===Array||!!y.$isList))return z
-return[]},null,null,1,0,518,"list"],
+return z},null,null,1,0,536,"counter"],
+go6:[function(a){var z=a.eb
+if(!!J.x(z).$isList)return z
+return[]},null,null,1,0,537,"list"],
 gvc:[function(a){var z,y
 z=a.eb
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isZ0)return J.qA(y.gvc(z))
-return[]},null,null,1,0,518,"keys"],
-r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,30,47,[],"value"],
+y=J.x(z)
+if(!!y.$isZ0)return J.qA(y.gvc(z))
+return[]},null,null,1,0,537,"keys"],
+r6:[function(a,b){return J.UQ(a.eb,b)},"call$1","gP",2,0,32,48,[],"value"],
 "@":function(){return[C.KH]},
 static:{mA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18835,13 +19110,13 @@
 C.Yt.ZL(a)
 C.Yt.G6(a)
 return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[519],
-V10:{
+"+JsonViewElement":[538],
+V13:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["xI;tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.uy]},
 static:{rA:[function(a){var z,y,x,w
 z=$.Nd()
@@ -18856,14 +19131,15 @@
 C.Z3.ZL(a)
 C.Z3.G6(a)
 return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[383]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+"+LibraryRefElement":[393]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
 KL:{
-"^":["V11;N7%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.N7},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,378,28,[],"library",358],
-yv:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-"@":function(){return[C.Gg]},
+"^":["V14;N7%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.N7},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.N7=this.ct(a,C.EV,a.N7,b)},null,null,3,0,388,30,[],"library",368],
+vV:[function(a,b){return J.QP(a.N7).ox(J.WB(J.F8(a.N7),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"call$1","gZm",2,0,394,212,[],"eval"],
+pA:[function(a,b){J.am(a.N7).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+"@":function(){return[C.Oyb]},
 static:{Ro:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -18876,8 +19152,8 @@
 C.MG.ZL(a)
 C.MG.G6(a)
 return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[520],
-V11:{
+"+LibraryViewElement":[539],
+V14:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
@@ -18896,7 +19172,7 @@
 else{if(this.eT!=null)throw H.b(P.f("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."))
 $.Y4=a}},
 gSZ:function(){return this.IE()},
-Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,28,[]],
+Im:[function(a){return a.P>=this.gOR().P},"call$1","goT",2,0,null,30,[]],
 Y6:[function(a,b,c,d){var z,y,x,w,v
 if(a.P>=this.gOR().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
@@ -18906,19 +19182,19 @@
 w=new N.HV(a,b,z,y,x,c,d)
 if($.RL)for(v=this;v!=null;){z=J.RE(v)
 z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,521,[],22,[],159,[],160,[]],
-X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,22,[],159,[],160,[]],
-yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,22,[],159,[],160,[]],
-ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,22,[],159,[],160,[]],
-OW:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.OW(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,22,[],159,[],160,[]],
-WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,22,[],159,[],160,[]],
+v=z.geT(v)}else J.EY(N.Jx(""),w)}},"call$4","gA9",4,4,null,82,82,540,[],24,[],159,[],160,[]],
+X2:[function(a,b,c){return this.Y6(C.VZ,a,b,c)},function(a){return this.X2(a,null,null)},"x9","call$3",null,"git",2,4,null,82,82,24,[],159,[],160,[]],
+yl:[function(a,b,c){return this.Y6(C.R5,a,b,c)},function(a){return this.yl(a,null,null)},"J4","call$3",null,"gmU",2,4,null,82,82,24,[],159,[],160,[]],
+ZG:[function(a,b,c){return this.Y6(C.IF,a,b,c)},function(a){return this.ZG(a,null,null)},"To","call$3",null,"gqa",2,4,null,82,82,24,[],159,[],160,[]],
+xH:[function(a,b,c){return this.Y6(C.UP,a,b,c)},function(a){return this.xH(a,null,null)},"j2","call$3",null,"goa",2,4,null,82,82,24,[],159,[],160,[]],
+WB:[function(a,b,c){return this.Y6(C.cV,a,b,c)},function(a){return this.WB(a,null,null)},"hh","call$3",null,"gpo",2,4,null,82,82,24,[],159,[],160,[]],
 IE:[function(){if($.RL||this.eT==null){var z=this.Gs
 if(z==null){z=P.bK(null,null,!0,N.HV)
 this.Gs=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},"call$0","gnc",0,0,null],
 od:[function(a,b){var z=this.Gs
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},"call$1","gBq",2,0,null,27,[]],
+z.Iv(b)}},"call$1","gBq",2,0,null,29,[]],
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
 $isTJ:true,
@@ -18939,10 +19215,8 @@
 qV:{
 "^":"a;oc>,P>",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isqV&&this.P===b.P},"call$1","gUJ",2,0,null,109,[]],
 C:[function(a,b){var z=J.Vm(b)
 if(typeof z!=="number")return H.s(z)
 return this.P<z},"call$1","gix",2,0,null,109,[]],
@@ -18961,7 +19235,7 @@
 giO:function(a){return this.P},
 bu:[function(a){return this.oc},"call$0","gXo",0,0,null],
 $isqV:true,
-static:{"^":"V7K,tmj,Enk,us,IQ,pd,Wr,AN,JY,lM,B9"}},
+static:{"^":"V7K,tmj,ab,LkO,reI,pd,Wr,AN,Uu,lM,B9"}},
 HV:{
 "^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
 bu:[function(a){return"["+this.OR.oc+"] "+this.iJ+": "+H.d(this.G1)},"call$0","gXo",0,0,null],
@@ -18976,8 +19250,8 @@
 J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(H.B7(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],P.L5(null,null,null,null,null)))])
 z.MM.ml(G.vN()).ml(new F.Lb())},"call$0","qg",0,0,null],
 em:{
-"^":"Tp:523;",
-call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,522,[],"call"],
+"^":"Tp:542;",
+call$1:[function(a){P.JS(a.gOR().oc+": "+H.d(a.gFl())+": "+H.d(J.yj(a)))},"call$1",null,2,0,null,541,[],"call"],
 $isEH:true},
 Lb:{
 "^":"Tp:112;",
@@ -18985,22 +19259,22 @@
 A.Ok()},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true}}],["metadata","../../../../../../../../../dart/dart-sdk/lib/html/html_common/metadata.dart",,B,{
 "^":"",
-T4:{
+jh:{
 "^":"a;T9,Bu",
-static:{"^":"Xd,en,pjg,PZ,xa"}},
+static:{"^":"n4I,en,pjg,nq,xa"}},
 tzK:{
 "^":"a;"},
 jA:{
 "^":"a;oc>"},
-PO:{
+Jo:{
 "^":"a;"},
 oBi:{
 "^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
 F1:{
-"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["uL;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 "@":function(){return[C.Ug]},
-static:{z5:[function(a){var z,y,x,w
+static:{aD:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19012,16 +19286,16 @@
 C.kD.ZL(a)
 C.kD.G6(a)
 return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[524],
+"+NavBarElement":[543],
 aQ:{
-"^":["V12;KU%-389,V4%-389,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-"@":function(){return[C.pc]},
+"^":["V15;KU%-400,V4%-400,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+"@":function(){return[C.u76]},
 static:{AJ:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
@@ -19037,16 +19311,16 @@
 C.SU.ZL(a)
 C.SU.G6(a)
 return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[525],
-V12:{
+"+NavMenuElement":[544],
+V15:{
 "^":"uL+Pi;",
 $isd3:true},
 Qa:{
-"^":["V13;KU%-389,V4%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,365,"link",358,377],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,30,28,[],"link",358],
-gdU:[function(a){return a.V4},null,null,1,0,365,"anchor",358,377],
-sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,30,28,[],"anchor",358],
+"^":["V16;KU%-400,V4%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gPj:[function(a){return a.KU},null,null,1,0,375,"link",368,387],
+sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",368],
+gdU:[function(a){return a.V4},null,null,1,0,375,"anchor",368,387],
+sdU:[function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},null,null,3,0,32,30,[],"anchor",368],
 "@":function(){return[C.nh]},
 static:{EL:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19062,27 +19336,27 @@
 C.nn.ZL(a)
 C.nn.G6(a)
 return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[526],
-V13:{
+"+NavMenuItemElement":[545],
+V16:{
 "^":"uL+Pi;",
 $isd3:true},
 Ww:{
-"^":["V14;rU%-82,SB%-382,Hq%-389,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",358,377],
+"^":["V17;rU%-82,SB%-392,Hq%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gFR:[function(a){return a.rU},null,null,1,0,115,"callback",368,387],
 Ki:function(a){return this.gFR(a).call$0()},
 VN:function(a,b){return this.gFR(a).call$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,28,[],"callback",358],
-gxw:[function(a){return a.SB},null,null,1,0,390,"active",358,377],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,391,28,[],"active",358],
-gph:[function(a){return a.Hq},null,null,1,0,365,"label",358,377],
-sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,30,28,[],"label",358],
+sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,112,30,[],"callback",368],
+gxw:[function(a){return a.SB},null,null,1,0,401,"active",368,387],
+sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,402,30,[],"active",368],
+gph:[function(a){return a.Hq},null,null,1,0,375,"label",368,387],
+sph:[function(a,b){a.Hq=this.ct(a,C.hf,a.Hq,b)},null,null,3,0,32,30,[],"label",368],
 Ty:[function(a,b,c,d){var z=a.SB
 if(z===!0)return
 a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,393,19,[],304,[],79,[],"buttonClick"],
+if(a.rU!=null)this.VN(a,this.gCB(a))},"call$3","gyr",6,0,404,21,[],313,[],79,[],"buttonClick"],
 wY:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"call$0","gCB",0,0,114,"refreshDone"],
 "@":function(){return[C.XG]},
-static:{ZC:[function(a){var z,y,x,w
+static:{zN:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19096,14 +19370,14 @@
 C.J7.ZL(a)
 C.J7.G6(a)
 return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[527],
-V14:{
+"+NavRefreshElement":[546],
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
 tz:{
-"^":["V15;Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V18;Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.NT]},
 static:{J8:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19118,16 +19392,16 @@
 C.lx.ZL(a)
 C.lx.G6(a)
 return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[528],
-V15:{
+"+TopNavMenuElement":[547],
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
 fl:{
-"^":["V16;Jo%-382,iy%-516,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
-gF1:[function(a){return a.iy},null,null,1,0,357,"isolate",358,377],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,360,28,[],"isolate",358],
+"^":["V19;Jo%-392,iy%-533,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
+gF1:[function(a){return a.iy},null,null,1,0,367,"isolate",368,387],
+sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,370,30,[],"isolate",368],
 "@":function(){return[C.zaS]},
 static:{Du:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19142,16 +19416,16 @@
 C.RR.ZL(a)
 C.RR.G6(a)
 return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[529],
-V16:{
+"+IsolateNavMenuElement":[548],
+V19:{
 "^":"uL+Pi;",
 $isd3:true},
 Zt:{
-"^":["V17;Ap%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,376,"library",358,377],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,378,28,[],"library",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V20;Ap%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtD:[function(a){return a.Ap},null,null,1,0,386,"library",368,387],
+stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,388,30,[],"library",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.KI]},
 static:{IV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19166,16 +19440,16 @@
 C.ct.ZL(a)
 C.ct.G6(a)
 return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[530],
-V17:{
+"+LibraryNavMenuElement":[549],
+V20:{
 "^":"uL+Pi;",
 $isd3:true},
 iL:{
-"^":["V18;Au%-374,Jo%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRu:[function(a){return a.Au},null,null,1,0,376,"cls",358,377],
-sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,378,28,[],"cls",358],
-grZ:[function(a){return a.Jo},null,null,1,0,390,"last",358,377],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,391,28,[],"last",358],
+"^":["V21;Au%-384,Jo%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRu:[function(a){return a.Au},null,null,1,0,386,"cls",368,387],
+sRu:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,388,30,[],"cls",368],
+grZ:[function(a){return a.Jo},null,null,1,0,401,"last",368,387],
+srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,402,30,[],"last",368],
 "@":function(){return[C.t9]},
 static:{lT:[function(a){var z,y,x,w
 z=$.Nd()
@@ -19190,30 +19464,30 @@
 C.xE.ZL(a)
 C.xE.G6(a)
 return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[531],
-V18:{
+"+ClassNavMenuElement":[550],
+V21:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
 lI:{
-"^":["V19;k5%-382,xH%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,390,"devtools",358,377],
-szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,391,28,[],"devtools",358],
-guw:[function(a){return a.xH},null,null,1,0,533,"app",358,359],
-suw:[function(a,b){a.xH=this.ct(a,C.wh,a.xH,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V22;k5%-392,Oe%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gzj:[function(a){return a.k5},null,null,1,0,401,"devtools",368,387],
+szj:[function(a,b){a.k5=this.ct(a,C.Na,a.k5,b)},null,null,3,0,402,30,[],"devtools",368],
+guw:[function(a){return a.Oe},null,null,1,0,552,"app",368,369],
+suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,553,30,[],"app",368],
 ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null,null,null)
+if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,null,null,null)
 z.pC()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.hq()
-a.xH=this.ct(a,C.wh,a.xH,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null,null,null)
+a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK("http://127.0.0.1:8181/",null,null,null)
 z.pC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null)
 z.US()
-a.xH=this.ct(a,C.wh,a.xH,z)}},null,null,0,0,115,"created"],
+a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
 "@":function(){return[C.bd]},
-static:{fv:[function(a){var z,y,x,w
+static:{Lu:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19227,17 +19501,17 @@
 C.k0.G6(a)
 C.k0.ZB(a)
 return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[535],
-V19:{
+"+ObservatoryApplicationElement":[554],
+V22:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["ir;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 i4:[function(a){A.zs.prototype.i4.call(this,a)},"call$0","gQd",0,0,114,"enteredView"],
 xo:[function(a){A.zs.prototype.xo.call(this,a)},"call$0","gbt",0,0,114,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,536,12,[],229,[],230,[],"attributeChanged"],
-gpQ:[function(a){return!0},null,null,1,0,390,"applyAuthorStyles"],
+aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"call$3","gxR",6,0,555,12,[],229,[],230,[],"attributeChanged"],
+gpQ:[function(a){return!0},null,null,1,0,401,"applyAuthorStyles"],
 Om:[function(a,b){var z,y,x,w
 if(b==null)return"-"
 z=J.LL(J.vX(b,1000))
@@ -19247,32 +19521,32 @@
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,537,538,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,537,26,[],"formatSeconds"],
+return Z.Ce(y,2)+":"+Z.Ce(x,2)+":"+Z.Ce(w,2)+"."+Z.Ce(z,3)},"call$1","gSs",2,0,556,557,[],"formatTime"],
+Yy:[function(a,b){return J.Ez(b,2)},"call$1","ghY",2,0,556,28,[],"formatSeconds"],
 A5:[function(a,b){var z=J.Wx(b)
 if(z.C(b,1024))return H.d(b)+"B"
 else if(z.C(b,1048576))return""+C.CD.yu(C.CD.UD(z.V(b,1024)))+"KB"
 else if(z.C(b,1073741824))return""+C.CD.yu(C.CD.UD(z.V(b,1048576)))+"MB"
 else if(z.C(b,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(b,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,413,539,[],"formatSize"],
-bj:[function(a,b){var z,y,x
+else return""+C.CD.yu(C.CD.UD(z.V(b,1099511627776)))+"TB"},"call$1","gbJ",2,0,425,558,[],"formatSize"],
+at:[function(a,b){var z,y,x
 z=J.U6(b)
 y=J.UQ(z.t(b,"script"),"user_name")
 x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,540,541,[],"fileAndLine"],
-z4:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,542,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,542,11,[],"isError"],
+return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"call$1","gNh",2,0,559,560,[],"fileAndLine"],
+b1:[function(a,b){return J.de(b,"Null")},"call$1","gXj",2,0,561,11,[],"isNull"],
+i5:[function(a,b){return J.de(b,"Error")},"call$1","gt3",2,0,561,11,[],"isError"],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,542,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,542,11,[],"isBool"],
-KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,542,11,[],"isString"],
-fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,542,11,[],"isInstance"],
-F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,542,11,[],"isClosure"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"call$1","gTB",2,0,561,11,[],"isInt"],
+RU:[function(a,b){return J.de(b,"Bool")},"call$1","gjS",2,0,561,11,[],"isBool"],
+KJ:[function(a,b){return J.de(b,"String")},"call$1","gfI",2,0,561,11,[],"isString"],
+fZ:[function(a,b){return J.de(b,"Instance")},"call$1","gnD",2,0,561,11,[],"isInstance"],
+F6:[function(a,b){return J.de(b,"Closure")},"call$1","gBF",2,0,561,11,[],"isClosure"],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,542,11,[],"isList"],
-Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,542,11,[],"isUnexpected"],
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"call$1","gwc",2,0,561,11,[],"isList"],
+Cn:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Biginit","Bool","String","Closure","Instance","GrowableObjectArray","Array","Error"],b)},"call$1","gaE",2,0,561,11,[],"isUnexpected"],
 "@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+static:{ew:[function(a){var z,y,x,w
 z=$.Nd()
 y=P.Py(null,null,null,J.O,W.I0)
 x=J.O
@@ -19287,8 +19561,8 @@
 for(z=J.Wx(a),y="";x=J.Wx(b),x.D(b,1);){w=x.W(b,1)
 if(typeof w!=="number")H.vh(new P.AT(w))
 if(z.C(a,Math.pow(10,w)))y+="0"
-b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,239,28,[],240,[],"_zeroPad"]}},
-"+ObservatoryElement":[543]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+b=x.W(b,1)}return y+H.d(a)},"call$2","Rz",4,0,242,30,[],243,[],"_zeroPad"]}},
+"+ObservatoryElement":[562]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
@@ -19306,16 +19580,16 @@
 x=H.VM(new P.Yp(z),[T.z2])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"call$0","gDx",0,0,390],
+return!0}return!1},"call$0","gDx",0,0,401],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+ct:[function(a,b,c,d){return F.Wi(a,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 nq:[function(a,b){if(!this.gnz(a))return
 if(a.Lk==null){a.Lk=[]
-P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,27,[]],
+P.rb(this.gDx(a))}a.Lk.push(b)},"call$1","giA",2,0,null,29,[]],
 $isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,T,{
 "^":"",
 z2:{
@@ -19330,7 +19604,7 @@
 "^":"Pi;b9,kK,Sv,rk,YX,B6,AP,Lk",
 kb:function(a){return this.rk.call$1(a)},
 gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",358],
+gP:[function(a){return this.Sv},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 wE:[function(a){var z,y,x,w,v
 if(this.YX)return
@@ -19381,22 +19655,21 @@
 $.tW=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
-if(s!=null){r=s.iE
-s=r==null?s!=null:r!==s}else s=!1
+s=s.iE!==s
 if(s){if(t.BN(0)){if(w)y.push([u,t])
 v=!0}$.tW.push(t)}}}while(z<1000&&v)
 if(w&&v){w=$.iU()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){q=s.lo
-r=J.U6(q)
-w.j2("In last iteration Observable changed at index "+H.d(r.t(q,0))+", object: "+H.d(r.t(q,1))+".")}}$.el=$.tW.length
+for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
+q=J.U6(r)
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
 $.Td=!1},"call$0","D6",0,0,null],
 Ht:[function(){var z={}
 z.a=!1
 z=new O.o5(z)
 return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"call$0","Zq",0,0,null],
 o5:{
-"^":"Tp:544;a",
+"^":"Tp:563;a",
 call$2:[function(a,b){var z=this.a
 if(z.a)return
 z.a=!0
@@ -19418,14 +19691,14 @@
 return this.f.call$0()},"call$0",null,0,0,null,"call"],
 $isEH:true},
 id:{
-"^":"Tp:545;UI",
+"^":"Tp:564;UI",
 call$4:[function(a,b,c,d){if(d==null)return d
 return new O.iV(this.UI,b,c,d)},"call$4",null,8,0,null,168,[],169,[],153,[],117,[],"call"],
 $isEH:true},
 iV:{
 "^":"Tp:112;bK,Gq,Rm,w3",
 call$1:[function(a){this.bK.call$2(this.Gq,this.Rm)
-return this.w3.call$1(a)},"call$1",null,2,0,null,26,[],"call"],
+return this.w3.call$1(a)},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
 f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
@@ -19463,7 +19736,7 @@
 if(typeof n!=="number")return n.g()
 n=P.J(o+1,n+1)
 if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"call$6","cL",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+m[t]=n}}return x},"call$6","cL",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
@@ -19498,10 +19771,10 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,247,[]],
+x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"call$1","fZ",2,0,null,250,[]],
 rB:[function(a,b,c){var z,y,x
 for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"call$3","UF",6,0,null,248,[],249,[],250,[]],
+return c},"call$3","UF",6,0,null,251,[],252,[],253,[]],
 xU:[function(a,b,c){var z,y,x,w,v,u
 z=J.U6(a)
 y=z.gB(a)
@@ -19512,7 +19785,7 @@
 u=z.t(a,y)
 w=J.xH(w,1)
 u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"call$3","M9",6,0,null,248,[],249,[],250,[]],
+if(!u)break;++v}return v},"call$3","M9",6,0,null,251,[],252,[],253,[]],
 jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.Wx(c)
 y=J.Wx(f)
@@ -19562,7 +19835,7 @@
 s=new G.DA(a,y,t,n,0)}J.bi(s.Il,z.t(d,o));++o
 break
 default:}if(s!=null)p.push(s)
-return p},"call$6","mu",12,0,null,241,[],242,[],243,[],244,[],245,[],246,[]],
+return p},"call$6","mu",12,0,null,244,[],245,[],246,[],247,[],248,[],249,[]],
 m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=J.RE(b)
 y=z.gWA(b)
@@ -19581,7 +19854,8 @@
 y=J.WB(z,J.q8(u.ok.G4))
 x=q.jr
 p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
+if(p>=0){if(r>=a.length)H.vh(new P.bJ("value "+r))
+a.splice(r,1)[0];--r
 z=J.xH(q.dM,J.q8(q.ok.G4))
 if(typeof z!=="number")return H.s(z)
 s-=z
@@ -19602,11 +19876,11 @@
 q.jr=J.WB(q.jr,m)
 if(typeof m!=="number")return H.s(m)
 s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,251,[],27,[]],
+t=!0}else t=!1}if(!t)a.push(u)},"call$2","c7",4,0,null,254,[],29,[]],
 xl:[function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"call$2","bN",4,0,null,73,[],252,[]],
+return z},"call$2","bN",4,0,null,73,[],255,[]],
 u2:[function(a,b){var z,y,x,w,v,u
 if(b.length===1)return b
 z=[]
@@ -19616,7 +19890,7 @@
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
 if(!J.de(v,x[u]))z.push(w)
 continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","AH",4,0,null,73,[],252,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,J.q8(w.gRt().G4)))}return z},"call$2","W5",4,0,null,73,[],255,[]],
 DA:{
 "^":"a;WA>,ok,Il<,jr,dM",
 gvH:function(a){return this.jr},
@@ -19629,7 +19903,7 @@
 if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
 z=J.WB(this.jr,this.dM)
 if(typeof z!=="number")return H.s(z)
-return a<z},"call$1","gcW",2,0,null,47,[]],
+return a<z},"call$1","gcW",2,0,null,48,[]],
 bu:[function(a){return"#<ListChangeRecord index: "+H.d(this.jr)+", removed: "+H.d(this.ok)+", addedCount: "+H.d(this.dM)+">"},"call$0","gXo",0,0,null],
 $isDA:true,
 static:{XM:function(a,b,c,d){var z
@@ -19639,79 +19913,19 @@
 z.$builtinTypeInfo=[null]
 return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
 "^":"",
-nd:{
-"^":"a;",
-$isnd:true},
+ndx:{
+"^":"a;"},
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
 Wi:[function(a,b,c,d){var z=J.RE(a)
 if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"call$4","T7",8,0,null,98,[],253,[],229,[],230,[]],
+return d},"call$4","T7",8,0,null,98,[],256,[],229,[],230,[]],
 d3:{
 "^":"a;",
-gUj:function(a){var z=this.R9
-if(z==null){z=this.gFW()
-z=P.bK(this.gkk(),z,!0,null)
-this.R9=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ci:[function(){var z,y,x,w,v,u,t,s,r
-z=$.tW
-if(z==null){z=H.VM([],[F.d3])
-$.tW=z}z.push(this)
-$.el=$.el+1
-y=H.vn(this)
-x=P.L5(null,null,null,P.wv,P.a)
-for(w=H.jO(J.bB(y.Ax).LU);!J.de(w,$.aA());w=w.gAY()){z=w.gYK().nb
-z=z.gUQ(z)
-v=new H.MH(null,J.GP(z.l6),z.T6)
-v.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;v.G();){u=v.lo
-z=J.RE(u)
-if(typeof u!=="object"||u===null||!z.$isRY||z.gV5(u)||u.gFo()||u.gq4())continue
-for(z=J.GP(u.gc9());z.G();){t=z.lo.gAx()
-s=J.x(t)
-if(typeof t==="object"&&t!==null&&!!s.$isnd){r=u.gIf()
-x.u(0,r,y.rN(r).gAx())
-break}}}}this.wv=y
-this.V2=x},"call$0","gFW",0,0,114],
-B0:[function(){if(this.V2!=null){this.wv=null
-this.V2=null}},"call$0","gkk",0,0,114],
-BN:[function(a){var z,y,x,w
-z={}
-y=this.V2
-if(y!=null){x=this.R9
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-x=!x}else x=!0
-if(x)return!1
-z.a=this.me
-this.me=null
-y.aN(0,new F.lS(z,this))
-z=z.a
-if(z==null)return!1
-y=this.R9
-z=H.VM(new P.Yp(z),[T.z2])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},"call$0","gDx",0,0,null],
-ct:[function(a,b,c,d){return F.Wi(this,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
-nq:[function(a,b){var z,y
-z=this.R9
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-z=this.me
-if(z==null){z=[]
-this.me=z}z.push(b)},"call$1","giA",2,0,null,27,[]],
 $isd3:true},
 lS:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x,w,v
 z=this.b
 y=z.wv.rN(a).gAx()
@@ -19726,9 +19940,9 @@
 "^":"",
 xh:{
 "^":"Pi;L1,AP,Lk",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",358],
+gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",358],
+sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},230,[],"value",368],
 bu:[function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"},"call$0","gXo",0,0,null]}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
@@ -19737,7 +19951,7 @@
 if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
 this.xg=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.h3.length},null,null,1,0,512,"length",358],
+gB:[function(a){return this.h3.length},null,null,1,0,536,"length",368],
 sB:[function(a,b){var z,y,x,w,v,u
 z=this.h3
 y=z.length
@@ -19765,10 +19979,10 @@
 u=[]
 w=new P.Yp(u)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,411,28,[],"length",358],
+this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,423,30,[],"length",368],
 t:[function(a,b){var z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},52,[],"[]",358],
+return z[b]},"call$1","gIA",2,0,function(){return H.IG(function(a){return{func:"dG",ret:a,args:[J.im]}},this.$receiver,"wn")},15,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w
 z=this.h3
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -19780,9 +19994,19 @@
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},52,[],28,[],"[]=",358],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,390,"isEmpty",358],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,390,"isNotEmpty",358],
+z[b]=c},"call$2","gj3",4,0,function(){return H.IG(function(a){return{func:"UR",void:true,args:[J.im,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",368],
+gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,401,"isEmpty",368],
+gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,401,"isNotEmpty",368],
+Mh:[function(a,b,c){var z,y,x
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.xg
+if(z!=null){x=z.iE
+z=x==null?z!=null:x!==z}else z=!1
+if(z&&J.z8(y,0)){z=this.h3
+H.K0(z,b,y)
+this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.h3,b,c)},"call$2","ghV",4,0,null,15,[],116,[]],
 h:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19791,7 +20015,7 @@
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
 if(x)this.iH(G.XM(this,y,1,null))
-C.Nm.h(z,b)},"call$1","ght",2,0,null,28,[]],
+C.Nm.h(z,b)},"call$1","ght",2,0,null,30,[]],
 FV:[function(a,b){var z,y,x,w
 z=this.h3
 y=z.length
@@ -19808,7 +20032,7 @@
 UZ:[function(a,b,c){var z,y,x,w,v,u,t
 z=b>=0
 if(!z||b>this.h3.length)H.vh(P.TE(b,0,this.h3.length))
-y=c>=b
+y=!(c<b)
 if(!y||c>this.h3.length)H.vh(P.TE(c,b,this.h3.length))
 x=c-b
 w=this.h3
@@ -19827,14 +20051,31 @@
 z=new H.nH(w,b,c)
 z.$builtinTypeInfo=[null]
 if(b<0)H.vh(new P.bJ("value "+b))
-if(c<0)H.vh(new P.bJ("value "+c))
+if(c<0)H.vh(new P.bJ("value "+H.d(c)))
 if(b>c)H.vh(P.TE(b,0,c))
 z=z.br(0)
 y=new P.Yp(z)
 y.$builtinTypeInfo=[null]
 this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},"call$2","gYH",4,0,null,123,[],124,[]],
-xe:[function(a,b,c){var z,y,x
+oF:[function(a,b,c){var z,y,x,w
 if(b<0||b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
+z=J.x(c)
+if(!z.$isList&&!z.$isz5)c=z.br(c)
+y=J.q8(c)
+z=this.h3
+x=z.length
+if(typeof y!=="number")return H.s(y)
+C.Nm.sB(z,x+y)
+w=z.length
+H.qG(z,b+y,w,this,b)
+H.ed(z,b,c)
+this.nU(x,z.length)
+z=this.xg
+if(z!=null){w=z.iE
+z=w==null?z!=null:w!==z}else z=!1
+if(z&&y>0)this.iH(G.XM(this,b,y,null))},"call$2","gFD",4,0,null,15,[],116,[]],
+xe:[function(a,b,c){var z,y,x
+if(b>this.h3.length)throw H.b(P.TE(b,0,this.h3.length))
 z=this.h3
 y=z.length
 if(b===y){this.h(0,c)
@@ -19847,27 +20088,21 @@
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
 if(y)this.iH(G.XM(this,b,1,null))
-if(b<0||b>=z.length)return H.e(z,b)
-z[b]=c},"call$2","gQG",4,0,null,52,[],132,[]],
-KI:[function(a,b){var z,y
-z=this.h3
-if(b<0||b>=z.length)return H.e(z,b)
-y=z[b]
-this.UZ(0,b,b+1)
-return y},"call$1","gNM",2,0,null,52,[]],
+if(b>=z.length)return H.e(z,b)
+z[b]=c},"call$2","gQG",4,0,null,15,[],132,[]],
 iH:[function(a){var z,y
 z=this.xg
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)return
 if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,27,[]],
+P.rb(this.gL6())}this.b3.push(a)},"call$1","gSi",2,0,null,29,[]],
 nU:[function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
 y=J.x(b)
 this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gNQ",4,0,null,229,[],230,[]],
+this.ct(this,C.nZ,!z,!y.n(b,0))},"call$2","gdX",4,0,null,229,[],230,[]],
 oC:[function(){var z,y,x
 z=this.b3
 if(z==null)return!1
@@ -19879,7 +20114,7 @@
 if(x){x=H.VM(new P.Yp(y),[G.DA])
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(x)
-return!0}return!1},"call$0","gL6",0,0,390],
+return!0}return!1},"call$0","gL6",0,0,401],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
 return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
@@ -19901,18 +20136,18 @@
 qC:{
 "^":"Pi;Zp,AP,Lk",
 gvc:[function(a){var z=this.Zp
-return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",358],
+return z.gvc(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dt",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",368],
 gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"wa",ret:[P.QV,b]}},this.$receiver,"qC")},"values",358],
+return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,b]}},this.$receiver,"qC")},"values",368],
 gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,512,"length",358],
+return z.gB(z)},null,null,1,0,536,"length",368],
 gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,390,"isEmpty",358],
+return z.gB(z)===0},null,null,1,0,401,"isEmpty",368],
 gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,390,"isNotEmpty",358],
-di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,546,28,[],"containsValue",358],
-x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,546,47,[],"containsKey",358],
-t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},47,[],"[]",358],
+return z.gB(z)!==0},null,null,1,0,401,"isNotEmpty",368],
+di:[function(a){return this.Zp.di(a)},"call$1","gmc",2,0,565,30,[],"containsValue",368],
+x4:[function(a){return this.Zp.x4(a)},"call$1","gV9",2,0,565,48,[],"containsKey",368],
+t:[function(a,b){return this.Zp.t(0,b)},"call$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},48,[],"[]",368],
 u:[function(a,b,c){var z,y,x,w,v
 z=this.Zp
 y=z.gB(z)
@@ -19923,7 +20158,7 @@
 w=v==null?w!=null:v!==w}else w=!1
 if(w){z=z.gB(z)
 if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},47,[],28,[],"[]=",358],
+this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"call$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"LF",void:true,args:[a,b]}},this.$receiver,"qC")},48,[],30,[],"[]=",368],
 FV:[function(a,b){J.kH(b,new V.zT(this))},"call$1","gDY",2,0,null,109,[]],
 Rz:[function(a,b){var z,y,x,w,v
 z=this.Zp
@@ -19933,7 +20168,7 @@
 if(w!=null){v=w.iE
 w=v==null?w!=null:v!==w}else w=!1
 if(w&&y!==z.gB(z)){this.nq(this,H.VM(new V.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,47,[]],
+F.Wi(this,C.Wn,y,z.gB(z))}return x},"call$1","guH",2,0,null,48,[]],
 V1:[function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -19950,76 +20185,61 @@
 z.FV(0,a)
 return z},Bq:function(a,b,c){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=typeof a==="object"&&a!==null&&!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
+if(!!z.$isBa)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
 return y}}},
 zT:{
 "^":"Tp;a",
-call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,47,[],28,[],"call"],
+call$2:[function(a,b){this.a.u(0,a,b)},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,47,[],28,[],"call"],
+z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"call$2",null,4,0,null,48,[],30,[],"call"],
 $isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
 "^":"",
 Wa:[function(a,b){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqI)return J.de(a.oc,b)
-if(typeof a==="object"&&a!==null&&!!z.$isHA){z=J.RE(b)
-if(typeof b==="object"&&b!==null&&!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"call$2","mD",4,0,null,27,[],47,[]],
-yf:[function(a,b){var z,y,x,w,v
+if(!!z.$isqI)return J.de(a.oc,b)
+if(!!z.$isHA){z=J.x(b)
+if(!!z.$iswv)b=z.gfN(b)
+return J.de(a.G3,b)}return!1},"call$2","Uv",4,0,null,29,[],48,[]],
+yf:[function(a,b){var z,y,x,w
 if(a==null)return
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.TH(y,b)){x=z.rN(b).gAx()
 return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't get "+H.d(b)+" in "+H.d(a))
 return},"call$2","MT",4,0,null,6,[],71,[]],
-h6:[function(a,b,c){var z,y,x,w,v
+h6:[function(a,b,c){var z,y,x,w
 if(a==null)return!1
 x=b
-if(typeof x==="number"&&Math.floor(x)===x){x=a
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&(x.constructor===Array||!!w.$isList)&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else{x=b
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$iswv){z=H.vn(a)
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
 y=H.jO(J.bB(z.gAx()).LU)
 try{if(L.dR(y,b)){z.PU(b,c)
 return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(v){x=H.Ru(v)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$ismp){if(!L.M6(y,C.OV))throw v}else throw v}}}x=$.aT()
+return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
 if(x.Im(C.VZ))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"call$3","nV",6,0,null,6,[],71,[],28,[]],
+return!1},"call$3","nV",6,0,null,6,[],71,[],30,[]],
 TH:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb
 if(z.x4(b))return!0
 if(z.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y,x,w
+dR:[function(a,b){var z,y
 z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
 for(;!J.de(a,$.aA());){y=a.gYK().nb
-x=y.t(0,b)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isRY)return!0
+if(!!J.x(y.t(0,b)).$isRY)return!0
 if(y.x4(z))return!0
 if(y.x4(C.OV))return!0
 a=L.pY(a)}return!1},"call$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z,y
+M6:[function(a,b){var z
 for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.guU())return!0
+if(!!J.x(z).$isRS&&z.guU())return!0
 a=L.pY(a)}return!1},"call$2","Wt",4,0,null,11,[],12,[]],
 pY:[function(a){var z,y
 try{z=a.gAY()
@@ -20042,7 +20262,7 @@
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",358],
+return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:[function(a,b){var z,y,x,w
 z=this.BK
@@ -20059,7 +20279,7 @@
 if(w>=z.length)return H.e(z,w)
 if(L.h6(x,z[w],b)){z=this.kN
 if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,471,230,[],"value",358],
+z[y]=b}},null,null,3,0,483,230,[],"value",368],
 k0:[function(a){O.Pi.prototype.k0.call(this,this)
 this.ov()
 this.XI()},"call$0","gqw",0,0,114],
@@ -20084,7 +20304,7 @@
 if(w===y&&x)u=this.E4(u)
 v=this.kN;++w
 if(w>=v.length)return H.e(v,w)
-v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gFD",0,3,null,82,124,[]],
+v[w]=u}},function(){return this.Zy(null)},"ov","call$1$end",null,"gPE",0,3,null,82,124,[]],
 hd:[function(a){var z,y,x,w,v,u,t,s,r
 for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
 s=w+1
@@ -20102,7 +20322,7 @@
 t[s]=u}this.ij(a)
 if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}},"call$1$start","gHi",0,3,null,332,123,[]],
+this.nq(this,z)}},"call$1$start","gHi",0,3,null,342,123,[]],
 Rl:[function(a,b){var z,y
 if(b==null)b=this.BK.length
 if(typeof b!=="number")return H.s(b)
@@ -20111,7 +20331,7 @@
 if(z>=y.length)return H.e(y,z)
 y=y[z]
 if(y!=null)y.ed()
-this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,332,82,123,[],124,[]],
+this.Kh(z)}},function(){return this.Rl(0,null)},"XI",function(a){return this.Rl(a,null)},"ij","call$2",null,null,"gmi",0,4,null,342,82,123,[],124,[]],
 Kh:[function(a){var z,y,x,w,v
 z=this.kN
 if(a>=z.length)return H.e(z,a)
@@ -20119,23 +20339,22 @@
 z=this.BK
 if(a>=z.length)return H.e(z,a)
 x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){z=J.x(y)
-if(typeof y==="object"&&y!==null&&!!z.$iswn){z=this.cs
+if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
 w=y.gvp().w4(!1)
 v=w.Lj
 w.dB=v.cR(new L.Px(this,a,x))
 w.o7=P.VH(P.AY(),v)
 w.Bd=v.Al(P.v3())
 if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!z.$isd3){v=this.cs
+z[a]=w}}else{z=J.x(y)
+if(!!z.$isd3){v=this.cs
 w=z.gUj(y).w4(!1)
 z=w.Lj
 w.dB=z.cR(new L.C4(this,a,x))
 w.o7=P.VH(P.AY(),z)
 w.Bd=z.Al(P.v3())
 if(a>=v.length)return H.e(v,a)
-v[a]=w}}},"call$1","gzm",2,0,null,409,[]],
+v[a]=w}}},"call$1","gzm",2,0,null,421,[]],
 d4:function(a,b,c){var z,y,x,w
 if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
 if(J.de(x,""))continue
@@ -20156,16 +20375,16 @@
 call$1:[function(a){return},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 Px:{
-"^":"Tp:547;a,b,c",
+"^":"Tp:566;a,b,c",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 C4:{
-"^":"Tp:548;d,e,f",
+"^":"Tp:567;d,e,f",
 call$1:[function(a){var z,y
 for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"call$1",null,2,0,null,252,[],"call"],
+return}},"call$1",null,2,0,null,255,[],"call"],
 $isEH:true},
 Md:{
 "^":"Tp:115;",
@@ -20174,16 +20393,16 @@
 "^":"",
 Jk:[function(a){var z,y,x
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isd3)return a
-if(typeof a==="object"&&a!==null&&!!z.$isZ0){y=V.Bq(a,null,null)
+if(!!z.$isd3)return a
+if(!!z.$isZ0){y=V.Bq(a,null,null)
 z.aN(a,new R.km(y))
-return y}if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)){z=z.ez(a,R.np())
+return y}if(!!z.$isQV){z=z.ez(a,R.np())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"call$1","np",2,0,112,28,[]],
+return x}return a},"call$1","np",2,0,112,30,[]],
 km:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
 JX:[function(){var z,y
@@ -20199,29 +20418,26 @@
 yV:[function(a){var z,y
 z=$.xY().Rz(0,a)
 if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"call$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w,v,u
+oF:[function(a,b){var z,y,x,w
 if(J.de(a,$.H8()))return b
 b=A.oF(a.gAY(),b)
 for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
 if(y.gFo()||y.gq4())continue
-x=J.RE(y)
-if(!(typeof y==="object"&&y!==null&&!!x.$isRY&&!x.gV5(y)))w=typeof y==="object"&&y!==null&&!!x.$isRS&&y.glT()
+x=J.x(y)
+if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
 else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();){v=w.lo.gAx()
-u=J.x(v)
-if(typeof v==="object"&&v!==null&&!!u.$isyL){if(typeof y!=="object"||y===null||!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
-b.u(0,y.gIf(),y)}break}}}return b},"call$2","Cd",4,0,null,254,[],255,[]],
+if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=H.B7([],P.L5(null,null,null,null,null))
+b.u(0,y.gIf(),y)}break}}return b},"call$2","Cd",4,0,null,257,[],258,[]],
 Oy:[function(a,b){var z,y
 do{z=a.gYK().nb.t(0,b)
 y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS&&z.glT()&&A.bc(a,z)||typeof z==="object"&&z!==null&&!!y.$isRY)return z
+if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
 a=a.gAY()}while(!J.de(a,$.H8()))
-return},"call$2","il",4,0,null,254,[],71,[]],
+return},"call$2","il",4,0,null,257,[],71,[]],
 bc:[function(a,b){var z,y
 z=H.u1(H.d(b.gIf().fN)+"=")
 y=a.gYK().nb.t(0,new H.GD(z))
-z=J.x(y)
-return typeof y==="object"&&y!==null&&!!z.$isRS&&y.ghB()},"call$2","i8",4,0,null,254,[],256,[]],
+return!!J.x(y).$isRS&&y.ghB()},"call$2","i8",4,0,null,257,[],259,[]],
 YG:[function(a,b,c){var z,y,x
 z=$.cM()
 if(z==null||a==null)return
@@ -20230,8 +20446,8 @@
 if(y==null)return
 x=J.UQ(y,"ShadowCSS")
 if(x==null)return
-x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,257,[],12,[],258,[]],
-Hl:[function(a){var z,y,x,w,v,u,t
+x.V7("shimStyling",[a,b,c])},"call$3","OA",6,0,null,260,[],12,[],261,[]],
+Hl:[function(a){var z,y,x,w,v,u
 if(a==null)return""
 w=J.RE(a)
 z=w.gmH(a)
@@ -20246,36 +20462,34 @@
 w.send()
 w=w.responseText
 return w}catch(u){w=H.Ru(u)
-t=J.x(w)
-if(typeof w==="object"&&w!==null&&!!t.$isNh){y=w
+if(!!J.x(w).$isNh){y=w
 x=new H.XO(u,null)
 $.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"call$1","NI",2,0,null,259,[]],
+return""}else throw u}},"call$1","NI",2,0,null,262,[]],
 Ad:[function(a,b){var z
 if(b==null)b=C.hG
 $.Ej().u(0,a,b)
 z=$.p2().Rz(0,a)
 if(z!=null)J.Or(z)},"call$2","ZK",2,2,null,82,12,[],11,[]],
-xv:[function(a){A.om(a,new A.Mq())},"call$1","J2",2,0,null,260,[]],
-om:[function(a,b){var z
+xv:[function(a){A.pb(a,new A.Mq())},"call$1","J2",2,0,null,263,[]],
+pb:[function(a,b){var z
 if(a==null)return
 b.call$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.om(z,b)},"call$2","Wm",4,0,null,260,[],155,[]],
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"call$2","e0",4,0,null,263,[],155,[]],
 lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.call$3(a,b,c)
-return new A.L6(a,b)},"call$4","y4",8,0,null,261,[],12,[],260,[],262,[]],
+return new A.L6(a,b)},"call$4","y4",8,0,null,264,[],12,[],263,[],265,[]],
 z9:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"call$1","DI",2,0,null,260,[]],
+return $.od().t(0,a)},"call$1","DI",2,0,null,263,[]],
 HR:[function(a,b,c){var z,y,x
 z=H.vn(a)
 y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
 if(y!=null){x=y.gMP()
 x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,46,[],263,[],17,[]],
-Rk:[function(a,b){var z,y
+C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"call$3","xi",6,0,null,47,[],266,[],19,[]],
+Rk:[function(a,b){var z
 do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isRS)return z
+if(!!J.x(z).$isRS)return z
 a=a.gAY()}while(a!=null)},"call$2","Uy",4,0,null,11,[],12,[]],
 ZI:[function(a,b){var z,y
 if(a==null)return
@@ -20283,25 +20497,23 @@
 J.c9(z,J.nJ(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"call$2","tO",4,0,null,264,[],265,[]],
+b.appendChild(z)},"call$2","tO",4,0,null,267,[],268,[]],
 pX:[function(){var z=window
 C.ol.hr(z)
 C.ol.oB(z,W.aF(new A.hm()))},"call$0","ji",0,0,null],
 al:[function(a,b){var z,y,x
-z=J.RE(b)
-y=typeof b==="object"&&b!==null&&!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
+z=J.x(b)
+y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
 if(J.de(y.gUx(),C.PU)||J.de(y.gUx(),C.nN))if(a!=null){x=A.h5(a)
 if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","mN",4,0,null,28,[],71,[]],
-h5:[function(a){var z
-if(a==null)return C.Qf
+return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"call$2","bP",4,0,null,30,[],71,[]],
+h5:[function(a){if(a==null)return C.Qf
 if(typeof a==="number"&&Math.floor(a)===a)return C.yw
 if(typeof a==="number")return C.O4
 if(typeof a==="boolean")return C.HL
 if(typeof a==="string")return C.Db
-z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isiP)return C.Yc
-return},"call$1","v9",2,0,null,28,[]],
+if(!!J.x(a).$isiP)return C.Yc
+return},"call$1","v9",2,0,null,30,[]],
 Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
 z.Gr(A.PB())
 return z}A.ei()
@@ -20333,14 +20545,14 @@
 return d}if(c.tg(0,a))return d
 c.h(c,a)
 for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(typeof w==="object"&&w!==null&&!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
+v=J.x(w)
+if(!!v.$isQj)A.GA(w.import,w.href,c,d)
+else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
 d.push(u===""?b:u)
 x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
 v=$.oK
 if(v==null)H.qw(z)
-else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,266,[],267,[],268,[],269,[]],
+else v.call$1(z)}}return d},"call$4","fE",4,4,null,82,82,269,[],270,[],271,[],272,[]],
 pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=$.RQ()
 z.toString
@@ -20392,12 +20604,11 @@
 y.$builtinTypeInfo=[H.Kp(r,0)]
 for(;y.G();){l=z.gl()
 for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-q=J.x(k)
-if(typeof k==="object"&&k!==null&&!!q.$isV3){q=k.ns
+if(!!J.x(k).$isV3){q=k.ns
 j=l.gYj()
 $.Ej().u(0,q,j)
 i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,270,[]],
+if(i!=null)J.Or(i)}}}},"call$1","Xz",2,0,null,273,[]],
 ZB:[function(a,b){var z,y,x
 for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
 break}if(!y)return
@@ -20421,11 +20632,10 @@
 gt5:function(a){return a.zx},
 gP1:function(a){return a.aa},
 goc:function(a){return a.RT},
-gZf:function(a){var z,y,x
+gZf:function(a){var z,y
 z=a.querySelector("template")
-if(z!=null){y=J.x(z)
-x=J.nX(typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z))
-y=x}else y=null
+if(z!=null)y=J.nX(!!J.x(z).$isTU?z:M.Ky(z))
+else y=null
 return y},
 yx:[function(a){var z,y,x,w,v
 if(this.y0(a,a.RT))return
@@ -20452,17 +20662,15 @@
 A.YG(this.gZf(a),y,z)
 w=P.re(a.zx)
 v=w.gYK().nb.t(0,C.c8)
-if(v!=null){x=J.x(v)
-x=typeof v==="object"&&v!==null&&!!x.$isRS&&v.gFo()&&v.guU()}else x=!1
-if(x)w.CI(C.c8,[a])
+if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
 this.Ba(a,y)
 A.yV(a.RT)},"call$0","gGy",0,0,null],
 y0:[function(a,b){if($.Ej().t(0,b)!=null)return!1
 $.p2().u(0,b,a)
 if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},"call$1","gXX",2,0,null,12,[]],
+return!0},"call$1","gox0",2,0,null,12,[]],
 PM:[function(a,b){if(b!=null&&J.UU(b,"-")>=0)if(!$.cd().x4(b)){J.bi($.xY().to(b,new A.q6()),a)
-return!0}return!1},"call$1","gmL",2,0,null,258,[]],
+return!0}return!1},"call$1","gmL",2,0,null,261,[]],
 Ba:[function(a,b){var z,y,x,w
 for(z=a,y=null;z!=null;){x=J.RE(z)
 y=x.gQg(z).MW.getAttribute("extends")
@@ -20490,14 +20698,14 @@
 if(typeof console!="undefined")console.warn(t)
 continue}y=a.Q7
 if(y==null){y=H.B7([],P.L5(null,null,null,null,null))
-a.Q7=y}y.u(0,v,u)}}},"call$2","gvQ",4,0,null,254,[],549,[]],
+a.Q7=y}y.u(0,v,u)}}},"call$2","ga2",4,0,null,257,[],568,[]],
 Vk:[function(a){var z,y
 z=P.L5(null,null,null,J.O,P.a)
 a.xX=z
 y=a.aa
 if(y!=null)z.FV(0,J.Ng(y))
 new W.i7(a).aN(0,new A.CK(a))},"call$0","gYi",0,0,null],
-W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,550,[]],
+W3:[function(a,b){new W.i7(a).aN(0,new A.LJ(b))},"call$1","gSX",2,0,null,569,[]],
 Mi:[function(a){var z=this.Hs(a,"[rel=stylesheet]")
 a.cI=z
 for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},"call$0","gax",0,0,null],
@@ -20523,7 +20731,7 @@
 y=z.br(z)
 x=this.gZf(a)
 if(x!=null)C.Nm.FV(y,J.pe(x,b))
-return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gKQ",2,2,null,82,477,[],551,[]],
+return y},function(a,b){return this.oP(a,b,null)},"Hs","call$2",null,"gIG",2,2,null,82,489,[],570,[]],
 kO:[function(a,b){var z,y,x,w,v,u
 z=P.p9("")
 y=new A.Oc("[polymer-scope="+b+"]")
@@ -20534,27 +20742,26 @@
 z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
 w=z.vM+w
 z.vM=w
-z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,552,[]],
+z.vM=w+"\n\n"}return z.vM},"call$1","gvf",2,0,null,571,[]],
 J3:[function(a,b,c){var z
 if(b==="")return
 z=document.createElement("style",null)
 J.c9(z,b)
 z.setAttribute("element",H.d(a.RT)+"-"+c)
-return z},"call$2","gNG",4,0,null,553,[],552,[]],
+return z},"call$2","gye",4,0,null,572,[],571,[]],
 q1:[function(a,b){var z,y,x,w
 if(J.de(b,$.H8()))return
 this.q1(a,b.gAY())
 for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-x=J.x(y)
-if(typeof y!=="object"||y===null||!x.$isRS||y.gFo()||!y.guU())continue
-w=y.gIf().fN
-x=J.rY(w)
-if(x.Tc(w,"Changed")&&!x.n(w,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-w=x.Nj(w,0,J.xH(x.gB(w),7))
-a.hf.u(0,new H.GD(H.u1(w)),y.gIf())}}},"call$1","gHv",2,0,null,254,[]],
+if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
+x=y.gIf().fN
+w=J.rY(x)
+if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
+x=w.Nj(x,0,J.xH(w.gB(x),7))
+a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},"call$1","gHv",2,0,null,257,[]],
 qC:[function(a,b){var z=P.L5(null,null,null,J.O,null)
 b.aN(0,new A.MX(z))
-return z},"call$1","gir",2,0,null,554,[]],
+return z},"call$1","gir",2,0,null,573,[]],
 du:function(a){a.RT=a.getAttribute("name")
 this.yx(a)},
 $isXP:true,
@@ -20567,16 +20774,16 @@
 call$0:[function(){return[]},"call$0",null,0,0,null,"call"],
 $isEH:true},
 CK:{
-"^":"Tp:348;a",
-call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 LJ:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],28,[],"call"],
+if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 ZG:{
 "^":"Tp:112;",
@@ -20587,8 +20794,8 @@
 call$1:[function(a){return J.RF(a,this.a)},"call$1",null,2,0,null,91,[],"call"],
 $isEH:true},
 MX:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],28,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 w12:{
 "^":"Tp:115;",
@@ -20597,14 +20804,14 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 r3y:{
-"^":"Tp:348;a",
-call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,555,[],556,[],"call"],
+"^":"Tp:358;a",
+call$2:[function(a,b){this.a.u(0,b,a)},"call$2",null,4,0,null,574,[],575,[],"call"],
 $isEH:true},
 yL:{
-"^":"nd;",
+"^":"ndx;",
 $isyL:true},
 zs:{
-"^":["a;KM:X0=-375",function(){return[C.Nw]}],
+"^":["a;KM:X0=-385",function(){return[C.Nw]}],
 gpQ:function(a){return!1},
 Pa:[function(a){if(W.Pv(this.gM0(a).defaultView)!=null||$.Bh>0)this.Ec(a)},"call$0","gu1",0,0,null],
 Ec:[function(a){var z,y
@@ -20622,26 +20829,24 @@
 this.BT(a,!0)},"call$0","gQd",0,0,null],
 xo:[function(a){this.x3(a)},"call$0","gbt",0,0,null],
 z2:[function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},"call$1","gET",2,0,null,557,[]],
-d0:[function(a,b){var z,y,x,w,v
+this.d0(a,b)}},"call$1","gET",2,0,null,576,[]],
+d0:[function(a,b){var z,y,x,w
 z=J.RE(b)
 y=z.Ja(b,"template")
 if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
 x=null}else x=this.Tp(a,y)
 else x=null
-w=J.x(x)
-if(typeof x!=="object"||x===null||!w.$isI0)return
-v=z.gQg(b).MW.getAttribute("name")
-if(v==null)return
-a.B7.u(0,v,x)},"call$1","gEB",2,0,null,558,[]],
+if(!J.x(x).$isI0)return
+w=z.gQg(b).MW.getAttribute("name")
+if(w==null)return
+a.B7.u(0,w,x)},"call$1","gEB",2,0,null,577,[]],
 Se:[function(a,b){var z,y
 if(b==null)return
-z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$isTU?b:M.Ky(b)
+z=!!J.x(b).$isTU?b:M.Ky(b)
 y=z.ZK(a,a.SO)
 this.jx(a,y)
 this.lj(a,a)
-return y},"call$1","gAt",2,0,null,257,[]],
+return y},"call$1","gAt",2,0,null,260,[]],
 Tp:[function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
@@ -20649,14 +20854,13 @@
 $.od().u(0,z,a)
 z.applyAuthorStyles=this.gpQ(a)
 z.resetStyleInheritance=!1
-y=J.x(b)
-y=typeof b==="object"&&b!==null&&!!y.$isTU?b:M.Ky(b)
+y=!!J.x(b).$isTU?b:M.Ky(b)
 z.appendChild(y.ZK(a,a.SO))
 this.lj(a,z)
-return z},"call$1","gQb",2,0,null,257,[]],
+return z},"call$1","gCS",2,0,null,260,[]],
 lj:[function(a,b){var z,y,x,w
 for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,559,[]],
+x.u(y,J.F8(w),w)}},"call$1","gb7",2,0,null,382,[]],
 aC:[function(a,b,c,d){var z=J.x(b)
 if(!z.n(b,"class")&&!z.n(b,"style"))this.D3(a,b,d)},"call$3","gxR",6,0,null,12,[],229,[],230,[]],
 Z2:[function(a){J.Ng(a.dZ).aN(0,new A.WC(a))},"call$0","gGN",0,0,null],
@@ -20669,14 +20873,14 @@
 y=H.vn(a)
 x=y.rN(z.gIf()).gAx()
 w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,560,12,[],28,[]],
+if(w==null?x!=null:w!==x)y.PU(z.gIf(),w)},"call$2","ghW",4,0,578,12,[],30,[]],
 B2:[function(a,b){var z=J.ak(a.dZ)
 if(z==null)return
 return z.t(0,b)},"call$1","gHf",2,0,null,12,[]],
 TW:[function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
 else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
-return},"call$1","gt4",2,0,null,28,[]],
+return},"call$1","gt4",2,0,null,30,[]],
 Id:[function(a,b){var z,y
 z=H.vn(a).rN(b).gAx()
 y=this.TW(a,z)
@@ -20700,7 +20904,7 @@
 t.bw(a,y,c,d)
 this.Id(a,z.gIf())
 J.kW(J.QE(M.Ky(a)),b,t)
-return t}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+return t}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 gCd:function(a){return J.QE(M.Ky(a))},
 Ih:[function(a,b){return J.MV(M.Ky(a),b)},"call$1","gC8",2,0,null,12,[]],
 x3:[function(a){var z,y
@@ -20728,31 +20932,28 @@
 z=a.oq
 if(z!=null){z.TP(0)
 a.oq=null}if(b===!0)return
-A.om(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,561,[]],
+A.pb(this.gIW(a),new A.TV())},function(a){return this.BT(a,null)},"oW","call$1$preventCascade",null,"gF7",0,3,null,82,579,[]],
 Xl:[function(a){var z,y,x,w,v,u
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=z==null
 if(!x)for(z.toString,w=H.VM(new P.i5(z),[H.Kp(z,0)]),v=w.Fb,w=H.VM(new P.N6(v,v.zN,null,null),[H.Kp(w,0)]),w.zq=w.Fb.H9;w.G();){u=w.fD
 this.rJ(a,u,H.vn(a).rN(u),null)}if(!x||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},"call$0","gJx",0,0,null],
-Pv:[function(a,b){var z,y,x,w,v,u
+Pv:[function(a,b){var z,y,x,w,v
 z=J.xR(a.dZ)
 y=J.YP(a.dZ)
 x=P.L5(null,null,null,P.wv,A.bS)
 for(w=J.GP(b);w.G();){v=w.gl()
-u=J.x(v)
-if(typeof v!=="object"||v===null||!u.$isqI)continue
-J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,562,563,[]],
+if(!J.x(v).$isqI)continue
+J.iG(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"call$1","gnu",2,0,580,581,[]],
 rJ:[function(a,b,c,d){var z,y,x,w,v
 z=J.xR(a.dZ)
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-x=J.x(d)
-if(typeof d==="object"&&d!==null&&!!x.$iswn){x=$.a3()
+if(!!J.x(d).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$iswn){x=$.a3()
+this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
 if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
 w=c.gvp().w4(!1)
 x=w.Lj
@@ -20762,7 +20963,7 @@
 x=H.d(J.GL(b))+"__array"
 v=a.Sa
 if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],28,[],244,[]],
+a.Sa=v}v.u(0,x,w)}},"call$3","gDW",6,0,null,12,[],30,[],247,[]],
 l5:[function(a,b){var z=a.Sa.Rz(0,b)
 if(z==null)return!1
 z.ed()
@@ -20786,7 +20987,7 @@
 t=new W.Ov(0,w.uv,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
 w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,260,[],564,[],295,[]],
+if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},"call$3","gPm",6,0,null,263,[],582,[],304,[]],
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
@@ -20798,28 +20999,26 @@
 u=J.UQ($.QX(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+H.d(t)+"]")
-this.ea(a,a,t,[b,typeof b==="object"&&b!==null&&!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,565,368,[]],
-ea:[function(a,b,c,d){var z,y,x
+this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"call$1","gD4",2,0,583,378,[]],
+ea:[function(a,b,c,d){var z,y
 z=$.SS()
 y=z.Im(C.R5)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-x=J.x(c)
-if(typeof c==="object"&&c!==null&&!!x.$isEH)H.Ek(c,d,P.Te(null))
+if(!!J.x(c).$isEH)H.Ek(c,d,P.Te(null))
 else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
 else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],566,[],17,[]],
+if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},"call$3","gEi",6,0,null,6,[],584,[],19,[]],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 WC:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).call$0())
-z.t(0,a)},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.t(0,a)},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 Xi:{
 "^":"Tp:115;b",
@@ -20827,20 +21026,19 @@
 $isEH:true},
 TV:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
+call$1:[function(a){var z=J.x(a)
+if(!!z.$iszs)z.oW(a)},"call$1",null,2,0,null,198,[],"call"],
 $isEH:true},
 Mq:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return J.AA(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a))},"call$1",null,2,0,null,260,[],"call"],
+call$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"call$1",null,2,0,null,263,[],"call"],
 $isEH:true},
 Oa:{
 "^":"Tp:115;a",
 call$0:[function(){return new A.bS(this.a.jL,null)},"call$0",null,0,0,null,"call"],
 $isEH:true},
 n1:{
-"^":"Tp:348;b,c,d,e",
+"^":"Tp:358;b,c,d,e",
 call$2:[function(a,b){var z,y,x
 z=this.e
 if(z!=null&&z.x4(a))J.Jr(this.b,a)
@@ -20850,14 +21048,14 @@
 if(y!=null){z=this.b
 x=J.RE(b)
 J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],567,[],"call"],
+A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"call$2",null,4,0,null,12,[],585,[],"call"],
 $isEH:true},
 xf:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){A.HR(this.a,this.c,[this.b])},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 L6:{
-"^":"Tp:348;a,b",
+"^":"Tp:358;a,b",
 call$2:[function(a,b){var z,y,x
 z=$.SS()
 if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
@@ -20866,26 +21064,26 @@
 if(x!=null)y=x
 z=J.f5(b).t(0,y)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,284,[],260,[],"call"],
+return H.VM(new A.xh(null,null,null),[null])},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 Rs:{
 "^":"Tp:112;c,d,e",
 call$1:[function(a){var z,y,x,w,v,u
 z=this.e
 y=A.z9(z)
-x=J.RE(y)
-if(typeof y!=="object"||y===null||!x.$iszs)return
+x=J.x(y)
+if(!x.$iszs)return
 w=this.c
 if(0>=w.length)return H.e(w,0)
 if(w[0]==="@"){v=this.d
 u=L.ao(v,C.xB.yn(w,1),null)
 w=u.gP(u)}else v=y
-u=J.RE(a)
-x.ea(y,v,w,[a,typeof a==="object"&&a!==null&&!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,368,[],"call"],
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"call$1",null,2,0,null,378,[],"call"],
 $isEH:true},
 uJ:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
 hm:{
 "^":"Tp:112;",
@@ -20908,16 +21106,15 @@
 X.TR.prototype.cO.call(this,this)},"call$0","gJK",0,0,null],
 EC:[function(a){this.dY=a
 this.I6.PU(this.iU,a)},"call$1","gH0",2,0,null,230,[]],
-aL4:[function(a){var z,y,x,w,v
+aL4:[function(a){var z,y,x,w
 for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isqI&&J.de(x.oc,y)){v=this.I6.rN(y).gAx()
+if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
 z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.xS,v)
-return}}},"call$1","giz",2,0,569,252,[]],
+if(z==null?w!=null:z!==w)J.ta(this.xS,w)
+return}}},"call$1","giz",2,0,587,255,[]],
 bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
 ir:{
-"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+"^":["GN;AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
 G6:function(a){this.Pa(a)},
 static:{oa:function(a){var z,y,x,w
 z=$.Nd()
@@ -20931,17 +21128,16 @@
 C.Iv.ZL(a)
 C.Iv.G6(a)
 return a}}},
-Sa:{
-"^":["qE+zs;KM:X0=-375",function(){return[C.Nw]}],
+jpR:{
+"^":["qE+zs;KM:X0=-385",function(){return[C.Nw]}],
 $iszs:true,
 $isTU:true,
 $isd3:true,
 $iscv:true,
-$isGv:true,
 $isD0:true,
 $isKV:true},
 GN:{
-"^":"Sa+Pi;",
+"^":"jpR+Pi;",
 $isd3:true},
 bS:{
 "^":"a;jL>,zZ*",
@@ -20968,19 +21164,17 @@
 $isEH:true},
 Fn:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isRS},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isRS},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 e3:{
 "^":"Tp:112;",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isMs},"call$1",null,2,0,null,570,[],"call"],
+call$1:[function(a){return!!J.x(a).$isMs},"call$1",null,2,0,null,588,[],"call"],
 $isEH:true},
 pM:{
 "^":"Tp:112;",
-call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,568,[],"call"],
+call$1:[function(a){return!a.gQ2()},"call$1",null,2,0,null,586,[],"call"],
 $isEH:true},
-jh:{
+Mh:{
 "^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
 Zh:[function(a,b,c){var z,y,x
@@ -20988,7 +21182,7 @@
 if(z!=null)return z.call$2(a,b)
 try{y=C.xr.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"call$3","jo",6,0,null,28,[],271,[],11,[]],
+return a}},"call$3","jo",6,0,null,30,[],274,[],11,[]],
 W6:{
 "^":"Tp:115;",
 call$0:[function(){var z=P.L5(null,null,null,null,null)
@@ -21001,35 +21195,35 @@
 return z},"call$0",null,0,0,null,"call"],
 $isEH:true},
 Lf:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 fT:{
-"^":"Tp:348;",
-call$2:[function(a,b){return a},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return a},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 pp:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z,y
 try{z=P.Gl(a)
 return z}catch(y){H.Ru(y)
-return b}},"call$2",null,4,0,null,26,[],571,[],"call"],
+return b}},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 nl:{
-"^":"Tp:348;",
-call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,26,[],113,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return!J.de(a,"false")},"call$2",null,4,0,null,28,[],113,[],"call"],
 $isEH:true},
 ik:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 mf:{
 "^":"Tp:112;a",
 call$1:[function(a){return this.a},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 LfS:{
-"^":"Tp:348;",
-call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,26,[],571,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return H.IH(a,new Z.HK(b))},"call$2",null,4,0,null,28,[],589,[],"call"],
 $isEH:true},
 HK:{
 "^":"Tp:112;b",
@@ -21037,20 +21231,20 @@
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
 ul:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a," "):a
-return z},"call$1","qP",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.vo(z.gvc(a),new T.o8(a)).zV(0," ")
+else z=!!z.$isQV?z.zV(a," "):a
+return z},"call$1","qP",2,0,194,275,[]],
 PX:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
-else z=typeof a==="object"&&a!==null&&(a.constructor===Array||!!z.$isQV)?z.zV(a,";"):a
-return z},"call$1","Fx",2,0,194,272,[]],
+if(!!z.$isZ0)z=J.C0(z.gvc(a),new T.ex(a)).zV(0,";")
+else z=!!z.$isQV?z.zV(a,";"):a
+return z},"call$1","Fx",2,0,194,275,[]],
 o8:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return J.de(this.a.t(0,a),!0)},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 ex:{
 "^":"Tp:112;a",
-call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 e9:{
 "^":"ve;",
@@ -21065,65 +21259,60 @@
 y.w5()
 x=y.o9()
 if(M.wR(c)){z=J.x(b)
-if(z.n(b,"bind")||z.n(b,"repeat")){z=J.x(x)
-z=typeof x==="object"&&x!==null&&!!z.$isEZ}else z=!1}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"call$3","gca",6,0,572,261,[],12,[],260,[]],
-CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,257,[]]},
+return new T.Xy(this,b,x)},"call$3","gca",6,0,590,264,[],12,[],263,[]],
+CE:[function(a){return new T.uK(this)},"call$1","gb4",2,0,null,260,[]]},
 Xy:{
-"^":"Tp:348;a,b,c",
-call$2:[function(a,b){var z=J.x(a)
-if(typeof a!=="object"||a===null||!z.$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=J.x(b)
-z=typeof b==="object"&&b!==null&&!!z.$iscv
+"^":"Tp:358;a,b,c",
+call$2:[function(a,b){var z
+if(!J.x(a).$isz6){z=this.a.nF
+a=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}z=!!J.x(b).$iscv
 if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
 if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"call$2",null,4,0,null,284,[],260,[],"call"],
+return T.FL(this.c,a,null)},"call$2",null,4,0,null,286,[],263,[],"call"],
 $isEH:true},
 uK:{
 "^":"Tp:112;a",
-call$1:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isz6)z=a
+call$1:[function(a){var z
+if(!!J.x(a).$isz6)z=a
 else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,284,[],"call"],
+z=new K.z6(null,a,V.WF(z==null?H.B7([],P.L5(null,null,null,null,null)):z,null,null),null)}return z},"call$1",null,2,0,null,286,[],"call"],
 $isEH:true},
 mY:{
 "^":"Pi;a9,Cu,uI,Y7,AP,Lk",
 u0:function(a){return this.uI.call$1(a)},
 KX:[function(a){var z,y
 z=this.Y7
-y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
+if(!!J.x(a).$isfk){y=J.C0(a.bm,new T.mB(this,a)).tt(0,!1)
 this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,272,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",358],
+this.Y7=y}F.Wi(this,C.ls,z,y)},"call$1","gUG",2,0,112,275,[]],
+gP:[function(a){return this.Y7},null,null,1,0,115,"value",368],
 r6:function(a,b){return this.gP(this).call$1(b)},
-sP:[function(a,b){var z,y,x,w
+sP:[function(a,b){var z,y,x
 try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,272,[],"value",358],
-yB:function(a,b,c){var z,y,x,w,v
+if(!!J.x(x).$isB0){z=x
+$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.yj(z))}else throw y}},null,null,3,0,112,275,[],"value",368],
+yB:function(a,b,c){var z,y,x,w
 y=this.Cu
 y.gju().yI(this.gUG()).fm(0,new T.GX(this))
 try{J.UK(y,new K.Ed(this.a9))
 y.gLl()
 this.KX(y.gLl())}catch(x){w=H.Ru(x)
-v=J.x(w)
-if(typeof w==="object"&&w!==null&&!!v.$isB0){z=w
+if(!!J.x(w).$isB0){z=w
 $.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.yj(z))}else throw x}},
 static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
 z.yB(a,b,c)
 return z}}},
 GX:{
 "^":"Tp:112;a",
-call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.yj(a)))},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 mB:{
 "^":"Tp:112;a,b",
 call$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.kF,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,409,[],"call"],
+z.u(0,this.b.F5,a)
+return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
 XF:{
@@ -21136,31 +21325,29 @@
 bX:{
 "^":"Tp;a,b",
 call$1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,409,[],"call"],
+z.L1=F.Wi(z,C.ls,z.L1,a)},"call$1",null,2,0,null,421,[],"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a){return{func:"CJ",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
 OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
 J.UK(z,new K.Ed(b))
-return z.gLv()},"call$2","ly",4,0,null,273,[],265,[]],
+return z.gLv()},"call$2","ly",4,0,null,276,[],268,[]],
 jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.RE(w),typeof w==="object"&&w!==null&&!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
 x.push(w.gT8())
 z.a=w.gBb()}w=z.a
-v=J.RE(w)
-if(typeof w==="object"&&w!==null&&!!v.$isw6){u=v.gP(w)
-t=C.OL
-s=!1}else if(typeof w==="object"&&w!==null&&!!v.$iszX){w=w.gJn()
 v=J.x(w)
-if(typeof w!=="object"||w===null||!v.$isno)y.call$0()
+if(!!v.$isw6){u=v.gP(w)
+t=C.OL
+s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.call$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
-s=!0}else{if(typeof w==="object"&&w!==null&&!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(typeof w==="object"&&w!==null&&!!v.$isJy){t=w.ghP()
+s=!0}else{if(!!v.$isx9){t=w.ghP()
+u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
 if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.call$0()
 u=J.vF(z.a)}else{y.call$0()
 u=null}}else{y.call$0()
@@ -21172,60 +21359,59 @@
 throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
 if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,273,[],28,[],265,[]],
-ci:[function(a){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqh)return B.z4(a,null)
-return a},"call$1","Af",2,0,null,272,[]],
+else H.vn(p).PU(new H.GD(H.u1(u)),b)},"call$3","wA",6,0,null,276,[],30,[],268,[]],
+ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
+return a},"call$1","Af",2,0,null,275,[]],
 Ra:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.WB(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 wJY:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 zOQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.vX(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 W6o:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.FW(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 MdQ:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 YJG:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return!J.de(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 DOe:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.z8(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 lPa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.J5(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Ufa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.u6(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 Raa:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.Bl(a,b)},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w0:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0||b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w4:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return a===!0&&b===!0},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
 w5:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){var z=H.Og(P.a)
 z=H.KT(z,[z]).BD(b)
 if(z)return b.call$1(a)
@@ -21261,10 +21447,10 @@
 else if(this.k8!=null){y=new H.GD(H.u1(b))
 x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
 z=J.x(x)
-if(typeof x!=="object"||x===null||!z.$isRY)w=typeof x==="object"&&x!==null&&!!z.$isRS&&x.glT()
+if(!z.$isRY)w=!!z.$isRS&&x.glT()
 else w=!0
 if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(typeof x==="object"&&x!==null&&!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
+else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
 if(z!=null)return K.ci(z.t(0,b))
 else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},"call$1","gIA",2,0,null,12,[]],
 tI:[function(a){var z
@@ -21286,12 +21472,12 @@
 gju:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
 gLl:function(){return this.Lv},
-eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,265,[]],
-Qh:[function(a){},"call$1","gVj",2,0,null,265,[]],
+eC:[function(a){return this.Qh(a)},"call$1","gpn",2,0,null,268,[]],
+Qh:[function(a){},"call$1","gVj",2,0,null,268,[]],
 DX:[function(a){var z
 this.yc(0,a)
 z=this.bO
-if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,265,[]],
+if(z!=null)z.DX(a)},"call$1","gFO",2,0,null,268,[]],
 yc:[function(a,b){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
@@ -21300,30 +21486,30 @@
 z=this.Lv
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
-x.Iv(z)}},"call$1","gcz",2,0,null,265,[]],
+x.Iv(z)}},"call$1","gcz",2,0,null,268,[]],
 bu:[function(a){return this.KL.bu(0)},"call$0","gXo",0,0,null],
 $ishw:true},
 Ed:{
 "^":"d2;Jd",
-xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,19,[]],
+xn:[function(a){a.yc(0,this.Jd)},"call$1","gBe",2,0,null,21,[]],
 ky:[function(a){J.UK(a.gT8(),this)
-a.yc(0,this.Jd)},"call$1","gU6",2,0,null,278,[]]},
+a.yc(0,this.Jd)},"call$1","gU6",2,0,null,280,[]]},
 G1:{
-"^":"fr;Jd,Le",
-W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,19,[]],
-LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,19,[]],
+"^":"fr;Jd,lk",
+W9:[function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},"call$1","glO",2,0,null,21,[]],
+LT:[function(a){return a.wz.RR(0,this)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){var z,y
 z=J.UK(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(y)
-return y},"call$1","gEW",2,0,null,354,[]],
+return y},"call$1","gfz",2,0,null,364,[]],
 CU:[function(a){var z,y,x
 z=J.UK(a.ghP(),this)
 y=J.UK(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","gA2",2,0,null,409,[]],
+return x},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z,y,x,w,v
 z=J.UK(a.ghP(),this)
 y=a.gre()
@@ -21333,21 +21519,21 @@
 x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(v)
 if(x!=null){x.toString
-H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gHb",2,0,null,274,[]],
+H.bQ(x,new K.Os(v))}return v},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z,y
 z=H.VM(new H.A8(a.gPu(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
-return y},"call$1","gmd",2,0,null,274,[]],
+return y},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){var z,y,x
 z=J.UK(a.gG3(a),this)
 y=J.UK(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
 z.sbO(x)
 y.sbO(x)
-return x},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,409,[]],
+return x},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){var z,y,x
 z=J.UK(a.gBb(),this)
 y=J.UK(a.gT8(),this)
@@ -21365,7 +21551,7 @@
 y=J.UK(a.gT8(),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
 y.sbO(x)
-return x},"call$1","gU6",2,0,null,409,[]]},
+return x},"call$1","gU6",2,0,null,421,[]]},
 Os:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
@@ -21376,12 +21562,12 @@
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
 a.sbO(z)
-return z},"call$1",null,2,0,null,19,[],"call"],
+return z},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 Wh:{
 "^":"Ay;KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=a.gk8()},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.EZ]},
 $isEZ:true,
 $ishw:true},
@@ -21391,27 +21577,27 @@
 return z.gP(z)},
 r6:function(a,b){return this.gP(this).call$1(b)},
 Qh:[function(a){var z=this.KL
-this.Lv=z.gP(z)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gP(z)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
 ev:{
 "^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+Qh:[function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.kB]},
 $iskB:true,
 $ishw:true},
 ID:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"call$2",null,4,0,null,190,[],19,[],"call"],
+return a},"call$2",null,4,0,null,190,[],21,[],"call"],
 $isEH:true},
 qR:{
 "^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.ae]},
 $isae:true,
 $ishw:true},
@@ -21424,21 +21610,20 @@
 z=this.KL
 this.Lv=J.UQ(a,z.gP(z))
 y=a.tI(z.gP(z))
-x=J.RE(y)
-if(typeof y==="object"&&y!==null&&!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+x=J.x(y)
+if(!!x.$isd3){z=H.u1(z.gP(z))
+this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.w6]},
 $isw6:true,
 $ishw:true},
 Qv:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 Xm:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 mv:{
 "^":"Ay;wz<,KL,bO,tj,Lv,k6",
@@ -21449,8 +21634,8 @@
 y=$.ww().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
 this.Lv=y.call$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=z.gLv()==null?null:y.call$1(z.gLv())}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.jK]},
 $isjK:true,
 $ishw:true},
@@ -21458,7 +21643,7 @@
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
 gkp:function(a){var z=this.KL
 return z.gkp(z)},
-Qh:[function(a){var z,y,x,w
+Qh:[function(a){var z,y,x
 z=this.KL
 y=$.e6().t(0,z.gkp(z))
 if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
@@ -21467,13 +21652,9 @@
 this.Lv=y.call$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.call$2(this.Bb.gLv(),this.T8.gLv())
 else{x=this.Bb
 if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")){z=x.gLv()
-w=J.x(z)
-w=typeof z==="object"&&z!==null&&!!w.$iswn
-z=w}else z=!1
-if(z)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
+this.Lv=y.call$2(x.gLv(),this.T8.gLv())}}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.uk]},
 $isuk:true,
 $ishw:true},
@@ -21491,20 +21672,19 @@
 return}y=this.KL
 x=new H.GD(H.u1(y.goc(y)))
 this.Lv=H.vn(z).rN(x).gAx()
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gUj(z).yI(new K.Li(this,a,x))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
 Li:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 WK:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 iT:{
 "^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
@@ -21514,19 +21694,18 @@
 return}y=this.Jn.gLv()
 x=J.U6(z)
 this.Lv=x.t(z,y)
-if(typeof z==="object"&&z!==null&&!!x.$isd3)this.tj=x.gUj(z).yI(new K.ja(this,a,y))},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-ja:{
+tE:{
 "^":"Tp:112;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+call$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 ey:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 fa:{
 "^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
@@ -21539,12 +21718,12 @@
 x=this.hP.gLv()
 if(x==null){this.Lv=null
 return}z=this.KL
-if(z.gbP(z)==null){z=J.x(x)
-this.Lv=K.ci(typeof x==="object"&&x!==null&&!!z.$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))}else{w=new H.GD(H.u1(z.gbP(z)))
+if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.Ek(x,y,P.Te(null)))
+else{w=new H.GD(H.u1(z.gbP(z)))
 this.Lv=H.vn(x).F2(w,y,null).Ax
-z=J.RE(x)
-if(typeof x==="object"&&x!==null&&!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+z=J.x(x)
+if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,w))}},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
@@ -21553,13 +21732,12 @@
 call$1:[function(a){return a.gLv()},"call$1",null,2,0,null,131,[],"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:548;a,b,c",
-call$1:[function(a){if(J.pb(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,563,[],"call"],
+"^":"Tp:567;a,b,c",
+call$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"call$1",null,2,0,null,581,[],"call"],
 $isEH:true},
 a9:{
 "^":"Tp:112;d",
-call$1:[function(a){var z=J.x(a)
-return typeof a==="object"&&a!==null&&!!z.$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,278,[],"call"],
+call$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"call$1",null,2,0,null,280,[],"call"],
 $isEH:true},
 VA:{
 "^":"Ay;Bb<,T8<,KL,bO,tj,Lv,k6",
@@ -21567,12 +21745,12 @@
 z=this.Bb
 y=this.T8.gLv()
 x=J.x(y)
-if((typeof y!=="object"||y===null||y.constructor!==Array&&!x.$isQV)&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(typeof y==="object"&&y!==null&&!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,265,[]],
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+this.Lv=new K.fk(x,w)},"call$1","gVj",2,0,null,268,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 $asAy:function(){return[U.K9]},
 $isK9:true,
 $ishw:true},
@@ -21581,11 +21759,11 @@
 call$1:[function(a){return this.a.DX(this.b)},"call$1",null,2,0,null,113,[],"call"],
 $isEH:true},
 fk:{
-"^":"a;kF,bm",
+"^":"a;F5,bm",
 $isfk:true},
 wL:{
 "^":"a:112;lR,ex",
-call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,573,[]],
+call$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"call$1","gKu",2,0,null,591,[]],
 $iswL:true,
 $isEH:true},
 B0:{
@@ -21600,33 +21778,33 @@
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"call$2","OE",4,0,null,131,[],187,[]],
+if(!J.de(y,b[z]))return!1}return!0},"call$2","xV",4,0,null,131,[],187,[]],
 au:[function(a){a.toString
-return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,274,[]],
+return U.Up(H.n3(a,0,new U.xs()))},"call$1","bT",2,0,null,277,[]],
 Zm:[function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"call$2","uN",4,0,null,275,[],28,[]],
+return a^a>>>6},"call$2","uN",4,0,null,237,[],30,[]],
 Up:[function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,275,[]],
+return 536870911&a+((16383&a)<<15>>>0)},"call$1","fM",2,0,null,237,[]],
 tc:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,574,19,[],131,[]],
-F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,19,[],190,[],131,[]]},
+Bf:[function(a,b,c){return new U.zX(b,c)},"call$2","gvH",4,0,592,21,[],131,[]],
+F2:[function(a,b,c){return new U.Jy(a,b,c)},"call$3","gb2",6,0,null,21,[],190,[],131,[]]},
 hw:{
 "^":"a;",
 $ishw:true},
 EZ:{
 "^":"hw;",
-RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.W9(this)},"call$1","gZC",2,0,null,275,[]],
 $isEZ:true},
 no:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ti(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){var z=this.P
 return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
@@ -21637,22 +21815,22 @@
 $isno:true},
 kB:{
 "^":"hw;Pu>",
-RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.o0(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"{"+H.d(this.Pu)+"}"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return U.au(this.Pu)},
 $iskB:true},
 ae:{
 "^":"hw;G3>,v4<",
-RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.YV(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.G3)+": "+H.d(this.v4)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isae&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
@@ -21660,33 +21838,31 @@
 $isae:true},
 XC:{
 "^":"hw;wz",
-RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.LT(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.wz)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.wz)},
 $isXC:true},
 w6:{
 "^":"hw;P>",
 r6:function(a,b){return this.P.call$1(b)},
-RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.qv(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return this.P},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isw6&&J.de(z.gP(b),this.P)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){return J.v1(this.P)},
 $isw6:true},
 jK:{
 "^":"hw;kp>,wz<",
-RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.Hx(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.kp)+" "+H.d(this.wz)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.kp)
 y=J.v1(this.wz)
@@ -21694,12 +21870,12 @@
 $isjK:true},
 uk:{
 "^":"hw;kp>,Bb<,T8<",
-RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.im(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.kp)
 y=J.v1(this.Bb)
@@ -21708,12 +21884,10 @@
 $isuk:true},
 K9:{
 "^":"hw;Bb<,T8<",
-RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ky(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isK9&&J.de(b.gBb(),this.Bb)&&J.de(b.gT8(),this.T8)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
@@ -21722,12 +21896,10 @@
 $isK9:true},
 zX:{
 "^":"hw;hP<,Jn<",
-RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.CU(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},"call$0","gXo",0,0,null],
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
@@ -21735,12 +21907,12 @@
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.co(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.oc)},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
@@ -21748,12 +21920,12 @@
 $isx9:true},
 Jy:{
 "^":"hw;hP<,bP>,re<",
-RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,272,[]],
+RR:[function(a,b){return b.ZR(this)},"call$1","gZC",2,0,null,275,[]],
 bu:[function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},"call$0","gXo",0,0,null],
 n:[function(a,b){var z
 if(b==null)return!1
-z=J.RE(b)
-return typeof b==="object"&&b!==null&&!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
+z=J.x(b)
+return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},"call$1","gUJ",2,0,null,96,[]],
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
 y=J.v1(this.bP)
@@ -21761,8 +21933,8 @@
 return U.Up(U.Zm(U.Zm(U.Zm(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:348;",
-call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,575,[],576,[],"call"],
+"^":"Tp:358;",
+call$2:[function(a,b){return U.Zm(a,J.v1(b))},"call$2",null,4,0,null,593,[],594,[],"call"],
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
@@ -21771,10 +21943,10 @@
 if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
 else z=!0
 if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.fL.lo)))
-this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,577,[],28,[]],
+this.fL.G()},function(){return this.XJ(null,null)},"w5","call$2",null,"gnp",0,4,null,82,82,595,[],30,[]],
 o9:[function(){if(this.fL.lo==null){this.Sk.toString
 return C.OL}var z=this.Dl()
-return z==null?null:this.BH(z,0)},"call$0","gKx",0,0,null],
+return z==null?null:this.BH(z,0)},"call$0","gwa",0,0,null],
 BH:[function(a,b){var z,y,x,w,v
 for(z=this.Sk;y=this.fL.lo,y!=null;)if(J.de(J.Iz(y),9))if(J.de(J.Vm(this.fL.lo),"(")){x=this.qj()
 z.toString
@@ -21782,25 +21954,21 @@
 z.toString
 a=new U.zX(a,w)}else break
 else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){y=J.x(a)
-if(typeof a!=="object"||a===null||!y.$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
+a=this.qL(a,this.Dl())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
 this.w5()
 v=this.o9()
 z.toString
 a=new U.K9(a,v)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
 else break
-return a},"call$2","gTv",4,0,null,134,[],578,[]],
+return a},"call$2","gTv",4,0,null,134,[],596,[]],
 qL:[function(a,b){var z,y
-if(typeof b==="object"&&b!==null&&!!b.$isw6){z=b.gP(b)
+z=J.x(b)
+if(!!z.$isw6){z=z.gP(b)
 this.Sk.toString
-return new U.x9(a,z)}else{if(typeof b==="object"&&b!==null&&!!b.$isJy){z=b.ghP()
-y=J.x(z)
-y=typeof z==="object"&&z!==null&&!!y.$isw6
-z=y}else z=!1
-if(z){z=J.Vm(b.ghP())
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
 y=b.gre()
 this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))}},"call$2","gE5",4,0,null,134,[],135,[]],
+return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},"call$2","gE5",4,0,null,134,[],135,[]],
 Tw:[function(a){var z,y,x
 z=this.fL.lo
 this.w5()
@@ -21832,7 +22000,7 @@
 return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
 w=this.BH(this.Ai(),11)
 this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},"call$0","gna",0,0,null],
+return new U.jK(z,w)}}return this.Ai()},"call$0","gpox",0,0,null],
 Ai:[function(){var z,y,x
 switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
 y=J.x(z)
@@ -21907,28 +22075,26 @@
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,330,579,[]],
+return y},function(){return this.pT("")},"Ud","call$1",null,"gwo",0,2,null,340,597,[]],
 yj:[function(a){var z,y
 z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
 this.Sk.toString
 y=H.VM(new U.no(z),[null])
 this.w5()
-return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,330,579,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+return y},function(){return this.yj("")},"tw","call$1",null,"gSE",0,2,null,340,597,[]]}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,276,116,[]],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"call$1","UM",2,0,278,116,[]],
 Ae:{
-"^":"a;vH>-369,P>-580",
+"^":"a;vH>-379,P>-598",
 r6:function(a,b){return this.P.call$1(b)},
-n:[function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return typeof b==="object"&&b!==null&&!!z.$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,512,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,365,"toString"],
+n:[function(a,b){if(b==null)return!1
+return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"call$1","gUJ",2,0,112,96,[],"=="],
+giO:[function(a){return J.v1(this.P)},null,null,1,0,536,"hashCode"],
+bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"call$0","gXo",0,0,375,"toString"],
 $isAe:true,
 "@":function(){return[C.Nw]},
 "<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},52,[],28,[],"new IndexedValue"]}},
+static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.im,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
 "+IndexedValue":[0],
 Bt:{
 "^":"mW;YR",
@@ -21945,7 +22111,7 @@
 return z},
 Zv:[function(a,b){var z=new K.Ae(b,J.i4(this.YR,b))
 z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},"call$1","goY",2,0,null,52,[]],
+return z},"call$1","gRV",2,0,null,15,[]],
 $asmW:function(a){return[[K.Ae,a]]},
 $asQV:function(a){return[[K.Ae,a]]}},
 vR:{
@@ -21965,14 +22131,14 @@
 z=a.gAY()
 if(z!=null&&!J.de(z.gUx(),C.PU)){y=Z.y1(a.gAY(),b)
 if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"call$2","Nb",4,0,null,277,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
+if(y!=null)return y}return},"call$2","Nb",4,0,null,279,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
 wX:[function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"call$1","uO",2,0,null,278,[]],
+default:return a}},"call$1","uO",2,0,null,280,[]],
 Pn:{
 "^":"a;fY>,P>,G8<",
 r6:function(a,b){return this.P.call$1(b)},
@@ -22070,7 +22236,7 @@
 x=H.eT(v)
 z.vM=z.vM+x
 this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
-z.vM=""},"call$0","gba",0,0,null]},
+z.vM=""},"call$0","gpS",0,0,null]},
 hA:{
 "^":"a;G1>",
 bu:[function(a){return"ParseException: "+this.G1},"call$0","gXo",0,0,null],
@@ -22078,30 +22244,30 @@
 "^":"",
 fr:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,581,91,[]]},
+DV:[function(a){return J.UK(a,this)},"call$1","gnG",2,0,599,91,[]]},
 d2:{
 "^":"fr;",
-W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,19,[]],
+W9:[function(a){return this.xn(a)},"call$1","glO",2,0,null,21,[]],
 LT:[function(a){a.wz.RR(0,this)
-this.xn(a)},"call$1","gff",2,0,null,19,[]],
+this.xn(a)},"call$1","gff",2,0,null,21,[]],
 co:[function(a){J.UK(a.ghP(),this)
-this.xn(a)},"call$1","gEW",2,0,null,409,[]],
+this.xn(a)},"call$1","gfz",2,0,null,421,[]],
 CU:[function(a){J.UK(a.ghP(),this)
 J.UK(a.gJn(),this)
-this.xn(a)},"call$1","gA2",2,0,null,409,[]],
+this.xn(a)},"call$1","gA2",2,0,null,421,[]],
 ZR:[function(a){var z
 J.UK(a.ghP(),this)
 z=a.gre()
 if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gES",2,0,null,409,[]],
-ti:[function(a){return this.xn(a)},"call$1","gHb",2,0,null,274,[]],
+this.xn(a)},"call$1","gES",2,0,null,421,[]],
+ti:[function(a){return this.xn(a)},"call$1","gvs",2,0,null,277,[]],
 o0:[function(a){var z
 for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
-this.xn(a)},"call$1","gmd",2,0,null,274,[]],
+this.xn(a)},"call$1","gX7",2,0,null,277,[]],
 YV:[function(a){J.UK(a.gG3(a),this)
 J.UK(a.gv4(),this)
-this.xn(a)},"call$1","ghH",2,0,null,19,[]],
-qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,409,[]],
+this.xn(a)},"call$1","ghH",2,0,null,21,[]],
+qv:[function(a){return this.xn(a)},"call$1","gFs",2,0,null,421,[]],
 im:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
 this.xn(a)},"call$1","glf",2,0,null,96,[]],
@@ -22109,12 +22275,12 @@
 this.xn(a)},"call$1","ghe",2,0,null,96,[]],
 ky:[function(a){J.UK(a.gBb(),this)
 J.UK(a.gT8(),this)
-this.xn(a)},"call$1","gU6",2,0,null,278,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
+this.xn(a)},"call$1","gU6",2,0,null,280,[]]}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
 JG:{
-"^":["V20;kW%-532,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,533,"app",358,377],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,534,28,[],"app",358],
+"^":["V23;kW%-551,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+guw:[function(a){return a.kW},null,null,1,0,552,"app",368,387],
+suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,553,30,[],"app",368],
 "@":function(){return[C.Is]},
 static:{Zo:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22128,27 +22294,27 @@
 C.Cc.ZL(a)
 C.Cc.G6(a)
 return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[582],
-V20:{
+"+ResponseViewerElement":[600],
+V23:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
 knI:{
-"^":["T5;zw%-369,AP,Lk,tY-381,Pe-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gRd:[function(a){return a.zw},null,null,1,0,512,"line",358,377],
-sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,411,28,[],"line",358],
+"^":["qe;zw%-379,AP,Lk,tY-391,Pe-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gRd:[function(a){return a.zw},null,null,1,0,536,"line",368,387],
+sRd:[function(a,b){a.zw=this.ct(a,C.Cv,a.zw,b)},null,null,3,0,423,30,[],"line",368],
 gD5:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gD5.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return y.gzz()
-else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,365,"hoverText"],
+else return H.d(y.gzz())+":"+H.d(a.zw)},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 z=J.u6(a.zw,0)
 y=a.tY
 if(z)return J.O6(y)
-else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,365,"name"],
+else return H.d(J.O6(y))+":"+H.d(a.zw)},null,null,1,0,375,"name"],
 "@":function(){return[C.Ur]},
 static:{Th:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22164,17 +22330,17 @@
 C.c0.ZL(a)
 C.c0.G6(a)
 return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[583],
-T5:{
+"+ScriptRefElement":[601],
+qe:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V21;Uz%-584,HJ%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,585,"script",358,377],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,586,28,[],"script",358],
-gnN:[function(a){return a.HJ},null,null,1,0,390,"showCoverage",358,377],
-snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,391,28,[],"showCoverage",358],
+"^":["V24;Uz%-602,HJ%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gNl:[function(a){return a.Uz},null,null,1,0,603,"script",368,387],
+sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,604,30,[],"script",368],
+gnN:[function(a){return a.HJ},null,null,1,0,401,"showCoverage",368,387],
+snN:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,402,30,[],"showCoverage",368],
 i4:[function(a){var z
 Z.uL.prototype.i4.call(this,a)
 z=a.Uz
@@ -22188,9 +22354,9 @@
 y=J.UQ(z.gu9(),J.f2(b))
 if(y==null)return"min-width:32px;"
 if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"call$1","gXa",2,0,587,180,[],"hitsStyle",359],
-yv:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
-j9:[function(a,b){J.y9(J.QP(a.Uz)).ml(new U.qq(a,b))},"call$1","gWp",2,0,157,379,[],"refreshCoverage"],
+return"min-width:32px;background-color:green"},"call$1","gXa",2,0,605,180,[],"hitsStyle",369],
+pA:[function(a,b){J.am(a.Uz).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
+j9:[function(a,b){J.IQ(J.QP(a.Uz)).ml(new U.l0(a,b))},"call$1","gWp",2,0,157,389,[],"refreshCoverage"],
 "@":function(){return[C.I3]},
 static:{"^":"he<-82,iJN<-82,oM<-82",Ry:[function(a){var z,y,x,w
 z=$.Nd()
@@ -22205,16 +22371,16 @@
 C.cJ.ZL(a)
 C.cJ.G6(a)
 return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[588],
-V21:{
+"+ScriptViewElement":[606],
+V24:{
 "^":"uL+Pi;",
 $isd3:true},
-qq:{
+l0:{
 "^":"Tp:112;a-82,b-82",
-call$1:[function(a){J.Q5(this.a,C.YH,0,1)
+call$1:[function(a){J.ni(this.a,C.YH,0,1)
 this.b.call$0()},"call$1",null,2,0,112,113,[],"call"],
 $isEH:true},
-"+ qq":[489]}],["service","package:observatory/service.dart",,D,{
+"+ l0":[501]}],["service","package:observatory/service.dart",,D,{
 "^":"",
 Er:[function(a){var z
 if(a!=null){z=J.U6(a)
@@ -22222,21 +22388,22 @@
 return z},"call$1","XI",2,0,null,190,[]],
 Io:[function(a){var z=J.rY(a)
 if(!z.nC(a,"@"))return a
-return z.yn(a,1)},"call$1","GK",2,0,null,11,[]],
+return z.yn(a,1)},"call$1","J6",2,0,null,11,[]],
 Ch:[function(a,b,c){var z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$isqC)D.Gf(a,b,c)
-else if(typeof a==="object"&&a!==null&&!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,281,[],282,[],14,[]],
-Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],282,[],14,[]],
+if(!!z.$isqC)D.Gf(a,b,c)
+else if(!!z.$iswn)D.f3(a,b,c)},"call$3","H3",6,0,null,283,[],284,[],16,[]],
+Gf:[function(a,b,c){a.aN(0,new D.UZ(a,b,c))},"call$3","Xb",6,0,null,151,[],284,[],16,[]],
 f3:[function(a,b,c){var z,y,x,w,v
 for(z=a.h3,y=0;y<z.length;++y){x=z[y]
-w=J.U6(x)
-v=typeof x==="object"&&x!==null&&!!w.$isqC
+w=J.x(x)
+v=!!w.$isqC
 if(v&&w.t(x,"id")!=null&&w.t(x,"type")!=null)a.u(0,y,D.Lr(b,c,x))
-else if(typeof x==="object"&&x!==null&&!!w.$iswn)D.f3(x,b,c)
-else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],282,[],14,[]],
+else if(!!w.$iswn)D.f3(x,b,c)
+else if(v)D.Gf(x,b,c)}},"call$3","PV",6,0,null,73,[],284,[],16,[]],
 Lr:[function(a,b,c){var z
-if(c!=null){z=J.U6(c)
-z=z.t(c,"id")!=null&&z.t(c,"type")!=null}else z=!1
+if(c==null)return
+z=J.U6(c)
+z=z.t(c,"id")!=null&&z.t(c,"type")!=null
 if(!z)N.Jx("").hh("Malformed service object: "+H.d(c))
 switch(D.Io(J.UQ(c,"type"))){case"Error":z=new D.pt(null,null,null,null,b,null,null,null,null,null,null,null)
 z.H4(b,c)
@@ -22252,31 +22419,29 @@
 z.$builtinTypeInfo=[null,null]
 z=new D.SI(z,b,null,null,null,null,null,null,null)
 z.H4(b,c)
-return z},"call$3","d1",6,0,null,282,[],14,[],190,[]],
+return z},"call$3","d1",6,0,null,284,[],16,[],190,[]],
 G8:{
 "^":"a;F1>",
-tg:[function(a,b){return this.A4.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,279,[]],
-t:[function(a,b){return this.A4.Zp.t(0,b)},"call$1","gIA",2,0,null,279,[]],
-u:[function(a,b,c){this.A4.u(0,b,c)},"call$2","gj3",4,0,null,279,[],367,[]],
-ox:[function(a){var z=this.A4.Zp.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.F1.ox(a).ml(this.gat())},"call$1","gRD",2,0,null,279,[]],
+tg:[function(a,b){return this.Qy.Zp.t(0,b)!=null},"call$1","gdj",2,0,null,281,[]],
+t:[function(a,b){return this.Qy.Zp.t(0,b)},"call$1","gIA",2,0,null,281,[]],
+u:[function(a,b,c){this.Qy.u(0,b,c)},"call$2","gj3",4,0,null,281,[],377,[]],
+ox:[function(a){var z=this.Qy.Zp.t(0,a)
+if(z!=null)return J.SK(z)
+return this.F1.Pg(a)},"call$1","gUb",2,0,null,281,[]],
 Jb:[function(a){var z,y
 z=J.U6(a)
 y=z.t(a,"id")
 z.t(a,"type")
 if(!this.pJ(y))N.Jx("").j2("Cache does not cache this id: "+H.d(y))
-if(this.tg(0,y))return this.A4.Zp.t(0,y)
+if(this.tg(0,y))return this.Qy.Zp.t(0,y)
 z=this.tR(a)
-this.A4.u(0,z.gjO(z),z)
-return z},"call$1","gMs",2,0,null,98,[]],
-LJ:[function(a){this.A4.u(0,J.F8(a),a)
-return a},"call$1","gat",2,0,function(){return H.IG(function(a){return{func:"NO",ret:a,args:[a]}},this.$receiver,"G8")},589,[]]},
+this.Qy.u(0,z.KG,z)
+return z},"call$1","gME",2,0,null,98,[]]},
 fJ:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.cI().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
@@ -22284,58 +22449,44 @@
 x=new D.rj(Q.uX(null,D.c2),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),null,null,null,null,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-Vc:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,590,591,[]],
+ZA:[function(a){J.kH(J.UQ(a,"coverage"),new D.q1(this))},"call$1","gJJ",2,0,607,608,[]],
 $asG8:function(){return[D.rj]},
 static:{"^":"RI"}},
 q1:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,592,[],"call"],
+z.t(a,"script").aq(z.t(a,"hits"))},"call$1",null,2,0,null,609,[],"call"],
 $isEH:true},
 jx:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.xN().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y,x
 z=this.F1
 y=J.im
 x=D.N8
-x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
+x=new D.kx(null,0,0,0,0,0,H.VM([],[D.Vi]),H.VM([],[D.Vi]),Q.uX(null,D.Q4),H.VM(new V.qC(P.Py(null,null,null,y,x),null,null),[y,x]),"","",null,null,null,null,!1,null,null,z,null,null,null,null,null,null,null)
 x.H4(z,a)
 return x},"call$1","gUU",2,0,null,98,[]],
-T0:[function(a){var z,y
-z=this.A4.Zp
-z=z.gUQ(z)
-y=P.F(z,!0,H.ip(z,"mW",0))
-H.rd(y,new D.yT())
-z=y.length
-if(typeof a!=="number")return H.s(a)
-if(z<a)return y
-C.Nm.sB(y,a)
-return y},"call$1","gy8",2,0,null,130,[]],
-c2:[function(){this.A4.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
+c2:[function(){this.Qy.Zp.aN(0,new D.Cn())},"call$0","gKW",0,0,null],
 pl:[function(a,b){var z,y,x,w
 z=J.U6(a)
 y=z.t(a,"codes")
 x=z.t(a,"samples")
 for(z=J.GP(y);z.G();){w=z.gl()
-J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,593,[],594,[]],
+J.UQ(w,"code").eL(w,b,x)}},"call$2","gxl",4,0,null,610,[],611,[]],
 $asG8:function(){return[D.kx]},
-static:{"^":"PA"}},
-yT:{
-"^":"Tp:595;",
-call$2:[function(a,b){return J.xH(b.gDu(),a.gDu())},"call$2",null,4,0,null,131,[],187,[],"call"],
-$isEH:true},
+static:{"^":"PA,xT"}},
 Cn:{
-"^":"Tp:596;",
-call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,442,[],143,[],"call"],
+"^":"Tp:612;",
+call$2:[function(a,b){b.PF()},"call$2",null,4,0,null,454,[],143,[],"call"],
 $isEH:true},
 du:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.Yk().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22344,10 +22495,10 @@
 $asG8:function(){return[D.SI]},
 static:{"^":"Oi"}},
 xc:{
-"^":"G8;F1,A4",
+"^":"G8;F1,Qy",
 pJ:[function(a){var z=$.uG().Ej
 if(typeof a!=="string")H.vh(new P.AT(a))
-return z.test(a)},"call$1","guT",2,0,null,279,[]],
+return z.test(a)},"call$1","guT",2,0,null,281,[]],
 tR:[function(a){var z,y
 z=this.F1
 y=new D.SI(H.VM(new V.qC(P.Py(null,null,null,null,null),null,null),[null,null]),z,null,null,null,null,null,null,null)
@@ -22355,8 +22506,76 @@
 return y},"call$1","gUU",2,0,null,98,[]],
 $asG8:function(){return[D.SI]},
 static:{"^":"TO"}},
+af:{
+"^":"Pi;bN@,GR@",
+gF1:[function(a){return this.Fm},null,null,1,0,367,"isolate",368],
+gzf:[function(){return this.Fm.zf},null,null,1,0,613,"vm",368],
+gPj:[function(a){var z,y
+z=this.Fm
+y=this.KG
+return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,375,"link",368],
+gHP:[function(){var z,y
+z=this.Fm
+y=this.KG
+return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,375,"hashLink",368],
+gjO:[function(a){return this.KG},null,null,1,0,375,"id",368],
+gzS:[function(){return this.mQ},null,null,1,0,375,"serviceType",368],
+goc:[function(a){return this.gbN()},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.gGR()},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",368],
+xW:[function(a){if(!this.nr)return P.Ab(this,null)
+return this.VD(0)},"call$0","gnB",0,0,null],
+VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
+return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
+eC:[function(a){var z=J.U6(a)
+if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
+this.KG=z.t(a,"id")
+this.mQ=D.Io(z.t(a,"type"))
+this.tM(0,a)
+return this},"call$1","gpn",2,0,614,190,[]],
+DC:[function(a){var z=this.nr?" Created from reference.":""
+N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gma",0,0,null],
+H4:function(a,b){var z=J.U6(b)
+this.KG=z.t(b,"id")
+this.nr=J.co(z.t(b,"type"),"@")
+this.mQ=D.Io(z.t(b,"type"))
+this.DC(0)
+this.eC(b)}},
+pa:{
+"^":["Pi;tl@-523",function(){return[C.Nw]}],
+gi2:[function(a){return this.tl},null,null,1,0,524,"isolates",368],
+pC:[function(){var z,y
+z=J.O
+y=D.bv
+y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
+y.nr=C.xB.nC("IsolateList","@")
+y.mQ=D.Io("IsolateList")
+y.DC(0)
+z=y.ct(y,C.YS,y.bN,"IsolateList")
+y.bN=z
+y.GR=y.ct(y,C.KS,y.GR,z)
+this.tl=y},"call$0","gWR",0,0,null],
+jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,281,[]]},
+Ey:{
+"^":"Tp:112;a",
+call$1:[function(a){var z,y,x,w
+try{z=C.xr.kV(a)
+N.Jx("").To("Decoded "+H.d(this.a))
+x=R.Jk(z)
+return x}catch(w){x=H.Ru(w)
+y=x
+x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
+x=R.Jk(x)
+return x}},"call$1",null,2,0,null,512,[],"call"],
+$isEH:true},
+tm:{
+"^":"Tp:112;",
+call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
+return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+$isEH:true},
 bv:{
-"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-597,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,null,null,null,null,null,null,null,null],
+"^":["D3;zf<,fq,ne,PH,pw,v9,zb,bN:KT@,GR:f5@,cL,LE<-615,Cf,W1,p2,Hw,S9,BC@-527,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,null,null,null,null,null,null,null,null,function(){return[C.mI]},null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null],
 gPj:function(a){return this.KG},
 gHP:function(){return"#/"+H.d(this.KG)},
 gZ0:function(){return this.ne},
@@ -22375,15 +22594,20 @@
 z=D.SI
 y=J.O
 this.pw=new D.xc(this,H.VM(new V.qC(P.Py(null,null,null,y,z),null,null),[y,z]))},"call$0","gWR",0,0,null],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,598,279,[],"relativeLink",358],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,598,279,[],"relativeHashLink",358],
-lh:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
-N3:[function(a){var z,y
+Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"call$1","gua",2,0,616,281,[],"relativeLink",368],
+xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"call$1","gz9",2,0,616,281,[],"relativeHashLink",368],
+Ms:[function(a){return this.ox("coverage").ml(this.fq.gJJ())},"call$0","gWp",0,0,null],
+N3:[function(a){var z,y,x,w
 z=H.VM([],[D.kx])
-for(y=J.GP(J.UQ(a,"codes"));y.G();)z.push(J.UQ(y.gl(),"code"))
+y=J.U6(a)
+for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.ne.c2()
-this.ne.pl(a,z)},"call$1","gNk",2,0,null,593,[]],
+this.ne.pl(a,z)
+w=y.t(a,"exclusive_trie")
+if(w!=null)this.BC=this.KQ(w,z)},"call$1","gNk",2,0,null,610,[]],
+Pg:[function(a){return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.C5(this))},"call$1","gU1",2,0,null,617,[]],
 ox:[function(a){var z,y
+if(J.de(a,""))return this.VD(0)
 this.fq.toString
 z=$.cI().Ej
 y=typeof a!=="string"
@@ -22401,24 +22625,28 @@
 z=$.uG().Ej
 if(y)H.vh(new P.AT(a))
 if(z.test(a))return this.pw.ox(a)
-return this.zf.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this))},"call$1","gRD",2,0,null,599,[]],
-gZA:[function(){return this.v9},null,null,1,0,376,"rootLib",358,359],
-sZA:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,378,28,[],"rootLib",358],
-gUu:[function(){return this.zb},null,null,1,0,600,"topFrame",358,359],
-sUu:[function(a){this.zb=F.Wi(this,C.ch,this.zb,a)},null,null,3,0,601,28,[],"topFrame",358],
-goc:[function(a){return this.KT},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.f5},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,30,28,[],"vmName",358],
-gw2:[function(){return this.cL},null,null,1,0,602,"entry",358,359],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,603,28,[],"entry",358],
-gCi:[function(){return this.Cf},null,null,1,0,512,"newHeapUsed",358,359],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,411,28,[],"newHeapUsed",358],
-guq:[function(){return this.W1},null,null,1,0,512,"oldHeapUsed",358,359],
-suq:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,411,28,[],"oldHeapUsed",358],
-gNh:[function(a){return this.S9},null,null,1,0,365,"fileAndLine",358,359],
-bj:function(a,b){return this.gNh(this).call$1(b)},
-sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,30,28,[],"fileAndLine",358],
+return this.Pg(a)},"call$1","gUb",2,0,null,617,[]],
+gVc:[function(){return this.v9},null,null,1,0,386,"rootLib",368,369],
+sVc:[function(a){this.v9=F.Wi(this,C.iF,this.v9,a)},null,null,3,0,388,30,[],"rootLib",368],
+gUu:[function(){return this.zb},null,null,1,0,618,"topFrame",368,369],
+sUu:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,619,30,[],"topFrame",368],
+goc:[function(a){return this.KT},null,null,1,0,375,"name",368,369],
+soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",368],
+gzz:[function(){return this.f5},null,null,1,0,375,"vmName",368,369],
+szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",368],
+gw2:[function(){return this.cL},null,null,1,0,620,"entry",368,369],
+sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,621,30,[],"entry",368],
+gCi:[function(){return this.Cf},null,null,1,0,536,"newHeapUsed",368,369],
+sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,423,30,[],"newHeapUsed",368],
+gcu:[function(){return this.W1},null,null,1,0,536,"oldHeapUsed",368,369],
+scu:[function(a){this.W1=F.Wi(this,C.ap,this.W1,a)},null,null,3,0,423,30,[],"oldHeapUsed",368],
+gab:[function(){return this.p2},null,null,1,0,536,"newHeapCapacity",368,369],
+sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,423,30,[],"newHeapCapacity",368],
+gRy:[function(){return this.Hw},null,null,1,0,536,"oldHeapCapacity",368,369],
+sRy:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,423,30,[],"oldHeapCapacity",368],
+gNh:[function(a){return this.S9},null,null,1,0,375,"fileAndLine",368,369],
+at:function(a,b){return this.gNh(this).call$1(b)},
+sNh:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",368],
 tM:[function(a,b){var z,y,x,w
 D.Ch(b,this.zf,this)
 this.nr=!1
@@ -22432,9 +22660,9 @@
 y=F.Wi(this,C.tP,this.cL,y)
 this.cL=y
 y=J.UQ(y,"name")
-this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root isolate")
+this.KT=F.Wi(this,C.YS,this.KT,y)}else this.KT=F.Wi(this,C.YS,this.KT,"root")
 if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.ch,this.zb,y)}else this.zb=F.Wi(this,C.ch,this.zb,null)
+this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
 x=H.B7([],P.L5(null,null,null,null,null))
 J.kH(z.t(b,"timers"),new D.Qq(x))
 y=this.LE
@@ -22446,33 +22674,71 @@
 w.u(y,"dart",x.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
 this.Cf=F.Wi(this,C.IO,this.Cf,y)
-z=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.ap,this.W1,z)},"call$1","gYh",2,0,null,151,[]],
+y=J.UQ(z.t(b,"heap"),"usedOld")
+this.W1=F.Wi(this,C.ap,this.W1,y)
+y=J.UQ(z.t(b,"heap"),"capacityNew")
+this.p2=F.Wi(this,C.So,this.p2,y)
+z=J.UQ(z.t(b,"heap"),"capacityOld")
+this.Hw=F.Wi(this,C.Le,this.Hw,z)},"call$1","gci",2,0,null,151,[]],
+KQ:[function(a,b){this.FF=0
+this.bj=a
+if(a==null)return
+if(J.u6(J.q8(a),3))return
+return this.AW(b)},"call$2","gTh",4,0,null,235,[],611,[]],
+AW:[function(a){var z,y,x,w,v,u,t,s,r,q
+z=this.bj
+y=this.FF
+if(typeof y!=="number")return y.g()
+this.FF=y+1
+x=J.UQ(z,y)
+if(x>>>0!==x||x>=a.length)return H.e(a,x)
+w=a[x]
+y=this.bj
+z=this.FF
+if(typeof z!=="number")return z.g()
+this.FF=z+1
+v=J.UQ(y,z)
+z=[]
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
+y=this.bj
+t=this.FF
+if(typeof t!=="number")return t.g()
+this.FF=t+1
+s=J.UQ(y,t)
+if(typeof s!=="number")return H.s(s)
+r=0
+for(;r<s;++r){q=this.AW(a)
+z.push(q)
+y=u.Jv
+t=q.Av
+if(typeof t!=="number")return H.s(t)
+u.Jv=y+t}return u},"call$1","gyi",2,0,null,611,[]],
 $isbv:true},
 D3:{
 "^":"af+Pi;",
 $isd3:true},
-KQ:{
-"^":"Tp:601;a",
+C5:{
+"^":"Tp:619;a",
 call$1:[function(a){var z=this.a
 return D.Lr(z.zf,z,a)},"call$1",null,2,0,null,190,[],"call"],
 $isEH:true},
 Qq:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,604,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"call$1",null,2,0,null,622,[],"call"],
 $isEH:true},
 Qd:{
 "^":["af;Gt,i2>-82,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,function(){return[C.mI]},null,null,null,null,null,null,null,null],
 gzf:function(){return this.Gt},
 VD:[function(a){return this.Gt.jU(this.KG).ml(this.gpn())},"call$0","gQU",0,0,null],
-tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gYh",2,0,null,151,[]],
+tM:[function(a,b){this.l9(J.UQ(b,"members"))},"call$1","gci",2,0,null,151,[]],
 l9:[function(a){var z=[]
 J.kH(this.i2,new D.i6(a,z))
 H.bQ(z,new D.r2(this))
 J.kH(a,new D.JB(this))
-this.Mm()},"call$1","geV",2,0,null,280,[]],
-Mm:[function(){J.kH(this.i2,new D.qj())},"call$0","gU2",0,0,null],
+this.Mm()},"call$1","geV",2,0,null,282,[]],
+Mm:[function(){J.kH(this.i2,new D.nd())},"call$0","gU2",0,0,null],
 AQ:[function(a){var z,y,x,w
 z=this.i2
 y=J.U6(z)
@@ -22480,14 +22746,14 @@
 if(x!=null)return x
 w=P.L5(null,null,null,J.O,J.GW)
 w=R.Jk(w)
-x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,null,null,null,null,a,"@Isolate",null,null,null,null,null)
+x=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,w,0,0,0,0,null,null,null,null,null,null,null,a,"@Isolate",null,null,null,null,null)
 x.nr=C.xB.nC("@Isolate","@")
 x.mQ=D.Io("@Isolate")
 x.DC(0)
 x.pC()
 y.u(z,a,x)
 x.xW(0)
-return x},"call$1","grE",2,0,null,279,[]],
+return x},"call$1","grE",2,0,null,281,[]],
 Ze:[function(a){var z,y,x,w,v
 z=J.UQ(a,"id")
 y=this.i2
@@ -22496,21 +22762,21 @@
 if(w!=null){w.eC(a)
 return w}v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+w=new D.bv(this.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 w.H4(null,a)
 w.pC()
 x.u(y,z,w)
 w.xW(0)
 return w},"call$1","gwB",2,0,null,190,[]],
-static:{ow:[function(a,b){return J.pb(b,new D.BH(a))},"call$2","nW",4,0,null,279,[],280,[]]}},
+static:{ow:[function(a,b){return J.ja(b,new D.BH(a))},"call$2","nW",4,0,null,281,[],282,[]]}},
 i6:{
-"^":"Tp:348;a,b",
-call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,442,[],272,[],"call"],
+"^":"Tp:358;a,b",
+call$2:[function(a,b){if(D.ow(a,this.a)!==!0)this.b.push(a)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true},
 r2:{
 "^":"Tp:112;c",
 call$1:[function(a){J.V1(this.c.i2,a)
-N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,279,[],"call"],
+N.Jx("").To("Isolate '"+H.d(a)+"' has gone away.")},"call$1",null,2,0,null,281,[],"call"],
 $isEH:true},
 JB:{
 "^":"Tp:112;d",
@@ -22521,19 +22787,19 @@
 w=J.U6(x)
 if(w.t(x,z)==null){v=P.L5(null,null,null,J.O,J.GW)
 v=R.Jk(v)
-u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,null,null,null,null,null,null,null,null,null,null,null)
+u=new D.bv(y.Gt,null,null,null,null,null,null,null,null,null,v,0,0,0,0,null,null,null,null,null,null,null,null,null,null,null,null,null,null)
 u.H4(null,a)
 u.pC()
 N.Jx("").To("Created ServiceObject for '"+H.d(u.KG)+"' with type '"+H.d(u.mQ)+"'")
 w.u(x,z,u)}},"call$1",null,2,0,null,151,[],"call"],
 $isEH:true},
-qj:{
-"^":"Tp:605;",
-call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,442,[],14,[],"call"],
+nd:{
+"^":"Tp:623;",
+call$2:[function(a,b){J.am(b)},"call$2",null,4,0,null,454,[],16,[],"call"],
 $isEH:true},
 BH:{
 "^":"Tp:112;a",
-call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,606,[],"call"],
+call$1:[function(a){return J.de(J.UQ(a,"id"),this.a)},"call$1",null,2,0,null,624,[],"call"],
 $isEH:true},
 SI:{
 "^":"af;RF,Fm,KG,mQ,nr,bN,GR,AP,Lk",
@@ -22548,16 +22814,16 @@
 y=y.t(0,"name")
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=this.Fm
-D.Ch(z,y.zf,y)},"call$1","gYh",2,0,null,190,[]],
+D.Ch(z,y.zf,y)},"call$1","gci",2,0,null,190,[]],
 FV:[function(a,b){return this.RF.FV(0,b)},"call$1","gDY",2,0,null,109,[]],
 V1:[function(a){return this.RF.V1(0)},"call$0","gRa",0,0,null],
-di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,272,[]],
-x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,442,[]],
+di:[function(a){return this.RF.Zp.di(a)},"call$1","gmc",2,0,null,275,[]],
+x4:[function(a){return this.RF.Zp.x4(a)},"call$1","gV9",2,0,null,454,[]],
 aN:[function(a,b){return this.RF.Zp.aN(0,b)},"call$1","gjw",2,0,null,117,[]],
-Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,47,[]],
-t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,442,[]],
+Rz:[function(a,b){return this.RF.Rz(0,b)},"call$1","guH",2,0,null,48,[]],
+t:[function(a,b){return this.RF.Zp.t(0,b)},"call$1","gIA",2,0,null,454,[]],
 u:[function(a,b,c){this.RF.u(0,b,c)
-return c},"call$2","gj3",4,0,null,442,[],272,[]],
+return c},"call$2","gj3",4,0,null,454,[],275,[]],
 gl0:function(a){var z=this.RF.Zp
 return z.gB(z)===0},
 gor:function(a){var z=this.RF.Zp
@@ -22569,10 +22835,10 @@
 gB:function(a){var z=this.RF.Zp
 return z.gB(z)},
 BN:[function(a){var z=this.RF
-return z.BN(z)},"call$0","gDx",0,0,390],
+return z.BN(z)},"call$0","gDx",0,0,401],
 nq:[function(a,b){var z=this.RF
-return z.nq(z,b)},"call$1","giA",2,0,null,27,[]],
-ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gAn",6,0,null,253,[],229,[],230,[]],
+return z.nq(z,b)},"call$1","giA",2,0,null,29,[]],
+ct:[function(a,b,c,d){return F.Wi(this.RF,b,c,d)},"call$3","gyWA",6,0,null,256,[],229,[],230,[]],
 k0:[function(a){return},"call$0","gqw",0,0,114],
 ni:[function(a){this.RF.AP=null
 return},"call$0","gl1",0,0,114],
@@ -22591,32 +22857,32 @@
 $isd3:true},
 pt:{
 "^":"wVq;J6,LD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
-gG1:[function(a){return this.LD},null,null,1,0,365,"message",358,359],
-sG1:[function(a,b){this.LD=F.Wi(this,C.h2,this.LD,b)},null,null,3,0,30,28,[],"message",358],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
+gG1:[function(a){return this.LD},null,null,1,0,375,"message",368,369],
+sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",368],
 tM:[function(a,b){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.h2,this.LD,z)
+this.LD=F.Wi(this,C.ch,this.LD,z)
 z="ServiceError "+H.d(this.J6)
 z=this.ct(this,C.YS,this.bN,z)
 this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gYh",2,0,null,151,[]]},
+this.GR=this.ct(this,C.KS,this.GR,z)},"call$1","gci",2,0,null,151,[]]},
 wVq:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd>-369,a4>-389",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":["a;Rd>-379,a4>-400",function(){return[C.Nw]},function(){return[C.Nw]}],
 $isc2:true},
 rj:{
 "^":["dZL;Sw<-82,u9<-82,Gz,J6,Ge,wA,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gtD:[function(a){return this.Gz},null,null,1,0,361,"library",358,359],
-stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,362,28,[],"library",358],
-gfY:[function(a){return this.J6},null,null,1,0,365,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,30,28,[],"kind",358],
+gtD:[function(a){return this.Gz},null,null,1,0,371,"library",368,369],
+stD:[function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},null,null,3,0,372,30,[],"library",368],
+gfY:[function(a){return this.J6},null,null,1,0,375,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",368],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 if(J.de(z.t(b,"type"),"Error")&&J.de(z.t(b,"kind"),"NotFoundError")){N.Jx("").To(z.t(b,"message"))
@@ -22630,7 +22896,7 @@
 this.GR=this.ct(this,C.KS,this.GR,y)
 y=z.t(b,"kind")
 this.J6=F.Wi(this,C.fy,this.J6,y)
-this.W8(z.t(b,"source"))},"call$1","gYh",2,0,null,190,[]],
+this.W8(z.t(b,"source"))},"call$1","gci",2,0,null,190,[]],
 aq:[function(a){var z,y,x,w,v
 if(this.nr)this.xW(0)
 z=J.U6(a)
@@ -22641,7 +22907,7 @@
 if(typeof v!=="number")return H.s(v)
 if(!(w<v))break
 x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},"call$1","gHS",2,0,null,607,[]],
+w+=2}},"call$1","gHS",2,0,null,625,[]],
 W8:[function(a){var z,y,x,w,v
 this.nr=!0
 if(a==null)return
@@ -22653,7 +22919,7 @@
 x.V1(y)
 N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
 for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,32,[]],
+x.h(y,new D.c2(v,z[w]))}},"call$1","gf4",2,0,null,33,[]],
 $isrj:true},
 dZL:{
 "^":"af+Pi;",
@@ -22662,50 +22928,56 @@
 "^":"a;Yu<,Du<,fF<",
 $isN8:true},
 Q4:{
-"^":["Pi;Yu<-369,m7<-389,L4<-389,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
+"^":["Pi;Yu<-379,m7<-400,L4<-400,AP,Lk",function(){return[C.mI]},function(){return[C.mI]},function(){return[C.mI]},null,null],
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,365,"formattedAddress",358],
+return"0x"+y.WZ(z,16)},"call$0","gZd",0,0,375,"formattedAddress",368],
 Io:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
 if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,608,143,[],"formattedInclusive",358],
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"call$1","gcQ",2,0,626,143,[],"formattedInclusive",368],
 HU:[function(a){var z
 if(a==null)return""
 z=J.UQ(a.gyP(),this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,608,143,[],"formattedExclusive",358],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"call$1","gGK",2,0,626,143,[],"formattedExclusive",368],
 $isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Ai",4,0,null,131,[],238,[]]}},
+static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","I9",4,0,null,131,[],241,[]]}},
 WAE:{
 "^":"a;uX",
 bu:[function(a){return this.uX},"call$0","gXo",0,0,null],
-static:{"^":"j6,pg,WAg,PM",CQ:[function(a){var z=J.x(a)
+static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
 if(z.n(a,"Native"))return C.nj
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
+else if(z.n(a,"Tag"))return C.oA
 N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"call$1","J6",2,0,null,91,[]]}},
+throw H.b(P.hS())},"call$1","Ma",2,0,null,91,[]]}},
 Vi:{
 "^":"a;tT>,Av<",
 $isVi:true},
+D5:{
+"^":"a;tT>,Av<,wd>,Jv",
+$isD5:true},
 kx:{
-"^":["w8F;J6,jv,Du@-369,fF@-369,vg@-369,Mb@-369,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,609,"kind",358,359],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,610,28,[],"kind",358],
-glt:[function(){return this.jv},null,null,1,0,512,"totalSamplesInProfile",358,359],
-slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,411,28,[],"totalSamplesInProfile",358],
-gAg:[function(){return this.mM},null,null,1,0,365,"formattedInclusiveTicks",358,359],
-sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,30,28,[],"formattedInclusiveTicks",358],
-ga3:[function(){return this.qH},null,null,1,0,365,"formattedExclusiveTicks",358,359],
-sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,30,28,[],"formattedExclusiveTicks",358],
-gMj:[function(a){return this.MO},null,null,1,0,376,"function",358,359],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,378,28,[],"function",358],
+"^":["w8F;J6,jv,Du@-379,fF@-379,vg@-379,Mb@-379,VS<-82,hw<-82,va<-82,yP<-82,mM,qH,Ni,MO,oc*,zz@,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
+gfY:[function(a){return this.J6},null,null,1,0,627,"kind",368,369],
+sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,628,30,[],"kind",368],
+glt:[function(){return this.jv},null,null,1,0,536,"totalSamplesInProfile",368,369],
+slt:[function(a){this.jv=F.Wi(this,C.QK,this.jv,a)},null,null,3,0,423,30,[],"totalSamplesInProfile",368],
+gAg:[function(){return this.mM},null,null,1,0,375,"formattedInclusiveTicks",368,369],
+sAg:[function(a){this.mM=F.Wi(this,C.EF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",368],
+ga3:[function(){return this.qH},null,null,1,0,375,"formattedExclusiveTicks",368,369],
+sa3:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",368],
+gL1E:[function(){return this.Ni},null,null,1,0,386,"objectPool",368,369],
+sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,388,30,[],"objectPool",368],
+gMj:[function(a){return this.MO},null,null,1,0,386,"function",368,369],
+sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,388,30,[],"function",368],
 PF:[function(){this.jv=F.Wi(this,C.QK,this.jv,0)
 this.Du=0
 this.fF=0
@@ -22727,7 +22999,7 @@
 u=H.BU(z.t(b,x+1),null,null)
 if(v>>>0!==v||v>=c.length)return H.e(c,v)
 y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,611,[],235,[],612,[]],
+x+=2}y.GT(a,new D.fx())},"call$3","goR",6,0,null,629,[],235,[],630,[]],
 eL:[function(a,b,c){var z,y
 this.jv=F.Wi(this,C.QK,this.jv,c)
 z=J.U6(a)
@@ -22739,8 +23011,8 @@
 if(y!=null)this.pd(y)
 z=D.Vb(this.fF,this.jv)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.EF,this.mM,z)
-z=D.Vb(this.Du,this.jv)+" ("+H.d(this.fF)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,613,[],594,[],614,[]],
+z=D.Vb(this.Du,this.jv)+" ("+H.d(this.Du)+")"
+this.qH=F.Wi(this,C.uU,this.qH,z)},"call$3","gI1",6,0,null,631,[],611,[],632,[]],
 tM:[function(a,b){var z,y,x
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
@@ -22752,15 +23024,18 @@
 y=this.Fm
 y=D.Lr(y.zf,y,z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,y)
+y=this.Fm
+y=D.Lr(y.zf,y,z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.xG,this.Ni,y)
 x=z.t(b,"disassembly")
 if(x!=null)this.xs(x)
 z=this.va
 y=J.U6(z)
 this.nr=J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
 z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gYh",2,0,null,190,[]],
-gvS:[function(){return this.TD},null,null,1,0,390,"hasDisassembly",358,359],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,391,28,[],"hasDisassembly",358],
+this.TD=F.Wi(this,C.zS,this.TD,z)},"call$1","gci",2,0,null,190,[]],
+gvS:[function(){return this.TD},null,null,1,0,401,"hasDisassembly",368,369],
+svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,402,30,[],"hasDisassembly",368],
 xs:[function(a){var z,y,x,w,v,u,t,s
 z=this.va
 y=J.w1(z)
@@ -22774,7 +23049,7 @@
 t=x.t(a,w+2)
 s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
 y.h(z,new D.Q4(s,u,t,null,null))
-w+=3}},"call$1","gxk",2,0,null,615,[]],
+w+=3}},"call$1","gxk",2,0,null,633,[]],
 pd:[function(a){var z,y,x,w,v,u
 z=J.U6(a)
 y=this.yP
@@ -22785,117 +23060,49 @@
 if(!(w<v))break
 u=H.BU(z.t(a,w),16,null)
 x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},"call$1","gfi",2,0,null,616,[]],
+w+=3}},"call$1","gfi",2,0,null,634,[]],
 tg:[function(a,b){J.J5(b,this.vg)
-return!1},"call$1","gdj",2,0,null,617,[]],
-QQ:[function(){return this.F3(this.VS)},"call$0","gOh",0,0,null],
+return!1},"call$1","gdj",2,0,null,635,[]],
+QQ:[function(){return this.F3(this.VS)},"call$0","gZzZ",0,0,null],
 dJ:[function(a){return this.Ov(this.VS,a)},"call$1","gf7",2,0,null,143,[]],
 F3:[function(a){var z,y,x
 for(z=J.GP(a),y=0;z.G();){x=z.gl().gAv()
 if(typeof x!=="number")return H.s(x)
-y+=x}return y},"call$1","gh9",2,0,null,611,[]],
+y+=x}return y},"call$1","gh9",2,0,null,629,[]],
 Ov:[function(a,b){var z,y
 for(z=J.GP(a);z.G();){y=z.gl()
-if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,611,[],143,[]],
+if(J.de(J.on(y),b))return y.gAv()}return 0},"call$2","gHp",4,0,null,629,[],143,[]],
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],238,[]]}},
+static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"call$2","Mr",4,0,null,131,[],241,[]]}},
 w8F:{
 "^":"af+Pi;",
 $isd3:true},
 fx:{
-"^":"Tp:348;",
+"^":"Tp:358;",
 call$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"call$2",null,4,0,null,131,[],187,[],"call"],
 $isEH:true},
-af:{
-"^":"Pi;bN@,GR@",
-gF1:[function(a){return this.Fm},null,null,1,0,357,"isolate",358],
-gzf:[function(){return this.Fm.zf},null,null,1,0,618,"vm",358],
-gPj:[function(a){var z,y
-z=this.Fm
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,365,"link",358],
-gHP:[function(){var z,y
-z=this.Fm
-y=this.KG
-return"#/"+(H.d(z.KG)+"/"+H.d(y))},null,null,1,0,365,"hashLink",358],
-gjO:[function(a){return this.KG},null,null,1,0,365,"id",358],
-gzS:[function(){return this.mQ},null,null,1,0,365,"serviceType",358],
-goc:[function(a){return this.gbN()},null,null,1,0,365,"name",358,359],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,30,28,[],"name",358],
-gzz:[function(){return this.gGR()},null,null,1,0,365,"vmName",358,359],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,30,28,[],"vmName",358],
-xW:[function(a){if(!this.nr)return P.Ab(this,null)
-return this.VD(0)},"call$0","gnB",0,0,null],
-VD:[function(a){if(J.de(this.KG,""))return P.Ab(this,null)
-return this.Fm.zf.jU(this.gPj(this)).ml(this.gpn())},"call$0","gQU",0,0,null],
-eC:[function(a){var z=J.U6(a)
-if(J.de(z.t(a,"type"),"Error")&&!J.de(this.mQ,"Error"))return D.Lr(this.gzf(),this.Fm,a)
-this.KG=z.t(a,"id")
-this.mQ=D.Io(z.t(a,"type"))
-this.tM(0,a)
-return this},"call$1","gpn",2,0,619,190,[]],
-DC:[function(a){var z=this.nr?" Created from reference.":""
-N.Jx("").To("Created ServiceObject for '"+H.d(this.KG)+"' with type '"+H.d(this.mQ)+"'."+z)},"call$0","gEX",0,0,null],
-H4:function(a,b){var z=J.U6(b)
-this.KG=z.t(b,"id")
-this.nr=J.co(z.t(b,"type"),"@")
-this.mQ=D.Io(z.t(b,"type"))
-this.DC(0)
-this.eC(b)}},
 UZ:{
-"^":"Tp:348;a,b,c",
+"^":"Tp:358;a,b,c",
 call$2:[function(a,b){var z,y
 z=J.x(b)
-y=typeof b==="object"&&b!==null&&!!z.$isqC
+y=!!z.$isqC
 if(y&&D.Er(b))this.a.u(0,a,D.Lr(this.b,this.c,b))
-else if(typeof b==="object"&&b!==null&&!!z.$iswn)D.f3(b,this.b,this.c)
-else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,442,[],272,[],"call"],
-$isEH:true},
-No:{
-"^":["d3;tl@-504",function(){return[C.Nw]}],
-gi2:[function(a){return this.tl},null,null,1,0,505,"isolates",358],
-pC:[function(){var z,y
-z=J.O
-y=D.bv
-y=new D.Qd(this,H.VM(new V.qC(P.Py(null,null,null,z,y),null,null),[z,y]),null,"isolates","IsolateList",null,null,null,null,null)
-y.nr=C.xB.nC("IsolateList","@")
-y.mQ=D.Io("IsolateList")
-y.DC(0)
-z=y.ct(y,C.YS,y.bN,"IsolateList")
-y.bN=z
-y.GR=y.ct(y,C.KS,y.GR,z)
-this.tl=y},"call$0","gWR",0,0,null],
-jU:[function(a){return this.z6(0,a).ml(new D.Ey(a)).OA(new D.tm())},"call$1","gGp",2,0,null,279,[]]},
-Ey:{
-"^":"Tp:112;a",
-call$1:[function(a){var z,y,x,w
-try{z=C.xr.kV(a)
-N.Jx("").To("Decoded "+H.d(this.a))
-x=R.Jk(z)
-return x}catch(w){x=H.Ru(w)
-y=x
-x=H.B7(["type","Error","id","","kind","DecodeError","message",H.d(y)],P.L5(null,null,null,null,null))
-x=R.Jk(x)
-return x}},"call$1",null,2,0,null,497,[],"call"],
-$isEH:true},
-tm:{
-"^":"Tp:112;",
-call$1:[function(a){var z=H.B7(["type","Error","id","","kind","LastResort","message",H.d(a)],P.L5(null,null,null,null,null))
-return R.Jk(z)},"call$1",null,2,0,null,159,[],"call"],
+else if(!!z.$iswn)D.f3(b,this.b,this.c)
+else if(y)D.Gf(b,this.b,this.c)},"call$2",null,4,0,null,454,[],275,[],"call"],
 $isEH:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":["No;Yu<,tl-504,R9,wv,V2,me",null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;Yu<,tl-523,AP,Lk",null,function(){return[C.Nw]},null,null],
 z6:[function(a,b){var z=this.Yu
 N.Jx("").To("Fetching "+H.d(b)+" from "+z)
-return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,279,[]]},
+return W.It(C.xB.g(z,b),null,null).OA(new U.dT())},"call$1","gpV",2,0,null,281,[]]},
 dT:{
 "^":"Tp:112;",
 call$1:[function(a){N.Jx("").hh("HttpRequest.getString failed.")
 return C.xr.KP(H.B7(["type","Error","id","","kind","NetworkError","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pin-isolates"],P.L5(null,null,null,null,null)))},"call$1",null,2,0,null,159,[],"call"],
 $isEH:true},
 ho:{
-"^":["No;ja,yb,tl-504,R9,wv,V2,me",null,null,function(){return[C.Nw]},null,null,null,null],
+"^":["pa;ja,yb,tl-523,AP,Lk",null,null,function(){return[C.Nw]},null,null],
 bI:[function(a){var z,y,x,w,v
 z=J.RE(a)
 y=J.UQ(z.gRn(a),"id")
@@ -22905,7 +23112,7 @@
 z=this.ja
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"call$1","gVx",2,0,157,20,[]],
+J.Xf(v,w)},"call$1","gVx",2,0,157,22,[]],
 z6:[function(a,b){var z,y,x
 z=""+this.yb
 y=H.B7([],P.L5(null,null,null,null,null))
@@ -22916,15 +23123,15 @@
 x=H.VM(new P.Zf(P.Dt(null)),[null])
 this.ja.u(0,z,x)
 J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},"call$1","gpV",2,0,null,261,[]],
+return x.MM},"call$1","gpV",2,0,null,264,[]],
 PI:function(){var z=C.Ns.aM(window)
 H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
 N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
 ob:{
-"^":["V22;mC%-381,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,361,"object",358,377],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,362,28,[],"object",358],
+"^":["V25;mC%-391,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gWA:[function(a){return a.mC},null,null,1,0,371,"object",368,387],
+sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,372,30,[],"object",368],
 hu:[function(a){var z
 switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
 J.CJ(z,a.mC)
@@ -22933,7 +23140,7 @@
 J.X8(z,a.mC)
 return z
 case"Class":z=W.r3("class-view",null)
-J.QQ(z,a.mC)
+J.At(z,a.mC)
 return z
 case"Code":z=W.r3("code-view",null)
 J.fH(z,a.mC)
@@ -22947,9 +23154,15 @@
 case"Function":z=W.r3("function-view",null)
 J.dk(z,a.mC)
 return z
+case"HeapMap":z=W.r3("heap-map",null)
+J.Nf(z,a.mC)
+return z
 case"Array":case"Bool":case"Closure":case"GrowableObjectArray":case"Instance":case"Smi":case"String":z=W.r3("instance-view",null)
 J.ti(z,a.mC)
 return z
+case"Isolate":z=W.r3("isolate-view",null)
+J.kq(z,a.mC)
+return z
 case"IsolateList":z=W.r3("isolate-list",null)
 J.oq(z,a.mC)
 return z
@@ -22965,7 +23178,7 @@
 case"StackTrace":z=W.r3("stack-trace",null)
 J.yO(z,a.mC)
 return z
-default:return}},"call$0","gbs",0,0,620,"_constructElementForObject"],
+default:return}},"call$0","gbs",0,0,636,"_constructElementForObject"],
 fa:[function(a,b){var z,y,x
 a.textContent=""
 z=a.mC
@@ -22988,32 +23201,32 @@
 C.ZO.ZL(a)
 C.ZO.G6(a)
 return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[621],
-V22:{
+"+ServiceObjectViewElement":[637],
+V25:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Ds;tY%-381,Pe%-382,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,361,"ref",358,377],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,362,28,[],"ref",358],
-gjT:[function(a){return a.Pe},null,null,1,0,390,"internal",358,377],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,391,28,[],"internal",358],
+"^":["pv;tY%-391,Pe%-392,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gnv:[function(a){return a.tY},null,null,1,0,371,"ref",368,387],
+snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,372,30,[],"ref",368],
+gjT:[function(a){return a.Pe},null,null,1,0,401,"internal",368,387],
+sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,402,30,[],"internal",368],
 aZ:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.bA,"",this.gD5(a))},"call$1","gma",2,0,157,229,[],"refChanged"],
+this.ct(a,C.bA,"",this.gD5(a))},"call$1","gLe",2,0,157,229,[],"refChanged"],
 gO3:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,365,"url"],
+return z.gHP()},null,null,1,0,375,"url"],
 gOL:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,365,"serviceId"],
+return J.F8(z)},null,null,1,0,375,"serviceId"],
 gD5:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,365,"hoverText"],
+return z.gzz()},null,null,1,0,375,"hoverText"],
 goc:[function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,365,"name"],
+return J.O6(z)},null,null,1,0,375,"name"],
 "@":function(){return[C.JD]},
 static:{lK:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23028,15 +23241,43 @@
 C.wU.ZL(a)
 C.wU.G6(a)
 return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[622],
-Ds:{
+"+ServiceRefElement":[638],
+pv:{
 "^":"uL+Pi;",
+$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
+"^":"",
+Uj:{
+"^":["Nr;kF%-392,IK%-400,No%-400,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gTq:[function(a){return a.kF},null,null,1,0,401,"checked",368,387],
+sTq:[function(a,b){a.kF=this.ct(a,C.bk,a.kF,b)},null,null,3,0,402,30,[],"checked",368],
+gEu:[function(a){return a.IK},null,null,1,0,375,"checkedText",368,387],
+sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",368],
+gRY:[function(a){return a.No},null,null,1,0,375,"uncheckedText",368,387],
+sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",368],
+oe:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.kF=this.ct(a,C.bk,a.kF,z)},"call$3","gR7",6,0,404,21,[],639,[],79,[],"change"],
+"@":function(){return[C.mS]},
+static:{Al:[function(a){var z,y,x,w
+z=$.Nd()
+y=P.Py(null,null,null,J.O,W.I0)
+x=J.O
+w=W.cv
+w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+a.SO=z
+a.B7=y
+a.X0=w
+C.fA.ZL(a)
+C.fA.G6(a)
+return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
+"+SlidingCheckboxElement":[640],
+Nr:{
+"^":"ir+Pi;",
 $isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
 "^":"",
 nm:{
-"^":["V23;Va%-623,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.Va},null,null,1,0,600,"frame",358,377],
-sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,601,28,[],"frame",358],
+"^":["V26;Va%-641,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gz1:[function(a){return a.Va},null,null,1,0,618,"frame",368,387],
+sz1:[function(a,b){a.Va=this.ct(a,C.rE,a.Va,b)},null,null,3,0,619,30,[],"frame",368],
 "@":function(){return[C.pE]},
 static:{an:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23050,16 +23291,16 @@
 C.dX.ZL(a)
 C.dX.G6(a)
 return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[624],
-V23:{
+"+StackFrameElement":[642],
+V26:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
 Vu:{
-"^":["V24;B3%-374,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-375",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,376,"trace",358,377],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,378,28,[],"trace",358],
-yv:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,379,[],"refresh"],
+"^":["V27;B3%-384,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0-385",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
+gtN:[function(a){return a.B3},null,null,1,0,386,"trace",368,387],
+stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,388,30,[],"trace",368],
+pA:[function(a,b){J.am(a.B3).YM(b)},"call$1","gvC",2,0,157,389,[],"refresh"],
 "@":function(){return[C.js]},
 static:{bV:[function(a){var z,y,x,w
 z=$.Nd()
@@ -23073,20 +23314,20 @@
 C.bg.ZL(a)
 C.bg.G6(a)
 return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[625],
-V24:{
+"+StackTraceElement":[643],
+V27:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQl)return C.i3.f0(a)
+IP:[function(a){var z=J.x(a)
+if(!!z.$isQl)return C.i3.f0(a)
 switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
 case"radio":case"select-multiple":case"select-one":return z.gi9(a)
 default:return z.gLm(a)}},"call$1","nc",2,0,null,132,[]],
 iX:[function(a,b){var z,y,x,w,v,u,t,s
 z=M.pN(a,b)
 y=J.x(a)
-if(typeof a==="object"&&a!==null&&!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
+if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
 else x=!0
 else x=!1
 w=x?a:null
@@ -23094,7 +23335,7 @@
 if(s==null)continue
 if(u==null)u=P.Py(null,null,null,null,null)
 u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,260,[],283,[]],
+return new M.K6(z,u,w,t)},"call$2","Nc",4,0,null,263,[],285,[]],
 HP:[function(a,b,c,d,e){var z,y,x
 if(b==null)return
 if(b.gN2()!=null){z=b.gN2()
@@ -23104,16 +23345,16 @@
 if(z.gwd(b)==null)return
 y=b.gTe()-a.childNodes.length
 for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,260,[],151,[],284,[],283,[],285,[]],
+M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"call$5","Yy",10,0,null,263,[],151,[],286,[],285,[],287,[]],
 bM:[function(a){var z
 for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(typeof a==="object"&&a!==null&&!!z.$isQF||typeof a==="object"&&a!==null&&!!z.$isI0||typeof a==="object"&&a!==null&&!!z.$ishy)return a
-return},"call$1","ay",2,0,null,260,[]],
+if(!!z.$isQF||!!z.$isI0||!!z.$ishy)return a
+return},"call$1","ay",2,0,null,263,[]],
 pN:[function(a,b){var z,y
 z=J.x(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)return M.F5(a,b)
-if(typeof a==="object"&&a!==null&&!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"call$2","SG",4,0,null,260,[],283,[]],
+if(!!z.$iscv)return M.F5(a,b)
+if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
+if(y!=null)return["text",y]}return},"call$2","vw",4,0,null,263,[],285,[]],
 F5:[function(a,b){var z,y,x
 z={}
 z.a=null
@@ -23124,9 +23365,9 @@
 if(y==null){x=[]
 z.a=x
 y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","OT",4,0,null,132,[],283,[]],
+y.push(M.F4("{{}}","bind",a,b))}return z.a},"call$2","wP",4,0,null,132,[],285,[]],
 Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=J.x(b),x=typeof b==="object"&&b!==null&&!!x.$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
+for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
 u=z.t(a,w+1)
 t=u.gEJ()
 if(1>=t.length)return H.e(t,1)
@@ -23154,7 +23395,7 @@
 t.push(L.ao(j,l,null))}o.wE(0)
 p=o
 s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"call$4","S5",6,2,null,82,290,[],260,[],284,[],285,[]],
+if(y)d.push(i)}},"call$4","S5",6,2,null,82,292,[],263,[],286,[],287,[]],
 F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
 z=a.length
 if(z===0)return
@@ -23172,30 +23413,30 @@
 v=t+2}if(v===z)w.push("")
 z=new M.HS(w,null)
 z.Yn(w)
-return z},"call$4","tE",8,0,null,91,[],12,[],260,[],283,[]],
+return z},"call$4","jF",8,0,null,91,[],12,[],263,[],285,[]],
 SH:[function(a,b){var z,y
 z=a.firstChild
 if(z==null)return
 y=new M.yp(z,a.lastChild,b)
 for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"call$2","St",4,0,null,207,[],284,[]],
+z=z.nextSibling}},"call$2","KQ",4,0,null,207,[],286,[]],
 Ky:[function(a){var z,y,x,w
 z=$.rw()
 z.toString
 y=H.of(a,"expando$values")
 x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
-w=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!w.$isMi)x=new M.ee(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$islp)x=new M.ug(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$isAE)x=new M.wl(a,null,null)
-else if(typeof a==="object"&&a!==null&&!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+w=J.x(a)
+if(!!w.$isMi)x=new M.ee(a,null,null)
+else if(!!w.$islp)x=new M.ug(a,null,null)
+else if(!!w.$isAE)x=new M.wl(a,null,null)
+else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=typeof a==="object"&&a!==null&&!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
 z.u(0,a,x)
-return x},"call$1","La",2,0,null,260,[]],
-wR:[function(a){var z=J.RE(a)
-if(typeof a==="object"&&a!==null&&!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},"call$1","La",2,0,null,263,[]],
+wR:[function(a){var z=J.x(a)
+if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
 else z=!0
 else z=!1
 return z},"call$1","xS",2,0,null,198,[]],
@@ -23203,9 +23444,7 @@
 "^":"TU;N1,mD,Ck",
 Z1:[function(a,b,c,d){var z,y,x,w,v
 J.MV(this.glN(),b)
-z=this.gN1()
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isQl&&J.de(b,"value")
+z=!!J.x(this.gN1()).$isQl&&J.de(b,"value")
 y=this.gN1()
 if(z){H.Go(y,"$isQl")
 y.toString
@@ -23221,29 +23460,29 @@
 z=d!=null?d:""
 x=new M.D8(w,y,c,null,null,v,z)
 x.Og(y,v,c,d)}this.gCd(this).u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 D8:{
 "^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z,y
 if(this.Y0){z=null!=a&&!1!==a
 y=this.eS
 if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
 else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
 y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,28,[]]},
+z.MW.setAttribute(this.eS,y)}},"call$1","gH0",2,0,null,30,[]]},
 zP:{
 "^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
 gH:function(){return M.NP.prototype.gH.call(this)},
-EC:[function(a){var z,y,x,w,v,u
+EC:[function(a){var z,y,x,w,v
 z=J.u3(M.NP.prototype.gH.call(this))
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-w=J.x(x)
-if(typeof x==="object"&&x!==null&&!!w.$isSA){v=z.value
-u=x}else{v=null
-u=null}}else{v=null
-u=null}M.NP.prototype.EC.call(this,a)
-if(u!=null&&u.gqP()!=null&&!J.de(y.gP(z),v))u.FC(null)},"call$1","gH0",2,0,null,230,[]]},
+y=J.x(z)
+if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
+if(!!J.x(x).$isSA){w=z.value
+v=x}else{w=null
+v=null}}else{w=null
+v=null}M.NP.prototype.EC.call(this,a)
+if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)},"call$1","gH0",2,0,null,230,[]]},
 H2:{
 "^":"TR;",
 cO:[function(a){if(this.qP==null)return
@@ -23268,11 +23507,11 @@
 $isEH:true},
 fTP:{
 "^":"Tp:112;a",
-call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.a.push(C.pi)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 ppY:{
 "^":"Tp:112;b",
-call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,19,[],"call"],
+call$1:[function(a){this.b.push(C.mt)},"call$1",null,2,0,null,21,[],"call"],
 $isEH:true},
 NP:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
@@ -23281,20 +23520,18 @@
 J.ta(z,a==null?"":H.d(a))},"call$1","gH0",2,0,null,230,[]],
 FC:[function(a){var z=J.Vm(this.gH())
 J.ta(this.xS,z)
-O.Y3()},"call$1","gqf",2,0,157,19,[]]},
+O.Y3()},"call$1","gqf",2,0,157,21,[]]},
 jt:{
 "^":"H2;Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z=X.TR.prototype.gH.call(this)
 J.rP(z,null!=a&&!1!==a)},"call$1","gH0",2,0,null,230,[]],
-FC:[function(a){var z,y,x,w
+FC:[function(a){var z,y,x
 z=J.Hf(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)
-z=X.TR.prototype.gH.call(this)
-y=J.x(z)
-if(typeof z==="object"&&z!==null&&!!y.$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){x=z.gl()
-y=J.x(x)
-w=J.UQ(J.QE(typeof x==="object"&&x!==null&&!!y.$isTU?x:M.Ky(x)),"checked")
-if(w!=null)J.ta(w,!1)}O.Y3()},"call$1","gqf",2,0,157,19,[]],
+if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
+x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
+if(x!=null)J.ta(x,!1)}O.Y3()},"call$1","gqf",2,0,157,21,[]],
 static:{kv:[function(a){var z,y,x
 z=J.RE(a)
 if(z.gMB(a)!=null){z=z.gMB(a)
@@ -23309,20 +23546,21 @@
 call$1:[function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(typeof a==="object"&&a!==null&&!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
 z=J.O6(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"call$1",null,2,0,null,287,[],"call"],
+return z},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 jz:{
 "^":"Tp:112;b",
 call$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,287,[],"call"],
+return!z.n(a,this.b)&&z.gMB(a)==null},"call$1",null,2,0,null,289,[],"call"],
 $isEH:true},
 SA:{
 "^":"H2;Dh,Ca,qP,ZY,xS,PB,eS,ay",
+gH:function(){return X.TR.prototype.gH.call(this)},
 EC:[function(a){var z
 this.C7()
 if(this.Gh(a)===!0)return
@@ -23347,14 +23585,14 @@
 y=J.x(z)
 if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
 J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"call$1","gqf",2,0,157,19,[]],
+J.ta(this.xS,z)}},"call$1","gqf",2,0,157,21,[]],
 $isSA:true,
 static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,28,[]]}},
+return typeof a==="number"&&Math.floor(a)===a?a:0},"call$1","v7",2,0,null,30,[]]}},
 hB:{
-"^":"Tp:348;a",
+"^":"Tp:358;a",
 call$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,26,[],626,[],"call"],
+if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"call$2",null,4,0,null,28,[],644,[],"call"],
 $isEH:true},
 nv:{
 "^":"Tp:112;",
@@ -23367,8 +23605,7 @@
 z=J.x(b)
 if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 y=this.gN1()
-x=J.x(y)
-J.MV(typeof y==="object"&&y!==null&&!!x.$isTU?y:this,b)
+J.MV(!!J.x(y).$isTU?y:this,b)
 J.Vs(this.N1).Rz(0,b)
 y=this.gCd(this)
 if(z.n(b,"value")){z=this.N1
@@ -23382,7 +23619,7 @@
 x.Og(z,"checked",c,d)
 x.Ca=M.IP(z).yI(x.gqf())
 z=x}y.u(0,b,z)
-return z},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return z},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 K6:{
 "^":"a;Cd>,wd>,N2<,Te<"},
 TU:{
@@ -23392,7 +23629,7 @@
 z=$.pl()
 y="Unhandled binding to Node: "+H.d(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
 z.toString
-if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+if(typeof console!="undefined")console.error(y)},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 if(this.mD==null)return
 z=this.gCd(this).Rz(0,b)
@@ -23404,10 +23641,8 @@
 gCd:function(a){var z=this.mD
 if(z==null){z=P.L5(null,null,null,J.O,X.TR)
 this.mD=z}return z},
-glN:function(){var z,y
-z=this.gN1()
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isTU?z:this},
+glN:function(){var z=this.gN1()
+return!!J.x(z).$isTU?z:this},
 $isTU:true},
 yp:{
 "^":"a;KO,qW,k8<"},
@@ -23419,24 +23654,20 @@
 z=J.x(b)
 if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.SA(null,null,x,c,null,null,b,y)
-y.Og(x,b,c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+y=this.N1
+x=d!=null?d:""
+x=new M.SA(null,null,y,c,null,null,b,x)
+x.Og(y,b,c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 DT:{
 "^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
 gN1:function(){return this.N1},
-glN:function(){var z,y
-z=this.N1
-y=J.x(z)
-return typeof z==="object"&&z!==null&&!!y.$isDT?this.N1:this},
+glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
 Z1:[function(a,b,c,d){var z
 d=d!=null?d:""
 z=this.kr
@@ -23462,7 +23693,7 @@
 z=new M.p8(this,c,b,d)
 this.gCd(this).u(0,b,z)
 return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]],
+default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]],
 Ih:[function(a,b){var z
 switch(b){case"bind":z=this.kr
 if(z==null)return
@@ -23495,32 +23726,30 @@
 P.rb(z.gjM())}},"call$0","geB",0,0,null],
 a5:[function(a,b,c){var z,y,x,w,v,u,t
 z=this.gnv(this)
-y=J.x(z)
-z=typeof z==="object"&&z!==null&&!!y.$isTU?z:M.Ky(z)
-x=J.nX(z)
-w=z.gdv()
-if(w==null){w=M.iX(x,b)
-z.sdv(w)}y=this.IT
-if(y==null){v=J.VN(this.N1)
-y=$.JM()
-u=y.t(0,v)
+z=!!J.x(z).$isTU?z:M.Ky(z)
+y=J.nX(z)
+x=z.gdv()
+if(x==null){x=M.iX(y,b)
+z.sdv(x)}w=this.IT
+if(w==null){v=J.VN(this.N1)
+w=$.JM()
+u=w.t(0,v)
 if(u==null){u=v.implementation.createHTMLDocument("")
-y.u(0,v,u)}this.IT=u
-y=u}t=M.Fz(x,y)
-M.HP(t,w,a,b,c)
+w.u(0,v,u)}this.IT=u
+w=u}t=M.Fz(y,w)
+M.HP(t,x,a,b,c)
 M.SH(t,a)
-return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,284,[],283,[],285,[]],
+return t},function(a,b){return this.a5(a,b,null)},"ZK","call$3",null,"gmJ",0,6,null,82,82,82,286,[],285,[],287,[]],
 gk8:function(){return this.lr},
 gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w,v
+gnv:function(a){var z,y,x,w
 this.Sy()
 z=J.Vs(this.N1).MW.getAttribute("ref")
 if(z!=null){y=M.bM(this.N1)
 x=y!=null?J.K3(y,z):null}else x=null
 if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.x(x)
-v=J.IS(typeof x==="object"&&x!==null&&!!w.$isTU?x:M.Ky(x))
-return v!=null?v:x},
+if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
+return w!=null?w:x},
 gjb:function(a){var z
 this.Sy()
 z=this.jH
@@ -23529,43 +23758,38 @@
 if(this.mj===!0)return!1
 M.oR()
 this.mj=!0
-z=this.N1
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
-w=!x
-if(w){z=this.N1
-y=J.RE(z)
-z=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0}else z=!1
-if(z){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
+z=!!J.x(this.N1).$isyY
+y=!z
+if(y){x=this.N1
+w=J.RE(x)
+x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
+if(x){if(a!=null)throw H.b(new P.AT("instanceRef should not be supplied for attribute templates."))
 v=M.eX(this.N1)
-z=J.x(v)
-v=typeof v==="object"&&v!==null&&!!z.$isTU?v:M.Ky(v)
+v=!!J.x(v).$isTU?v:M.Ky(v)
 v.smj(!0)
-z=v.gN1()
-y=J.x(z)
-x=typeof z==="object"&&z!==null&&!!y.$isyY
+z=!!J.x(v.gN1()).$isyY
 u=!0}else{v=this
-u=!1}if(!x)v.sjH(J.bs(M.TA(v.gN1())))
+u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
 if(a!=null)v.sQO(a)
-else if(w)M.KE(v,this.N1,u)
+else if(y)M.KE(v,this.N1,u)
 else M.GM(J.nX(v))
-return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,627,[]],
+return!0},function(){return this.wh(null)},"Sy","call$1",null,"ga6",0,2,null,82,645,[]],
 $isDT:true,
 static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
 z=J.Lh(b,a,!1)
-y=J.RE(z)
-if(typeof z==="object"&&z!==null&&!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
+y=J.x(z)
+if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
 else y=!0
 else y=!1
 if(y)return z
 for(x=J.cO(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"call$2","G0",4,0,null,260,[],286,[]],TA:[function(a){var z,y,x,w
+return z},"call$2","G0",4,0,null,263,[],288,[]],TA:[function(a){var z,y,x,w
 z=J.VN(a)
 if(W.Pv(z.defaultView)==null)return z
 y=$.LQ().t(0,z)
 if(y==null){y=z.implementation.createHTMLDocument("")
 for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","nt",2,0,null,257,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},"call$1","lA",2,0,null,260,[]],eX:[function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
 z.gKV(a).insertBefore(y,a)
@@ -23580,38 +23804,37 @@
 v.removeAttribute(w)
 y.setAttribute(w,u)
 break
-default:}}return y},"call$1","Bw",2,0,null,287,[]],KE:[function(a,b,c){var z,y,x,w
+default:}}return y},"call$1","Bw",2,0,null,289,[]],KE:[function(a,b,c){var z,y,x,w
 z=J.nX(a)
 if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,257,[],287,[],288,[]],GM:[function(a){var z,y
+return}for(y=J.RE(b),x=J.RE(z);w=y.gq6(b),w!=null;)x.jx(z,w)},"call$3","BZ",6,0,null,260,[],289,[],290,[]],GM:[function(a){var z,y
 z=new M.OB()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.call$1(a)
-y.aN(y,z)},"call$1","DR",2,0,null,289,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},"call$1","DR",2,0,null,291,[]],oR:[function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
 J.c9(z,H.d($.cz())+" { display: none; }")
 document.head.appendChild(z)},"call$0","Lv",0,0,null]}},
 OB:{
 "^":"Tp:157;",
-call$1:[function(a){var z
-if(!M.Ky(a).wh(null)){z=J.x(a)
-M.GM(J.nX(typeof a==="object"&&a!==null&&!!z.$isTU?a:M.Ky(a)))}},"call$1",null,2,0,null,257,[],"call"],
+call$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.nX(!!J.x(a).$isTU?a:M.Ky(a)))},"call$1",null,2,0,null,260,[],"call"],
 $isEH:true},
 Uf:{
 "^":"Tp:112;",
-call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,442,[],"call"],
+call$1:[function(a){return H.d(a)+"[template]"},"call$1",null,2,0,null,454,[],"call"],
 $isEH:true},
 p8:{
 "^":"a;ud,lr,eS,ay",
+gH:function(){var z=this.ud
+z.toString
+return z.N1},
 gk8:function(){return this.lr},
 gP:function(a){return J.Vm(this.gND())},
 r6:function(a,b){return this.gP(this).call$1(b)},
 sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z,y
-z=this.lr
-y=J.x(z)
-if((typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(this.ay,"value"))return this.lr
+gND:function(){var z=J.x(this.lr)
+if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
 return L.ao(this.lr,this.ay,null)},
 cO:[function(a){var z=this.ud
 if(z==null)return
@@ -23620,7 +23843,7 @@
 this.ud=null},"call$0","gJK",0,0,null],
 $isTR:true},
 NW:{
-"^":"Tp:348;a,b,c,d",
+"^":"Tp:358;a,b,c,d",
 call$2:[function(a,b){var z,y,x,w
 for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
 if(this.d)if(z.n(a,"if")){this.a.b=!0
@@ -23632,7 +23855,7 @@
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"call$2",null,4,0,null,12,[],28,[],"call"],
+z.push(y)}},"call$2",null,4,0,null,12,[],30,[],"call"],
 $isEH:true},
 HS:{
 "^":"a;EJ<,bX",
@@ -23651,8 +23874,8 @@
 if(0>=z.length)return H.e(z,0)
 y=H.d(z[0])+H.d(a)
 if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"call$1","gBg",2,0,628,28,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
+return y+H.d(z[3])},"call$1","gBg",2,0,646,30,[]],
+CV:[function(a){var z,y,x,w,v,u,t
 z=this.EJ
 if(0>=z.length)return H.e(z,0)
 y=P.p9(z[0])
@@ -23662,7 +23885,7 @@
 if(t>=z.length)return H.e(z,t)
 u=z[t]
 u=typeof u==="string"?u:H.d(u)
-y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,629,630,[]],
+y.vM=y.vM+u}return y.vM},"call$1","gqD",2,0,647,648,[]],
 Yn:function(a){this.bX=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
 "^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
@@ -23687,11 +23910,11 @@
 Az:[function(a){var z,y,x,w
 z=this.xG
 this.Gb()
-y=J.w1(a)
-if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isList)){this.xG=a
-x=a}else if(typeof a==="object"&&a!==null&&(a.constructor===Array||!!y.$isQV)){x=y.br(a)
+y=J.x(a)
+if(!!y.$isList){this.xG=a
+x=a}else if(!!y.$isQV){x=y.br(a)
 this.xG=x}else{this.xG=null
-x=null}if(x!=null&&typeof a==="object"&&a!==null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
+x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
 y=z!=null?z:[]
 x=this.xG
 x=x!=null?x:[]
@@ -23709,7 +23932,7 @@
 if(z)return x
 w=M.Ky(x).gkr()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gzt",2,0,null,52,[]],
+return w.wx(C.jn.cU(w.YC.length,2)-1)},"call$1","gVv",2,0,null,15,[]],
 lP:[function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
 y=this.wx(z.W(a,1))
@@ -23722,7 +23945,7 @@
 v=J.TZ(this.e9.N1)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,52,[],207,[],631,[],285,[]],
+else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},"call$4","gaF",8,0,null,15,[],207,[],649,[],287,[]],
 MC:[function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
@@ -23739,35 +23962,33 @@
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,52,[]],
+z.push(s)}return new M.Ya(z,t)},"call$1","gtx",2,0,null,15,[]],
 El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
 if(this.pq)return
 z=this.e9
 y=z.N1
-x=z.N1
-w=J.x(x)
-v=(typeof x==="object"&&x!==null&&!!w.$isDT?z.N1:z).gzH()
-x=J.RE(y)
-if(x.gKV(y)==null||W.Pv(x.gM0(y).defaultView)==null){this.cO(0)
+x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
+w=J.RE(y)
+if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
 return}if(!this.U9){this.U9=!0
-if(v!=null){this.DO=v.CE(y)
-this.Fy=null}}u=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(x=J.w1(a),w=x.gA(a),t=0;w.G();){s=w.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)u.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
+if(x!=null){this.DO=x.CE(y)
+this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
+for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
+for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
 r=s.gNg()
 if(typeof r!=="number")return H.s(r)
-t-=r}for(x=x.gA(a);x.G();){s=x.gl()
-for(w=J.RE(s),p=w.gvH(s);r=J.Wx(p),r.C(p,J.WB(w.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=u.Rz(0,o)
+t-=r}for(w=w.gA(a);w.G();){s=w.gl()
+for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
+n=v.Rz(0,o)
 if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
 m=q.gkU(n)
 l=q.gyT(n)
 k=null}else{m=[]
 if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,v,m):null
-l=null}this.lP(p,k,l,m)}}for(z=u.gUQ(u),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,632,251,[]],
+k=o!=null?z.a5(o,x,m):null
+l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"call$1","gZX",2,0,650,254,[]],
 uS:[function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,285,[]],
+for(z=J.GP(a);z.G();)J.wC(z.gl())},"call$1","gYl",2,0,null,287,[]],
 Gb:[function(){var z=this.IY
 if(z==null)return
 z.ed()
@@ -23783,20 +24004,20 @@
 this.pq=!0},"call$0","gJK",0,0,null]},
 VU:{
 "^":"Tp:112;",
-call$1:[function(a){return[a]},"call$1",null,2,0,null,26,[],"call"],
+call$1:[function(a){return[a]},"call$1",null,2,0,null,28,[],"call"],
 $isEH:true},
 Kj:{
-"^":"Tp:633;a",
+"^":"Tp:651;a",
 call$1:[function(a){var z,y,x
 z=J.U6(a)
 y=z.t(a,0)
 x=z.t(a,1)
 if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"call$1",null,2,0,null,630,[],"call"],
+return this.a?y:[y]},"call$1",null,2,0,null,648,[],"call"],
 $isEH:true},
 R7:{
 "^":"Tp:112;b",
-call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,392,[],"call"],
+call$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true},
 Ya:{
 "^":"a;yT>,kU>",
@@ -23812,7 +24033,7 @@
 x=new M.ic(y,c,null,null,"text",x)
 x.Og(y,"text",c,d)
 z.u(0,b,x)
-return x},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]},
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]},
 ic:{
 "^":"TR;qP,ZY,xS,PB,eS,ay",
 EC:[function(a){var z=this.qP
@@ -23823,17 +24044,16 @@
 Z1:[function(a,b,c,d){var z,y,x
 if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
 z=this.gN1()
-y=J.x(z)
-J.MV(typeof z==="object"&&z!==null&&!!y.$isTU?z:this,b)
+J.MV(!!J.x(z).$isTU?z:this,b)
 J.Vs(this.N1).Rz(0,b)
 z=this.gCd(this)
-x=this.N1
-y=d!=null?d:""
-y=new M.NP(null,x,c,null,null,"value",y)
-y.Og(x,"value",c,d)
-y.Ca=M.IP(x).yI(y.gqf())
-z.u(0,b,y)
-return y},"call$3","gxfG",4,2,null,82,12,[],284,[],261,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
+y=this.N1
+x=d!=null?d:""
+x=new M.NP(null,y,c,null,null,"value",x)
+x.Og(y,"value",c,d)
+x.Ca=M.IP(y).yI(x.gqf())
+z.u(0,b,x)
+return x},"call$3","gxfG",4,2,null,82,12,[],286,[],264,[]]}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
 ve:{
 "^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
@@ -23854,9 +24074,8 @@
 this.qP=null
 this.ZY=null},"call$0","gJK",0,0,null],
 Og:function(a,b,c,d){var z,y
-z=this.ZY
-y=J.x(z)
-z=(typeof z==="object"&&z!==null&&!!y.$isWR||typeof z==="object"&&z!==null&&!!y.$isJ3)&&J.de(d,"value")
+z=J.x(this.ZY)
+z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
 y=this.ZY
 if(z){this.xS=y
 z=y}else{z=L.ao(y,this.ay,null)
@@ -23866,7 +24085,7 @@
 VD:{
 "^":"Tp:112;a",
 call$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,392,[],"call"],
+return z.EC(J.Vm(z.xS))},"call$1",null,2,0,null,403,[],"call"],
 $isEH:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
@@ -24001,9 +24220,9 @@
 P.Ys.$isej=true
 P.Ys.$isa=true
 X.TR.$isa=true
-F.d3.$isa=true
 P.MO.$isMO=true
 P.MO.$isa=true
+F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
 P.qh.$isqh=true
@@ -24043,14 +24262,14 @@
 D.bv.$isaf=true
 D.bv.$isa=true
 D.c2.$isa=true
-D.Vi.$isVi=true
 D.Vi.$isa=true
 D.Q4.$isa=true
 D.N8.$isa=true
 W.zU.$isD0=true
 W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
+D.D5.$isa=true
 W.tV.$iscv=true
 W.tV.$isKV=true
 W.tV.$isD0=true
@@ -24075,8 +24294,8 @@
 H.Uz.$isej=true
 H.Uz.$isej=true
 H.Uz.$isa=true
-P.e4.$ise4=true
-P.e4.$isa=true
+P.qK.$isqK=true
+P.qK.$isa=true
 P.dl.$isdl=true
 P.dl.$isa=true
 V.qC.$isqC=true
@@ -24151,6 +24370,8 @@
 J.AA=function(a){return J.RE(a).GB(a)}
 J.AB=function(a){return J.RE(a).gkU(a)}
 J.AG=function(a){return J.x(a).bu(a)}
+J.AH=function(a){return J.RE(a).gR(a)}
+J.At=function(a,b){return J.RE(a).sRu(a,b)}
 J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
 J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
 return J.Wx(a).E(a,b)}
@@ -24161,6 +24382,7 @@
 J.EC=function(a){return J.RE(a).giC(a)}
 J.EY=function(a,b){return J.RE(a).od(a,b)}
 J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.Eh=function(a,b){return J.Wx(a).O(a,b)}
 J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
 J.F6=function(a,b){return J.RE(a).stD(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
@@ -24171,6 +24393,7 @@
 J.GL=function(a){return J.RE(a).gfN(a)}
 J.GP=function(a){return J.w1(a).gA(a)}
 J.Hf=function(a){return J.RE(a).gTq(a)}
+J.IQ=function(a){return J.RE(a).Ms(a)}
 J.IS=function(a){return J.RE(a).gnv(a)}
 J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
@@ -24185,27 +24408,31 @@
 J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
 J.LH=function(a,b){return J.w1(a).GT(a,b)}
 J.LL=function(a){return J.Wx(a).HG(a)}
+J.LO=function(a,b,c,d){return J.RE(a).Ar(a,b,c,d)}
+J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
 J.Lp=function(a,b){return J.RE(a).st5(a,b)}
 J.MK=function(a,b){return J.RE(a).Md(a,b)}
 J.MQ=function(a){return J.w1(a).grZ(a)}
 J.MV=function(a,b){return J.RE(a).Ih(a,b)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
+J.My=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.Mz=function(a){return J.rY(a).hc(a)}
 J.N5=function(a,b){return J.RE(a).RP(a,b)}
 J.NQ=function(a,b){return J.RE(a).bA(a,b)}
+J.Nf=function(a,b){return J.RE(a).syw(a,b)}
 J.Ng=function(a){return J.RE(a).gxX(a)}
+J.No=function(a,b){return J.RE(a).sR(a,b)}
 J.O2=function(a,b){return J.RE(a).Ch(a,b)}
 J.O6=function(a){return J.RE(a).goc(a)}
+J.OE=function(a,b){return J.RE(a).sfg(a,b)}
 J.Or=function(a){return J.RE(a).yx(a)}
-J.Pr=function(a,b){return J.w1(a).eR(a,b)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.Q5=function(a){return J.RE(a).gwl(a)}
 J.QC=function(a){return J.w1(a).wg(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
 J.QM=function(a,b){return J.RE(a).Rg(a,b)}
 J.QP=function(a){return J.RE(a).gF1(a)}
-J.QQ=function(a,b){return J.RE(a).sRu(a,b)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
 J.RF=function(a,b){return J.RE(a).WO(a,b)}
 J.SK=function(a){return J.RE(a).xW(a)}
@@ -24225,6 +24452,7 @@
 J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
 J.V1=function(a,b){return J.w1(a).Rz(a,b)}
 J.VN=function(a){return J.RE(a).gM0(a)}
+J.Vf=function(a){return J.RE(a).gVE(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
 J.Vq=function(a){return J.RE(a).xo(a)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
@@ -24238,6 +24466,7 @@
 J.XS=function(a,b){return J.w1(a).zV(a,b)}
 J.Xf=function(a,b){return J.RE(a).oo(a,b)}
 J.Y5=function(a){return J.RE(a).gyT(a)}
+J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
 J.YP=function(a){return J.RE(a).gQ7(a)}
 J.YV=function(a){return J.RE(a).goE(a)}
 J.Z7=function(a){if(typeof a=="number")return-a
@@ -24252,7 +24481,6 @@
 J.bi=function(a,b){return J.w1(a).h(a,b)}
 J.bj=function(a,b){return J.w1(a).FV(a,b)}
 J.bs=function(a){return J.RE(a).JP(a)}
-J.c1=function(a,b){return J.Wx(a).O(a,b)}
 J.c9=function(a,b){return J.RE(a).sa4(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
 J.cO=function(a){return J.RE(a).gq6(a)}
@@ -24268,29 +24496,37 @@
 J.f5=function(a){return J.RE(a).gI(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
+J.fv=function(a,b){return J.RE(a).LI(a,b)}
 J.i4=function(a,b){return J.w1(a).Zv(a,b)}
 J.iG=function(a,b){return J.RE(a).szZ(a,b)}
 J.iZ=function(a){return J.RE(a).gzZ(a)}
 J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.jD=function(a){return J.RE(a).gRn(a)}
+J.ja=function(a,b){return J.w1(a).Vr(a,b)}
 J.jf=function(a,b){return J.x(a).T(a,b)}
 J.kE=function(a,b){return J.U6(a).tg(a,b)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
 J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
 return J.w1(a).u(a,b,c)}
+J.kd=function(a){return J.RE(a).gfg(a)}
+J.kq=function(a,b){return J.RE(a).sF1(a,b)}
 J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
 J.l2=function(a){return J.RE(a).gN(a)}
 J.lB=function(a){return J.RE(a).gP1(a)}
 J.lE=function(a,b){return J.rY(a).j(a,b)}
 J.m4=function(a){return J.RE(a).gig(a)}
+J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
+return J.Wx(a).i(a,b)}
 J.nJ=function(a){return J.RE(a).ga4(a)}
 J.nX=function(a){return J.RE(a).gjb(a)}
+J.ni=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
+J.nt=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.og=function(a,b){return J.RE(a).sIt(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
 J.oq=function(a,b){return J.RE(a).si2(a,b)}
 J.pO=function(a){return J.U6(a).gor(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pb=function(a,b){return J.w1(a).Vr(a,b)}
 J.pe=function(a,b){return J.RE(a).pr(a,b)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
@@ -24298,7 +24534,6 @@
 J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
 J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.tH=function(a,b){return J.w1(a).KI(a,b)}
 J.ta=function(a,b){return J.RE(a).sP(a,b)}
 J.td=function(a){return J.RE(a).gng(a)}
 J.ti=function(a,b){return J.RE(a).sQr(a,b)}
@@ -24308,8 +24543,10 @@
 return J.Wx(a).C(a,b)}
 J.uH=function(a,b){return J.rY(a).Fr(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
+J.uw=function(a){return J.RE(a).gwd(a)}
 J.v1=function(a){return J.x(a).giO(a)}
 J.vF=function(a){return J.RE(a).gbP(a)}
+J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
 J.vo=function(a,b){return J.w1(a).ev(a,b)}
@@ -24322,7 +24559,6 @@
 J.xR=function(a){return J.RE(a).ghf(a)}
 J.xW=function(a){return J.RE(a).e6(a)}
 J.xq=function(a){return J.RE(a).gUj(a)}
-J.y9=function(a){return J.RE(a).lh(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
 J.yj=function(a){return J.RE(a).gG1(a)}
 J.yn=function(a,b){return J.RE(a).vV(a,b)}
@@ -24334,22 +24570,23 @@
 C.J0=B.G6.prototype
 C.KZ=new H.hJ()
 C.OL=new U.EZ()
-C.Gw=new H.SJ()
-C.l0=new J.Q()
+C.Gw=new H.yq()
+C.E3=new J.Q()
 C.Fm=new J.kn()
 C.yX=new J.GW()
-C.wq=new J.im()
+C.c1=new J.im()
 C.x0=new J.Jh()
 C.oD=new J.P()
 C.Kn=new J.O()
-C.mI=new K.nd()
+C.mI=new K.ndx()
 C.IU=new P.kF()
 C.Us=new A.yL()
 C.Nw=new K.vly()
 C.Wj=new P.JF()
-C.xd=new A.jh()
+C.xd=new A.Mh()
+C.vT=new P.hR()
 C.NU=new P.R8()
-C.v8=new P.W5()
+C.v8=new P.nU()
 C.xE=A.iL.prototype
 C.YZ=Q.Tg.prototype
 C.kk=Z.Jc.prototype
@@ -24357,6 +24594,7 @@
 C.l8=new D.WAE("Dart")
 C.nj=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
+C.oA=new D.WAE("Tag")
 C.IK=O.CN.prototype
 C.YD=F.Be.prototype
 C.j8=R.E0.prototype
@@ -24371,17 +24609,20 @@
 C.nh=new A.V3("nav-menu-item")
 C.KI=new A.V3("library-nav-menu")
 C.hpj=new A.V3("service-view")
+C.Yl=new A.V3("heap-map")
 C.nu=new A.V3("function-view")
 C.jR=new A.V3("isolate-profile")
-C.xz=new A.V3("code-view")
+C.h2=new A.V3("code-view")
 C.oY=new A.V3("class-view")
-C.Gg=new A.V3("library-view")
+C.fO=new A.V3("isolate-view")
+C.mS=new A.V3("sliding-checkbox")
+C.Oyb=new A.V3("library-view")
 C.U8=new A.V3("code-ref")
 C.NT=new A.V3("top-nav-menu")
 C.js=new A.V3("stack-trace")
 C.Ur=new A.V3("script-ref")
 C.OS=new A.V3("class-ref")
-C.jF=new A.V3("isolate-list")
+C.jFV=new A.V3("isolate-list")
 C.jy=new A.V3("breakpoint-list")
 C.VW=new A.V3("instance-ref")
 C.Gu=new A.V3("collapsible-content")
@@ -24391,11 +24632,12 @@
 C.zaS=new A.V3("isolate-nav-menu")
 C.t9=new A.V3("class-nav-menu")
 C.uW=new A.V3("error-view")
-C.pc=new A.V3("nav-menu")
+C.u76=new A.V3("nav-menu")
 C.KH=new A.V3("json-view")
-C.R0=new A.V3("function-ref")
+C.X0=new A.V3("isolate-ref")
+C.YQ=new A.V3("function-ref")
 C.uy=new A.V3("library-ref")
-C.My=new A.V3("field-view")
+C.Tq=new A.V3("field-view")
 C.JD=new A.V3("service-ref")
 C.Ug=new A.V3("nav-bar")
 C.DKS=new A.V3("curly-block")
@@ -24403,25 +24645,28 @@
 C.ny=new P.a6(0)
 C.OD=F.E9.prototype
 C.Gh=L.rm.prototype
-C.mt=H.VM(new W.e0("change"),[W.ea])
-C.pi=H.VM(new W.e0("click"),[W.Wp])
-C.MD=H.VM(new W.e0("error"),[W.ew])
-C.PP=H.VM(new W.e0("hashchange"),[W.ea])
-C.i3=H.VM(new W.e0("input"),[W.ea])
-C.fK=H.VM(new W.e0("load"),[W.ew])
-C.Ns=H.VM(new W.e0("message"),[W.cx])
+C.mt=H.VM(new W.UC("change"),[W.ea])
+C.pi=H.VM(new W.UC("click"),[W.Wp])
+C.MD=H.VM(new W.UC("error"),[W.kQ])
+C.PP=H.VM(new W.UC("hashchange"),[W.ea])
+C.i3=H.VM(new W.UC("input"),[W.ea])
+C.fK=H.VM(new W.UC("load"),[W.kQ])
+C.Ns=H.VM(new W.UC("message"),[W.cx])
 C.MC=D.m8.prototype
 C.LT=A.Gk.prototype
-C.Xo=U.qW.prototype
+C.Xo=U.AX.prototype
 C.Yu=N.mk.prototype
+C.pJ=O.lb.prototype
 C.Vc=K.jY.prototype
 C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.yK=Z.hx.prototype
+C.cp=B.NG.prototype
+C.pU=Z.hx.prototype
 C.b9=L.u7.prototype
 C.RR=A.fl.prototype
-C.XH=X.E7.prototype
-C.Qt=D.Kz.prototype
+C.XH=X.kKl.prototype
+C.LN=N.oO.prototype
+C.Qt=D.St.prototype
+C.Xe=L.qkb.prototype
 C.Nm=J.Q.prototype
 C.ON=J.GW.prototype
 C.jn=J.im.prototype
@@ -24560,7 +24805,7 @@
 }
 C.xr=new P.by(null,null)
 C.A3=new P.Cf(null)
-C.Ap=new P.pD(null)
+C.Ap=new P.dI(null)
 C.Yt=Z.vj.prototype
 C.VZ=new N.qV("FINER",400)
 C.R5=new N.qV("FINE",500)
@@ -24597,8 +24842,8 @@
 C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
 C.p5=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
 C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
-C.pa=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.pa)
+C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
 C.MEG=I.makeConstantList(["enumerate"])
 C.va=new H.LPe(1,{enumerate:K.UM()},C.MEG)
 C.S2=W.H9.prototype
@@ -24616,6 +24861,7 @@
 C.cJ=U.fI.prototype
 C.ZO=U.ob.prototype
 C.wU=Q.xI.prototype
+C.fA=Q.Uj.prototype
 C.dX=K.nm.prototype
 C.bg=X.Vu.prototype
 C.PU=new H.GD("dart.core.Object")
@@ -24627,26 +24873,34 @@
 C.wh=new H.GD("app")
 C.S4=new H.GD("busy")
 C.Ka=new H.GD("call")
+C.Hx=new H.GD("callGraphChecked")
 C.AV=new H.GD("callback")
+C.bk=new H.GD("checked")
+C.lH=new H.GD("checkedText")
 C.XA=new H.GD("cls")
 C.b1=new H.GD("code")
 C.h1=new H.GD("currentHash")
 C.Na=new H.GD("devtools")
+C.aH=new H.GD("displayCutoff")
 C.Jw=new H.GD("displayValue")
 C.nN=new H.GD("dynamic")
 C.tP=new H.GD("entry")
 C.YU=new H.GD("error")
 C.mr=new H.GD("expanded")
-C.WQ=new H.GD("field")
+C.Gx=new H.GD("field")
 C.CX=new H.GD("fileAndLine")
 C.Aq=new H.GD("formattedAverage")
 C.WG=new H.GD("formattedCollections")
 C.uU=new H.GD("formattedExclusiveTicks")
 C.EF=new H.GD("formattedInclusiveTicks")
 C.ST=new H.GD("formattedTotalCollectionTime")
+C.QH=new H.GD("fragmentation")
 C.rE=new H.GD("frame")
 C.nf=new H.GD("function")
+C.Mo=new H.GD("hasClass")
 C.zS=new H.GD("hasDisassembly")
+C.D2=new H.GD("hasParent")
+C.Ai=new H.GD("hideTagsChecked")
 C.YH=new H.GD("hitsStyle")
 C.bA=new H.GD("hoverText")
 C.AZ=new H.GD("dart.core.String")
@@ -24667,15 +24921,18 @@
 C.eh=new H.GD("lineMode")
 C.dB=new H.GD("link")
 C.PC=new H.GD("dart.core.int")
-C.h2=new H.GD("message")
-C.fQ=new H.GD("methodCountSelected")
+C.ch=new H.GD("message")
 C.UX=new H.GD("msg")
 C.YS=new H.GD("name")
+C.So=new H.GD("newHeapCapacity")
 C.IO=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
 C.VJ=new H.GD("object")
+C.xG=new H.GD("objectPool")
+C.Le=new H.GD("oldHeapCapacity")
 C.ap=new H.GD("oldHeapUsed")
 C.vb=new H.GD("profile")
+C.zc=new H.GD("qualified")
 C.kY=new H.GD("ref")
 C.Dj=new H.GD("refreshTime")
 C.c8=new H.GD("registerCallback")
@@ -24685,97 +24942,105 @@
 C.ok=new H.GD("dart.core.Null")
 C.md=new H.GD("dart.core.double")
 C.XU=new H.GD("sampleCount")
+C.bE=new H.GD("sampleDepth")
+C.kA=new H.GD("sampleRate")
 C.fX=new H.GD("script")
 C.eC=new H.GD("[]=")
 C.V0=new H.GD("showCoverage")
+C.PM=new H.GD("status")
 C.mi=new H.GD("text")
-C.ch=new H.GD("topFrame")
+C.EB=new H.GD("topFrame")
 C.QK=new H.GD("totalSamplesInProfile")
 C.kw=new H.GD("trace")
 C.ep=new H.GD("tree")
+C.WY=new H.GD("uncheckedText")
 C.Fh=new H.GD("url")
 C.ls=new H.GD("value")
 C.eR=new H.GD("valueType")
 C.KS=new H.GD("vmName")
 C.v6=new H.GD("void")
 C.lx=A.tz.prototype
-C.SX=H.mm('qC')
+C.SX=H.uV('qC')
 C.WP=new H.Lm(C.SX,"K",0)
-C.SL=H.mm('Ae')
+C.SL=H.uV('Ae')
 C.xC=new H.Lm(C.SL,"V",0)
-C.Yn=H.mm('xh')
+C.Yn=H.uV('xh')
 C.wW=new H.Lm(C.Yn,"T",0)
-C.Gsc=H.mm('wn')
+C.Gsc=H.uV('wn')
 C.io=new H.Lm(C.Gsc,"E",0)
 C.nz=new H.Lm(C.SX,"V",0)
-C.RP=H.mm('hx')
-C.Ln=H.mm('Dg')
-C.z6Y=H.mm('Tg')
-C.IZ=H.mm('rm')
-C.eY=H.mm('n6')
-C.Vh=H.mm('Pz')
-C.zq=H.mm('Qa')
-C.tf=H.mm('Zt')
-C.RJ=H.mm('JG')
-C.Ye=H.mm('qW')
-C.z7=H.mm('G6')
-C.Ma=H.mm('F1')
-C.nY=H.mm('a')
-C.Yc=H.mm('iP')
-C.jRs=H.mm('Be')
-C.kA=H.mm('u7')
-C.PT=H.mm('I2')
-C.Wup=H.mm('LZ')
-C.P0k=H.mm('lI')
-C.T1=H.mm('Wy')
-C.hG=H.mm('ir')
-C.aj=H.mm('fI')
-C.la=H.mm('ZX')
-C.G4=H.mm('CN')
-C.O4=H.mm('double')
-C.yw=H.mm('int')
-C.RcY=H.mm('aQ')
-C.KJ=H.mm('mk')
-C.yiu=H.mm('knI')
-C.iN=H.mm('yc')
-C.HI=H.mm('Pg')
-C.ila=H.mm('xI')
-C.lk=H.mm('mJ')
-C.lpG=H.mm('LU')
-C.Yte=H.mm('KL')
-C.mR=H.mm('fl')
-C.jV=H.mm('rF')
-C.SB=H.mm('E7')
-C.Tq=H.mm('vj')
-C.JW=H.mm('Ww')
-C.qo=H.mm('jY')
-C.wH=H.mm('Kz')
-C.cx5=H.mm('m8')
-C.l49=H.mm('uL')
-C.yQ=H.mm('EH')
-C.Im=H.mm('X6')
-C.FU=H.mm('lw')
-C.rd6=H.mm('E0')
-C.nG=H.mm('zt')
-C.yG=H.mm('nm')
-C.px=H.mm('tz')
-C.epC=H.mm('Jc')
-C.Fd=H.mm('E9')
-C.Db=H.mm('String')
-C.Bm=H.mm('XP')
-C.hg=H.mm('hd')
-C.Fv=H.mm('ob')
-C.Wza=H.mm('pR')
-C.HL=H.mm('bool')
-C.Qf=H.mm('Null')
-C.HH=H.mm('dynamic')
-C.l6=H.mm('iL')
-C.Gp=H.mm('cw')
-C.ri=H.mm('yy')
-C.CS=H.mm('vm')
-C.Hk=H.mm('Gk')
-C.hN=H.mm('oI')
-C.r6=H.mm('Vu')
+C.Ye=H.uV('hx')
+C.Ln=H.uV('Dg')
+C.z6Y=H.uV('Tg')
+C.xFi=H.uV('rm')
+C.eY=H.uV('n6')
+C.Vh=H.uV('Pz')
+C.zq=H.uV('Qa')
+C.tf=H.uV('Zt')
+C.RJ=H.uV('JG')
+C.z7=H.uV('G6')
+C.GTO=H.uV('F1')
+C.nY=H.uV('a')
+C.Yc=H.uV('iP')
+C.jRs=H.uV('Be')
+C.P9=H.uV('oO')
+C.bW=H.uV('u7')
+C.PT=H.uV('I2')
+C.P0k=H.uV('lI')
+C.T1=H.uV('Wy')
+C.hG=H.uV('ir')
+C.aj=H.uV('fI')
+C.UrY=H.uV('kKl')
+C.la=H.uV('ZX')
+C.G4=H.uV('CN')
+C.O4=H.uV('double')
+C.yw=H.uV('int')
+C.RcY=H.uV('aQ')
+C.ld=H.uV('AX')
+C.KJ=H.uV('mk')
+C.yiu=H.uV('knI')
+C.dUi=H.uV('Uj')
+C.iN=H.uV('yc')
+C.v5=H.uV('NG')
+C.HI=H.uV('Pg')
+C.ila=H.uV('xI')
+C.lk=H.uV('mJ')
+C.lpG=H.uV('LU')
+C.CO=H.uV('lb')
+C.RP=H.uV('KL')
+C.mR=H.uV('fl')
+C.jV=H.uV('rF')
+C.wd=H.uV('vj')
+C.JW=H.uV('Ww')
+C.qo=H.uV('jY')
+C.Pa=H.uV('St')
+C.cx5=H.uV('m8')
+C.l49=H.uV('uL')
+C.yQ=H.uV('EH')
+C.Im=H.uV('X6')
+C.FU=H.uV('lw')
+C.rd6=H.uV('E0')
+C.nG=H.uV('zt')
+C.yG=H.uV('nm')
+C.px=H.uV('tz')
+C.epC=H.uV('Jc')
+C.Fd=H.uV('E9')
+C.JA3=H.uV('b0B')
+C.Db=H.uV('String')
+C.BP=H.uV('qkb')
+C.Bm=H.uV('XP')
+C.hg=H.uV('hd')
+C.Fv=H.uV('ob')
+C.HL=H.uV('bool')
+C.Qf=H.uV('Null')
+C.HH=H.uV('dynamic')
+C.l6=H.uV('iL')
+C.Gp=H.uV('cw')
+C.ri=H.uV('yy')
+C.CS=H.uV('vm')
+C.Hk=H.uV('Gk')
+C.hN=H.uV('oI')
+C.IWi=H.uV('Vu')
 C.vB=J.is.prototype
 C.xM=new P.z0(!1)
 C.ol=W.u9.prototype
@@ -24811,8 +25076,8 @@
 $.Bh=0
 $.uP=!0
 $.To=null
-$.Dq=["A3","A5","AZ","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cx","D","D3","D6","DC","Dd","De","E","Ec","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KI","KJ","Kb","LV","Md","Mi","Mu","NC","NZ","Nj","O","OP","Om","On","PA","PM","PQ","PZ","Pa","Pk","Pv","Q0","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SF","SS","Se","T","TP","TW","Tc","Ti","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aN","aZ","az","bA","bS","bj","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","fz","g","gA","gAS","gAb","gAp","gAu","gAy","gB","gB1","gB3","gBA","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gDt","gEh","gF0","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIW","gIt","gJ0","gJS","gJf","gJo","gJy","gKM","gKU","gKV","gLA","gLY","gLm","gLn","gLx","gM0","gMB","gMj","gN","gN7","gNF","gNh","gNl","gO3","gO9","gOL","gOc","gOl","gP","gP1","gPK","gPe","gPj","gPu","gPw","gPy","gQ7","gQg","gQr","gRA","gRd","gRn","gRu","gSB","gTq","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVa","gVl","gW0","gWA","gWT","gX3","gXc","gXh","gXt","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfb","gfc","gfn","ghU","ghf","gho","gi2","gi9","giC","giO","gig","giy","gjL","gjO","gjT","gjb","gk5","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","gm2","gmC","gmH","gmW","gmm","gn9","gnN","gng","gnv","gnx","gnz","go6","goE","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gx8","gxA","gxH","gxX","gxj","gxr","gxw","gy4","gyH","gyT","gz1","gzP","gzW","gzZ","gzh","gzj","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","l5","lh","lj","lp","m","mK","n","nC","nH","ni","nq","oB","oP","oW","oZ","od","oo","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAp","sAu","sAy","sB","sB1","sB3","sBA","sBP","sBW","sCO","sCY","sCd","sCj","sDt","sEh","sF0","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIt","sJ0","sJS","sJo","sJy","sKM","sKU","sKV","sLA","sLY","sLn","sLx","sM0","sMB","sMj","sN","sN7","sNF","sNh","sNl","sO3","sO9","sOc","sOl","sP","sPK","sPe","sPj","sPu","sPw","sPy","sQ7","sQr","sRA","sRd","sRn","sRu","sSB","sTq","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXc","sXh","sXt","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfb","sfc","sfn","shU","shf","sho","si2","siC","sig","siy","sjL","sjO","sjT","sjb","sk5","skG","skU","skW","skc","skf","skg","skp","sl7","sm2","smC","smH","sn9","snN","sng","snv","snx","so6","soE","soc","spD","spQ","sph","sq3","sq6","sqO","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sxA","sxH","sxX","sxj","sxr","sxw","sy4","syH","syT","sz1","szW","szZ","szh","szj","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vV","w","wE","wL","wW","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yv","yx","yy","z2","z4","z6","zV","zY","zr"]
-$.Au=[C.RP,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.IZ,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.Ye,U.qW,{created:U.ZV},C.z7,B.G6,{created:B.Dw},C.Ma,A.F1,{created:A.z5},C.jRs,F.Be,{created:F.Fe},C.kA,L.u7,{created:L.Cu},C.Wup,H.LZ,{"":H.UI},C.P0k,V.lI,{created:V.fv},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.Yte,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.SB,X.E7,{created:X.jD},C.Tq,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.ZC},C.qo,K.jY,{created:K.US},C.wH,D.Kz,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.Wza,B.pR,{created:B.b4},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.r6,X.Vu,{created:X.bV}]
+$.Dq=["A3","A5","A8","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cn","Cp","Cs","Cx","D","D3","D6","DC","Dd","De","E","EX","Ec","Ey","F","F6","FL","FV","Fr","Fv","G6","GB","GE","GG","GT","HG","Hn","Hs","Id","Ih","Is","J","J2","J3","JP","JV","Ja","Jk","K1","KJ","Kb","LI","LV","Md","Mh","Mi","Ms","Mu","My","NC","NZ","Nj","O","OP","Om","On","PM","PQ","PZ","Pa","Pk","Pv","Q0","QI","Qi","Qx","R3","R4","RB","RP","RR","RU","Rg","Rz","SS","Se","T","TP","TW","Tc","Tk","Tp","Ty","U","UD","UH","UZ","Uc","V","V1","VD","VI","Vk","Vr","W","W3","W4","WO","WZ","X6","XG","XU","Xl","Y","Y9","YF","YS","YU","YW","Yy","Z","Z1","Z2","Z3","ZB","ZF","ZL","ZZ","Zv","aC","aD","aN","aZ","at","az","b1","bA","bS","ba","br","bu","cO","cU","cn","ct","d0","dR","da","dd","du","e6","eR","ea","ek","eo","er","es","ev","ez","f6","fZ","fa","fk","fm","g","gA","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBP","gBW","gCO","gCY","gCd","gCj","gD5","gDD","gE7","gEh","gEly","gEu","gF1","gFR","gFT","gFw","gG0","gG1","gG3","gGQ","gGV","gGd","gHJ","gHX","gHm","gHq","gHu","gI","gIF","gIK","gIW","gIt","gJ0","gJQ","gJS","gJf","gJo","gJy","gKK","gKM","gKU","gKV","gKx","gLA","gLY","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gN","gN7","gNF","gNG","gNh","gNl","gNo","gO3","gO9","gOL","gOc","gOe","gOh","gOl","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQb","gQg","gQr","gQs","gR","gRA","gRY","gRd","gRn","gRu","gSB","gTq","gU4","gUQ","gUj","gUo","gUy","gUz","gV4","gV5","gVE","gVa","gVl","gW0","gWA","gWT","gX3","gXX","gXh","gXt","gXv","gXx","gZ8","gZf","ga4","gai","gbG","gbP","gbV","gbx","gcC","gdU","geT","geb","gey","gfN","gfY","gfc","gfg","gfn","ghU","ghf","ghi","gho","gi2","gi9","giC","giO","gig","gik","giy","gjL","gjO","gjT","gjb","gk5","gkF","gkG","gkU","gkW","gkc","gkf","gkg","gkp","gl0","gl7","glb","glh","gm2","gmC","gmH","gmm","gn9","gnN","gnZ","gng","gnv","gnx","gnz","go6","goE","goY","goc","gor","gpD","gpQ","gph","gq3","gq6","gqO","gqe","gqn","grK","grU","grZ","grs","gt0","gt5","gtD","gtH","gtN","gtT","gtY","gtf","gtp","guD","guw","gvH","gvL","gvc","gvk","gvt","gwd","gwl","gx","gx8","gxA","gxX","gxj","gxr","gxw","gy","gy4","gyH","gyT","gys","gyw","gz1","gzP","gzW","gzZ","gzg","gzh","gzj","gzt","gzw","h","h8","hZ","hc","hr","hu","i","i4","i5","iF","iM","ib","ii","iw","j","j9","jh","jp","jx","k0","kO","kk","l5","lj","m","mK","n","nC","nH","na","ni","nq","oB","oF","oP","oW","oZ","od","oe","oo","pA","pM","pZ","pr","ps","q1","qA","qC","qZ","r6","rJ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBP","sBW","sCO","sCY","sCd","sCj","sE7","sEh","sEly","sEu","sF1","sFR","sFT","sFw","sG1","sG3","sGQ","sGV","sGd","sHJ","sHX","sHm","sHq","sHu","sIF","sIK","sIt","sJ0","sJQ","sJS","sJo","sJy","sKK","sKM","sKU","sKV","sKx","sLA","sLY","sLn","sLx","sM0","sM5","sMB","sMj","sN","sN7","sNF","sNG","sNh","sNl","sNo","sO3","sO9","sOc","sOe","sOh","sOl","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQb","sQr","sQs","sR","sRA","sRY","sRd","sRn","sRu","sSB","sTq","sU4","sUQ","sUo","sUy","sUz","sV4","sV5","sVa","sWA","sWT","sX3","sXX","sXh","sXt","sXv","sXx","sZ8","sa4","sai","sbG","sbP","sbV","scC","sdU","seT","seb","sfN","sfY","sfc","sfg","sfn","shU","shf","shi","sho","si2","siC","sig","sik","siy","sjL","sjO","sjT","sjb","sk5","skF","skG","skU","skW","skc","skf","skg","skp","sl7","slb","slh","sm2","smC","smH","sn9","snN","snZ","sng","snv","snx","so6","soE","soY","soc","spD","spQ","sph","sq3","sq6","sqO","sqe","srU","srZ","srs","st0","st5","stD","stN","stT","stY","stf","suD","suw","svH","svL","svk","svt","swd","sx","sxA","sxX","sxj","sxr","sxw","sy","sy4","syT","sys","syw","sz1","szW","szZ","szg","szh","szj","szt","szw","t","tM","tZ","tg","tt","u","u8","uB","ub","vQ","vV","w","wE","wL","wY","wg","wn","x3","xW","xc","xe","xo","y0","yC","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY"]
+$.Au=[C.Ye,Z.hx,{created:Z.HC},C.Ln,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.zq,A.Qa,{created:A.EL},C.tf,A.Zt,{created:A.IV},C.RJ,Q.JG,{created:Q.Zo},C.z7,B.G6,{created:B.Dw},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.P9,N.oO,{created:N.Zg},C.bW,L.u7,{created:L.Cu},C.P0k,V.lI,{created:V.Lu},C.hG,A.ir,{created:A.oa},C.aj,U.fI,{created:U.Ry},C.UrY,X.kKl,{created:X.Tv},C.G4,O.CN,{created:O.On},C.RcY,A.aQ,{created:A.AJ},C.ld,U.AX,{created:U.ZV},C.KJ,N.mk,{created:N.N0},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.v5,B.NG,{created:B.b4},C.HI,H.Pg,{"":H.aR},C.ila,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.CO,O.lb,{created:O.d0},C.RP,M.KL,{created:M.Ro},C.mR,A.fl,{created:A.Du},C.wd,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.US},C.Pa,D.St,{created:D.JR},C.cx5,D.m8,{created:D.zY},C.l49,Z.uL,{created:Z.ew},C.FU,R.lw,{created:R.fR},C.rd6,R.E0,{created:R.Hv},C.yG,K.nm,{created:K.an},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.Fd,F.E9,{created:F.TW},C.JA3,H.b0B,{"":H.UI},C.BP,L.qkb,{created:L.uD},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.zy},C.l6,A.iL,{created:A.lT},C.ri,W.yy,{},C.Hk,A.Gk,{created:A.bH},C.IWi,X.Vu,{created:X.bV}]
 I.$lazy($,"globalThis","DX","jk",function(){return function() { return this; }()})
 I.$lazy($,"globalWindow","pG","Qm",function(){return $.jk().window})
 I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
@@ -24856,7 +25121,7 @@
   }
 }())})
 I.$lazy($,"_currentIsolateMatcher","m6","QJ",function(){return new H.VR(H.v4("#/isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","vi","wM",function(){return new H.VR(H.v4("#/isolates/\\d+(/|$)",!1,!0,!1),null,null)})
 I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().call$0()})
 I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
 I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?: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))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
@@ -24899,7 +25164,7 @@
 I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
 I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
 I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gmW(window)),null,null)})
+I.$lazy($,"_librariesToLoad","x2","nT",function(){return A.GA(document,J.CC(C.ol.gyH(window)),null,null)})
 I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
 I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
 I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
@@ -24910,7 +25175,7 @@
 I.$lazy($,"_matcher","RI","cI",function(){return new H.VR(H.v4("scripts/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","PA","xN",function(){return new H.VR(H.v4("code/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_matcher","Oi","Yk",function(){return new H.VR(H.v4("classes/\\d+$",!1,!0,!1),null,null)})
-I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
+I.$lazy($,"_matcher","TO","uG",function(){return new H.VR(H.v4("^functions/native-.+|^functions/collected-.+|^functions/reused-.+|^functions/stub-.+|^functions/tag-.+|^classes/\\d+/functions/.+|^classes/\\d+/closures/.+|^classes/\\d+/implicit_closures/.+|^classes/\\d+/dispatchers/.+",!1,!0,!1),null,null)})
 I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.lP().call$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
@@ -24918,7 +25183,7 @@
 I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
 
 init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"string","source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","index","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4,P.dl,null,P.MN]},"self","parent",{func:"aD",args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","mustCopy","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l","hash",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newChild","refChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.No,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"children","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Vf,D.af,J.kn,Q.xI,Z.pv,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Vfx,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.Dsd,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"qe",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"BC",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","pos",F.tuj,{func:"Wr",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"Wr",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.Vct,H.Tp,A.D13,N.WZq,{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.pva,"response","st",{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",{func:"vl",ret:[P.b8,D.af],args:[J.O]},Z.cda,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.waa,"codeCaller",{func:"SR",args:[D.Vi]},J.Q,G.XN,{func:"cH",ret:J.im},{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V4,D.bv,D.V9,{func:"r5",ret:J.Q},Z.V10,M.V11,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V12,A.V13,A.V14,A.V15,A.V16,A.V17,A.V18,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V19,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.e4,P.dl]},{func:"Zg",args:[P.dl,P.e4,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement","root",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"CS",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V20,A.T5,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Yg",ret:J.O,args:[D.c2]},U.V21,"so",{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"VL",args:[D.kx,D.kx]},{func:"KK",args:[null,D.kx]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"aS",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"Lr",ret:D.No},{func:"HB",ret:D.af,args:[V.qC]},{func:"nR",ret:Z.uL},U.V22,Q.Ds,V.qC,K.V23,X.V24,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"QF",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"oe",args:[J.Q]},];$=null
+init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"Dv",args:[null]},"_",{func:"kl",void:true},{func:"NT"},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","a","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map","errorHandler","zone","listeners","callback","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.qK,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"wD",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"XR",ret:{func:"Dv",args:[null]},args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.qK,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.qK,P.dl,{func:"NT"}]},{func:"xN",ret:P.tU,args:[P.dl,P.qK,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.qK,P.dl,J.O]},"line",{func:"xM",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.qK,P.dl,P.aY,[P.Z0,P.wv,null]]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bZ",ret:J.im,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable",{func:"P2",ret:J.im,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"DZ",ret:J.im,args:[P.a]},{func:"K4",ret:J.im,args:[J.O],named:{onError:{func:"Tl",ret:J.im,args:[J.O]},radix:J.im}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","thing","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","createProxy","hash","mustCopy","nativeImageData","imageData","total",{func:"qE",ret:J.O,args:[J.im,J.im]},"pad","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","v","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","id","members","collection","vm","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","imagedata","dx","dy","dirtyX","dirtyY","dirtyWidth","dirtyHeight","elementId","deep","selectors","relativeSelectors","listener","useCapture","async","user","password","timestamp","canBubble","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","childList","attributes","characterData","subtree","attributeOldValue","characterDataOldValue","attributeFilter","otherNode","newNodes","refChild","newChild","oldChild","targetOrigin","messagePorts","length","invocation","","separator",0,!0,"growable","fractionDigits","str","times","authentification","resume","responsePort","errorsAreFatal","pingType","portId","port","dataEvent","info","val",{func:"bh",args:[null,null]},"parameter","unsortedIndex","jsConstructor",{func:"Za",args:[J.O,null]},{func:"TS",args:[null,J.O]},"g",G.dZ,D.pa,{func:"Wy",ret:D.bv},C.Nw,C.mI,{func:"UO",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},"label","row",{func:"I0",ret:J.O},{func:"Hr",void:true,args:[D.af]},"serviceObject","event",J.im,[J.Q,G.Y2],[J.Q,J.O],"root","rowIndex",D.SI,[P.Z0,J.O,W.cv],{func:"rm",ret:D.SI},C.Us,{func:"Q5",args:[D.SI]},"done",B.Ds,D.af,J.kn,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},Z.Vfx,D.kx,{func:"bR",ret:D.kx},{func:"oX",args:[D.kx]},F.Dsd,J.O,{func:"Uf",ret:J.kn},{func:"zk",args:[J.kn]},"r",{func:"Np",void:true,args:[W.ea,null,W.KV]},R.tuj,{func:"ZT",void:true,args:[null,null,null]},R.LP,"action","test","at","library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.ej]},"reflectiveName","useEval",{func:"lv",args:[P.wv,null]},"typeArgument","tv","methodOwner","fieldOwner","i",{func:"VG",ret:P.Ms,args:[J.im]},{func:"Z5",args:[J.im]},{func:"K6",ret:P.X9,args:[J.im]},{func:"Pt",ret:J.O,args:[J.im]},{func:"ag",args:[J.O,J.O]},"eventId",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"YP",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch","cancelOnError","handleData","handleDone","resumeSignal","wasInputPaused","onData","onDone","dispatch",{func:"ha",args:[null,P.MN]},"sink",{func:"aR",void:true,args:[null,P.MN]},"inputEvent","otherZone","runGuarded","bucket","each","ifAbsent","cell","objects","orElse","k","elements","offset","comp","key1","key2",{func:"Yz",ret:J.kn,args:[P.jp]},{func:"dc",args:[J.O,P.a]},"leadingSurrogate","nextCodeUnit","matched",{func:"Tl",ret:J.im,args:[J.O]},{func:"Zh",ret:J.GW,args:[J.O]},"factor","quotient","pathSegments","base","reference","ss","ch",{func:"cd",ret:J.kn,args:[J.im]},{func:"an",ret:J.im,args:[J.im]},"digit","part",{func:"wJ",ret:J.im,args:[null,null]},"byteString",{func:"HE",ret:J.im,args:[J.im,J.im]},"byte","buffer",{func:"YI",void:true,args:[P.a]},"title","xhr","header","shouldAdd","prevValue","selector","stream","max",F.Vct,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"fT",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.D13,H.Tp,A.WZq,U.T5,N.pva,{func:"KY",ret:[J.Q,J.im],args:[J.im]},"classId",{func:"Yg",void:true,args:[J.im,J.im,null]},"startPage","dataIndex","colorMap",O.cda,"response","st",{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.im]},{func:"hN",ret:J.O,args:[J.kn]},"newSpace",K.waa,{func:"iR",args:[J.im,null]},{func:"W7",void:true,args:[J.kn,null]},"expand",Z.V4,D.Qd,{func:"eJ",ret:D.Qd},{func:"us",args:[D.Qd]},L.V9,D.D5,J.GW,G.XN,{func:"Df",ret:J.O,args:[G.Y2]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},X.V10,D.bv,D.V11,L.V12,{func:"cH",ret:J.im},{func:"r5",ret:J.Q},Z.V13,M.V14,"logLevel","rec",{func:"IM",args:[N.HV]},Z.uL,A.V15,A.V16,A.V17,A.V18,A.V19,A.V20,A.V21,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V22,{func:"a7",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.GW]},"time","bytes",{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.ir,{func:"Aa",args:[P.qK,P.dl]},{func:"Zg",args:[P.dl,P.qK,P.dl,{func:"Dv",args:[null]}]},{func:"Lc",ret:J.kn,args:[P.a]},{func:"mR",args:[[J.Q,G.DA]]},{func:"ZD",args:[[J.Q,T.z2]]},"superDecl","delegates","matcher","scopeDescriptor","cssText","properties","onName","eventType","declaration","elementElement",{func:"rd",void:true,args:[J.O,J.O]},"preventCascade",{func:"Ob",void:true,args:[[P.QV,T.z2]]},"changes","events",{func:"WW",void:true,args:[W.ea]},"callbackOrMethod","pair","p",{func:"YT",void:true,args:[[J.Q,T.z2]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"pp",ret:U.zX,args:[U.hw,U.hw]},"h","item","kind","precedence","prefix",3,{func:"qo",args:[U.hw]},Q.V23,A.qe,D.rj,{func:"ls",ret:D.rj},{func:"J5",args:[D.rj]},{func:"Ta",ret:J.O,args:[D.c2]},U.V24,{func:"Mg",void:true,args:[D.SI]},"coverage","scriptCoverage","profile","codeTable",{func:"XK",args:[null,D.kx]},{func:"Lr",ret:D.pa},{func:"HB",ret:D.af,args:[V.qC]},[P.Z0,J.O,J.GW],{func:"zs",ret:J.O,args:[J.O]},"serviceId",{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},{func:"Tt",ret:P.Z0},{func:"BV",args:[P.Z0]},"timer",{func:"zn",args:[null,D.bv]},"E","scriptHits",{func:"H6",ret:J.O,args:[D.kx]},{func:"jB",ret:D.WAE},{func:"Ep",args:[D.WAE]},"calls","codes","profileData","sampleCount","disassembly","profileTicks","address",{func:"nR",ret:Z.uL},U.V25,Q.pv,"details",Q.Nr,V.qC,K.V26,X.V27,"y","instanceRef",{func:"en",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values","instanceNodes",{func:"K7",void:true,args:[[J.Q,G.DA]]},{func:"D8",args:[J.Q]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
 function convertToFastObject(properties) {
@@ -25213,6 +25478,20 @@
 $desc=$collectedClasses.Ny
 if($desc instanceof Array)$desc=$desc[1]
 Ny.prototype=$desc
+Ny.prototype.gfg=function(receiver){return receiver.height}
+Ny.prototype.sfg=function(receiver,v){return receiver.height=v}
+Ny.prototype.gR=function(receiver){return receiver.width}
+Ny.prototype.sR=function(receiver,v){return receiver.width=v}
+function Yd(){}Yd.builtin$cls="Yd"
+if(!"name" in Yd)Yd.name="Yd"
+$desc=$collectedClasses.Yd
+if($desc instanceof Array)$desc=$desc[1]
+Yd.prototype=$desc
+function mj(){}mj.builtin$cls="mj"
+if(!"name" in mj)mj.name="mj"
+$desc=$collectedClasses.mj
+if($desc instanceof Array)$desc=$desc[1]
+mj.prototype=$desc
 function Zv(){}Zv.builtin$cls="Zv"
 if(!"name" in Zv)Zv.name="Zv"
 $desc=$collectedClasses.Zv
@@ -25329,11 +25608,15 @@
 $desc=$collectedClasses.Fs
 if($desc instanceof Array)$desc=$desc[1]
 Fs.prototype=$desc
+Fs.prototype.gfg=function(receiver){return receiver.height}
+Fs.prototype.sfg=function(receiver,v){return receiver.height=v}
 Fs.prototype.goc=function(receiver){return receiver.name}
 Fs.prototype.soc=function(receiver,v){return receiver.name=v}
 Fs.prototype.gLA=function(receiver){return receiver.src}
 Fs.prototype.gt5=function(receiver){return receiver.type}
 Fs.prototype.st5=function(receiver,v){return receiver.type=v}
+Fs.prototype.gR=function(receiver){return receiver.width}
+Fs.prototype.sR=function(receiver,v){return receiver.width=v}
 function Ty(){}Ty.builtin$cls="Ty"
 if(!"name" in Ty)Ty.name="Ty"
 $desc=$collectedClasses.Ty
@@ -25420,11 +25703,11 @@
 $desc=$collectedClasses.Uq
 if($desc instanceof Array)$desc=$desc[1]
 Uq.prototype=$desc
-function QH(){}QH.builtin$cls="QH"
-if(!"name" in QH)QH.name="QH"
-$desc=$collectedClasses.QH
+function QHL(){}QHL.builtin$cls="QHL"
+if(!"name" in QHL)QHL.name="QHL"
+$desc=$collectedClasses.QHL
 if($desc instanceof Array)$desc=$desc[1]
-QH.prototype=$desc
+QHL.prototype=$desc
 function Rt(){}Rt.builtin$cls="Rt"
 if(!"name" in Rt)Rt.name="Rt"
 $desc=$collectedClasses.Rt
@@ -25441,6 +25724,7 @@
 if($desc instanceof Array)$desc=$desc[1]
 zU.prototype=$desc
 zU.prototype.giC=function(receiver){return receiver.responseText}
+zU.prototype.gys=function(receiver){return receiver.status}
 function wa(){}wa.builtin$cls="wa"
 if(!"name" in wa)wa.name="wa"
 $desc=$collectedClasses.wa
@@ -25451,21 +25735,31 @@
 $desc=$collectedClasses.tX
 if($desc instanceof Array)$desc=$desc[1]
 tX.prototype=$desc
+tX.prototype.gfg=function(receiver){return receiver.height}
+tX.prototype.sfg=function(receiver,v){return receiver.height=v}
 tX.prototype.goc=function(receiver){return receiver.name}
 tX.prototype.soc=function(receiver,v){return receiver.name=v}
 tX.prototype.gLA=function(receiver){return receiver.src}
+tX.prototype.gR=function(receiver){return receiver.width}
+tX.prototype.sR=function(receiver,v){return receiver.width=v}
 function Sg(){}Sg.builtin$cls="Sg"
 if(!"name" in Sg)Sg.name="Sg"
 $desc=$collectedClasses.Sg
 if($desc instanceof Array)$desc=$desc[1]
 Sg.prototype=$desc
 Sg.prototype.gRn=function(receiver){return receiver.data}
+Sg.prototype.gfg=function(receiver){return receiver.height}
+Sg.prototype.gR=function(receiver){return receiver.width}
 function pA(){}pA.builtin$cls="pA"
 if(!"name" in pA)pA.name="pA"
 $desc=$collectedClasses.pA
 if($desc instanceof Array)$desc=$desc[1]
 pA.prototype=$desc
+pA.prototype.gfg=function(receiver){return receiver.height}
+pA.prototype.sfg=function(receiver,v){return receiver.height=v}
 pA.prototype.gLA=function(receiver){return receiver.src}
+pA.prototype.gR=function(receiver){return receiver.width}
+pA.prototype.sR=function(receiver,v){return receiver.width=v}
 function Mi(){}Mi.builtin$cls="Mi"
 if(!"name" in Mi)Mi.name="Mi"
 $desc=$collectedClasses.Mi
@@ -25474,6 +25768,8 @@
 Mi.prototype.gTq=function(receiver){return receiver.checked}
 Mi.prototype.sTq=function(receiver,v){return receiver.checked=v}
 Mi.prototype.gMB=function(receiver){return receiver.form}
+Mi.prototype.gfg=function(receiver){return receiver.height}
+Mi.prototype.sfg=function(receiver,v){return receiver.height=v}
 Mi.prototype.go6=function(receiver){return receiver.list}
 Mi.prototype.goc=function(receiver){return receiver.name}
 Mi.prototype.soc=function(receiver,v){return receiver.name=v}
@@ -25482,6 +25778,8 @@
 Mi.prototype.st5=function(receiver,v){return receiver.type=v}
 Mi.prototype.gP=function(receiver){return receiver.value}
 Mi.prototype.sP=function(receiver,v){return receiver.value=v}
+Mi.prototype.gR=function(receiver){return receiver.width}
+Mi.prototype.sR=function(receiver,v){return receiver.width=v}
 function Gt(){}Gt.builtin$cls="Gt"
 if(!"name" in Gt)Gt.name="Gt"
 $desc=$collectedClasses.Gt
@@ -25496,13 +25794,13 @@
 In.prototype.goc=function(receiver){return receiver.name}
 In.prototype.soc=function(receiver,v){return receiver.name=v}
 In.prototype.gt5=function(receiver){return receiver.type}
-function wP(){}wP.builtin$cls="wP"
-if(!"name" in wP)wP.name="wP"
-$desc=$collectedClasses.wP
+function pL(){}pL.builtin$cls="pL"
+if(!"name" in pL)pL.name="pL"
+$desc=$collectedClasses.pL
 if($desc instanceof Array)$desc=$desc[1]
-wP.prototype=$desc
-wP.prototype.gP=function(receiver){return receiver.value}
-wP.prototype.sP=function(receiver,v){return receiver.value=v}
+pL.prototype=$desc
+pL.prototype.gP=function(receiver){return receiver.value}
+pL.prototype.sP=function(receiver,v){return receiver.value=v}
 function eP(){}eP.builtin$cls="eP"
 if(!"name" in eP)eP.name="eP"
 $desc=$collectedClasses.eP
@@ -25637,14 +25935,14 @@
 $desc=$collectedClasses.bn
 if($desc instanceof Array)$desc=$desc[1]
 bn.prototype=$desc
-function ab(){}ab.builtin$cls="ab"
-if(!"name" in ab)ab.name="ab"
-$desc=$collectedClasses.ab
+function tH(){}tH.builtin$cls="tH"
+if(!"name" in tH)tH.name="tH"
+$desc=$collectedClasses.tH
 if($desc instanceof Array)$desc=$desc[1]
-ab.prototype=$desc
-ab.prototype.gjO=function(receiver){return receiver.id}
-ab.prototype.goc=function(receiver){return receiver.name}
-ab.prototype.gt5=function(receiver){return receiver.type}
+tH.prototype=$desc
+tH.prototype.gjO=function(receiver){return receiver.id}
+tH.prototype.goc=function(receiver){return receiver.name}
+tH.prototype.gt5=function(receiver){return receiver.type}
 function Ve(){}Ve.builtin$cls="Ve"
 if(!"name" in Ve)Ve.name="Ve"
 $desc=$collectedClasses.Ve
@@ -25711,10 +26009,14 @@
 G7.prototype=$desc
 G7.prototype.gRn=function(receiver){return receiver.data}
 G7.prototype.gMB=function(receiver){return receiver.form}
+G7.prototype.gfg=function(receiver){return receiver.height}
+G7.prototype.sfg=function(receiver,v){return receiver.height=v}
 G7.prototype.goc=function(receiver){return receiver.name}
 G7.prototype.soc=function(receiver,v){return receiver.name=v}
 G7.prototype.gt5=function(receiver){return receiver.type}
 G7.prototype.st5=function(receiver,v){return receiver.type=v}
+G7.prototype.gR=function(receiver){return receiver.width}
+G7.prototype.sR=function(receiver,v){return receiver.width=v}
 function l9(){}l9.builtin$cls="l9"
 if(!"name" in l9)l9.name="l9"
 $desc=$collectedClasses.l9
@@ -25744,11 +26046,11 @@
 Xp.prototype.gt5=function(receiver){return receiver.type}
 Xp.prototype.gP=function(receiver){return receiver.value}
 Xp.prototype.sP=function(receiver,v){return receiver.value=v}
-function bP(){}bP.builtin$cls="bP"
-if(!"name" in bP)bP.name="bP"
-$desc=$collectedClasses.bP
+function Dx(){}Dx.builtin$cls="Dx"
+if(!"name" in Dx)Dx.name="Dx"
+$desc=$collectedClasses.Dx
 if($desc instanceof Array)$desc=$desc[1]
-bP.prototype=$desc
+Dx.prototype=$desc
 function mX(){}mX.builtin$cls="mX"
 if(!"name" in mX)mX.name="mX"
 $desc=$collectedClasses.mX
@@ -25768,11 +26070,11 @@
 HD.prototype.soc=function(receiver,v){return receiver.name=v}
 HD.prototype.gP=function(receiver){return receiver.value}
 HD.prototype.sP=function(receiver,v){return receiver.value=v}
-function ni(){}ni.builtin$cls="ni"
-if(!"name" in ni)ni.name="ni"
-$desc=$collectedClasses.ni
+function PF(){}PF.builtin$cls="PF"
+if(!"name" in PF)PF.name="PF"
+$desc=$collectedClasses.PF
 if($desc instanceof Array)$desc=$desc[1]
-ni.prototype=$desc
+PF.prototype=$desc
 function jg(){}jg.builtin$cls="jg"
 if(!"name" in jg)jg.name="jg"
 $desc=$collectedClasses.jg
@@ -25780,11 +26082,11 @@
 jg.prototype=$desc
 jg.prototype.gtT=function(receiver){return receiver.code}
 jg.prototype.gG1=function(receiver){return receiver.message}
-function GT(){}GT.builtin$cls="GT"
-if(!"name" in GT)GT.name="GT"
-$desc=$collectedClasses.GT
+function qj(){}qj.builtin$cls="qj"
+if(!"name" in qj)qj.name="qj"
+$desc=$collectedClasses.qj
 if($desc instanceof Array)$desc=$desc[1]
-GT.prototype=$desc
+qj.prototype=$desc
 function nC(){}nC.builtin$cls="nC"
 if(!"name" in nC)nC.name="nC"
 $desc=$collectedClasses.nC
@@ -25798,11 +26100,11 @@
 KR.prototype=$desc
 KR.prototype.gP=function(receiver){return receiver.value}
 KR.prototype.sP=function(receiver,v){return receiver.value=v}
-function ew(){}ew.builtin$cls="ew"
-if(!"name" in ew)ew.name="ew"
-$desc=$collectedClasses.ew
+function kQ(){}kQ.builtin$cls="kQ"
+if(!"name" in kQ)kQ.name="kQ"
+$desc=$collectedClasses.kQ
 if($desc instanceof Array)$desc=$desc[1]
-ew.prototype=$desc
+kQ.prototype=$desc
 function fs(){}fs.builtin$cls="fs"
 if(!"name" in fs)fs.name="fs"
 $desc=$collectedClasses.fs
@@ -25857,11 +26159,11 @@
 lp.prototype.gt5=function(receiver){return receiver.type}
 lp.prototype.gP=function(receiver){return receiver.value}
 lp.prototype.sP=function(receiver,v){return receiver.value=v}
-function kd(){}kd.builtin$cls="kd"
-if(!"name" in kd)kd.name="kd"
-$desc=$collectedClasses.kd
+function pD(){}pD.builtin$cls="pD"
+if(!"name" in pD)pD.name="pD"
+$desc=$collectedClasses.pD
 if($desc instanceof Array)$desc=$desc[1]
-kd.prototype=$desc
+pD.prototype=$desc
 function I0(){}I0.builtin$cls="I0"
 if(!"name" in I0)I0.name="I0"
 $desc=$collectedClasses.I0
@@ -25918,15 +26220,15 @@
 if($desc instanceof Array)$desc=$desc[1]
 G5.prototype=$desc
 G5.prototype.goc=function(receiver){return receiver.name}
-function bk(){}bk.builtin$cls="bk"
-if(!"name" in bk)bk.name="bk"
-$desc=$collectedClasses.bk
+function wb(){}wb.builtin$cls="wb"
+if(!"name" in wb)wb.name="wb"
+$desc=$collectedClasses.wb
 if($desc instanceof Array)$desc=$desc[1]
-bk.prototype=$desc
-bk.prototype.gG3=function(receiver){return receiver.key}
-bk.prototype.gzZ=function(receiver){return receiver.newValue}
-bk.prototype.gjL=function(receiver){return receiver.oldValue}
-bk.prototype.gO3=function(receiver){return receiver.url}
+wb.prototype=$desc
+wb.prototype.gG3=function(receiver){return receiver.key}
+wb.prototype.gzZ=function(receiver){return receiver.newValue}
+wb.prototype.gjL=function(receiver){return receiver.oldValue}
+wb.prototype.gO3=function(receiver){return receiver.url}
 function Lx(){}Lx.builtin$cls="Lx"
 if(!"name" in Lx)Lx.name="Lx"
 $desc=$collectedClasses.Lx
@@ -25988,12 +26290,12 @@
 AE.prototype.gt5=function(receiver){return receiver.type}
 AE.prototype.gP=function(receiver){return receiver.value}
 AE.prototype.sP=function(receiver,v){return receiver.value=v}
-function xV(){}xV.builtin$cls="xV"
-if(!"name" in xV)xV.name="xV"
-$desc=$collectedClasses.xV
+function R0(){}R0.builtin$cls="R0"
+if(!"name" in R0)R0.name="R0"
+$desc=$collectedClasses.R0
 if($desc instanceof Array)$desc=$desc[1]
-xV.prototype=$desc
-xV.prototype.gRn=function(receiver){return receiver.data}
+R0.prototype=$desc
+R0.prototype.gRn=function(receiver){return receiver.data}
 function FH(){}FH.builtin$cls="FH"
 if(!"name" in FH)FH.name="FH"
 $desc=$collectedClasses.FH
@@ -26014,11 +26316,11 @@
 RH.prototype.gph=function(receiver){return receiver.label}
 RH.prototype.sph=function(receiver,v){return receiver.label=v}
 RH.prototype.gLA=function(receiver){return receiver.src}
-function pU(){}pU.builtin$cls="pU"
-if(!"name" in pU)pU.name="pU"
-$desc=$collectedClasses.pU
+function Fg(){}Fg.builtin$cls="Fg"
+if(!"name" in Fg)Fg.name="Fg"
+$desc=$collectedClasses.Fg
 if($desc instanceof Array)$desc=$desc[1]
-pU.prototype=$desc
+Fg.prototype=$desc
 function OJ(){}OJ.builtin$cls="OJ"
 if(!"name" in OJ)OJ.name="OJ"
 $desc=$collectedClasses.OJ
@@ -26034,21 +26336,25 @@
 $desc=$collectedClasses.dp
 if($desc instanceof Array)$desc=$desc[1]
 dp.prototype=$desc
-function vw(){}vw.builtin$cls="vw"
-if(!"name" in vw)vw.name="vw"
-$desc=$collectedClasses.vw
+function r4(){}r4.builtin$cls="r4"
+if(!"name" in r4)r4.name="r4"
+$desc=$collectedClasses.r4
 if($desc instanceof Array)$desc=$desc[1]
-vw.prototype=$desc
-function aG(){}aG.builtin$cls="aG"
-if(!"name" in aG)aG.name="aG"
-$desc=$collectedClasses.aG
+r4.prototype=$desc
+function SW(){}SW.builtin$cls="SW"
+if(!"name" in SW)SW.name="SW"
+$desc=$collectedClasses.SW
 if($desc instanceof Array)$desc=$desc[1]
-aG.prototype=$desc
-function fA(){}fA.builtin$cls="fA"
-if(!"name" in fA)fA.name="fA"
-$desc=$collectedClasses.fA
+SW.prototype=$desc
+SW.prototype.gfg=function(receiver){return receiver.height}
+SW.prototype.sfg=function(receiver,v){return receiver.height=v}
+SW.prototype.gR=function(receiver){return receiver.width}
+SW.prototype.sR=function(receiver,v){return receiver.width=v}
+function T4(){}T4.builtin$cls="T4"
+if(!"name" in T4)T4.name="T4"
+$desc=$collectedClasses.T4
 if($desc instanceof Array)$desc=$desc[1]
-fA.prototype=$desc
+T4.prototype=$desc
 function u9(){}u9.builtin$cls="u9"
 if(!"name" in u9)u9.name="u9"
 $desc=$collectedClasses.u9
@@ -26056,6 +26362,8 @@
 u9.prototype=$desc
 u9.prototype.goc=function(receiver){return receiver.name}
 u9.prototype.soc=function(receiver,v){return receiver.name=v}
+u9.prototype.gys=function(receiver){return receiver.status}
+u9.prototype.sys=function(receiver,v){return receiver.status=v}
 function Bn(){}Bn.builtin$cls="Bn"
 if(!"name" in Bn)Bn.name="Bn"
 $desc=$collectedClasses.Bn
@@ -26079,11 +26387,11 @@
 $desc=$collectedClasses.tZ
 if($desc instanceof Array)$desc=$desc[1]
 tZ.prototype=$desc
-function kc(){}kc.builtin$cls="kc"
-if(!"name" in kc)kc.name="kc"
-$desc=$collectedClasses.kc
+function eq(){}eq.builtin$cls="eq"
+if(!"name" in eq)eq.name="eq"
+$desc=$collectedClasses.eq
 if($desc instanceof Array)$desc=$desc[1]
-kc.prototype=$desc
+eq.prototype=$desc
 function AK(){}AK.builtin$cls="AK"
 if(!"name" in AK)AK.name="AK"
 $desc=$collectedClasses.AK
@@ -26094,11 +26402,11 @@
 $desc=$collectedClasses.ty
 if($desc instanceof Array)$desc=$desc[1]
 ty.prototype=$desc
-function Nf(){}Nf.builtin$cls="Nf"
-if(!"name" in Nf)Nf.name="Nf"
-$desc=$collectedClasses.Nf
+function SC(){}SC.builtin$cls="SC"
+if(!"name" in SC)SC.name="SC"
+$desc=$collectedClasses.SC
 if($desc instanceof Array)$desc=$desc[1]
-Nf.prototype=$desc
+SC.prototype=$desc
 function F2(){}F2.builtin$cls="F2"
 if(!"name" in F2)F2.name="F2"
 $desc=$collectedClasses.F2
@@ -26124,11 +26432,11 @@
 $desc=$collectedClasses.c5
 if($desc instanceof Array)$desc=$desc[1]
 c5.prototype=$desc
-function LO(){}LO.builtin$cls="LO"
-if(!"name" in LO)LO.name="LO"
-$desc=$collectedClasses.LO
+function LOx(){}LOx.builtin$cls="LOx"
+if(!"name" in LOx)LOx.name="LOx"
+$desc=$collectedClasses.LOx
 if($desc instanceof Array)$desc=$desc[1]
-LO.prototype=$desc
+LOx.prototype=$desc
 function Q7(){}Q7.builtin$cls="Q7"
 if(!"name" in Q7)Q7.name="Q7"
 $desc=$collectedClasses.Q7
@@ -26177,6 +26485,21 @@
 $desc=$collectedClasses.y5
 if($desc instanceof Array)$desc=$desc[1]
 y5.prototype=$desc
+function JY(){}JY.builtin$cls="JY"
+if(!"name" in JY)JY.name="JY"
+$desc=$collectedClasses.JY
+if($desc instanceof Array)$desc=$desc[1]
+JY.prototype=$desc
+function or8(){}or8.builtin$cls="or8"
+if(!"name" in or8)or8.name="or8"
+$desc=$collectedClasses.or8
+if($desc instanceof Array)$desc=$desc[1]
+or8.prototype=$desc
+function xt(){}xt.builtin$cls="xt"
+if(!"name" in xt)xt.name="xt"
+$desc=$collectedClasses.xt
+if($desc instanceof Array)$desc=$desc[1]
+xt.prototype=$desc
 function jQ(){}jQ.builtin$cls="jQ"
 if(!"name" in jQ)jQ.name="jQ"
 $desc=$collectedClasses.jQ
@@ -26192,11 +26515,11 @@
 $desc=$collectedClasses.ui
 if($desc instanceof Array)$desc=$desc[1]
 ui.prototype=$desc
-function vO(){}vO.builtin$cls="vO"
-if(!"name" in vO)vO.name="vO"
-$desc=$collectedClasses.vO
+function TI(){}TI.builtin$cls="TI"
+if(!"name" in TI)TI.name="TI"
+$desc=$collectedClasses.TI
 if($desc instanceof Array)$desc=$desc[1]
-vO.prototype=$desc
+TI.prototype=$desc
 function DQ(){}DQ.builtin$cls="DQ"
 if(!"name" in DQ)DQ.name="DQ"
 $desc=$collectedClasses.DQ
@@ -26222,6 +26545,10 @@
 $desc=$collectedClasses.eG
 if($desc instanceof Array)$desc=$desc[1]
 eG.prototype=$desc
+eG.prototype.gfg=function(receiver){return receiver.height}
+eG.prototype.gR=function(receiver){return receiver.width}
+eG.prototype.gx=function(receiver){return receiver.x}
+eG.prototype.gy=function(receiver){return receiver.y}
 function lv(){}lv.builtin$cls="lv"
 if(!"name" in lv)lv.name="lv"
 $desc=$collectedClasses.lv
@@ -26229,32 +26556,56 @@
 lv.prototype=$desc
 lv.prototype.gt5=function(receiver){return receiver.type}
 lv.prototype.gUQ=function(receiver){return receiver.values}
+lv.prototype.gfg=function(receiver){return receiver.height}
+lv.prototype.gR=function(receiver){return receiver.width}
+lv.prototype.gx=function(receiver){return receiver.x}
+lv.prototype.gy=function(receiver){return receiver.y}
 function pf(){}pf.builtin$cls="pf"
 if(!"name" in pf)pf.name="pf"
 $desc=$collectedClasses.pf
 if($desc instanceof Array)$desc=$desc[1]
 pf.prototype=$desc
+pf.prototype.gfg=function(receiver){return receiver.height}
+pf.prototype.gR=function(receiver){return receiver.width}
+pf.prototype.gx=function(receiver){return receiver.x}
+pf.prototype.gy=function(receiver){return receiver.y}
 function NV(){}NV.builtin$cls="NV"
 if(!"name" in NV)NV.name="NV"
 $desc=$collectedClasses.NV
 if($desc instanceof Array)$desc=$desc[1]
 NV.prototype=$desc
 NV.prototype.gkp=function(receiver){return receiver.operator}
+NV.prototype.gfg=function(receiver){return receiver.height}
+NV.prototype.gR=function(receiver){return receiver.width}
+NV.prototype.gx=function(receiver){return receiver.x}
+NV.prototype.gy=function(receiver){return receiver.y}
 function W1(){}W1.builtin$cls="W1"
 if(!"name" in W1)W1.name="W1"
 $desc=$collectedClasses.W1
 if($desc instanceof Array)$desc=$desc[1]
 W1.prototype=$desc
+W1.prototype.gfg=function(receiver){return receiver.height}
+W1.prototype.gR=function(receiver){return receiver.width}
+W1.prototype.gx=function(receiver){return receiver.x}
+W1.prototype.gy=function(receiver){return receiver.y}
 function mCz(){}mCz.builtin$cls="mCz"
 if(!"name" in mCz)mCz.name="mCz"
 $desc=$collectedClasses.mCz
 if($desc instanceof Array)$desc=$desc[1]
 mCz.prototype=$desc
+mCz.prototype.gfg=function(receiver){return receiver.height}
+mCz.prototype.gR=function(receiver){return receiver.width}
+mCz.prototype.gx=function(receiver){return receiver.x}
+mCz.prototype.gy=function(receiver){return receiver.y}
 function kK(){}kK.builtin$cls="kK"
 if(!"name" in kK)kK.name="kK"
 $desc=$collectedClasses.kK
 if($desc instanceof Array)$desc=$desc[1]
 kK.prototype=$desc
+kK.prototype.gfg=function(receiver){return receiver.height}
+kK.prototype.gR=function(receiver){return receiver.width}
+kK.prototype.gx=function(receiver){return receiver.x}
+kK.prototype.gy=function(receiver){return receiver.y}
 function n5(){}n5.builtin$cls="n5"
 if(!"name" in n5)n5.name="n5"
 $desc=$collectedClasses.n5
@@ -26265,6 +26616,10 @@
 $desc=$collectedClasses.bb
 if($desc instanceof Array)$desc=$desc[1]
 bb.prototype=$desc
+bb.prototype.gfg=function(receiver){return receiver.height}
+bb.prototype.gR=function(receiver){return receiver.width}
+bb.prototype.gx=function(receiver){return receiver.x}
+bb.prototype.gy=function(receiver){return receiver.y}
 function NdT(){}NdT.builtin$cls="NdT"
 if(!"name" in NdT)NdT.name="NdT"
 $desc=$collectedClasses.NdT
@@ -26290,17 +26645,29 @@
 $desc=$collectedClasses.Ob
 if($desc instanceof Array)$desc=$desc[1]
 Ob.prototype=$desc
+Ob.prototype.gfg=function(receiver){return receiver.height}
+Ob.prototype.gR=function(receiver){return receiver.width}
+Ob.prototype.gx=function(receiver){return receiver.x}
+Ob.prototype.gy=function(receiver){return receiver.y}
 function me(){}me.builtin$cls="me"
 if(!"name" in me)me.name="me"
 $desc=$collectedClasses.me
 if($desc instanceof Array)$desc=$desc[1]
 me.prototype=$desc
+me.prototype.gfg=function(receiver){return receiver.height}
+me.prototype.gR=function(receiver){return receiver.width}
+me.prototype.gx=function(receiver){return receiver.x}
+me.prototype.gy=function(receiver){return receiver.y}
 me.prototype.gmH=function(receiver){return receiver.href}
 function oB(){}oB.builtin$cls="oB"
 if(!"name" in oB)oB.name="oB"
 $desc=$collectedClasses.oB
 if($desc instanceof Array)$desc=$desc[1]
 oB.prototype=$desc
+oB.prototype.gfg=function(receiver){return receiver.height}
+oB.prototype.gR=function(receiver){return receiver.width}
+oB.prototype.gx=function(receiver){return receiver.x}
+oB.prototype.gy=function(receiver){return receiver.y}
 function NY(){}NY.builtin$cls="NY"
 if(!"name" in NY)NY.name="NY"
 $desc=$collectedClasses.NY
@@ -26312,58 +26679,90 @@
 if($desc instanceof Array)$desc=$desc[1]
 EI.prototype=$desc
 EI.prototype.gkp=function(receiver){return receiver.operator}
+EI.prototype.gfg=function(receiver){return receiver.height}
+EI.prototype.gR=function(receiver){return receiver.width}
+EI.prototype.gx=function(receiver){return receiver.x}
+EI.prototype.gy=function(receiver){return receiver.y}
 function MI(){}MI.builtin$cls="MI"
 if(!"name" in MI)MI.name="MI"
 $desc=$collectedClasses.MI
 if($desc instanceof Array)$desc=$desc[1]
 MI.prototype=$desc
+MI.prototype.gfg=function(receiver){return receiver.height}
+MI.prototype.gR=function(receiver){return receiver.width}
+MI.prototype.gx=function(receiver){return receiver.x}
+MI.prototype.gy=function(receiver){return receiver.y}
 function rg(){}rg.builtin$cls="rg"
 if(!"name" in rg)rg.name="rg"
 $desc=$collectedClasses.rg
 if($desc instanceof Array)$desc=$desc[1]
 rg.prototype=$desc
+rg.prototype.gx=function(receiver){return receiver.x}
+rg.prototype.gy=function(receiver){return receiver.y}
 function um(){}um.builtin$cls="um"
 if(!"name" in um)um.name="um"
 $desc=$collectedClasses.um
 if($desc instanceof Array)$desc=$desc[1]
 um.prototype=$desc
+um.prototype.gfg=function(receiver){return receiver.height}
+um.prototype.gR=function(receiver){return receiver.width}
+um.prototype.gx=function(receiver){return receiver.x}
+um.prototype.gy=function(receiver){return receiver.y}
 function eW(){}eW.builtin$cls="eW"
 if(!"name" in eW)eW.name="eW"
 $desc=$collectedClasses.eW
 if($desc instanceof Array)$desc=$desc[1]
 eW.prototype=$desc
+eW.prototype.gx=function(receiver){return receiver.x}
+eW.prototype.gy=function(receiver){return receiver.y}
 function kL(){}kL.builtin$cls="kL"
 if(!"name" in kL)kL.name="kL"
 $desc=$collectedClasses.kL
 if($desc instanceof Array)$desc=$desc[1]
 kL.prototype=$desc
+kL.prototype.gfg=function(receiver){return receiver.height}
+kL.prototype.gR=function(receiver){return receiver.width}
+kL.prototype.gx=function(receiver){return receiver.x}
+kL.prototype.gy=function(receiver){return receiver.y}
 function Fu(){}Fu.builtin$cls="Fu"
 if(!"name" in Fu)Fu.name="Fu"
 $desc=$collectedClasses.Fu
 if($desc instanceof Array)$desc=$desc[1]
 Fu.prototype=$desc
 Fu.prototype.gt5=function(receiver){return receiver.type}
+Fu.prototype.gfg=function(receiver){return receiver.height}
+Fu.prototype.gR=function(receiver){return receiver.width}
+Fu.prototype.gx=function(receiver){return receiver.x}
+Fu.prototype.gy=function(receiver){return receiver.y}
 function QN(){}QN.builtin$cls="QN"
 if(!"name" in QN)QN.name="QN"
 $desc=$collectedClasses.QN
 if($desc instanceof Array)$desc=$desc[1]
 QN.prototype=$desc
+QN.prototype.gfg=function(receiver){return receiver.height}
+QN.prototype.gR=function(receiver){return receiver.width}
+QN.prototype.gx=function(receiver){return receiver.x}
+QN.prototype.gy=function(receiver){return receiver.y}
 QN.prototype.gmH=function(receiver){return receiver.href}
 function N9(){}N9.builtin$cls="N9"
 if(!"name" in N9)N9.name="N9"
 $desc=$collectedClasses.N9
 if($desc instanceof Array)$desc=$desc[1]
 N9.prototype=$desc
+N9.prototype.gfg=function(receiver){return receiver.height}
+N9.prototype.gR=function(receiver){return receiver.width}
+N9.prototype.gx=function(receiver){return receiver.x}
+N9.prototype.gy=function(receiver){return receiver.y}
 function BA(){}BA.builtin$cls="BA"
 if(!"name" in BA)BA.name="BA"
 $desc=$collectedClasses.BA
 if($desc instanceof Array)$desc=$desc[1]
 BA.prototype=$desc
-function d0(){}d0.builtin$cls="d0"
-if(!"name" in d0)d0.name="d0"
-$desc=$collectedClasses.d0
+function TQ(){}TQ.builtin$cls="TQ"
+if(!"name" in TQ)TQ.name="TQ"
+$desc=$collectedClasses.TQ
 if($desc instanceof Array)$desc=$desc[1]
-d0.prototype=$desc
+TQ.prototype=$desc
 function zp(){}zp.builtin$cls="zp"
 if(!"name" in zp)zp.name="zp"
 $desc=$collectedClasses.zp
@@ -26374,6 +26773,10 @@
 $desc=$collectedClasses.br
 if($desc instanceof Array)$desc=$desc[1]
 br.prototype=$desc
+br.prototype.gfg=function(receiver){return receiver.height}
+br.prototype.gR=function(receiver){return receiver.width}
+br.prototype.gx=function(receiver){return receiver.x}
+br.prototype.gy=function(receiver){return receiver.y}
 br.prototype.gmH=function(receiver){return receiver.href}
 function PIw(){}PIw.builtin$cls="PIw"
 if(!"name" in PIw)PIw.name="PIw"
@@ -26390,11 +26793,15 @@
 $desc=$collectedClasses.Jq
 if($desc instanceof Array)$desc=$desc[1]
 Jq.prototype=$desc
-function Yd(){}Yd.builtin$cls="Yd"
-if(!"name" in Yd)Yd.name="Yd"
-$desc=$collectedClasses.Yd
+function NBZ(){}NBZ.builtin$cls="NBZ"
+if(!"name" in NBZ)NBZ.name="NBZ"
+$desc=$collectedClasses.NBZ
 if($desc instanceof Array)$desc=$desc[1]
-Yd.prototype=$desc
+NBZ.prototype=$desc
+NBZ.prototype.gfg=function(receiver){return receiver.height}
+NBZ.prototype.gR=function(receiver){return receiver.width}
+NBZ.prototype.gx=function(receiver){return receiver.x}
+NBZ.prototype.gy=function(receiver){return receiver.y}
 function kN(){}kN.builtin$cls="kN"
 if(!"name" in kN)kN.name="kN"
 $desc=$collectedClasses.kN
@@ -26410,6 +26817,10 @@
 $desc=$collectedClasses.Gr
 if($desc instanceof Array)$desc=$desc[1]
 Gr.prototype=$desc
+Gr.prototype.gfg=function(receiver){return receiver.height}
+Gr.prototype.gR=function(receiver){return receiver.width}
+Gr.prototype.gx=function(receiver){return receiver.x}
+Gr.prototype.gy=function(receiver){return receiver.y}
 Gr.prototype.gmH=function(receiver){return receiver.href}
 function XE(){}XE.builtin$cls="XE"
 if(!"name" in XE)XE.name="XE"
@@ -26431,6 +26842,10 @@
 $desc=$collectedClasses.NJ
 if($desc instanceof Array)$desc=$desc[1]
 NJ.prototype=$desc
+NJ.prototype.gfg=function(receiver){return receiver.height}
+NJ.prototype.gR=function(receiver){return receiver.width}
+NJ.prototype.gx=function(receiver){return receiver.x}
+NJ.prototype.gy=function(receiver){return receiver.y}
 function j24(){}j24.builtin$cls="j24"
 if(!"name" in j24)j24.name="j24"
 $desc=$collectedClasses.j24
@@ -26449,13 +26864,13 @@
 $desc=$collectedClasses.rQ
 if($desc instanceof Array)$desc=$desc[1]
 rQ.prototype=$desc
-function Lu(){}Lu.builtin$cls="Lu"
-if(!"name" in Lu)Lu.name="Lu"
-$desc=$collectedClasses.Lu
+function ki(){}ki.builtin$cls="ki"
+if(!"name" in ki)ki.name="ki"
+$desc=$collectedClasses.ki
 if($desc instanceof Array)$desc=$desc[1]
-Lu.prototype=$desc
-Lu.prototype.gt5=function(receiver){return receiver.type}
-Lu.prototype.st5=function(receiver,v){return receiver.type=v}
+ki.prototype=$desc
+ki.prototype.gt5=function(receiver){return receiver.type}
+ki.prototype.st5=function(receiver,v){return receiver.type=v}
 function LR(){}LR.builtin$cls="LR"
 if(!"name" in LR)LR.name="LR"
 $desc=$collectedClasses.LR
@@ -26471,6 +26886,10 @@
 $desc=$collectedClasses.hy
 if($desc instanceof Array)$desc=$desc[1]
 hy.prototype=$desc
+hy.prototype.gfg=function(receiver){return receiver.height}
+hy.prototype.gR=function(receiver){return receiver.width}
+hy.prototype.gx=function(receiver){return receiver.x}
+hy.prototype.gy=function(receiver){return receiver.y}
 function mq(){}mq.builtin$cls="mq"
 if(!"name" in mq)mq.name="mq"
 $desc=$collectedClasses.mq
@@ -26486,11 +26905,11 @@
 $desc=$collectedClasses.CG
 if($desc instanceof Array)$desc=$desc[1]
 CG.prototype=$desc
-function Xe(){}Xe.builtin$cls="Xe"
-if(!"name" in Xe)Xe.name="Xe"
-$desc=$collectedClasses.Xe
+function mHq(){}mHq.builtin$cls="mHq"
+if(!"name" in mHq)mHq.name="mHq"
+$desc=$collectedClasses.mHq
 if($desc instanceof Array)$desc=$desc[1]
-Xe.prototype=$desc
+mHq.prototype=$desc
 function y0(){}y0.builtin$cls="y0"
 if(!"name" in y0)y0.name="y0"
 $desc=$collectedClasses.y0
@@ -26508,6 +26927,8 @@
 $desc=$collectedClasses.Eo
 if($desc instanceof Array)$desc=$desc[1]
 Eo.prototype=$desc
+Eo.prototype.gx=function(receiver){return receiver.x}
+Eo.prototype.gy=function(receiver){return receiver.y}
 function Dn(){}Dn.builtin$cls="Dn"
 if(!"name" in Dn)Dn.name="Dn"
 $desc=$collectedClasses.Dn
@@ -26518,6 +26939,10 @@
 $desc=$collectedClasses.pyk
 if($desc instanceof Array)$desc=$desc[1]
 pyk.prototype=$desc
+pyk.prototype.gfg=function(receiver){return receiver.height}
+pyk.prototype.gR=function(receiver){return receiver.width}
+pyk.prototype.gx=function(receiver){return receiver.x}
+pyk.prototype.gy=function(receiver){return receiver.y}
 pyk.prototype.gmH=function(receiver){return receiver.href}
 function ZD(){}ZD.builtin$cls="ZD"
 if(!"name" in ZD)ZD.name="ZD"
@@ -26555,11 +26980,11 @@
 $desc=$collectedClasses.Ja
 if($desc instanceof Array)$desc=$desc[1]
 Ja.prototype=$desc
-function mj(){}mj.builtin$cls="mj"
-if(!"name" in mj)mj.name="mj"
-$desc=$collectedClasses.mj
+function FT(){}FT.builtin$cls="FT"
+if(!"name" in FT)FT.name="FT"
+$desc=$collectedClasses.FT
 if($desc instanceof Array)$desc=$desc[1]
-mj.prototype=$desc
+FT.prototype=$desc
 function hW(){}hW.builtin$cls="hW"
 if(!"name" in hW)hW.name="hW"
 $desc=$collectedClasses.hW
@@ -26575,21 +27000,21 @@
 $desc=$collectedClasses.yR
 if($desc instanceof Array)$desc=$desc[1]
 yR.prototype=$desc
-function AX(){}AX.builtin$cls="AX"
-if(!"name" in AX)AX.name="AX"
-$desc=$collectedClasses.AX
+function GK(){}GK.builtin$cls="GK"
+if(!"name" in GK)GK.name="GK"
+$desc=$collectedClasses.GK
 if($desc instanceof Array)$desc=$desc[1]
-AX.prototype=$desc
+GK.prototype=$desc
 function xJ(){}xJ.builtin$cls="xJ"
 if(!"name" in xJ)xJ.name="xJ"
 $desc=$collectedClasses.xJ
 if($desc instanceof Array)$desc=$desc[1]
 xJ.prototype=$desc
-function Nn(){}Nn.builtin$cls="Nn"
-if(!"name" in Nn)Nn.name="Nn"
-$desc=$collectedClasses.Nn
+function aC(){}aC.builtin$cls="aC"
+if(!"name" in aC)aC.name="aC"
+$desc=$collectedClasses.aC
 if($desc instanceof Array)$desc=$desc[1]
-Nn.prototype=$desc
+aC.prototype=$desc
 function Et(){}Et.builtin$cls="Et"
 if(!"name" in Et)Et.name="Et"
 $desc=$collectedClasses.Et
@@ -26610,11 +27035,11 @@
 $desc=$collectedClasses.Zn
 if($desc instanceof Array)$desc=$desc[1]
 Zn.prototype=$desc
-function xt(){}xt.builtin$cls="xt"
-if(!"name" in xt)xt.name="xt"
-$desc=$collectedClasses.xt
+function zu(){}zu.builtin$cls="zu"
+if(!"name" in zu)zu.name="zu"
+$desc=$collectedClasses.zu
 if($desc instanceof Array)$desc=$desc[1]
-xt.prototype=$desc
+zu.prototype=$desc
 function tG(){}tG.builtin$cls="tG"
 if(!"name" in tG)tG.name="tG"
 $desc=$collectedClasses.tG
@@ -26687,11 +27112,11 @@
 $desc=$collectedClasses.IJ
 if($desc instanceof Array)$desc=$desc[1]
 IJ.prototype=$desc
-function aH(){}aH.builtin$cls="aH"
-if(!"name" in aH)aH.name="aH"
-$desc=$collectedClasses.aH
+function us(){}us.builtin$cls="us"
+if(!"name" in us)us.name="us"
+$desc=$collectedClasses.us
 if($desc instanceof Array)$desc=$desc[1]
-aH.prototype=$desc
+us.prototype=$desc
 function N2(){}N2.builtin$cls="N2"
 if(!"name" in N2)N2.name="N2"
 $desc=$collectedClasses.N2
@@ -26778,11 +27203,11 @@
 $desc=$collectedClasses.GW
 if($desc instanceof Array)$desc=$desc[1]
 GW.prototype=$desc
-function vT(){}vT.builtin$cls="vT"
-if(!"name" in vT)vT.name="vT"
-$desc=$collectedClasses.vT
+function x1(){}x1.builtin$cls="x1"
+if(!"name" in x1)x1.name="x1"
+$desc=$collectedClasses.x1
 if($desc instanceof Array)$desc=$desc[1]
-vT.prototype=$desc
+x1.prototype=$desc
 function VP(){}VP.builtin$cls="VP"
 if(!"name" in VP)VP.name="VP"
 $desc=$collectedClasses.VP
@@ -26830,12 +27255,12 @@
 f0.prototype.gi2=function(receiver){return this.i2}
 f0.prototype.si2=function(receiver,v){return this.i2=v}
 f0.prototype.gw2=function(){return this.w2}
-function aX(jO,Gx,fW,En,EE,Qy,PX,RW,C9,lJ,Jp,pa){this.jO=jO
+function aX(jO,Gx,fW,En,EE,um,PX,RW,C9,lJ,Jp,pa){this.jO=jO
 this.Gx=Gx
 this.fW=fW
 this.En=En
 this.EE=EE
-this.Qy=Qy
+this.um=um
 this.PX=PX
 this.RW=RW
 this.C9=C9
@@ -26901,11 +27326,11 @@
 $desc=$collectedClasses.Vg
 if($desc instanceof Array)$desc=$desc[1]
 Vg.prototype=$desc
-function Iy(){}Iy.builtin$cls="Iy"
-if(!"name" in Iy)Iy.name="Iy"
-$desc=$collectedClasses.Iy
+function dq(){}dq.builtin$cls="dq"
+if(!"name" in dq)dq.name="dq"
+$desc=$collectedClasses.dq
 if($desc instanceof Array)$desc=$desc[1]
-Iy.prototype=$desc
+dq.prototype=$desc
 function Z6(JE,Jz){this.JE=JE
 this.Jz=Jz}Z6.builtin$cls="Z6"
 if(!"name" in Z6)Z6.name="Z6"
@@ -27012,11 +27437,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 ku.prototype=$desc
 ku.prototype.gng=function(receiver){return this.ng}
-function Zd(){}Zd.builtin$cls="Zd"
-if(!"name" in Zd)Zd.name="Zd"
-$desc=$collectedClasses.Zd
+function L1(){}L1.builtin$cls="L1"
+if(!"name" in L1)L1.name="L1"
+$desc=$collectedClasses.L1
 if($desc instanceof Array)$desc=$desc[1]
-Zd.prototype=$desc
+L1.prototype=$desc
 function xQ(){}xQ.builtin$cls="xQ"
 if(!"name" in xQ)xQ.name="xQ"
 $desc=$collectedClasses.xQ
@@ -27218,22 +27643,22 @@
 v.prototype.gnw=function(){return this.nw}
 v.prototype.gjm=function(){return this.jm}
 v.prototype.gRA=function(receiver){return this.RA}
-function Ll(QW){this.QW=QW}Ll.builtin$cls="Ll"
-if(!"name" in Ll)Ll.name="Ll"
-$desc=$collectedClasses.Ll
+function qq(QW){this.QW=QW}qq.builtin$cls="qq"
+if(!"name" in qq)qq.name="qq"
+$desc=$collectedClasses.qq
 if($desc instanceof Array)$desc=$desc[1]
-Ll.prototype=$desc
-function D2(QW){this.QW=QW}D2.builtin$cls="D2"
-if(!"name" in D2)D2.name="D2"
-$desc=$collectedClasses.D2
+qq.prototype=$desc
+function dN(QW){this.QW=QW}dN.builtin$cls="dN"
+if(!"name" in dN)dN.name="dN"
+$desc=$collectedClasses.dN
 if($desc instanceof Array)$desc=$desc[1]
-D2.prototype=$desc
-function my(oc){this.oc=oc}my.builtin$cls="my"
-if(!"name" in my)my.name="my"
-$desc=$collectedClasses.my
+dN.prototype=$desc
+function GT(oc){this.oc=oc}GT.builtin$cls="GT"
+if(!"name" in GT)GT.name="GT"
+$desc=$collectedClasses.GT
 if($desc instanceof Array)$desc=$desc[1]
-my.prototype=$desc
-my.prototype.goc=function(receiver){return this.oc}
+GT.prototype=$desc
+GT.prototype.goc=function(receiver){return this.oc}
 function Pe(G1){this.G1=G1}Pe.builtin$cls="Pe"
 if(!"name" in Pe)Pe.name="Pe"
 $desc=$collectedClasses.Pe
@@ -27246,11 +27671,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 Eq.prototype=$desc
 Eq.prototype.gG1=function(receiver){return this.G1}
-function lb(){}lb.builtin$cls="lb"
-if(!"name" in lb)lb.name="lb"
-$desc=$collectedClasses.lb
+function lbp(){}lbp.builtin$cls="lbp"
+if(!"name" in lbp)lbp.name="lbp"
+$desc=$collectedClasses.lbp
 if($desc instanceof Array)$desc=$desc[1]
-lb.prototype=$desc
+lbp.prototype=$desc
 function tD(dw,Iq,is,p6){this.dw=dw
 this.Iq=Iq
 this.is=is
@@ -27405,8 +27830,7 @@
 Y2.prototype.gwd.$reflectable=1
 Y2.prototype.goH=function(){return this.oH}
 Y2.prototype.goH.$reflectable=1
-function XN(rI,WT,AP,Lk){this.rI=rI
-this.WT=WT
+function XN(WT,AP,Lk){this.WT=WT
 this.AP=AP
 this.Lk=Lk}XN.builtin$cls="XN"
 if(!"name" in XN)XN.name="XN"
@@ -27436,11 +27860,11 @@
 G6.prototype.gBW.$reflectable=1
 G6.prototype.sBW=function(receiver,v){return receiver.BW=v}
 G6.prototype.sBW.$reflectable=1
-function Vf(){}Vf.builtin$cls="Vf"
-if(!"name" in Vf)Vf.name="Vf"
-$desc=$collectedClasses.Vf
+function Ds(){}Ds.builtin$cls="Ds"
+if(!"name" in Ds)Ds.name="Ds"
+$desc=$collectedClasses.Ds
 if($desc instanceof Array)$desc=$desc[1]
-Vf.prototype=$desc
+Ds.prototype=$desc
 function Tg(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27459,7 +27883,7 @@
 $desc=$collectedClasses.Tg
 if($desc instanceof Array)$desc=$desc[1]
 Tg.prototype=$desc
-function Jc(F0,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.F0=F0
+function Jc(lb,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lb=lb
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -27476,15 +27900,15 @@
 $desc=$collectedClasses.Jc
 if($desc instanceof Array)$desc=$desc[1]
 Jc.prototype=$desc
-Jc.prototype.gF0=function(receiver){return receiver.F0}
-Jc.prototype.gF0.$reflectable=1
-Jc.prototype.sF0=function(receiver,v){return receiver.F0=v}
-Jc.prototype.sF0.$reflectable=1
-function pv(){}pv.builtin$cls="pv"
-if(!"name" in pv)pv.name="pv"
-$desc=$collectedClasses.pv
+Jc.prototype.glb=function(receiver){return receiver.lb}
+Jc.prototype.glb.$reflectable=1
+Jc.prototype.slb=function(receiver,v){return receiver.lb=v}
+Jc.prototype.slb.$reflectable=1
+function Vfx(){}Vfx.builtin$cls="Vfx"
+if(!"name" in Vfx)Vfx.name="Vfx"
+$desc=$collectedClasses.Vfx
 if($desc instanceof Array)$desc=$desc[1]
-pv.prototype=$desc
+Vfx.prototype=$desc
 function CN(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -27524,11 +27948,11 @@
 Be.prototype.gXx.$reflectable=1
 Be.prototype.sXx=function(receiver,v){return receiver.Xx=v}
 Be.prototype.sXx.$reflectable=1
-function Vfx(){}Vfx.builtin$cls="Vfx"
-if(!"name" in Vfx)Vfx.name="Vfx"
-$desc=$collectedClasses.Vfx
+function Dsd(){}Dsd.builtin$cls="Dsd"
+if(!"name" in Dsd)Dsd.name="Dsd"
+$desc=$collectedClasses.Dsd
 if($desc instanceof Array)$desc=$desc[1]
-Vfx.prototype=$desc
+Dsd.prototype=$desc
 function E0(zh,HX,Uy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zh=zh
 this.HX=HX
 this.Uy=Uy
@@ -27560,11 +27984,11 @@
 E0.prototype.gUy.$reflectable=1
 E0.prototype.sUy=function(receiver,v){return receiver.Uy=v}
 E0.prototype.sUy.$reflectable=1
-function Dsd(){}Dsd.builtin$cls="Dsd"
-if(!"name" in Dsd)Dsd.name="Dsd"
-$desc=$collectedClasses.Dsd
+function tuj(){}tuj.builtin$cls="tuj"
+if(!"name" in tuj)tuj.name="tuj"
+$desc=$collectedClasses.tuj
 if($desc instanceof Array)$desc=$desc[1]
-Dsd.prototype=$desc
+tuj.prototype=$desc
 function lw(GV,Hu,nx,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GV=GV
 this.Hu=Hu
 this.nx=nx
@@ -27677,21 +28101,21 @@
 $desc=$collectedClasses.rR
 if($desc instanceof Array)$desc=$desc[1]
 rR.prototype=$desc
-function SJ(){}SJ.builtin$cls="SJ"
-if(!"name" in SJ)SJ.name="SJ"
-$desc=$collectedClasses.SJ
+function yq(){}yq.builtin$cls="yq"
+if(!"name" in yq)yq.name="yq"
+$desc=$collectedClasses.yq
 if($desc instanceof Array)$desc=$desc[1]
-SJ.prototype=$desc
+yq.prototype=$desc
 function SU7(){}SU7.builtin$cls="SU7"
 if(!"name" in SU7)SU7.name="SU7"
 $desc=$collectedClasses.SU7
 if($desc instanceof Array)$desc=$desc[1]
 SU7.prototype=$desc
-function Tv(){}Tv.builtin$cls="Tv"
-if(!"name" in Tv)Tv.name="Tv"
-$desc=$collectedClasses.Tv
+function JJ(){}JJ.builtin$cls="JJ"
+if(!"name" in JJ)JJ.name="JJ"
+$desc=$collectedClasses.JJ
 if($desc instanceof Array)$desc=$desc[1]
-Tv.prototype=$desc
+JJ.prototype=$desc
 function w2Y(){}w2Y.builtin$cls="w2Y"
 if(!"name" in w2Y)w2Y.name="w2Y"
 $desc=$collectedClasses.w2Y
@@ -27922,22 +28346,22 @@
 $desc=$collectedClasses.t0
 if($desc instanceof Array)$desc=$desc[1]
 t0.prototype=$desc
-function Ld(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
+function XJ(ao,V5,Fo,n6,jE,Ay,le,If){this.ao=ao
 this.V5=V5
 this.Fo=Fo
 this.n6=n6
 this.jE=jE
 this.Ay=Ay
 this.le=le
-this.If=If}Ld.builtin$cls="Ld"
-if(!"name" in Ld)Ld.name="Ld"
-$desc=$collectedClasses.Ld
+this.If=If}XJ.builtin$cls="XJ"
+if(!"name" in XJ)XJ.name="XJ"
+$desc=$collectedClasses.XJ
 if($desc instanceof Array)$desc=$desc[1]
-Ld.prototype=$desc
-Ld.prototype.gao=function(){return this.ao}
-Ld.prototype.gV5=function(receiver){return this.V5}
-Ld.prototype.gFo=function(){return this.Fo}
-Ld.prototype.gAy=function(receiver){return this.Ay}
+XJ.prototype=$desc
+XJ.prototype.gao=function(){return this.ao}
+XJ.prototype.gV5=function(receiver){return this.V5}
+XJ.prototype.gFo=function(){return this.Fo}
+XJ.prototype.gAy=function(receiver){return this.Ay}
 function Sz(Ax,xq){this.Ax=Ax
 this.xq=xq}Sz.builtin$cls="Sz"
 if(!"name" in Sz)Sz.name="Sz"
@@ -28125,6 +28549,12 @@
 $desc=$collectedClasses.b8
 if($desc instanceof Array)$desc=$desc[1]
 b8.prototype=$desc
+function ZC(a,b){this.a=a
+this.b=b}ZC.builtin$cls="ZC"
+if(!"name" in ZC)ZC.name="ZC"
+$desc=$collectedClasses.ZC
+if($desc instanceof Array)$desc=$desc[1]
+ZC.prototype=$desc
 function Ia(){}Ia.builtin$cls="Ia"
 if(!"name" in Ia)Ia.name="Ia"
 $desc=$collectedClasses.Ia
@@ -28537,13 +28967,13 @@
 $desc=$collectedClasses.aY
 if($desc instanceof Array)$desc=$desc[1]
 aY.prototype=$desc
-function zG(E2,cP,Jl,pU,Fh,Xp,aj,rb,Zq,rF,JS,iq){this.E2=E2
+function zG(E2,cP,Jl,pU,Fh,Xp,fb,rb,Zq,rF,JS,iq){this.E2=E2
 this.cP=cP
 this.Jl=Jl
 this.pU=pU
 this.Fh=Fh
 this.Xp=Xp
-this.aj=aj
+this.fb=fb
 this.rb=rb
 this.Zq=Zq
 this.rF=rF
@@ -28559,16 +28989,16 @@
 zG.prototype.gpU=function(){return this.pU}
 zG.prototype.gFh=function(){return this.Fh}
 zG.prototype.gXp=function(){return this.Xp}
-zG.prototype.gaj=function(){return this.aj}
+zG.prototype.gfb=function(){return this.fb}
 zG.prototype.grb=function(){return this.rb}
 zG.prototype.gZq=function(){return this.Zq}
 zG.prototype.gJS=function(receiver){return this.JS}
 zG.prototype.giq=function(){return this.iq}
-function e4(){}e4.builtin$cls="e4"
-if(!"name" in e4)e4.name="e4"
-$desc=$collectedClasses.e4
+function qK(){}qK.builtin$cls="qK"
+if(!"name" in qK)qK.name="qK"
+$desc=$collectedClasses.qK
 if($desc instanceof Array)$desc=$desc[1]
-e4.prototype=$desc
+qK.prototype=$desc
 function dl(){}dl.builtin$cls="dl"
 if(!"name" in dl)dl.name="dl"
 $desc=$collectedClasses.dl
@@ -28646,11 +29076,11 @@
 $desc=$collectedClasses.Ha
 if($desc instanceof Array)$desc=$desc[1]
 Ha.prototype=$desc
-function W5(){}W5.builtin$cls="W5"
-if(!"name" in W5)W5.name="W5"
-$desc=$collectedClasses.W5
+function nU(){}nU.builtin$cls="nU"
+if(!"name" in nU)nU.name="nU"
+$desc=$collectedClasses.nU
 if($desc instanceof Array)$desc=$desc[1]
-W5.prototype=$desc
+nU.prototype=$desc
 function R8(){}R8.builtin$cls="R8"
 if(!"name" in R8)R8.name="R8"
 $desc=$collectedClasses.R8
@@ -29014,11 +29444,11 @@
 $desc=$collectedClasses.by
 if($desc instanceof Array)$desc=$desc[1]
 by.prototype=$desc
-function pD(Xi){this.Xi=Xi}pD.builtin$cls="pD"
-if(!"name" in pD)pD.name="pD"
-$desc=$collectedClasses.pD
+function dI(Xi){this.Xi=Xi}dI.builtin$cls="dI"
+if(!"name" in dI)dI.name="dI"
+$desc=$collectedClasses.dI
 if($desc instanceof Array)$desc=$desc[1]
-pD.prototype=$desc
+dI.prototype=$desc
 function Cf(N5){this.N5=N5}Cf.builtin$cls="Cf"
 if(!"name" in Cf)Cf.name="Cf"
 $desc=$collectedClasses.Cf
@@ -29042,11 +29472,11 @@
 $desc=$collectedClasses.z0
 if($desc instanceof Array)$desc=$desc[1]
 z0.prototype=$desc
-function E3(){}E3.builtin$cls="E3"
-if(!"name" in E3)E3.name="E3"
-$desc=$collectedClasses.E3
+function om(){}om.builtin$cls="om"
+if(!"name" in om)om.name="om"
+$desc=$collectedClasses.om
 if($desc instanceof Array)$desc=$desc[1]
-E3.prototype=$desc
+om.prototype=$desc
 function Rw(WF,ZP,EN){this.WF=WF
 this.ZP=ZP
 this.EN=EN}Rw.builtin$cls="Rw"
@@ -29558,11 +29988,11 @@
 $desc=$collectedClasses.I4
 if($desc instanceof Array)$desc=$desc[1]
 I4.prototype=$desc
-function e0(Ph){this.Ph=Ph}e0.builtin$cls="e0"
-if(!"name" in e0)e0.name="e0"
-$desc=$collectedClasses.e0
+function UC(Ph){this.Ph=Ph}UC.builtin$cls="UC"
+if(!"name" in UC)UC.name="UC"
+$desc=$collectedClasses.UC
 if($desc instanceof Array)$desc=$desc[1]
-e0.prototype=$desc
+UC.prototype=$desc
 function RO(uv,Ph,Sg){this.uv=uv
 this.Ph=Ph
 this.Sg=Sg}RO.builtin$cls="RO"
@@ -29625,7 +30055,7 @@
 $desc=$collectedClasses.RX
 if($desc instanceof Array)$desc=$desc[1]
 RX.prototype=$desc
-function bO(Ob){this.Ob=Ob}bO.builtin$cls="bO"
+function bO(xY){this.xY=xY}bO.builtin$cls="bO"
 if(!"name" in bO)bO.name="bO"
 $desc=$collectedClasses.bO
 if($desc instanceof Array)$desc=$desc[1]
@@ -29729,6 +30159,41 @@
 $desc=$collectedClasses.QS
 if($desc instanceof Array)$desc=$desc[1]
 QS.prototype=$desc
+function hR(){}hR.builtin$cls="hR"
+if(!"name" in hR)hR.name="hR"
+$desc=$collectedClasses.hR
+if($desc instanceof Array)$desc=$desc[1]
+hR.prototype=$desc
+function vY(Bo,Hz){this.Bo=Bo
+this.Hz=Hz}vY.builtin$cls="vY"
+if(!"name" in vY)vY.name="vY"
+$desc=$collectedClasses.vY
+if($desc instanceof Array)$desc=$desc[1]
+vY.prototype=$desc
+function hL(x,y){this.x=x
+this.y=y}hL.builtin$cls="hL"
+if(!"name" in hL)hL.name="hL"
+$desc=$collectedClasses.hL
+if($desc instanceof Array)$desc=$desc[1]
+hL.prototype=$desc
+hL.prototype.gx=function(receiver){return this.x}
+hL.prototype.gy=function(receiver){return this.y}
+function HDe(){}HDe.builtin$cls="HDe"
+if(!"name" in HDe)HDe.name="HDe"
+$desc=$collectedClasses.HDe
+if($desc instanceof Array)$desc=$desc[1]
+HDe.prototype=$desc
+function tn(Bb,eA,R,fg){this.Bb=Bb
+this.eA=eA
+this.R=R
+this.fg=fg}tn.builtin$cls="tn"
+if(!"name" in tn)tn.name="tn"
+$desc=$collectedClasses.tn
+if($desc instanceof Array)$desc=$desc[1]
+tn.prototype=$desc
+tn.prototype.gBb=function(){return this.Bb}
+tn.prototype.gR=function(receiver){return this.R}
+tn.prototype.gfg=function(receiver){return this.fg}
 function ej(){}ej.builtin$cls="ej"
 if(!"name" in ej)ej.name="ej"
 $desc=$collectedClasses.ej
@@ -29807,11 +30272,11 @@
 $desc=$collectedClasses.Nx
 if($desc instanceof Array)$desc=$desc[1]
 Nx.prototype=$desc
-function LZ(){}LZ.builtin$cls="LZ"
-if(!"name" in LZ)LZ.name="LZ"
-$desc=$collectedClasses.LZ
+function b0B(){}b0B.builtin$cls="b0B"
+if(!"name" in b0B)b0B.name="b0B"
+$desc=$collectedClasses.b0B
 if($desc instanceof Array)$desc=$desc[1]
-LZ.prototype=$desc
+b0B.prototype=$desc
 function Dg(){}Dg.builtin$cls="Dg"
 if(!"name" in Dg)Dg.name="Dg"
 $desc=$collectedClasses.Dg
@@ -29863,11 +30328,11 @@
 E9.prototype.gPy.$reflectable=1
 E9.prototype.sPy=function(receiver,v){return receiver.Py=v}
 E9.prototype.sPy.$reflectable=1
-function tuj(){}tuj.builtin$cls="tuj"
-if(!"name" in tuj)tuj.name="tuj"
-$desc=$collectedClasses.tuj
+function Vct(){}Vct.builtin$cls="Vct"
+if(!"name" in Vct)Vct.name="Vct"
+$desc=$collectedClasses.Vct
 if($desc instanceof Array)$desc=$desc[1]
-tuj.prototype=$desc
+Vct.prototype=$desc
 function rm(fn,Ab,Ln,y4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.fn=fn
 this.Ab=Ab
 this.Ln=Ln
@@ -29904,11 +30369,11 @@
 rm.prototype.gy4.$reflectable=1
 rm.prototype.sy4=function(receiver,v){return receiver.y4=v}
 rm.prototype.sy4.$reflectable=1
-function Vct(){}Vct.builtin$cls="Vct"
-if(!"name" in Vct)Vct.name="Vct"
-$desc=$collectedClasses.Vct
+function D13(){}D13.builtin$cls="D13"
+if(!"name" in D13)D13.name="D13"
+$desc=$collectedClasses.D13
 if($desc instanceof Array)$desc=$desc[1]
-Vct.prototype=$desc
+D13.prototype=$desc
 function YW(a){this.a=a}YW.builtin$cls="YW"
 if(!"name" in YW)YW.name="YW"
 $desc=$collectedClasses.YW
@@ -29953,12 +30418,17 @@
 Gk.prototype.gvt.$reflectable=1
 Gk.prototype.svt=function(receiver,v){return receiver.vt=v}
 Gk.prototype.svt.$reflectable=1
-function D13(){}D13.builtin$cls="D13"
-if(!"name" in D13)D13.name="D13"
-$desc=$collectedClasses.D13
+function WZq(){}WZq.builtin$cls="WZq"
+if(!"name" in WZq)WZq.name="WZq"
+$desc=$collectedClasses.WZq
 if($desc instanceof Array)$desc=$desc[1]
-D13.prototype=$desc
-function qW(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+WZq.prototype=$desc
+function AX(lh,qe,zg,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.lh=lh
+this.qe=qe
+this.zg=zg
+this.AP=AP
+this.Lk=Lk
+this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -29971,11 +30441,28 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}qW.builtin$cls="qW"
-if(!"name" in qW)qW.name="qW"
-$desc=$collectedClasses.qW
+this.X0=X0}AX.builtin$cls="AX"
+if(!"name" in AX)AX.name="AX"
+$desc=$collectedClasses.AX
 if($desc instanceof Array)$desc=$desc[1]
-qW.prototype=$desc
+AX.prototype=$desc
+AX.prototype.glh=function(receiver){return receiver.lh}
+AX.prototype.glh.$reflectable=1
+AX.prototype.slh=function(receiver,v){return receiver.lh=v}
+AX.prototype.slh.$reflectable=1
+AX.prototype.gqe=function(receiver){return receiver.qe}
+AX.prototype.gqe.$reflectable=1
+AX.prototype.sqe=function(receiver,v){return receiver.qe=v}
+AX.prototype.sqe.$reflectable=1
+AX.prototype.gzg=function(receiver){return receiver.zg}
+AX.prototype.gzg.$reflectable=1
+AX.prototype.szg=function(receiver,v){return receiver.zg=v}
+AX.prototype.szg.$reflectable=1
+function T5(){}T5.builtin$cls="T5"
+if(!"name" in T5)T5.name="T5"
+$desc=$collectedClasses.T5
+if($desc instanceof Array)$desc=$desc[1]
+T5.prototype=$desc
 function mk(Z8,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Z8=Z8
 this.AP=AP
 this.Lk=Lk
@@ -29997,11 +30484,81 @@
 mk.prototype.gZ8.$reflectable=1
 mk.prototype.sZ8=function(receiver,v){return receiver.Z8=v}
 mk.prototype.sZ8.$reflectable=1
-function WZq(){}WZq.builtin$cls="WZq"
-if(!"name" in WZq)WZq.name="WZq"
-$desc=$collectedClasses.WZq
+function pva(){}pva.builtin$cls="pva"
+if(!"name" in pva)pva.name="pva"
+$desc=$collectedClasses.pva
 if($desc instanceof Array)$desc=$desc[1]
-WZq.prototype=$desc
+pva.prototype=$desc
+function lb(hi,An,PA,Oh,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.hi=hi
+this.An=An
+this.PA=PA
+this.Oh=Oh
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}lb.builtin$cls="lb"
+if(!"name" in lb)lb.name="lb"
+$desc=$collectedClasses.lb
+if($desc instanceof Array)$desc=$desc[1]
+lb.prototype=$desc
+lb.prototype.ghi=function(receiver){return receiver.hi}
+lb.prototype.ghi.$reflectable=1
+lb.prototype.shi=function(receiver,v){return receiver.hi=v}
+lb.prototype.shi.$reflectable=1
+lb.prototype.gAn=function(receiver){return receiver.An}
+lb.prototype.gAn.$reflectable=1
+lb.prototype.sAn=function(receiver,v){return receiver.An=v}
+lb.prototype.sAn.$reflectable=1
+lb.prototype.gPA=function(receiver){return receiver.PA}
+lb.prototype.gPA.$reflectable=1
+lb.prototype.sPA=function(receiver,v){return receiver.PA=v}
+lb.prototype.sPA.$reflectable=1
+lb.prototype.gOh=function(receiver){return receiver.Oh}
+lb.prototype.gOh.$reflectable=1
+lb.prototype.sOh=function(receiver,v){return receiver.Oh=v}
+lb.prototype.sOh.$reflectable=1
+function cda(){}cda.builtin$cls="cda"
+if(!"name" in cda)cda.name="cda"
+$desc=$collectedClasses.cda
+if($desc instanceof Array)$desc=$desc[1]
+cda.prototype=$desc
+function nB(a,b){this.a=a
+this.b=b}nB.builtin$cls="nB"
+if(!"name" in nB)nB.name="nB"
+$desc=$collectedClasses.nB
+if($desc instanceof Array)$desc=$desc[1]
+nB.prototype=$desc
+function WQ(a,b,c,d){this.a=a
+this.b=b
+this.c=c
+this.d=d}WQ.builtin$cls="WQ"
+if(!"name" in WQ)WQ.name="WQ"
+$desc=$collectedClasses.WQ
+if($desc instanceof Array)$desc=$desc[1]
+WQ.prototype=$desc
+function aG(a){this.a=a}aG.builtin$cls="aG"
+if(!"name" in aG)aG.name="aG"
+$desc=$collectedClasses.aG
+if($desc instanceof Array)$desc=$desc[1]
+aG.prototype=$desc
+function aO(){}aO.builtin$cls="aO"
+if(!"name" in aO)aO.name="aO"
+$desc=$collectedClasses.aO
+if($desc instanceof Array)$desc=$desc[1]
+aO.prototype=$desc
+function oc(a){this.a=a}oc.builtin$cls="oc"
+if(!"name" in oc)oc.name="oc"
+$desc=$collectedClasses.oc
+if($desc instanceof Array)$desc=$desc[1]
+oc.prototype=$desc
 function jY(GQ,J0,Oc,CO,bV,kg,LY,q3,Ol,X3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.GQ=GQ
 this.J0=J0
 this.Oc=Oc
@@ -30068,11 +30625,11 @@
 jY.prototype.gX3.$reflectable=1
 jY.prototype.sX3=function(receiver,v){return receiver.X3=v}
 jY.prototype.sX3.$reflectable=1
-function pva(){}pva.builtin$cls="pva"
-if(!"name" in pva)pva.name="pva"
-$desc=$collectedClasses.pva
+function waa(){}waa.builtin$cls="waa"
+if(!"name" in waa)waa.name="waa"
+$desc=$collectedClasses.waa
 if($desc instanceof Array)$desc=$desc[1]
-pva.prototype=$desc
+waa.prototype=$desc
 function nx(a){this.a=a}nx.builtin$cls="nx"
 if(!"name" in nx)nx.name="nx"
 $desc=$collectedClasses.nx
@@ -30151,6 +30708,16 @@
 $desc=$collectedClasses.xL
 if($desc instanceof Array)$desc=$desc[1]
 xL.prototype=$desc
+function qS(Rn,fg,R){this.Rn=Rn
+this.fg=fg
+this.R=R}qS.builtin$cls="qS"
+if(!"name" in qS)qS.name="qS"
+$desc=$collectedClasses.qS
+if($desc instanceof Array)$desc=$desc[1]
+qS.prototype=$desc
+qS.prototype.gRn=function(receiver){return this.Rn}
+qS.prototype.gfg=function(receiver){return this.fg}
+qS.prototype.gR=function(receiver){return this.R}
 function As(){}As.builtin$cls="As"
 if(!"name" in As)As.name="As"
 $desc=$collectedClasses.As
@@ -30187,7 +30754,7 @@
 $desc=$collectedClasses.GS
 if($desc instanceof Array)$desc=$desc[1]
 GS.prototype=$desc
-function pR(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+function NG(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
@@ -30200,11 +30767,11 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}pR.builtin$cls="pR"
-if(!"name" in pR)pR.name="pR"
-$desc=$collectedClasses.pR
+this.X0=X0}NG.builtin$cls="NG"
+if(!"name" in NG)NG.name="NG"
+$desc=$collectedClasses.NG
 if($desc instanceof Array)$desc=$desc[1]
-pR.prototype=$desc
+NG.prototype=$desc
 function Js(a){this.a=a}Js.builtin$cls="Js"
 if(!"name" in Js)Js.name="Js"
 $desc=$collectedClasses.Js
@@ -30231,11 +30798,11 @@
 hx.prototype.gXh.$reflectable=1
 hx.prototype.sXh=function(receiver,v){return receiver.Xh=v}
 hx.prototype.sXh.$reflectable=1
-function cda(){}cda.builtin$cls="cda"
-if(!"name" in cda)cda.name="cda"
-$desc=$collectedClasses.cda
+function V4(){}V4.builtin$cls="V4"
+if(!"name" in V4)V4.name="V4"
+$desc=$collectedClasses.V4
 if($desc instanceof Array)$desc=$desc[1]
-cda.prototype=$desc
+V4.prototype=$desc
 function u7(tf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tf=tf
 this.AP=AP
 this.Lk=Lk
@@ -30257,11 +30824,30 @@
 u7.prototype.gtf.$reflectable=1
 u7.prototype.stf=function(receiver,v){return receiver.tf=v}
 u7.prototype.stf.$reflectable=1
-function waa(){}waa.builtin$cls="waa"
-if(!"name" in waa)waa.name="waa"
-$desc=$collectedClasses.waa
+function V9(){}V9.builtin$cls="V9"
+if(!"name" in V9)V9.name="V9"
+$desc=$collectedClasses.V9
 if($desc instanceof Array)$desc=$desc[1]
-waa.prototype=$desc
+V9.prototype=$desc
+function Se(B1,SF,H,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
+this.SF=SF
+this.H=H
+this.eT=eT
+this.yt=yt
+this.wd=wd
+this.oH=oH
+this.z3=z3
+this.AP=AP
+this.Lk=Lk}Se.builtin$cls="Se"
+if(!"name" in Se)Se.name="Se"
+$desc=$collectedClasses.Se
+if($desc instanceof Array)$desc=$desc[1]
+Se.prototype=$desc
+Se.prototype.gB1=function(receiver){return this.B1}
+Se.prototype.gSF=function(){return this.SF}
+Se.prototype.gSF.$reflectable=1
+Se.prototype.gH=function(){return this.H}
+Se.prototype.gH.$reflectable=1
 function qm(B1,tT,eT,yt,wd,oH,z3,AP,Lk){this.B1=B1
 this.tT=tT
 this.eT=eT
@@ -30278,17 +30864,15 @@
 qm.prototype.gB1=function(receiver){return this.B1}
 qm.prototype.gtT=function(receiver){return this.tT}
 qm.prototype.gtT.$reflectable=1
-function TI(a){this.a=a}TI.builtin$cls="TI"
-if(!"name" in TI)TI.name="TI"
-$desc=$collectedClasses.TI
-if($desc instanceof Array)$desc=$desc[1]
-TI.prototype=$desc
-function E7(pD,Dt,BA,FT,vk,fb,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
-this.Dt=Dt
-this.BA=BA
+function kKl(pD,Kx,zt,FT,vk,Xv,M5,ik,XX,qO,Hm,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.pD=pD
+this.Kx=Kx
+this.zt=zt
 this.FT=FT
 this.vk=vk
-this.fb=fb
+this.Xv=Xv
+this.M5=M5
+this.ik=ik
+this.XX=XX
 this.qO=qO
 this.Hm=Hm
 this.AP=AP
@@ -30302,48 +30886,65 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}E7.builtin$cls="E7"
-if(!"name" in E7)E7.name="E7"
-$desc=$collectedClasses.E7
+this.X0=X0}kKl.builtin$cls="kKl"
+if(!"name" in kKl)kKl.name="kKl"
+$desc=$collectedClasses.kKl
 if($desc instanceof Array)$desc=$desc[1]
-E7.prototype=$desc
-E7.prototype.gpD=function(receiver){return receiver.pD}
-E7.prototype.gpD.$reflectable=1
-E7.prototype.spD=function(receiver,v){return receiver.pD=v}
-E7.prototype.spD.$reflectable=1
-E7.prototype.gDt=function(receiver){return receiver.Dt}
-E7.prototype.gDt.$reflectable=1
-E7.prototype.gBA=function(receiver){return receiver.BA}
-E7.prototype.gBA.$reflectable=1
-E7.prototype.sBA=function(receiver,v){return receiver.BA=v}
-E7.prototype.sBA.$reflectable=1
-E7.prototype.gFT=function(receiver){return receiver.FT}
-E7.prototype.gFT.$reflectable=1
-E7.prototype.sFT=function(receiver,v){return receiver.FT=v}
-E7.prototype.sFT.$reflectable=1
-E7.prototype.gvk=function(receiver){return receiver.vk}
-E7.prototype.gvk.$reflectable=1
-E7.prototype.svk=function(receiver,v){return receiver.vk=v}
-E7.prototype.svk.$reflectable=1
-E7.prototype.gfb=function(receiver){return receiver.fb}
-E7.prototype.gfb.$reflectable=1
-E7.prototype.gqO=function(receiver){return receiver.qO}
-E7.prototype.gqO.$reflectable=1
-E7.prototype.gHm=function(receiver){return receiver.Hm}
-E7.prototype.gHm.$reflectable=1
-E7.prototype.sHm=function(receiver,v){return receiver.Hm=v}
-E7.prototype.sHm.$reflectable=1
-function V4(){}V4.builtin$cls="V4"
-if(!"name" in V4)V4.name="V4"
-$desc=$collectedClasses.V4
+kKl.prototype=$desc
+kKl.prototype.gpD=function(receiver){return receiver.pD}
+kKl.prototype.gpD.$reflectable=1
+kKl.prototype.spD=function(receiver,v){return receiver.pD=v}
+kKl.prototype.spD.$reflectable=1
+kKl.prototype.gKx=function(receiver){return receiver.Kx}
+kKl.prototype.gKx.$reflectable=1
+kKl.prototype.sKx=function(receiver,v){return receiver.Kx=v}
+kKl.prototype.sKx.$reflectable=1
+kKl.prototype.gzt=function(receiver){return receiver.zt}
+kKl.prototype.gzt.$reflectable=1
+kKl.prototype.szt=function(receiver,v){return receiver.zt=v}
+kKl.prototype.szt.$reflectable=1
+kKl.prototype.gFT=function(receiver){return receiver.FT}
+kKl.prototype.gFT.$reflectable=1
+kKl.prototype.sFT=function(receiver,v){return receiver.FT=v}
+kKl.prototype.sFT.$reflectable=1
+kKl.prototype.gvk=function(receiver){return receiver.vk}
+kKl.prototype.gvk.$reflectable=1
+kKl.prototype.svk=function(receiver,v){return receiver.vk=v}
+kKl.prototype.svk.$reflectable=1
+kKl.prototype.gXv=function(receiver){return receiver.Xv}
+kKl.prototype.gXv.$reflectable=1
+kKl.prototype.sXv=function(receiver,v){return receiver.Xv=v}
+kKl.prototype.sXv.$reflectable=1
+kKl.prototype.gM5=function(receiver){return receiver.M5}
+kKl.prototype.gM5.$reflectable=1
+kKl.prototype.sM5=function(receiver,v){return receiver.M5=v}
+kKl.prototype.sM5.$reflectable=1
+kKl.prototype.gik=function(receiver){return receiver.ik}
+kKl.prototype.gik.$reflectable=1
+kKl.prototype.sik=function(receiver,v){return receiver.ik=v}
+kKl.prototype.sik.$reflectable=1
+kKl.prototype.gXX=function(receiver){return receiver.XX}
+kKl.prototype.gXX.$reflectable=1
+kKl.prototype.sXX=function(receiver,v){return receiver.XX=v}
+kKl.prototype.sXX.$reflectable=1
+kKl.prototype.gqO=function(receiver){return receiver.qO}
+kKl.prototype.gqO.$reflectable=1
+kKl.prototype.gHm=function(receiver){return receiver.Hm}
+kKl.prototype.gHm.$reflectable=1
+kKl.prototype.sHm=function(receiver,v){return receiver.Hm=v}
+kKl.prototype.sHm.$reflectable=1
+function V10(){}V10.builtin$cls="V10"
+if(!"name" in V10)V10.name="V10"
+$desc=$collectedClasses.V10
 if($desc instanceof Array)$desc=$desc[1]
-V4.prototype=$desc
+V10.prototype=$desc
 function SV(a){this.a=a}SV.builtin$cls="SV"
 if(!"name" in SV)SV.name="SV"
 $desc=$collectedClasses.SV
 if($desc instanceof Array)$desc=$desc[1]
 SV.prototype=$desc
-function Kz(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+function oO(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
+this.Pe=Pe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30355,20 +30956,63 @@
 this.Wz=Wz
 this.SO=SO
 this.B7=B7
-this.X0=X0}Kz.builtin$cls="Kz"
-if(!"name" in Kz)Kz.name="Kz"
-$desc=$collectedClasses.Kz
+this.X0=X0}oO.builtin$cls="oO"
+if(!"name" in oO)oO.name="oO"
+$desc=$collectedClasses.oO
 if($desc instanceof Array)$desc=$desc[1]
-Kz.prototype=$desc
-Kz.prototype.gPw=function(receiver){return receiver.Pw}
-Kz.prototype.gPw.$reflectable=1
-Kz.prototype.sPw=function(receiver,v){return receiver.Pw=v}
-Kz.prototype.sPw.$reflectable=1
-function V9(){}V9.builtin$cls="V9"
-if(!"name" in V9)V9.name="V9"
-$desc=$collectedClasses.V9
+oO.prototype=$desc
+function St(Pw,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Pw=Pw
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}St.builtin$cls="St"
+if(!"name" in St)St.name="St"
+$desc=$collectedClasses.St
 if($desc instanceof Array)$desc=$desc[1]
-V9.prototype=$desc
+St.prototype=$desc
+St.prototype.gPw=function(receiver){return receiver.Pw}
+St.prototype.gPw.$reflectable=1
+St.prototype.sPw=function(receiver,v){return receiver.Pw=v}
+St.prototype.sPw.$reflectable=1
+function V11(){}V11.builtin$cls="V11"
+if(!"name" in V11)V11.name="V11"
+$desc=$collectedClasses.V11
+if($desc instanceof Array)$desc=$desc[1]
+V11.prototype=$desc
+function qkb(oY,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.oY=oY
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}qkb.builtin$cls="qkb"
+if(!"name" in qkb)qkb.name="qkb"
+$desc=$collectedClasses.qkb
+if($desc instanceof Array)$desc=$desc[1]
+qkb.prototype=$desc
+qkb.prototype.goY=function(receiver){return receiver.oY}
+qkb.prototype.goY.$reflectable=1
+qkb.prototype.soY=function(receiver,v){return receiver.oY=v}
+qkb.prototype.soY.$reflectable=1
+function V12(){}V12.builtin$cls="V12"
+if(!"name" in V12)V12.name="V12"
+$desc=$collectedClasses.V12
+if($desc instanceof Array)$desc=$desc[1]
+V12.prototype=$desc
 function vj(eb,kf,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.eb=eb
 this.kf=kf
 this.AP=AP
@@ -30395,11 +31039,11 @@
 vj.prototype.gkf.$reflectable=1
 vj.prototype.skf=function(receiver,v){return receiver.kf=v}
 vj.prototype.skf.$reflectable=1
-function V10(){}V10.builtin$cls="V10"
-if(!"name" in V10)V10.name="V10"
-$desc=$collectedClasses.V10
+function V13(){}V13.builtin$cls="V13"
+if(!"name" in V13)V13.name="V13"
+$desc=$collectedClasses.V13
 if($desc instanceof Array)$desc=$desc[1]
-V10.prototype=$desc
+V13.prototype=$desc
 function LU(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -30439,11 +31083,11 @@
 KL.prototype.gN7.$reflectable=1
 KL.prototype.sN7=function(receiver,v){return receiver.N7=v}
 KL.prototype.sN7.$reflectable=1
-function V11(){}V11.builtin$cls="V11"
-if(!"name" in V11)V11.name="V11"
-$desc=$collectedClasses.V11
+function V14(){}V14.builtin$cls="V14"
+if(!"name" in V14)V14.name="V14"
+$desc=$collectedClasses.V14
 if($desc instanceof Array)$desc=$desc[1]
-V11.prototype=$desc
+V14.prototype=$desc
 function TJ(oc,eT,n2,Cj,wd,Gs){this.oc=oc
 this.eT=eT
 this.n2=n2
@@ -30497,12 +31141,12 @@
 $desc=$collectedClasses.Lb
 if($desc instanceof Array)$desc=$desc[1]
 Lb.prototype=$desc
-function T4(T9,Bu){this.T9=T9
-this.Bu=Bu}T4.builtin$cls="T4"
-if(!"name" in T4)T4.name="T4"
-$desc=$collectedClasses.T4
+function jh(T9,Bu){this.T9=T9
+this.Bu=Bu}jh.builtin$cls="jh"
+if(!"name" in jh)jh.name="jh"
+$desc=$collectedClasses.jh
 if($desc instanceof Array)$desc=$desc[1]
-T4.prototype=$desc
+jh.prototype=$desc
 function tzK(){}tzK.builtin$cls="tzK"
 if(!"name" in tzK)tzK.name="tzK"
 $desc=$collectedClasses.tzK
@@ -30514,11 +31158,11 @@
 if($desc instanceof Array)$desc=$desc[1]
 jA.prototype=$desc
 jA.prototype.goc=function(receiver){return this.oc}
-function PO(){}PO.builtin$cls="PO"
-if(!"name" in PO)PO.name="PO"
-$desc=$collectedClasses.PO
+function Jo(){}Jo.builtin$cls="Jo"
+if(!"name" in Jo)Jo.name="Jo"
+$desc=$collectedClasses.Jo
 if($desc instanceof Array)$desc=$desc[1]
-PO.prototype=$desc
+Jo.prototype=$desc
 function oBi(){}oBi.builtin$cls="oBi"
 if(!"name" in oBi)oBi.name="oBi"
 $desc=$collectedClasses.oBi
@@ -30569,11 +31213,11 @@
 aQ.prototype.gJo.$reflectable=1
 aQ.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 aQ.prototype.sJo.$reflectable=1
-function V12(){}V12.builtin$cls="V12"
-if(!"name" in V12)V12.name="V12"
-$desc=$collectedClasses.V12
+function V15(){}V15.builtin$cls="V15"
+if(!"name" in V15)V15.name="V15"
+$desc=$collectedClasses.V15
 if($desc instanceof Array)$desc=$desc[1]
-V12.prototype=$desc
+V15.prototype=$desc
 function Qa(KU,V4,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.KU=KU
 this.V4=V4
 this.AP=AP
@@ -30600,11 +31244,11 @@
 Qa.prototype.gV4.$reflectable=1
 Qa.prototype.sV4=function(receiver,v){return receiver.V4=v}
 Qa.prototype.sV4.$reflectable=1
-function V13(){}V13.builtin$cls="V13"
-if(!"name" in V13)V13.name="V13"
-$desc=$collectedClasses.V13
+function V16(){}V16.builtin$cls="V16"
+if(!"name" in V16)V16.name="V16"
+$desc=$collectedClasses.V16
 if($desc instanceof Array)$desc=$desc[1]
-V13.prototype=$desc
+V16.prototype=$desc
 function Ww(rU,SB,Hq,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.rU=rU
 this.SB=SB
 this.Hq=Hq
@@ -30636,11 +31280,11 @@
 Ww.prototype.gHq.$reflectable=1
 Ww.prototype.sHq=function(receiver,v){return receiver.Hq=v}
 Ww.prototype.sHq.$reflectable=1
-function V14(){}V14.builtin$cls="V14"
-if(!"name" in V14)V14.name="V14"
-$desc=$collectedClasses.V14
+function V17(){}V17.builtin$cls="V17"
+if(!"name" in V17)V17.name="V17"
+$desc=$collectedClasses.V17
 if($desc instanceof Array)$desc=$desc[1]
-V14.prototype=$desc
+V17.prototype=$desc
 function tz(Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.AP=AP
 this.Lk=Lk
@@ -30662,11 +31306,11 @@
 tz.prototype.gJo.$reflectable=1
 tz.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 tz.prototype.sJo.$reflectable=1
-function V15(){}V15.builtin$cls="V15"
-if(!"name" in V15)V15.name="V15"
-$desc=$collectedClasses.V15
+function V18(){}V18.builtin$cls="V18"
+if(!"name" in V18)V18.name="V18"
+$desc=$collectedClasses.V18
 if($desc instanceof Array)$desc=$desc[1]
-V15.prototype=$desc
+V18.prototype=$desc
 function fl(Jo,iy,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Jo=Jo
 this.iy=iy
 this.AP=AP
@@ -30693,11 +31337,11 @@
 fl.prototype.giy.$reflectable=1
 fl.prototype.siy=function(receiver,v){return receiver.iy=v}
 fl.prototype.siy.$reflectable=1
-function V16(){}V16.builtin$cls="V16"
-if(!"name" in V16)V16.name="V16"
-$desc=$collectedClasses.V16
+function V19(){}V19.builtin$cls="V19"
+if(!"name" in V19)V19.name="V19"
+$desc=$collectedClasses.V19
 if($desc instanceof Array)$desc=$desc[1]
-V16.prototype=$desc
+V19.prototype=$desc
 function Zt(Ap,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Ap=Ap
 this.Jo=Jo
 this.AP=AP
@@ -30724,11 +31368,11 @@
 Zt.prototype.gJo.$reflectable=1
 Zt.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 Zt.prototype.sJo.$reflectable=1
-function V17(){}V17.builtin$cls="V17"
-if(!"name" in V17)V17.name="V17"
-$desc=$collectedClasses.V17
+function V20(){}V20.builtin$cls="V20"
+if(!"name" in V20)V20.name="V20"
+$desc=$collectedClasses.V20
 if($desc instanceof Array)$desc=$desc[1]
-V17.prototype=$desc
+V20.prototype=$desc
 function iL(Au,Jo,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Au=Au
 this.Jo=Jo
 this.AP=AP
@@ -30755,13 +31399,13 @@
 iL.prototype.gJo.$reflectable=1
 iL.prototype.sJo=function(receiver,v){return receiver.Jo=v}
 iL.prototype.sJo.$reflectable=1
-function V18(){}V18.builtin$cls="V18"
-if(!"name" in V18)V18.name="V18"
-$desc=$collectedClasses.V18
+function V21(){}V21.builtin$cls="V21"
+if(!"name" in V21)V21.name="V21"
+$desc=$collectedClasses.V21
 if($desc instanceof Array)$desc=$desc[1]
-V18.prototype=$desc
-function lI(k5,xH,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
-this.xH=xH
+V21.prototype=$desc
+function lI(k5,Oe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.k5=k5
+this.Oe=Oe
 this.AP=AP
 this.Lk=Lk
 this.AP=AP
@@ -30782,15 +31426,15 @@
 lI.prototype.gk5.$reflectable=1
 lI.prototype.sk5=function(receiver,v){return receiver.k5=v}
 lI.prototype.sk5.$reflectable=1
-lI.prototype.gxH=function(receiver){return receiver.xH}
-lI.prototype.gxH.$reflectable=1
-lI.prototype.sxH=function(receiver,v){return receiver.xH=v}
-lI.prototype.sxH.$reflectable=1
-function V19(){}V19.builtin$cls="V19"
-if(!"name" in V19)V19.name="V19"
-$desc=$collectedClasses.V19
+lI.prototype.gOe=function(receiver){return receiver.Oe}
+lI.prototype.gOe.$reflectable=1
+lI.prototype.sOe=function(receiver,v){return receiver.Oe=v}
+lI.prototype.sOe.$reflectable=1
+function V22(){}V22.builtin$cls="V22"
+if(!"name" in V22)V22.name="V22"
+$desc=$collectedClasses.V22
 if($desc instanceof Array)$desc=$desc[1]
-V19.prototype=$desc
+V22.prototype=$desc
 function uL(AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.AP=AP
 this.Lk=Lk
 this.dZ=dZ
@@ -30891,11 +31535,11 @@
 DA.prototype=$desc
 DA.prototype.gWA=function(receiver){return this.WA}
 DA.prototype.gIl=function(){return this.Il}
-function nd(){}nd.builtin$cls="nd"
-if(!"name" in nd)nd.name="nd"
-$desc=$collectedClasses.nd
+function ndx(){}ndx.builtin$cls="ndx"
+if(!"name" in ndx)ndx.name="ndx"
+$desc=$collectedClasses.ndx
 if($desc instanceof Array)$desc=$desc[1]
-nd.prototype=$desc
+ndx.prototype=$desc
 function vly(){}vly.builtin$cls="vly"
 if(!"name" in vly)vly.name="vly"
 $desc=$collectedClasses.vly
@@ -31182,11 +31826,11 @@
 $desc=$collectedClasses.ir
 if($desc instanceof Array)$desc=$desc[1]
 ir.prototype=$desc
-function Sa(X0){this.X0=X0}Sa.builtin$cls="Sa"
-if(!"name" in Sa)Sa.name="Sa"
-$desc=$collectedClasses.Sa
+function jpR(X0){this.X0=X0}jpR.builtin$cls="jpR"
+if(!"name" in jpR)jpR.name="jpR"
+$desc=$collectedClasses.jpR
 if($desc instanceof Array)$desc=$desc[1]
-Sa.prototype=$desc
+jpR.prototype=$desc
 zs.prototype.gKM=function(receiver){return receiver.X0}
 zs.prototype.gKM.$reflectable=1
 function GN(){}GN.builtin$cls="GN"
@@ -31239,11 +31883,11 @@
 $desc=$collectedClasses.pM
 if($desc instanceof Array)$desc=$desc[1]
 pM.prototype=$desc
-function jh(){}jh.builtin$cls="jh"
-if(!"name" in jh)jh.name="jh"
-$desc=$collectedClasses.jh
+function Mh(){}Mh.builtin$cls="Mh"
+if(!"name" in Mh)Mh.name="Mh"
+$desc=$collectedClasses.Mh
 if($desc instanceof Array)$desc=$desc[1]
-jh.prototype=$desc
+Mh.prototype=$desc
 function W6(){}W6.builtin$cls="W6"
 if(!"name" in W6)W6.name="W6"
 $desc=$collectedClasses.W6
@@ -31459,8 +32103,8 @@
 $desc=$collectedClasses.Ed
 if($desc instanceof Array)$desc=$desc[1]
 Ed.prototype=$desc
-function G1(Jd,Le){this.Jd=Jd
-this.Le=Le}G1.builtin$cls="G1"
+function G1(Jd,lk){this.Jd=Jd
+this.lk=lk}G1.builtin$cls="G1"
 if(!"name" in G1)G1.name="G1"
 $desc=$collectedClasses.G1
 if($desc instanceof Array)$desc=$desc[1]
@@ -31609,13 +32253,13 @@
 iT.prototype=$desc
 iT.prototype.ghP=function(){return this.hP}
 iT.prototype.gJn=function(){return this.Jn}
-function ja(a,b,c){this.a=a
+function tE(a,b,c){this.a=a
 this.b=b
-this.c=c}ja.builtin$cls="ja"
-if(!"name" in ja)ja.name="ja"
-$desc=$collectedClasses.ja
+this.c=c}tE.builtin$cls="tE"
+if(!"name" in tE)tE.name="tE"
+$desc=$collectedClasses.tE
 if($desc instanceof Array)$desc=$desc[1]
-ja.prototype=$desc
+tE.prototype=$desc
 function ey(d){this.d=d}ey.builtin$cls="ey"
 if(!"name" in ey)ey.name="ey"
 $desc=$collectedClasses.ey
@@ -31670,7 +32314,7 @@
 $desc=$collectedClasses.J1
 if($desc instanceof Array)$desc=$desc[1]
 J1.prototype=$desc
-function fk(kF,bm){this.kF=kF
+function fk(F5,bm){this.F5=F5
 this.bm=bm}fk.builtin$cls="fk"
 if(!"name" in fk)fk.name="fk"
 $desc=$collectedClasses.fk
@@ -31876,11 +32520,11 @@
 JG.prototype.gkW.$reflectable=1
 JG.prototype.skW=function(receiver,v){return receiver.kW=v}
 JG.prototype.skW.$reflectable=1
-function V20(){}V20.builtin$cls="V20"
-if(!"name" in V20)V20.name="V20"
-$desc=$collectedClasses.V20
+function V23(){}V23.builtin$cls="V23"
+if(!"name" in V23)V23.name="V23"
+$desc=$collectedClasses.V23
 if($desc instanceof Array)$desc=$desc[1]
-V20.prototype=$desc
+V23.prototype=$desc
 function knI(zw,AP,Lk,tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.zw=zw
 this.AP=AP
 this.Lk=Lk
@@ -31906,11 +32550,11 @@
 knI.prototype.gzw.$reflectable=1
 knI.prototype.szw=function(receiver,v){return receiver.zw=v}
 knI.prototype.szw.$reflectable=1
-function T5(){}T5.builtin$cls="T5"
-if(!"name" in T5)T5.name="T5"
-$desc=$collectedClasses.T5
+function qe(){}qe.builtin$cls="qe"
+if(!"name" in qe)qe.name="qe"
+$desc=$collectedClasses.qe
 if($desc instanceof Array)$desc=$desc[1]
-T5.prototype=$desc
+qe.prototype=$desc
 function fI(Uz,HJ,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Uz=Uz
 this.HJ=HJ
 this.AP=AP
@@ -31937,25 +32581,25 @@
 fI.prototype.gHJ.$reflectable=1
 fI.prototype.sHJ=function(receiver,v){return receiver.HJ=v}
 fI.prototype.sHJ.$reflectable=1
-function V21(){}V21.builtin$cls="V21"
-if(!"name" in V21)V21.name="V21"
-$desc=$collectedClasses.V21
+function V24(){}V24.builtin$cls="V24"
+if(!"name" in V24)V24.name="V24"
+$desc=$collectedClasses.V24
 if($desc instanceof Array)$desc=$desc[1]
-V21.prototype=$desc
-function qq(a,b){this.a=a
-this.b=b}qq.builtin$cls="qq"
-if(!"name" in qq)qq.name="qq"
-$desc=$collectedClasses.qq
+V24.prototype=$desc
+function l0(a,b){this.a=a
+this.b=b}l0.builtin$cls="l0"
+if(!"name" in l0)l0.name="l0"
+$desc=$collectedClasses.l0
 if($desc instanceof Array)$desc=$desc[1]
-qq.prototype=$desc
+l0.prototype=$desc
 function G8(F1){this.F1=F1}G8.builtin$cls="G8"
 if(!"name" in G8)G8.name="G8"
 $desc=$collectedClasses.G8
 if($desc instanceof Array)$desc=$desc[1]
 G8.prototype=$desc
 G8.prototype.gF1=function(receiver){return this.F1}
-function fJ(F1,A4){this.F1=F1
-this.A4=A4}fJ.builtin$cls="fJ"
+function fJ(F1,Qy){this.F1=F1
+this.Qy=Qy}fJ.builtin$cls="fJ"
 if(!"name" in fJ)fJ.name="fJ"
 $desc=$collectedClasses.fJ
 if($desc instanceof Array)$desc=$desc[1]
@@ -31965,35 +32609,59 @@
 $desc=$collectedClasses.q1
 if($desc instanceof Array)$desc=$desc[1]
 q1.prototype=$desc
-function jx(F1,A4){this.F1=F1
-this.A4=A4}jx.builtin$cls="jx"
+function jx(F1,Qy){this.F1=F1
+this.Qy=Qy}jx.builtin$cls="jx"
 if(!"name" in jx)jx.name="jx"
 $desc=$collectedClasses.jx
 if($desc instanceof Array)$desc=$desc[1]
 jx.prototype=$desc
-function yT(){}yT.builtin$cls="yT"
-if(!"name" in yT)yT.name="yT"
-$desc=$collectedClasses.yT
-if($desc instanceof Array)$desc=$desc[1]
-yT.prototype=$desc
 function Cn(){}Cn.builtin$cls="Cn"
 if(!"name" in Cn)Cn.name="Cn"
 $desc=$collectedClasses.Cn
 if($desc instanceof Array)$desc=$desc[1]
 Cn.prototype=$desc
-function du(F1,A4){this.F1=F1
-this.A4=A4}du.builtin$cls="du"
+function du(F1,Qy){this.F1=F1
+this.Qy=Qy}du.builtin$cls="du"
 if(!"name" in du)du.name="du"
 $desc=$collectedClasses.du
 if($desc instanceof Array)$desc=$desc[1]
 du.prototype=$desc
-function xc(F1,A4){this.F1=F1
-this.A4=A4}xc.builtin$cls="xc"
+function xc(F1,Qy){this.F1=F1
+this.Qy=Qy}xc.builtin$cls="xc"
 if(!"name" in xc)xc.name="xc"
 $desc=$collectedClasses.xc
 if($desc instanceof Array)$desc=$desc[1]
 xc.prototype=$desc
-function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,S9,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
+function af(bN,GR){this.bN=bN
+this.GR=GR}af.builtin$cls="af"
+if(!"name" in af)af.name="af"
+$desc=$collectedClasses.af
+if($desc instanceof Array)$desc=$desc[1]
+af.prototype=$desc
+af.prototype.gbN=function(){return this.bN}
+af.prototype.sbN=function(v){return this.bN=v}
+af.prototype.gGR=function(){return this.GR}
+af.prototype.sGR=function(v){return this.GR=v}
+function pa(tl){this.tl=tl}pa.builtin$cls="pa"
+if(!"name" in pa)pa.name="pa"
+$desc=$collectedClasses.pa
+if($desc instanceof Array)$desc=$desc[1]
+pa.prototype=$desc
+pa.prototype.gtl=function(){return this.tl}
+pa.prototype.gtl.$reflectable=1
+pa.prototype.stl=function(v){return this.tl=v}
+pa.prototype.stl.$reflectable=1
+function Ey(a){this.a=a}Ey.builtin$cls="Ey"
+if(!"name" in Ey)Ey.name="Ey"
+$desc=$collectedClasses.Ey
+if($desc instanceof Array)$desc=$desc[1]
+Ey.prototype=$desc
+function tm(){}tm.builtin$cls="tm"
+if(!"name" in tm)tm.name="tm"
+$desc=$collectedClasses.tm
+if($desc instanceof Array)$desc=$desc[1]
+tm.prototype=$desc
+function bv(zf,fq,ne,PH,pw,v9,zb,KT,f5,cL,LE,Cf,W1,p2,Hw,S9,BC,FF,bj,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.zf=zf
 this.fq=fq
 this.ne=ne
 this.PH=PH
@@ -32006,7 +32674,12 @@
 this.LE=LE
 this.Cf=Cf
 this.W1=W1
+this.p2=p2
+this.Hw=Hw
 this.S9=S9
+this.BC=BC
+this.FF=FF
+this.bj=bj
 this.AP=AP
 this.Lk=Lk
 this.Fm=Fm
@@ -32028,16 +32701,20 @@
 bv.prototype.sGR=function(v){return this.f5=v}
 bv.prototype.gLE=function(){return this.LE}
 bv.prototype.gLE.$reflectable=1
+bv.prototype.gBC=function(){return this.BC}
+bv.prototype.gBC.$reflectable=1
+bv.prototype.sBC=function(v){return this.BC=v}
+bv.prototype.sBC.$reflectable=1
 function D3(){}D3.builtin$cls="D3"
 if(!"name" in D3)D3.name="D3"
 $desc=$collectedClasses.D3
 if($desc instanceof Array)$desc=$desc[1]
 D3.prototype=$desc
-function KQ(a){this.a=a}KQ.builtin$cls="KQ"
-if(!"name" in KQ)KQ.name="KQ"
-$desc=$collectedClasses.KQ
+function C5(a){this.a=a}C5.builtin$cls="C5"
+if(!"name" in C5)C5.name="C5"
+$desc=$collectedClasses.C5
 if($desc instanceof Array)$desc=$desc[1]
-KQ.prototype=$desc
+C5.prototype=$desc
 function Qq(a){this.a=a}Qq.builtin$cls="Qq"
 if(!"name" in Qq)Qq.name="Qq"
 $desc=$collectedClasses.Qq
@@ -32075,11 +32752,11 @@
 $desc=$collectedClasses.JB
 if($desc instanceof Array)$desc=$desc[1]
 JB.prototype=$desc
-function qj(){}qj.builtin$cls="qj"
-if(!"name" in qj)qj.name="qj"
-$desc=$collectedClasses.qj
+function nd(){}nd.builtin$cls="nd"
+if(!"name" in nd)nd.name="nd"
+$desc=$collectedClasses.nd
 if($desc instanceof Array)$desc=$desc[1]
-qj.prototype=$desc
+nd.prototype=$desc
 function BH(a){this.a=a}BH.builtin$cls="BH"
 if(!"name" in BH)BH.name="BH"
 $desc=$collectedClasses.BH
@@ -32196,7 +32873,18 @@
 Vi.prototype=$desc
 Vi.prototype.gtT=function(receiver){return this.tT}
 Vi.prototype.gAv=function(){return this.Av}
-function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
+function D5(tT,Av,wd,Jv){this.tT=tT
+this.Av=Av
+this.wd=wd
+this.Jv=Jv}D5.builtin$cls="D5"
+if(!"name" in D5)D5.name="D5"
+$desc=$collectedClasses.D5
+if($desc instanceof Array)$desc=$desc[1]
+D5.prototype=$desc
+D5.prototype.gtT=function(receiver){return this.tT}
+D5.prototype.gAv=function(){return this.Av}
+D5.prototype.gwd=function(receiver){return this.wd}
+function kx(J6,jv,Du,fF,vg,Mb,VS,hw,va,yP,mM,qH,Ni,MO,oc,zz,TD,AP,Lk,Fm,KG,mQ,nr,bN,GR,AP,Lk){this.J6=J6
 this.jv=jv
 this.Du=Du
 this.fF=fF
@@ -32208,6 +32896,7 @@
 this.yP=yP
 this.mM=mM
 this.qH=qH
+this.Ni=Ni
 this.MO=MO
 this.oc=oc
 this.zz=zz
@@ -32264,16 +32953,6 @@
 $desc=$collectedClasses.fx
 if($desc instanceof Array)$desc=$desc[1]
 fx.prototype=$desc
-function af(bN,GR){this.bN=bN
-this.GR=GR}af.builtin$cls="af"
-if(!"name" in af)af.name="af"
-$desc=$collectedClasses.af
-if($desc instanceof Array)$desc=$desc[1]
-af.prototype=$desc
-af.prototype.gbN=function(){return this.bN}
-af.prototype.sbN=function(v){return this.bN=v}
-af.prototype.gGR=function(){return this.GR}
-af.prototype.sGR=function(v){return this.GR=v}
 function UZ(a,b,c){this.a=a
 this.b=b
 this.c=c}UZ.builtin$cls="UZ"
@@ -32281,31 +32960,10 @@
 $desc=$collectedClasses.UZ
 if($desc instanceof Array)$desc=$desc[1]
 UZ.prototype=$desc
-function No(tl){this.tl=tl}No.builtin$cls="No"
-if(!"name" in No)No.name="No"
-$desc=$collectedClasses.No
-if($desc instanceof Array)$desc=$desc[1]
-No.prototype=$desc
-No.prototype.gtl=function(){return this.tl}
-No.prototype.gtl.$reflectable=1
-No.prototype.stl=function(v){return this.tl=v}
-No.prototype.stl.$reflectable=1
-function Ey(a){this.a=a}Ey.builtin$cls="Ey"
-if(!"name" in Ey)Ey.name="Ey"
-$desc=$collectedClasses.Ey
-if($desc instanceof Array)$desc=$desc[1]
-Ey.prototype=$desc
-function tm(){}tm.builtin$cls="tm"
-if(!"name" in tm)tm.name="tm"
-$desc=$collectedClasses.tm
-if($desc instanceof Array)$desc=$desc[1]
-tm.prototype=$desc
-function XK(Yu,tl,R9,wv,V2,me){this.Yu=Yu
+function XK(Yu,tl,AP,Lk){this.Yu=Yu
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}XK.builtin$cls="XK"
+this.AP=AP
+this.Lk=Lk}XK.builtin$cls="XK"
 if(!"name" in XK)XK.name="XK"
 $desc=$collectedClasses.XK
 if($desc instanceof Array)$desc=$desc[1]
@@ -32316,13 +32974,11 @@
 $desc=$collectedClasses.dT
 if($desc instanceof Array)$desc=$desc[1]
 dT.prototype=$desc
-function ho(ja,yb,tl,R9,wv,V2,me){this.ja=ja
+function ho(ja,yb,tl,AP,Lk){this.ja=ja
 this.yb=yb
 this.tl=tl
-this.R9=R9
-this.wv=wv
-this.V2=V2
-this.me=me}ho.builtin$cls="ho"
+this.AP=AP
+this.Lk=Lk}ho.builtin$cls="ho"
 if(!"name" in ho)ho.name="ho"
 $desc=$collectedClasses.ho
 if($desc instanceof Array)$desc=$desc[1]
@@ -32348,11 +33004,11 @@
 ob.prototype.gmC.$reflectable=1
 ob.prototype.smC=function(receiver,v){return receiver.mC=v}
 ob.prototype.smC.$reflectable=1
-function V22(){}V22.builtin$cls="V22"
-if(!"name" in V22)V22.name="V22"
-$desc=$collectedClasses.V22
+function V25(){}V25.builtin$cls="V25"
+if(!"name" in V25)V25.name="V25"
+$desc=$collectedClasses.V25
 if($desc instanceof Array)$desc=$desc[1]
-V22.prototype=$desc
+V25.prototype=$desc
 function xI(tY,Pe,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.tY=tY
 this.Pe=Pe
 this.AP=AP
@@ -32379,11 +33035,47 @@
 xI.prototype.gPe.$reflectable=1
 xI.prototype.sPe=function(receiver,v){return receiver.Pe=v}
 xI.prototype.sPe.$reflectable=1
-function Ds(){}Ds.builtin$cls="Ds"
-if(!"name" in Ds)Ds.name="Ds"
-$desc=$collectedClasses.Ds
+function pv(){}pv.builtin$cls="pv"
+if(!"name" in pv)pv.name="pv"
+$desc=$collectedClasses.pv
 if($desc instanceof Array)$desc=$desc[1]
-Ds.prototype=$desc
+pv.prototype=$desc
+function Uj(kF,IK,No,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.kF=kF
+this.IK=IK
+this.No=No
+this.AP=AP
+this.Lk=Lk
+this.AP=AP
+this.Lk=Lk
+this.dZ=dZ
+this.Sa=Sa
+this.Uk=Uk
+this.oq=oq
+this.Wz=Wz
+this.SO=SO
+this.B7=B7
+this.X0=X0}Uj.builtin$cls="Uj"
+if(!"name" in Uj)Uj.name="Uj"
+$desc=$collectedClasses.Uj
+if($desc instanceof Array)$desc=$desc[1]
+Uj.prototype=$desc
+Uj.prototype.gkF=function(receiver){return receiver.kF}
+Uj.prototype.gkF.$reflectable=1
+Uj.prototype.skF=function(receiver,v){return receiver.kF=v}
+Uj.prototype.skF.$reflectable=1
+Uj.prototype.gIK=function(receiver){return receiver.IK}
+Uj.prototype.gIK.$reflectable=1
+Uj.prototype.sIK=function(receiver,v){return receiver.IK=v}
+Uj.prototype.sIK.$reflectable=1
+Uj.prototype.gNo=function(receiver){return receiver.No}
+Uj.prototype.gNo.$reflectable=1
+Uj.prototype.sNo=function(receiver,v){return receiver.No=v}
+Uj.prototype.sNo.$reflectable=1
+function Nr(){}Nr.builtin$cls="Nr"
+if(!"name" in Nr)Nr.name="Nr"
+$desc=$collectedClasses.Nr
+if($desc instanceof Array)$desc=$desc[1]
+Nr.prototype=$desc
 function nm(Va,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.Va=Va
 this.AP=AP
 this.Lk=Lk
@@ -32405,11 +33097,11 @@
 nm.prototype.gVa.$reflectable=1
 nm.prototype.sVa=function(receiver,v){return receiver.Va=v}
 nm.prototype.sVa.$reflectable=1
-function V23(){}V23.builtin$cls="V23"
-if(!"name" in V23)V23.name="V23"
-$desc=$collectedClasses.V23
+function V26(){}V26.builtin$cls="V26"
+if(!"name" in V26)V26.name="V26"
+$desc=$collectedClasses.V26
 if($desc instanceof Array)$desc=$desc[1]
-V23.prototype=$desc
+V26.prototype=$desc
 function Vu(B3,AP,Lk,AP,Lk,dZ,Sa,Uk,oq,Wz,SO,B7,X0){this.B3=B3
 this.AP=AP
 this.Lk=Lk
@@ -32431,11 +33123,11 @@
 Vu.prototype.gB3.$reflectable=1
 Vu.prototype.sB3=function(receiver,v){return receiver.B3=v}
 Vu.prototype.sB3.$reflectable=1
-function V24(){}V24.builtin$cls="V24"
-if(!"name" in V24)V24.name="V24"
-$desc=$collectedClasses.V24
+function V27(){}V27.builtin$cls="V27"
+if(!"name" in V27)V27.name="V27"
+$desc=$collectedClasses.V27
 if($desc instanceof Array)$desc=$desc[1]
-V24.prototype=$desc
+V27.prototype=$desc
 function V2(N1,mD,Ck){this.N1=N1
 this.mD=mD
 this.Ck=Ck}V2.builtin$cls="V2"
@@ -32724,4 +33416,4 @@
 $desc=$collectedClasses.VD
 if($desc instanceof Array)$desc=$desc[1]
 VD.prototype=$desc
-return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QH,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,wP,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,ab,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,bP,mX,SN,HD,ni,jg,GT,nC,KR,ew,fs,LY,BL,fe,By,j2,X4,lp,kd,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,bk,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,xV,FH,y6,RH,pU,OJ,Mf,dp,vw,aG,fA,u9,Bn,Eb,UL,tZ,kc,AK,ty,Nf,F2,VB,Cy,q0,c5,LO,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,jQ,mT,ui,vO,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,d0,zp,br,PIw,vd,Jq,Yd,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,Lu,LR,d5,hy,mq,Ke,CG,Xe,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,mj,hW,uY,yR,AX,xJ,Nn,Et,NC,nb,Zn,xt,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,aH,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,vT,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,Iy,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,Zd,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,Ll,D2,my,Pe,Eq,lb,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Vf,Tg,Jc,pv,CN,Be,Vfx,E0,Dsd,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,SJ,SU7,Tv,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,Ld,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,e4,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,W5,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,pD,Cf,Sh,tF,z0,E3,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,e0,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,LZ,Dg,Ui,Ip,Pg,ObS,nA,E9,tuj,rm,Vct,YW,m8,Gk,D13,qW,mk,WZq,jY,pva,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,As,GE,rl,uQ,D7,hT,GS,pR,Js,hx,cda,u7,waa,qm,TI,E7,V4,SV,Kz,V9,vj,V10,LU,KL,V11,TJ,dG,qV,HV,em,Lb,T4,tzK,jA,PO,oBi,F1,aQ,V12,Qa,V13,Ww,V14,tz,V15,fl,V16,Zt,V17,iL,V18,lI,V19,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,nd,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,Sa,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,jh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,ja,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V20,knI,T5,fI,V21,qq,G8,fJ,q1,jx,yT,Cn,du,xc,bv,D3,KQ,Qq,Qd,i6,r2,JB,qj,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,kx,w8F,fx,af,UZ,No,Ey,tm,XK,dT,ho,ob,V22,xI,Ds,nm,V23,Vu,V24,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
+return[qE,zw,Ps,A0,Sb,vp,zx,P2,Xk,W2,zJ,Az,Fy,QW,ca,Ny,Yd,mj,Zv,Yr,BR,wT,d7,yJ,He,vz,vHT,hh,Em,NWk,rV,K4,QF,Aj,cm,Nh,wj,cv,Fs,Ty,ea,D0,as,hH,QU,u5,h4,W4,jP,Cz,tA,xn,Uq,QHL,Rt,X2,zU,wa,tX,Sg,pA,Mi,Gt,In,pL,eP,mF,Qj,cS,YI,El,zm,Y7,aB,W7,BK,Rv,HO,Kk,ZY,cx,EeC,Qb,PG,xe,Hw,bn,tH,Ve,Wp,H9,o4,Q0,ih,KV,yk,KY,G7,l9,Ql,Xp,Dx,mX,SN,HD,PF,jg,qj,nC,KR,kQ,fs,LY,BL,fe,By,j2,X4,lp,pD,I0,QR,Sc,uaa,yg,mG,Ul,uj,G5,wb,Lx,fh,qk,GI,Tb,tV,BT,yY,kJ,AE,R0,FH,y6,RH,Fg,OJ,Mf,dp,r4,SW,T4,u9,Bn,Eb,UL,tZ,eq,AK,ty,SC,F2,VB,Cy,q0,c5,LOx,Q7,hF,OF,Dh,Ue,mU,NE,Ak,y5,JY,or8,xt,jQ,mT,ui,TI,DQ,Sm,LM,es,eG,lv,pf,NV,W1,mCz,kK,n5,bb,NdT,lc,Xu,qM,Ob,me,oB,NY,EI,MI,rg,um,eW,kL,Fu,QN,N9,BA,TQ,zp,br,PIw,vd,Jq,NBZ,kN,AW,Gr,XE,GH,lo,NJ,j24,vt,rQ,ki,LR,d5,hy,mq,Ke,CG,mHq,y0,Rk4,Eo,Dn,pyk,ZD,Rlr,wD,Wv,yz,Fi,Ja,FT,hW,uY,yR,GK,xJ,aC,Et,NC,nb,Zn,zu,tG,P0,kh,SQ,qD,TM,WZ,pF,df,Hg,L3,zz,dE,IJ,us,N2,eE,V6,Lt,Gv,kn,Jh,QI,FP,is,Q,nM,iY,Jt,P,im,GW,x1,VP,BQ,O,PK,JO,f0,aX,oU,cC,RA,IY,JH,jl,Vg,dq,Z6,Ua,ns,yo,NA,NO,II,fP,X1,HU,Nt,OW,Tf,AP,yH,FA,Av,ku,L1,xQ,F0,oH,LPe,LD,jJ,XR,LI,A2,IW,F3,FD,Nv,Cj,u8,Zr,W0,az,vV,Am,XO,dr,TL,KX,uZ,OQ,Tp,Bp,v,qq,dN,GT,Pe,Eq,lbp,tD,hJ,tu,fw,Zz,cu,Lm,dC,wN,VX,VR,EK,KW,Pb,tQ,mL,Kf,qu,dZ,Qe,Y2,XN,G6,Ds,Tg,Jc,Vfx,CN,Be,Dsd,E0,tuj,lw,LP,wJ,aL,nH,a7,i1,xy,MH,A8,U5,SO,kV,rR,yq,SU7,JJ,w2Y,iK,GD,Sn,nI,jU,Lj,mb,cb,cw,EE,Uz,uh,IB,oP,YX,BI,Un,M2,iu,mg,bl,tB,Oo,Tc,Ax,Wf,vk,Ei,Ci,t0,XJ,Sz,Zk,fu,wt,ng,TN,Ar,rh,jB,ye,O1,Oh,Xh,Ca,Ik,JI,WVu,dz,tK,OR,Bg,DL,b8,ZC,Ia,Zf,vs,da,pV,U7,rH,cX,ZL,rq,RW,RT,jZ,FZ,OM,qh,YJ,jv,LB,DO,lz,Rl,Jb,M4,Jp,h7,pr,eN,B5,PI,j4,i9,VV,Dy,lU,OC,UH,Z5,j5,ii,MO,O9,yU,nP,KA,Vo,qB,ez,fIm,LV,DS,JF,ht,CR,Qk,v1y,uR,GU,YR,fB,nO,t3,tU,aY,zG,qK,dl,Id,WH,TF,K5,Cg,Hs,dv,ph,uo,pK,eM,Ha,nU,R8,k6,oi,ce,DJ,PL,Fq,jG,fG,EQ,YB,a1,ou,S9,db,i5,N6,UB,YO,oz,b6,ef,zQ,Yp,lN,mW,ar,lD,ZQ,Sw,o0,qv,jp,GZ,Ba,An,bF,BW,S6B,OG,uM,DN,ZM,HW,JC,f1,Uk,zF,Zi,Ud,K8,by,dI,Cf,Sh,tF,z0,om,Rw,HB,CL,p4,a2,Tx,iP,MF,Rq,a6,P7,DW,Ge,LK,AT,bJ,yd,mp,ub,ds,lj,UV,kF,VS,t7,HG,aE,eV,kM,EH,QV,AC,Z0,L9,a,Od,MN,WU,Rn,wv,uq,iD,hP,Uo,hb,Kd,yZ,Gs,pm,Tw,wm,FB,Lk,XZ,Mx,C9,kZ,JT,d9,rI,QZ,VG,wz,B1,M5,Jn,DM,RAp,Gb,Kx,iO,bU,Yg,e7,nNL,ma,Ou,yoo,ecX,zLC,w1p,dxW,kEI,tJ,Zc,i7,nF,FK,Si,vf,Iw,Fc,hD,I4,UC,RO,eu,ie,Ea,pu,i2,b0,Ov,qO,RX,bO,Gm,Of,Qg,W9,vZ,dW,Dk,O7,hq,E4,Gn,r7,Tz,Wk,DV,Hp,Nz,Jd,QS,hR,vY,hL,HDe,tn,ej,NL,vr,D4,X9,Ms,Fw,RS,RY,Ys,Lw,Gj,U4,B8q,Nx,b0B,Dg,Ui,Ip,Pg,ObS,nA,E9,Vct,rm,D13,YW,m8,Gk,WZq,AX,T5,mk,pva,lb,cda,nB,WQ,aG,aO,oc,jY,waa,nx,jm,ke,xj,aI,rG,yh,wO,Tm,ib,CA,YL,KC,xL,qS,As,GE,rl,uQ,D7,hT,GS,NG,Js,hx,V4,u7,V9,Se,qm,kKl,V10,SV,oO,St,V11,qkb,V12,vj,V13,LU,KL,V14,TJ,dG,qV,HV,em,Lb,jh,tzK,jA,Jo,oBi,F1,aQ,V15,Qa,V16,Ww,V17,tz,V18,fl,V19,Zt,V20,iL,V21,lI,V22,uL,Pi,z2,qI,J3,E5,o5,b5,zI,Zb,id,iV,DA,ndx,vly,d3,lS,xh,wn,er,Bj,HA,qC,zT,Lo,WR,qL,Px,C4,Md,km,Zj,XP,q6,CK,LJ,ZG,Oc,MX,w12,r3y,yL,zs,WC,Xi,TV,Mq,Oa,n1,xf,L6,Rs,uJ,hm,Ji,Bf,ir,jpR,GN,bS,HJ,S0,V3,rD,Fn,e3,pM,Mh,W6,Lf,fT,pp,nl,ik,mf,LfS,HK,o8,ex,e9,Xy,uK,mY,GX,mB,XF,bX,Ra,wJY,zOQ,W6o,MdQ,YJG,DOe,lPa,Ufa,Raa,w0,w4,w5,w7,w10,w11,c4,z6,Ay,Ed,G1,Os,B8,Wh,x5,ev,ID,qR,ek,Qv,Xm,mv,iv,uA,vl,Li,WK,iT,tE,ey,fa,WW,vQ,a9,VA,J1,fk,wL,B0,tc,hw,EZ,no,kB,ae,XC,w6,jK,uk,K9,zX,x9,Jy,xs,FX,Ae,Bt,vR,Pn,hc,hA,fr,d2,JG,V23,knI,qe,fI,V24,l0,G8,fJ,q1,jx,Cn,du,xc,af,pa,Ey,tm,bv,D3,C5,Qq,Qd,i6,r2,JB,nd,BH,SI,pt,wVq,c2,rj,dZL,N8,Q4,WAE,Vi,D5,kx,w8F,fx,UZ,XK,dT,ho,ob,V25,xI,pv,Uj,Nr,nm,V26,Vu,V27,V2,D8,zP,H2,lP,fTP,ppY,NP,jt,r0,jz,SA,hB,nv,ee,K6,TU,yp,ug,DT,OB,Uf,p8,NW,HS,TG,VU,Kj,R7,Ya,XT,ic,wl,ve,TR,VD]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 0b59620..61ce909 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -14,21 +14,25 @@
 export 'package:observatory/src/elements/field_view.dart';
 export 'package:observatory/src/elements/function_ref.dart';
 export 'package:observatory/src/elements/function_view.dart';
+export 'package:observatory/src/elements/heap_map.dart';
+export 'package:observatory/src/elements/heap_profile.dart';
 export 'package:observatory/src/elements/instance_ref.dart';
 export 'package:observatory/src/elements/instance_view.dart';
 export 'package:observatory/src/elements/isolate_list.dart';
-export 'package:observatory/src/elements/isolate_summary.dart';
 export 'package:observatory/src/elements/isolate_profile.dart';
-export 'package:observatory/src/elements/heap_profile.dart';
+export 'package:observatory/src/elements/isolate_ref.dart';
+export 'package:observatory/src/elements/isolate_summary.dart';
+export 'package:observatory/src/elements/isolate_view.dart';
 export 'package:observatory/src/elements/json_view.dart';
 export 'package:observatory/src/elements/library_ref.dart';
 export 'package:observatory/src/elements/library_view.dart';
-export 'package:observatory/src/elements/service_view.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
 export 'package:observatory/src/elements/response_viewer.dart';
 export 'package:observatory/src/elements/script_ref.dart';
 export 'package:observatory/src/elements/script_view.dart';
 export 'package:observatory/src/elements/service_ref.dart';
+export 'package:observatory/src/elements/service_view.dart';
+export 'package:observatory/src/elements/sliding_checkbox.dart';
 export 'package:observatory/src/elements/stack_frame.dart';
 export 'package:observatory/src/elements/stack_trace.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index 4746eac..abfeed6 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -14,8 +14,11 @@
   <link rel="import" href="src/elements/field_view.html">
   <link rel="import" href="src/elements/function_ref.html">
   <link rel="import" href="src/elements/function_view.html">
+  <link rel="import" href="src/elements/heap_map.html">
   <link rel="import" href="src/elements/isolate_list.html">
+  <link rel="import" href="src/elements/isolate_ref.html">
   <link rel="import" href="src/elements/isolate_summary.html">
+  <link rel="import" href="src/elements/isolate_view.html">
   <link rel="import" href="src/elements/instance_ref.html">
   <link rel="import" href="src/elements/instance_view.html">
   <link rel="import" href="src/elements/json_view.html">
@@ -29,6 +32,7 @@
   <link rel="import" href="src/elements/script_view.html">
   <link rel="import" href="src/elements/service_ref.html">
   <link rel="import" href="src/elements/service_view.html">
+  <link rel="import" href="src/elements/sliding_checkbox.html">
   <link rel="import" href="src/elements/stack_frame.html">
   <link rel="import" href="src/elements/stack_trace.html">
 </head>
diff --git a/runtime/bin/vmservice/client/lib/service.dart b/runtime/bin/vmservice/client/lib/service.dart
index e513701..4b328f9 100644
--- a/runtime/bin/vmservice/client/lib/service.dart
+++ b/runtime/bin/vmservice/client/lib/service.dart
@@ -13,4 +13,3 @@
 part 'src/service/cache.dart';
 part 'src/service/object.dart';
 part 'src/service/service.dart';
-part 'src/service/vm.dart';
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index dba7f88..e662f6f 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -10,7 +10,7 @@
 class LocationManager extends Observable {
   static const String defaultHash = '#/isolates/';
   static final RegExp _currentIsolateMatcher = new RegExp(r'#/isolates/\d+');
-  static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+/');
+  static final RegExp _currentObjectMatcher = new RegExp(r'#/isolates/\d+(/|$)');
   ObservatoryApplication _app;
   @observable String currentHash = '';
 
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index e832dca..dda6c81 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -42,18 +42,16 @@
 }
 
 class TableTree extends Observable {
-  final List<String> columnHeaders = [];
   @observable final List<TableTreeRow> rows = toObservable([]);
 
   /// Create a table tree with column [headers].
-  TableTree(List<String> headers) {
-    columnHeaders.addAll(headers);
-  }
+  TableTree();
 
   /// Initialize the table tree with the list of root children.
-  void initialize(List<TableTreeRow> children) {
+  void initialize(TableTreeRow root) {
     rows.clear();
-    rows.addAll(children);
+    root.onShow();
+    rows.addAll(root.children);
   }
 
   /// Toggle expansion of row at [rowIndex].
@@ -70,20 +68,10 @@
 
   int _index(TableTreeRow row) => rows.indexOf(row);
 
-  void _insertRow(int index, TableTreeRow row) {
-    if (index == -1) {
-      rows.add(row);
-    } else {
-      rows.insert(index, row);
-    }
-  }
-
   void _expand(TableTreeRow row) {
     int index = _index(row);
     assert(index != -1);
-    for (var i = 0; i < row.children.length; i++) {
-      _insertRow(index + i + 1, row.children[i]);
-    }
+    rows.insertAll(index + 1, row.children);
   }
 
   void _collapse(TableTreeRow row) {
@@ -101,8 +89,6 @@
     row.expanded = false;
     // Remove all children.
     int index = _index(row);
-    for (var i = 0; i < childCount; i++) {
-      rows.removeAt(index + 1);
-    }
+    rows.removeRange(index + 1, index + 1 + childCount);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
index 6893fd0..7e957be 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="class-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+
+<template><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+
 <script type="application/dart" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index fd53d20..8c35168 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -4,6 +4,7 @@
 
 library class_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
@@ -13,7 +14,12 @@
   @published ServiceMap cls;
   ClassViewElement.created() : super.created();
 
+  Future<ServiceObject> eval(String text) {
+    return cls.isolate.get(
+        cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
   void refresh(var done) {
     cls.reload().whenComplete(done);
   }
-}
\ No newline at end of file
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 8bffd2c..29f2ed5 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,14 +1,38 @@
 <head>
-  <link rel="import" href="error_view.html">
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
   <link rel="import" href="library_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_ref.html">
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -17,74 +41,125 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-    <div class="row">
-    <div class="col-md-8 col-md-offset-2">
-      <div class="panel panel-warning">
-        <div class="panel-heading">
-          class <strong>{{ cls.name }}</strong>
-          <template if="{{ cls['super']['type'] != 'Null' }}">
-            extends
-            <class-ref ref="{{ cls['super'] }}"></class-ref>
-          </template>
-          <p></p>
-          <library-ref ref="{{ cls['library'] }}"></library-ref>
+    <div class="content">
+      <h1>
+        <template if="{{ cls['abstract'] }}">
+          abstract
+        </template>
+        <template if="{{ cls['patch'] }}">
+          patch
+        </template>
+        class {{ cls.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">library</div>
+          <div class="memberValue">
+            <library-ref ref="{{ cls['library'] }}"></library-ref>
+          </div>
         </div>
-        <div class="panel-body">
-          <table class="table table-hover">
-            <tbody>
-              <tr>
-                <td>Abstract</td><td>{{ cls['abstract'] }}</td>
-              </tr>
-              <tr>
-                <td>Const</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Finalized</td><td>{{ cls['const'] }}</td>
-              </tr>
-              <tr>
-                <td>Implemented</td><td>{{ cls['implemented'] }}</td>
-              </tr>
-              <tr>
-                <td>Patch</td><td>{{ cls['patch'] }}</td>
-              </tr>
-              <tr>
-                <td>VM Name</td><td>{{ cls['name'] }}</td>
-              </tr>
-            </tbody>
-          </table>
-          <template if="{{ cls['error'] == null }}">
-            <blockquote><strong>Fields</strong></blockquote>
-            <table class="table table-hover">
-             <tbody>
-                <tr template repeat="{{ field in cls['fields'] }}">
-                  <td><field-ref ref="{{ field }}"></field-ref></td>
-                  <td><instance-ref ref="{{ field['value'] }}"></instance-ref></td>
-                </tr>
-              </tbody>
-            </table>
-            <blockquote><strong>Functions</strong></blockquote>
-            <table class="table table-hover">
-              <thead>
-                <tr>
-                  <th>User Name</th>
-                  <th>VM Name</th>
-                </tr>
-              </thead>
-              <tbody>
-                <tr template repeat="{{ function in cls['functions'] }}">
-                  <td><function-ref ref="{{ function }}"></function-ref></td>
-                  <td><function-ref ref="{{ function }}" internal></function-ref></td>
-                </tr>
-              </tbody>
-            </table>
-          </template>
-          <template if="{{ cls['error'] != null }}">
-            <error-view error_obj="{{ cls['error'] }}"></error-view>
-          </template>
+        <div class="memberItem">
+          <div class="memberName">script</div>
+          <div class="memberValue">
+            <script-ref ref="{{ cls['script'] }}" line="{{ cls['line'] }}">
+            </script-ref>
+          </div>
         </div>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['super']['type'] != 'Null' }}">
+          <div class="memberItem">
+            <div class="memberName">extends</div>
+            <div class="memberValue">
+              <class-ref ref="{{ cls['super'] }}"></class-ref>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls['subclasses'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">extended by</div>
+            <div class="memberValue">
+              <template repeat="{{ subclass in cls['subclasses'] }}">
+                <class-ref ref="{{ subclass }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+
+        <div class="memberItem">&nbsp;</div>
+
+        <template if="{{ cls['interfaces'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">implements</div>
+            <div class="memberValue">
+              <template repeat="{{ interface in cls['interfaces'] }}">
+                <class-ref ref="{{ interface }}"></class-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ cls.name != cls.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ cls.vmName }}</div>
+          </div>
+        </template>
       </div>
     </div>
+
+    <template if="{{ cls['error'] != null }}">
+      <!-- TODO(turnidge): Don't use instance-ref for error display here -->
+      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+    </template>
+
+    <hr>
+
+    <div class="content">
+      <template if="{{ cls['fields'].isNotEmpty }}">
+        fields ({{ cls['fields'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in cls['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ cls['functions'].isNotEmpty }}">
+        functions ({{ cls['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in cls['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}" qualified="{{ false }}">
+                  </function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
     </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
   </template>
   <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index cc6166c..80c4cb8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,4 +1,5 @@
 <link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
 <polymer-element name="code-view" extends="observatory-element">
@@ -17,7 +18,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member, .memberHeader {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -31,27 +39,33 @@
     </style>
     <div class="content">
       <h1>Code for {{ code.name }}</h1>
-      <table>
-        <tr>
-          <td class="memberHeader">kind</td>
-          <td class="member">{{code.kind}}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">function</td>
-          <td class="member">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">kind</div>
+          <div class="memberValue">{{code.kind}}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">function</div>
+          <div class="memberValue">
             <function-ref ref="{{code.function}}">
             </function-ref>
-          </td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Inclusive</td>
-          <td class="member">{{ code.formattedInclusiveTicks }}</td>
-        </tr>
-        <tr>
-          <td class="memberHeader">Exclusive</td>
-          <td class="member">{{ code.formattedExclusiveTicks }}</td>
-        </tr>
-      </table>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Inclusive</div>
+          <div class="memberValue">{{ code.formattedInclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Exclusive</div>
+          <div class="memberValue">{{ code.formattedExclusiveTicks }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Constant object pool</div>
+          <div class="memberValue">
+            <instance-ref ref="{{ code.objectPool }}"></instance-ref>
+          </div>
+        </div>
+      </div>
     </div>
     <hr>
     <div class="content">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
index 3133ed7..0223bf1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.dart
@@ -9,5 +9,21 @@
 
 @CustomTag('function-ref')
 class FunctionRefElement extends ServiceRefElement {
+  @published bool qualified = true;
+
+  void refChanged(oldValue) {
+    super.refChanged(oldValue);
+    notifyPropertyChange(#hasParent, 0, 1);
+    notifyPropertyChange(#hasClass, 0, 1);
+    hasParent = (ref != null && ref['parent'] != null);
+    hasClass = (ref != null &&
+                ref['class'] != null &&
+                ref['class']['name'] != null &&
+                ref['class']['name'] != '::');
+  }
+
+  @observable bool hasParent = false;
+  @observable bool hasClass = false;
+
   FunctionRefElement.created() : super.created();
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
index a6e4c09..2760ab0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -1,9 +1,15 @@
 <head>
+<link rel="import" href="class_ref.html">
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-<template>
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
-</template>
+  <template><!-- These comments are here to allow newlines.
+     --><template if="{{ qualified && !hasParent && hasClass }}"><!--
+       --><class-ref ref="{{ ref['class'] }}"></class-ref>.</template><!--
+     --><template if="{{ qualified && hasParent }}"><!--
+       --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
+          </function-ref>.<!--
+     --></template><a href="{{ url }}">{{ name }}</a><!--
+  --></template>
 <script type="application/dart" src="function_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
new file mode 100644
index 0000000..fccb62a
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
@@ -0,0 +1,118 @@
+// 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.
+
+library heap_map_element;
+
+import 'dart:async';
+import 'dart:html';
+import 'dart:math';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:logging/logging.dart';
+import 'package:polymer/polymer.dart';
+import 'package:observatory/app.dart';
+
+/// Displays an Error response.
+@CustomTag('heap-map')
+class HeapMapElement extends ObservatoryElement {
+  var _fragmentationCanvas;
+  var _fragmentationData;
+
+  @observable String status;
+  @published ServiceMap fragmentation;
+
+  HeapMapElement.created() : super.created() {
+  }
+
+  void enteredView() {
+    super.enteredView();
+    _fragmentationCanvas = shadowRoot.querySelector("#fragmentation");
+  }
+
+  List<int> _classIdToRGBA(int classId) {
+    if (classId == fragmentation['free_class_id']) {
+      return [255, 255, 255, 255];
+    } else {
+      // TODO(koda): Pick random hue, but fixed saturation and value.
+      var rng = new Random(classId);
+      return [rng.nextInt(128),
+              rng.nextInt(128),
+              rng.nextInt(128),
+              255];
+    }
+  }
+
+  void _updateFragmentationData() {
+    if (fragmentation == null || _fragmentationCanvas == null) {
+      return;
+    }
+    var pages = fragmentation['pages'];
+    // Calculate dimensions.
+    var numPixels = 0;
+    var colorMap = {};
+    for (var page in pages) {
+      for (int i = 0; i < page.length; i += 2) {
+        numPixels += page[i];
+        var classId = page[i + 1];
+        colorMap.putIfAbsent(classId, () => _classIdToRGBA(classId));
+      }
+    }
+    var width = _fragmentationCanvas.parent.client.width;
+    var height = (numPixels + width - 1) ~/ width;
+    // Render image.
+    _fragmentationData =
+        _fragmentationCanvas.context2D.createImageData(width, height);
+    _fragmentationCanvas.width = _fragmentationData.width;
+    _fragmentationCanvas.height = _fragmentationData.height;
+    _renderPages(0, 0, colorMap);
+  }
+
+  // Renders and draws asynchronously, one page at a time to avoid
+  // blocking the UI.
+  void _renderPages(int startPage, int dataIndex, var colorMap) {
+    var pages = fragmentation['pages'];
+    status = 'Loaded $startPage of ${pages.length} pages';
+    if (startPage >= pages.length) {
+      return;
+    }
+    var width = _fragmentationData.width;
+    var dirtyBegin = (dataIndex / 4) ~/ width;
+    var page = pages[startPage];
+    for (var i = 0; i < page.length; i += 2) {
+      var count = page[i];
+      var color = colorMap[page[i + 1]];
+      for (var j = 0; j < count; ++j) {
+        for (var component in color) {
+          _fragmentationData.data[dataIndex++] = component;
+        }
+      }
+    }
+    var dirtyEnd = (dataIndex / 4 + width - 1) ~/ width;
+    _fragmentationCanvas.context2D.putImageData(
+        _fragmentationData, 0, 0, 0, dirtyBegin, width, dirtyEnd - dirtyBegin);
+    // Continue with the next page, asynchronously.
+    new Future(() {
+      _renderPages(startPage + 1, dataIndex, colorMap);
+    });
+  }
+
+  void refresh(var done) {
+    if (fragmentation == null) {
+      return;
+    }
+    fragmentation.isolate.get('heapmap').then((ServiceMap response) {
+      assert(response['type'] == 'HeapMap');
+      fragmentation = response;
+    }).catchError((e, st) {
+      Logger.root.info('$e $st');
+    }).whenComplete(done);
+  }
+  
+  void fragmentationChanged(oldValue) {
+    // Async, in case enteredView has not yet run (observed in JS version).
+    new Future(() {
+      _updateFragmentationData();
+    });
+  }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
new file mode 100644
index 0000000..510f1fe
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -0,0 +1,22 @@
+<head>
+  <link rel="import" href="class_ref.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="nav_bar.html">
+</head>
+<polymer-element name="heap-map" extends="observatory-element">
+<template>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
+    <nav-menu link="." anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+  <div class="row">
+    <p style="text-align:center">{{ status }}</p>
+  </div>
+  <div class="row">
+    <canvas id="fragmentation" width="1px" height="1px"></canvas>
+  </div>
+</template>
+<script type="application/dart" src="heap_map.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index e03e1d2..4fae426 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -6,9 +6,17 @@
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 1px 0 1px 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div>
@@ -32,6 +40,7 @@
 
       <template if="{{ isClosure(ref.serviceType) }}">
         <a href="{{ url }}">
+          <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
       </template>
@@ -39,28 +48,34 @@
       <template if="{{ isInstance(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tr template repeat="{{ field in ref['fields'] }}">
-              <td class="member">{{ field['decl']['user_name'] }}</td>
-              <td class="member">
-                <instance-ref ref="{{ field['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ field in ref['fields'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  {{ field['decl']['user_name'] }}
+                </div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
         <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
-          <table>
-            <tr template repeat="{{ element in ref['elements'] }}">
-              <td class="member">[{{ element['index']}}]</td>
-              <td class="member">
-                <instance-ref ref="{{ element['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ element in ref['elements'] }}">
+              <div class="memberItem">
+                <div class="memberName">[{{ element['index']}}]</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
       </template>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index 5a0f9ba..295dddf 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -4,12 +4,11 @@
 
 library instance_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
-import 'dart:async';
-
 @CustomTag('instance-view')
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index c39183d..6c400ca 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -26,12 +26,14 @@
       h1 {
         font: 400 18px 'Montserrat', sans-serif;
       }
-      .member {
-        vertical-align: top;
-        padding: 3px 0 3px 1em;
-        font: 400 14px 'Montserrat', sans-serif;
+      .memberList {
+        display: table;
       }
-      .memberBold {
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
         padding: 3px 0 3px 1em;
         font: 400 14px 'Montserrat', sans-serif;
@@ -46,23 +48,25 @@
       <div class="content">
         <!-- TODO(turnidge): Handle null instances. -->
         <h1>instance of {{ instance['class']['user_name'] }}</h1>
-        <table>
-          <tr>
-            <td class="memberBold">class</td>
-            <td class="member">
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">class</div>
+            <div class="memberValue">
               <class-ref ref="{{ instance['class'] }}">
               </class-ref>
-            </td>
-          </tr>
-          <tr template if="{{ instance['preview'] != null }}">
-            <td class="memberBold">preview</td>
-            <td class="member">{{ instance['preview'] }}</td>
-          </tr>
-          <tr>
-            <td class="memberBold">size</td>
-            <td class="member">{{ instance['size'] | formatSize }}</td>
-          </tr>
-        </table>
+            </div>
+          </div>
+          <template if="{{ instance['preview'] != null }}">
+            <div class="memberItem">
+              <div class="memberName">preview</div>
+              <div class="memberValue">{{ instance['preview'] }}</div>
+            </div>
+          </template>
+          <div class="memberItem">
+            <div class="memberName">size</div>
+            <div class="memberValue">{{ instance['size'] | formatSize }}</div>
+          </div>
+        </div>
       </div>
 
       <hr>
@@ -71,44 +75,50 @@
         <template if="{{ instance['fields'].isNotEmpty }}">
           fields ({{ instance['fields'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ field in instance['fields'] }}">
-                <td class="member">
-                  <field-ref ref="{{ field['decl'] }}"></field-ref>
-                </td>
-                <td class="member">
-                  <instance-ref ref="{{ field['value'] }}"></instance-ref>
-                </td>
-              </tr>
-            </table>
+            <div class="memberList">
+              <template repeat="{{ field in instance['fields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">
+                    <field-ref ref="{{ field['decl'] }}"></field-ref>
+                  </div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
           </curly-block>
         </template>
 
         <template if="{{ instance['nativeFields'].isNotEmpty }}">
           native fields ({{ instance['nativeFields'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ field in instance['nativeFields'] }}">
-                <td class="member">[{{ field['index']}}]</td>
-                <td class="member">[{{ field['value']}}]</td>
-              </tr>
-            </table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ field in instance['nativeFields'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ field['index']}}]</div>
+                  <div class="memberValue">[{{ field['value']}}]</div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
 
         <template if="{{ instance['elements'].isNotEmpty }}">
           elements ({{ instance['elements'].length }})
           <curly-block>
-            <table>
-              <tr template repeat="{{ element in instance['elements'] }}">
-                <td class="member">[{{ element['index']}}]</td>
-                <td class="member">
-                  <instance-ref ref="{{ element['value'] }}">
-                  </instance-ref>
-                </td>
-              </tr>
-            </table>
-          </curly-block>
+            <div class="memberList">
+              <template repeat="{{ element in instance['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}">
+                    </instance-ref>
+                  </div>
+                </div>
+              </template>
+            </div>
+          </curly-block><br>
         </template>
       </div>
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index 39092b3..1e244df 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -6,10 +6,61 @@
 
 import 'dart:html';
 import 'observatory_element.dart';
+import 'package:logging/logging.dart';
 import 'package:observatory/service.dart';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
+class ProfileCodeTrieNodeTreeRow extends TableTreeRow {
+  final ServiceMap profile;
+  @reflectable final CodeTrieNode root;
+  @reflectable final CodeTrieNode node;
+  @reflectable Code get code => node.code;
+
+  static String formatPercent(num a, num total) {
+    var percent = 100.0 * (a / total);
+    return '${percent.toStringAsFixed(2)}%';
+  }
+
+  ProfileCodeTrieNodeTreeRow(this.profile, this.root, this.node,
+                             ProfileCodeTrieNodeTreeRow parent)
+      : super(parent) {
+    assert(root != null);
+    assert(node != null);
+    var totalSamples = root.count;
+    // When the row is created, fill out the columns.
+    if (parent == null) {
+      columns.add(formatPercent(node.count, root.count));
+    } else {
+      columns.add(formatPercent(node.count, parent.node.count));
+    }
+    columns.add(formatPercent(node.code.exclusiveTicks, totalSamples));
+  }
+
+  bool shouldDisplayChild(CodeTrieNode childNode, double threshold) {
+    return ((childNode.count / node.count) > threshold) ||
+            ((childNode.code.exclusiveTicks / root.count) > threshold);
+  }
+
+  void onShow() {
+    var threshold = profile['threshold'];
+    if (children.length > 0) {
+      // Child rows already created.
+      return;
+    }
+    for (var childNode in node.children) {
+      if (!shouldDisplayChild(childNode, threshold)) {
+        continue;
+      }
+      var row = new ProfileCodeTrieNodeTreeRow(profile, root, childNode, this);
+      children.add(row);
+    }
+  }
+
+  void onHide() {
+  }
+}
+
 class ProfileCallerTreeRow extends TableTreeRow {
   final ServiceMap profile;
   @reflectable final Code code;
@@ -25,29 +76,41 @@
     assert(code != null);
     var totalSamples = profile['samples'];
     // When the row is created, fill out the columns.
-    columns.add(
-        formatPercent(code.exclusiveTicks, totalSamples));
     if (parent == null) {
-      // Fill with dummy data.
-      columns.add('');
+      var root = profile.isolate.codes.tagRoot();
+      var totalAttributedCalls = root.callersCount(code);
+      var totalParentCalls = root.sumCallersCount();
+      columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
     } else {
       var totalAttributedCalls = parent.code.callersCount(code);
       var totalParentCalls = parent.code.sumCallersCount();
       columns.add(formatPercent(totalAttributedCalls, totalParentCalls));
     }
+    columns.add(formatPercent(code.exclusiveTicks, totalSamples));
+  }
+
+  bool shouldDisplayChild(CodeCallCount childNode, totalSamples,
+                          double threshold) {
+    var callerPercent = code.callersCount(childNode.code) /
+                        code.sumCallersCount();
+    return (callerPercent > threshold) ||
+            ((childNode.code.exclusiveTicks / totalSamples) > threshold);
   }
 
   void onShow() {
+    var threshold = profile['threshold'];
+    var totalSamples = profile['samples'];
     if (children.length > 0) {
       // Child rows already created.
       return;
     }
-    // Create child rows on demand.
-    code.callers.forEach((CodeCallCount codeCaller) {
-      var row =
-          new ProfileCallerTreeRow(profile, codeCaller.code, this);
+    for (var codeCaller in code.callers) {
+      if (!shouldDisplayChild(codeCaller, totalSamples, threshold)) {
+        continue;
+      }
+      var row = new ProfileCallerTreeRow(profile, codeCaller.code, this);
       children.add(row);
-    });
+    }
   }
 
   void onHide() {
@@ -59,15 +122,20 @@
 class IsolateProfileElement extends ObservatoryElement {
   IsolateProfileElement.created() : super.created();
   @published ServiceMap profile;
-  @reflectable final topExclusiveCodes = new ObservableList<Code>();
-  @observable int methodCountSelected = 0;
+  @observable bool callGraphChecked;
+  @observable bool hideTagsChecked;
   @observable String sampleCount = '';
   @observable String refreshTime = '';
+  @observable String sampleRate = '';
+  @observable String sampleDepth = '';
+  @observable String displayCutoff = '';
+  @reflectable double displayThreshold = 0.0001; // 0.5%.
 
-  final List methodCounts = [10, 20, 50];
   final _id = '#tableTree';
   TableTree tree;
 
+  static const MICROSECONDS_PER_SECOND = 1000000.0;
+
   void profileChanged(oldValue) {
     if (profile == null) {
       return;
@@ -76,21 +144,35 @@
     var now = new DateTime.now();
     sampleCount = totalSamples.toString();
     refreshTime = now.toString();
+    sampleDepth = profile['depth'].toString();
+    var period = profile['period'];
+    sampleRate = (MICROSECONDS_PER_SECOND / period).toStringAsFixed(0);
+    displayCutoff = '${(displayThreshold * 100.0).toString()}%';
     profile.isolate.processProfile(profile);
+    profile['threshold'] = displayThreshold;
     _update();
   }
 
+  void callGraphCheckedChanged(oldValue) {
+    _update();
+  }
+
+
   void enteredView() {
-    tree = new TableTree(['Method', 'Exclusive', 'Caller']);
+    tree = new TableTree();
     _update();
   }
 
-  methodCountSelectedChanged(oldValue) {
-    _update();
+  void hideTagsCheckedChanged(oldValue) {
+    refresh(null);
   }
 
   void refresh(var done) {
-    profile.isolate.get('profile').then((ServiceMap m) {
+    var request = 'profile';
+    if ((hideTagsChecked != null) && hideTagsChecked) {
+      request += '?tags=hide';
+    }
+    profile.isolate.get(request).then((ServiceMap m) {
       // Assert we got back the a profile.
       assert(m.serviceType == 'Profile');
       profile = m;
@@ -101,28 +183,46 @@
     if (profile == null) {
       return;
     }
-    _refreshTopMethods();
-    _rebuildTree();
+    _buildTree();
   }
 
-  void _refreshTopMethods() {
+  void _buildCallersTree() {
     assert(profile != null);
-    var count = methodCounts[methodCountSelected];
-    topExclusiveCodes.clear();
-    topExclusiveCodes.addAll(profile.isolate.codes.topExclusive(count));
-  }
-
-  void _rebuildTree() {
-    assert(profile != null);
-    var rootChildren = [];
-    for (var code in topExclusiveCodes) {
-      var row = new ProfileCallerTreeRow(profile, code, null);
-      rootChildren.add(row);
+    var root = profile.isolate.codes.tagRoot();
+    if (root == null) {
+      Logger.root.warning('No profile root tag.');
     }
-    tree.initialize(rootChildren);
+    try {
+      tree.initialize(new ProfileCallerTreeRow(profile, root, null));
+    } catch (e, stackTrace) {
+      Logger.root.warning('_buildCallersTree', e, stackTrace);
+    }
+
     notifyPropertyChange(#tree, null, tree);
   }
 
+  void _buildStackTree() {
+    var root = profile.isolate.profileTrieRoot;
+    if (root == null) {
+      Logger.root.warning('No profile trie root.');
+    }
+    try {
+      tree.initialize(
+          new ProfileCodeTrieNodeTreeRow(profile, root, root, null));
+    } catch (e, stackTrace) {
+      Logger.root.warning('_buildStackTree', e, stackTrace);
+    }
+    notifyPropertyChange(#tree, null, tree);
+  }
+
+  void _buildTree() {
+    if ((callGraphChecked) != null && callGraphChecked) {
+      _buildCallersTree();
+    } else {
+      _buildStackTree();
+    }
+  }
+
   @observable String padding(TableTreeRow row) {
     return 'padding-left: ${row.depth * 16}px;';
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index f8d14aa..af6c097 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -2,6 +2,7 @@
   <link rel="import" href="code_ref.html">
   <link rel="import" href="nav_bar.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="sliding_checkbox.html">
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
@@ -11,40 +12,83 @@
       <nav-menu link="." anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
-    <div class="row">
-      <div class="col-md-12">
-        <span>Top</span>
-        <select selectedIndex="{{methodCountSelected}}" value="{{methodCounts[methodCountSelected]}}">
-          <option template repeat="{{count in methodCounts}}">{{count}}</option>
-        </select>
-        <span>exclusive methods</span>
-      </div>
-    </div>
-    <div class="row">
-      <div class="col-md-12">
-        <p>Refreshed at {{ refreshTime }} with {{ sampleCount }} samples.</p>
-      </div>
-    </div>
-    <table id="tableTree" class="table table-hover">
-      <thead>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .member, .memberHeader {
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .monospace {
+        font-family: consolas, courier, monospace;
+        font-size: 1em;
+        line-height: 1.2em;
+        white-space: nowrap;
+      }
+    </style>
+    <div class="content">
+      <h1>Sampled CPU profile</h1>
+      <table>
         <tr>
-          <th>Method</th>
-          <th>Exclusive</th>
-          <th>Caller</th>
+          <td class="memberHeader">Timestamp</td>
+          <td class="member">{{ refreshTime }}</td>
         </tr>
-      </thead>
-      <tbody>
-        <tr template repeat="{{row in tree.rows }}" style="{{}}">
-          <td on-click="{{toggleExpanded}}"
-              class="{{ coloring(row) }}"
-              style="{{ padding(row) }}">
-            <code-ref ref="{{ row.code }}"></code-ref>
+        <tr>
+          <td class="memberHeader">Sample count</td>
+          <td class="member">{{ sampleCount }}</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample rate</td>
+          <td class="member">{{ sampleRate }} Hz</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Sample depth</td>
+          <td class="member">{{ sampleDepth }} stack frames</td>
+        </tr>
+        <tr>
+          <td class="memberHeader">Call graph tree</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ callGraphChecked }}">
           </td>
-          <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
-          <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
-        </tr>
-      </tbody>
-    </table>
+         <tr>
+          <td class="memberHeader">Display cutoff</td>
+          <td class="member">{{ displayCutoff }}</td>
+         </tr>
+         <tr>
+          <td class="memberHeader">Hide tags</td>
+          <td class="member">
+            <input type="checkbox" checked="{{ hideTagsChecked }}">
+          </td>
+         </tr>
+      </table>
+      <hr>
+      <table id="tableTree" class="table table-hover">
+        <thead>
+          <tr>
+            <th>Method</th>
+            <th>Caller</th>
+            <th>Exclusive</th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr template repeat="{{row in tree.rows }}" style="{{}}">
+            <td on-click="{{toggleExpanded}}"
+                class="{{ coloring(row) }}"
+                style="{{ padding(row) }}">
+              <code-ref ref="{{ row.code }}"></code-ref>
+            </td>
+            <td class="{{ coloring(row) }}">{{row.columns[0]}}</td>
+            <td class="{{ coloring(row) }}">{{row.columns[1]}}</td>
+          </tr>
+        </tbody>
+      </table>
+    </div>
   </template>
   <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
new file mode 100644
index 0000000..730a438
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.dart
@@ -0,0 +1,13 @@
+// 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.
+
+library isolate_ref_element;
+
+import 'package:polymer/polymer.dart';
+import 'service_ref.dart';
+
+@CustomTag('isolate-ref')
+class IsolateRefElement extends ServiceRefElement {
+  IsolateRefElement.created() : super.created();
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
new file mode 100644
index 0000000..53d96b3
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -0,0 +1,9 @@
+<head>
+<link rel="import" href="service_ref.html">
+</head>
+<polymer-element name="isolate-ref" extends="service-ref">
+<template>
+  <a href="{{ url }}">{{ ref.name }}</a>
+</template>
+<script type="application/dart" src="isolate_ref.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index a5dbe18..9d3826a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,5 +1,6 @@
 <head>
   <link rel="import" href="function_ref.html">
+  <link rel="import" href="isolate_ref.html">
   <link rel="import" href="observatory_element.html">
   <link rel="import" href="script_ref.html">
 </head>
@@ -16,14 +17,7 @@
       <div class="col-md-4">
 
         <div class="row">
-          <template if="{{ isolate.entry['id'] != null }}">
-            <a href="{{ isolate.hashLink(isolate.entry['id']) }}">
-              {{ isolate.name }}
-            </a>
-          </template>
-          <template if="{{ isolate.entry['id'] == null }}">
-            {{ isolate.name }}
-          </template>
+          <isolate-ref ref="{{ isolate }}"></isolate-ref>
         </div>
 
         <div class="row">
@@ -66,6 +60,7 @@
         <a href="{{ isolate.relativeHashLink('allocationprofile') }}">
           {{ isolate.newHeapUsed | formatSize }}/{{ isolate.oldHeapUsed | formatSize }}
         </a>
+        ( <a href="{{ isolate.relativeHashLink('heapmap') }}">map</a> )
       </div>
       <div class="col-md-2">
         <template if="{{ isolate.topFrame == null }}">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
new file mode 100644
index 0000000..3693ce6
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -0,0 +1,25 @@
+// 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.
+
+library isolate_view_element;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('isolate-view')
+class IsolateViewElement extends ObservatoryElement {
+  @published Isolate isolate;
+  IsolateViewElement.created() : super.created();
+
+  Future<ServiceObject> eval(String text) {
+    return isolate.get(
+        isolate.rootLib.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
+  void refresh(var done) {
+    isolate.reload().whenComplete(done);
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
new file mode 100644
index 0000000..209c73d
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -0,0 +1,163 @@
+<head>
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
+  <link rel="import" href="function_ref.html">
+  <link rel="import" href="library_ref.html">
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="script_ref.html">
+</head>
+<polymer-element name="isolate-view" extends="observatory-element">
+  <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      .sourceInset {
+        padding-left: 15%;
+        padding-right: 15%;
+      }
+    </style>
+
+    <nav-bar>
+      <top-nav-menu></top-nav-menu>
+      <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
+      </isolate-nav-menu>
+    </nav-bar>
+
+    <div class="content">
+      <h1>isolate '{{ isolate.name }}'</h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">status</div>
+          <div class="memberValue">
+            <template if="{{ isolate.topFrame == null }}">
+              <strong>idle</strong>
+            </template>
+            <template if="{{ isolate.topFrame != null }}">
+              <strong>running</strong>
+              @
+              <function-ref ref="{{ isolate.topFrame['function'] }}">
+              </function-ref>
+              (<script-ref ref="{{ isolate.topFrame['script'] }}"
+                           line="{{ isolate.topFrame['line'] }}"></script-ref>)
+            </template>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <template if="{{ isolate.topFrame != null }}">
+      <br>
+      <div class="sourceInset">
+        <pre>
+          {{ isolate.topFrame['line'] }} &nbsp; {{ isolate.topFrame['lineString'] }}</pre>
+      </div>
+    </template>
+
+    <br>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">root library</div>
+          <div class="memberValue">
+            <function-ref ref="{{ isolate.rootLib }}"></function-ref>
+          </div>
+        </div>
+        <div class="memberItem">
+          <template if="{{ isolate.entry != null }}">
+            <div class="memberName">entry</div>
+            <div class="memberValue">
+              <function-ref ref="{{ isolate.entry }}"></function-ref>
+            </div>
+          </template>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">id</div>
+          <div class="memberValue">{{ isolate.vmName }}</div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">new heap</div>
+          <div class="memberValue">
+            {{ isolate.newHeapUsed | formatSize }}
+            of
+            {{ isolate.newHeapCapacity | formatSize }}
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">old heap</div>
+          <div class="memberValue">
+            {{ isolate.oldHeapUsed | formatSize }}
+            of
+            {{ isolate.oldHeapCapacity | formatSize }}
+          </div>
+        </div>
+      </div>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">heap profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
+  </template>
+  <script type="application/dart" src="isolate_view.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
index 398c508..f22e019 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.dart
@@ -4,17 +4,23 @@
 
 library library_view_element;
 
+import 'dart:async';
 import 'observatory_element.dart';
 import 'package:observatory/service.dart';
-
 import 'package:polymer/polymer.dart';
 
+
 @CustomTag('library-view')
 class LibraryViewElement extends ObservatoryElement {
   @published ServiceMap library;
 
   LibraryViewElement.created() : super.created();
 
+  Future<ServiceObject> eval(String text) {
+    return library.isolate.get(
+        library.id + "/eval?expr=${Uri.encodeComponent(text)}");
+  }
+
   void refresh(var done) {
     library.reload().whenComplete(done);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index b54eb21..3b4a368 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -1,5 +1,7 @@
 <head>
   <link rel="import" href="class_ref.html">
+  <link rel="import" href="curly_block.html">
+  <link rel="import" href="eval_box.html">
   <link rel="import" href="field_ref.html">
   <link rel="import" href="function_ref.html">
   <link rel="import" href="instance_ref.html">
@@ -10,6 +12,28 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
+    <style>
+      .content {
+        padding-left: 10%;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+      h1 {
+        font: 400 18px 'Montserrat', sans-serif;
+      }
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
+        vertical-align: top;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
+      }
+    </style>
+
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
@@ -17,68 +41,111 @@
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
     </nav-bar>
 
-  <div class="alert alert-info">Scripts</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ script in library['scripts']}}">
-        <td>
-          {{ script.kind }}
-        </td>
-        <td>
-          <script-ref ref="{{ script }}"></script-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Imported Libraries</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ lib in library['libraries'] }}">
-        <td>
-          <library-ref ref="{{ lib }}"></library-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Variables</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ variable in library['variables'] }}">
-        <td><field-ref ref="{{ variable }}"></field-ref></td>
-        <td><instance-ref ref="{{ variable['value'] }}"></instance-ref></td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Functions</div>
-  <table class="table table-hover">
-    <tbody>
-      <tr template repeat="{{ func in library['functions'] }}">
-        <td>
-          <function-ref ref="{{ func }}"></function-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
-  <div class="alert alert-info">Classes</div>
-  <table class="table table-hover">
-    <thead>
-      <tr>
-        <th>Name</th>
-        <th>Internal Name</th>
-      </tr>
-    </thead>
-    <tbody>
-      <tr template repeat="{{ cls in library['classes'] }}">
-        <td>
-          <class-ref ref="{{ cls }}"></class-ref>
-        </td>
-        <td>
-          <class-ref ref="{{ cls }}" internal></class-ref>
-        </td>
-      </tr>
-    </tbody>
-  </table>
+    <div class="content">
+      <h1>
+        <!-- TODO(turnidge): Handle unnamed libraries -->
+        library {{ library.name }}
+      </h1>
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">url</div>
+          <div class="memberValue">{{ library['url'] }}</div>
+        </div>
+        <template if="{{ library['imports'].length > 0 }}">
+          <div class="memberItem">
+            <div class="memberName">imports</div>
+            <div class="memberValue">
+              <template repeat="{{ import in library['imports'] }}">
+                <library-ref ref="{{ import }}"></library-ref>
+              </template>
+            </div>
+          </div>
+        </template>
+        <template if="{{ library.name != library.vmName }}">
+          <div class="memberItem">
+            <div class="memberName">vm name</div>
+            <div class="memberValue">{{ library.vmName }}</div>
+          </div>
+        </template>
+      </div>
+    </div>
 
+    <hr>
+
+    <div class="content">
+      <template if="{{ library['scripts'].isNotEmpty }}">
+        scripts ({{ library['scripts'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ script in library['scripts'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <script-ref ref="{{ script }}"></script-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['classes'].isNotEmpty }}">
+        classes ({{ library['classes'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ cls in library['classes'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <class-ref ref="{{ cls }}"></class-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['variables'].isNotEmpty }}">
+        variables ({{ library['variables'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ field in library['variables'] }}">
+              <div class="memberItem">
+                <div class="memberName">
+                  <field-ref ref="{{ field }}"></field-ref>
+                </div>
+                <div class="memberValue">
+                  <template if="{{ field['value'] != null }}">
+                    <instance-ref ref="{{ field['value'] }}"></instance-ref>
+                  </template>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+
+      <template if="{{ library['functions'].isNotEmpty }}">
+        functions ({{ library['functions'].length }})
+        <curly-block>
+          <div class="memberList">
+            <template repeat="{{ function in library['functions'] }}">
+              <div class="memberItem">
+                <div class="memberValue">
+                  <function-ref ref="{{ function }}"></function-ref>
+                </div>
+              </div>
+            </template>
+          </div>
+        </curly-block><br>
+      </template>
+    </div>
+
+    <hr>
+
+    <div class="content">
+      <eval-box callback="{{ eval }}"></eval-box>
+    </div>
+    <br><br><br><br>
+    <br><br><br><br>
   </template>
   <script type="application/dart" src="library_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index dbd2006..20e2907 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -159,13 +159,15 @@
 
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="#" anchor="{{ isolate.name }}" last="{{ last }}">
+    <nav-menu link="{{ isolate.hashLink }}" anchor="{{ isolate.name }}" last="{{ last }}">
       <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
       <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
                      anchor="heap profile"></nav-menu-item>
+      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
+                     anchor="heap map"></nav-menu-item>                     
       <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index 2a81626..e739a45 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -48,6 +48,10 @@
         FunctionViewElement element = new Element.tag('function-view');
         element.function = object;
         return element;
+      case 'HeapMap':
+        HeapMapElement element = new Element.tag('heap-map');
+        element.fragmentation = object;
+        return element;
       case 'Array':
       case 'Bool':
       case 'Closure':
@@ -58,6 +62,10 @@
         InstanceViewElement element = new Element.tag('instance-view');
         element.instance = object;
         return element;
+      case 'Isolate':
+        IsolateViewElement element = new Element.tag('isolate-view');
+        element.isolate = object;
+        return element;
       case 'IsolateList':
         IsolateListElement element = new Element.tag('isolate-list');
         element.isolates = object;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
index 93fadd0..23a7630 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -5,6 +5,7 @@
   <link rel="import" href="error_view.html">
   <link rel="import" href="field_view.html">
   <link rel="import" href="function_view.html">
+  <link rel="import" href="heap_map.html">
   <link rel="import" href="heap_profile.html">
   <link rel="import" href="instance_view.html">
   <link rel="import" href="isolate_list.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart
new file mode 100644
index 0000000..760fd11
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.dart
@@ -0,0 +1,21 @@
+// 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.
+
+library sliding_checkbox_element;
+
+import 'dart:html';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('sliding-checkbox')
+class SlidingCheckboxElement extends PolymerElement {
+  SlidingCheckboxElement.created() : super.created();
+  @published bool checked;
+  @published String checkedText;
+  @published String uncheckedText;
+
+  void change(Event e, var details, Node target) {
+    CheckboxInputElement input = shadowRoot.querySelector('#slide-switch');
+    checked = input.checked;
+  }
+}
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
new file mode 100644
index 0000000..80f39aa
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -0,0 +1,87 @@
+<polymer-element name="sliding-checkbox">
+  <template>
+    <style>
+      .switch {
+        position: relative;
+        width: 121px;
+        -webkit-user-select: none;
+        -moz-user-select: none;
+        -ms-user-select: none;
+      }
+      .hide {
+        display: none;
+      }
+      .label {
+        display: block;
+        overflow: hidden;
+        cursor: pointer;
+        border: 2px solid #999999;
+        border-radius: 15px;
+      }
+      .content {
+        width: 200%;
+        margin-left: -100%;
+        -moz-transition: margin 0.3s ease-in 0s;
+        -webkit-transition: margin 0.3s ease-in 0s;
+        -o-transition: margin 0.3s ease-in 0s;
+        transition: margin 0.3s ease-in 0s;
+      }
+      .content:before, .content:after {
+        float: left;
+        width: 50%;
+        height: 30px;
+        padding: 0;
+        line-height: 30px;
+        color: white;
+        font: 400 14px 'Montserrat', sans-serif;
+        -moz-box-sizing: border-box;
+        -webkit-box-sizing: border-box;
+        box-sizing: border-box;
+      }
+      .content:before {
+        content: {{ checkedText }};
+        padding-left: 10px;
+        background-color: #0489C3;
+      }
+      .content:after {
+        content: {{ uncheckedText }};
+        padding-right: 10px;
+        background-color: #EEEEEE;
+        color: #999999;
+        text-align: right;
+      }
+      .dot {
+        width: 14px;
+        margin: 8px;
+        background: #FFFFFF;
+        border: 2px solid #999999;
+        border-radius: 15px;
+        position: absolute;
+        top: 0;
+        bottom: 0;
+        right: 87px;
+        -moz-transition: all 0.3s ease-in 0s;
+        -webkit-transition: all 0.3s ease-in 0s;
+        -o-transition: all 0.3s ease-in 0s;
+        transition: all 0.3s ease-in 0s;
+      }
+      :checked + .label .content {
+        margin-left: 0;
+      }
+      :checked + .label .dot {
+        right: 0px;
+      }
+    </style>
+    <div class="switch">
+      <input type="checkbox"
+             class="hide"
+             id="slide-switch"
+             on-change="{{ change }}">
+      <label class="label" for="slide-switch">
+        <div class="content"></div>
+        <div class="dot"></div>
+      </label>
+    </div>
+  </template>
+  <script type="application/dart" src="sliding_checkbox.dart"></script>
+</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index ca7313c..a965765 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -8,9 +8,17 @@
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <style>
-      .member {
+      .memberList {
+        display: table;
+      }
+      .memberItem {
+        display: table-row;
+      }
+      .memberName, .memberValue {
+        display: table-cell;
         vertical-align: top;
-        padding: 0 0 0 1em;
+        padding: 3px 0 3px 1em;
+        font: 400 14px 'Montserrat', sans-serif;
       }
     </style>
     <div class="row">
@@ -22,15 +30,18 @@
         <function-ref ref="{{ frame['function'] }}"></function-ref>
         ( <script-ref ref="{{ frame['script'] }}" line="{{ frame['line'] }}">
         </script-ref> )
+
         <curly-block>
-          <table>
-            <tr template repeat="{{ v in frame['vars'] }}">
-              <td class="member">{{ v['name']}}</td>
-              <td class="member">
-                <instance-ref ref="{{ v['value'] }}"></instance-ref>
-              </td>
-            </tr>
-          </table>
+          <div class="memberList">
+            <template repeat="{{ v in frame['vars'] }}">
+              <div class="memberItem">
+                <div class="memberName">{{ v['name']}}</div>
+                <div class="memberValue">
+                  <instance-ref ref="{{ v['value'] }}"></instance-ref>
+                </div>
+              </div>
+            </template>
+          </div>
         </curly-block>
 
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/service/cache.dart b/runtime/bin/vmservice/client/lib/src/service/cache.dart
index 6feb94a..a1d8fe4 100644
--- a/runtime/bin/vmservice/client/lib/src/service/cache.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/cache.dart
@@ -42,9 +42,9 @@
     assert(cachesId(id));
     T cached = _cache[id];
     if (cached != null) {
-      return new Future.value(cached);
+      return cached.load();
     }
-    return isolate.get(id).then(_addToCache);
+    return isolate.getDirect(id);
   }
 
   /// If [obj] is cached, return the cached object. Otherwise, upgrades [obj]
@@ -113,6 +113,13 @@
     return codeList;
   }
 
+  static const TAG_ROOT_ID = 'code/tag-0';
+
+  /// Returns the Code object for the root tag.
+  Code tagRoot() {
+    return _cache[TAG_ROOT_ID];
+  }
+
   void _resetProfileData() {
     _cache.forEach((k, Code code) {
       code.resetProfileData();
@@ -154,6 +161,7 @@
                  r'^functions/collected-.+|'
                  r'^functions/reused-.+|'
                  r'^functions/stub-.+|'
+                 r'^functions/tag-.+|'
                  r'^classes/\d+/functions/.+|'
                  r'^classes/\d+/closures/.+|'
                  r'^classes/\d+/implicit_closures/.+|'
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index bbfe10a..63e253f 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -4,6 +4,169 @@
 
 part of service;
 
+/// A [ServiceObject] is an object known to the VM service and is tied
+/// to an owning [Isolate].
+abstract class ServiceObject extends Observable {
+  Isolate _isolate;
+
+  /// Owning isolate.
+  @reflectable Isolate get isolate => _isolate;
+
+  /// Owning vm.
+  @reflectable VM get vm => _isolate.vm;
+
+  /// The complete service url of this object.
+  @reflectable String get link => isolate.relativeLink(_id);
+
+  /// The complete service url of this object with a '#/' prefix.
+  @reflectable String get hashLink => isolate.relativeHashLink(_id);
+  set hashLink(var o) { /* silence polymer */ }
+
+  String _id;
+  /// The id of this object.
+  @reflectable String get id => _id;
+
+  String _serviceType;
+  /// The service type of this object.
+  @reflectable String get serviceType => _serviceType;
+
+  bool _ref;
+
+  @observable String name;
+  @observable String vmName;
+
+  ServiceObject(this._isolate, this._id, this._serviceType) {
+    _ref = isRefType(_serviceType);
+    _serviceType = stripRef(_serviceType);
+    _created();
+  }
+
+  ServiceObject.fromMap(this._isolate, ObservableMap m) {
+    assert(isServiceMap(m));
+    _id = m['id'];
+    _ref = isRefType(m['type']);
+    _serviceType = stripRef(m['type']);
+    _created();
+    update(m);
+  }
+
+  /// If [this] was created from a reference, load the full object
+  /// from the service by calling [reload]. Else, return [this].
+  Future<ServiceObject> load() {
+    if (!_ref) {
+      // Not a reference.
+      return new Future.value(this);
+    }
+    // Call reload which will fill in the entire object.
+    return reload();
+  }
+
+  /// Reload [this]. Returns a future which completes to [this] or
+  /// a [ServiceError].
+  Future<ServiceObject> reload() {
+    assert(isolate != null);
+    if (id == '') {
+      // Errors don't have ids.
+      assert(serviceType == 'Error');
+      return new Future.value(this);
+    }
+    return isolate.vm.getAsMap(link).then(update);
+  }
+
+  /// Update [this] using [m] as a source. [m] can be a reference.
+  ServiceObject update(ObservableMap m) {
+    // Assert that m is a service map.
+    assert(ServiceObject.isServiceMap(m));
+    if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
+      // Got an unexpected error. Don't update the object.
+      return _upgradeToServiceObject(vm, isolate, m);
+    }
+    // TODO(johnmccutchan): Should we allow for a ServiceObject's id
+    // or type to change?
+    _id = m['id'];
+    _serviceType = stripRef(m['type']);
+    _update(m);
+    return this;
+  }
+
+  // update internal state from [map]. [map] can be a reference.
+  void _update(ObservableMap map);
+
+  /// Returns true if [this] has only been partially initialized via
+  /// a reference. See [load].
+  bool isRef() => _ref;
+
+  void _created() {
+    var refNotice = _ref ? ' Created from reference.' : '';
+    Logger.root.info('Created ServiceObject for \'${_id}\' with type '
+                     '\'${_serviceType}\'.' + refNotice);
+  }
+
+  /// Returns true if [map] is a service map. i.e. it has the following keys:
+  /// 'id' and a 'type'.
+  static bool isServiceMap(ObservableMap m) {
+    return (m != null) && (m['id'] != null) && (m['type'] != null);
+  }
+
+  /// Returns true if [type] is a reference type. i.e. it begins with an
+  /// '@' character.
+  static bool isRefType(String type) {
+    return type.startsWith('@');
+  }
+
+  /// Returns the unreffed version of [type].
+  static String stripRef(String type) {
+    if (!isRefType(type)) {
+      return type;
+    }
+    // Strip off the '@' character.
+    return type.substring(1);
+  }
+}
+
+/// State for a VM being inspected.
+abstract class VM extends Observable {
+  @reflectable IsolateList _isolates;
+  @reflectable IsolateList get isolates => _isolates;
+
+  void _initOnce() {
+    assert(_isolates == null);
+    _isolates = new IsolateList(this);
+  }
+
+  VM() {
+    _initOnce();
+  }
+
+  /// Get [id] as an [ObservableMap] from the service directly.
+  Future<ObservableMap> getAsMap(String id) {
+    return getString(id).then((response) {
+      try {
+        var map = JSON.decode(response);
+        Logger.root.info('Decoded $id');
+        return toObservable(map);
+      } catch (e, st) {
+        return toObservable({
+          'type': 'Error',
+          'id': '',
+          'kind': 'DecodeError',
+          'message': '$e',
+        });
+      }
+    }).catchError((error) {
+      return toObservable({
+        'type': 'Error',
+        'id': '',
+        'kind': 'LastResort',
+        'message': '$error'
+      });
+    });
+  }
+
+  /// Get [id] as a [String] from the service directly. See [getAsMap].
+  Future<String> getString(String id);
+}
+
 /// State for a running isolate.
 class Isolate extends ServiceObject {
   final VM vm;
@@ -61,11 +224,24 @@
     }
     _codes._resetProfileData();
     _codes._updateProfileData(profile, codeTable);
+    var exclusiveTrie = profile['exclusive_trie'];
+    if (exclusiveTrie != null) {
+      profileTrieRoot = _processProfileTrie(exclusiveTrie, codeTable);
+    }
+  }
+
+  Future<ServiceObject> getDirect(String serviceId) {
+    return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
+        return _upgradeToServiceObject(vm, this, m);
+    });
   }
 
   /// Requests [serviceId] from [this]. Completes to a [ServiceObject].
   /// Can return pre-existing, cached, [ServiceObject]s.
   Future<ServiceObject> get(String serviceId) {
+    if (serviceId == '') {
+      return reload();
+    }
     if (_scripts.cachesId(serviceId)) {
       return _scripts.get(serviceId);
     }
@@ -78,9 +254,7 @@
     if (_functions.cachesId(serviceId)) {
       return _functions.get(serviceId);
     }
-    return vm.getAsMap(relativeLink(serviceId)).then((ObservableMap m) {
-      return _upgradeToServiceObject(vm, this, m);
-    });
+    return getDirect(serviceId);
   }
 
   @observable ServiceMap rootLib;
@@ -95,6 +269,8 @@
 
   @observable int newHeapUsed = 0;
   @observable int oldHeapUsed = 0;
+  @observable int newHeapCapacity = 0;
+  @observable int oldHeapCapacity = 0;
 
   @observable String fileAndLine;
 
@@ -114,7 +290,7 @@
       name = entry['name'];
     } else {
       // fred
-      name = 'root isolate';
+      name = 'root';
     }
     if (map['topFrame'] != null) {
       topFrame = map['topFrame'];
@@ -137,6 +313,53 @@
 
     newHeapUsed = map['heap']['usedNew'];
     oldHeapUsed = map['heap']['usedOld'];
+    newHeapCapacity = map['heap']['capacityNew'];
+    oldHeapCapacity = map['heap']['capacityOld'];
+  }
+
+  @reflectable CodeTrieNode profileTrieRoot;
+  // The profile trie is serialized as a list of integers. Each node
+  // is recreated by consuming some portion of the list. The format is as
+  // follows:
+  // [0] index into codeTable of code object.
+  // [1] tick count (number of times this stack frame occured).
+  // [2] child node count
+  // Reading the trie is done by recursively reading the tree depth-first
+  // pre-order.
+  CodeTrieNode _processProfileTrie(List<int> data, List<Code> codeTable) {
+    // Setup state shared across calls to _readTrieNode.
+    _trieDataCursor = 0;
+    _trieData = data;
+    if (_trieData == null) {
+      return null;
+    }
+    if (_trieData.length < 3) {
+      // Not enough integers for 1 node.
+      return null;
+    }
+    // Read the tree, returns the root node.
+    return _readTrieNode(codeTable);
+  }
+  int _trieDataCursor;
+  List<int> _trieData;
+  CodeTrieNode _readTrieNode(List<Code> codeTable) {
+    // Read index into code table.
+    var index = _trieData[_trieDataCursor++];
+    // Lookup code object.
+    var code = codeTable[index];
+    // Frame counter.
+    var count = _trieData[_trieDataCursor++];
+    // Create node.
+    var node = new CodeTrieNode(code, count);
+    // Number of children.
+    var children = _trieData[_trieDataCursor++];
+    // Recursively read child nodes.
+    for (var i = 0; i < children; i++) {
+      var child = _readTrieNode(codeTable);
+      node.children.add(child);
+      node.summedChildCount += child.count;
+    }
+    return node;
   }
 }
 
@@ -446,6 +669,8 @@
       return Collected;
     } else if (s == 'Reused') {
       return Reused;
+    } else if (s == 'Tag') {
+      return Tag;
     }
     Logger.root.warning('Unknown code kind $s');
     throw new FallThroughError();
@@ -454,6 +679,7 @@
   static const Dart = const CodeKind._internal('Dart');
   static const Collected = const CodeKind._internal('Collected');
   static const Reused = const CodeKind._internal('Reused');
+  static const Tag = const CodeKind._internal('Tag');
 }
 
 class CodeCallCount {
@@ -462,6 +688,14 @@
   CodeCallCount(this.code, this.count);
 }
 
+class CodeTrieNode {
+  final Code code;
+  final int count;
+  final children = new List<CodeTrieNode>();
+  int summedChildCount = 0;
+  CodeTrieNode(this.code, this.count);
+}
+
 class Code extends ServiceObject {
   @observable CodeKind kind;
   @observable int totalSamplesInProfile = 0;
@@ -475,7 +709,7 @@
   @reflectable final addressTicks = new ObservableMap<int, CodeTick>();
   @observable String formattedInclusiveTicks = '';
   @observable String formattedExclusiveTicks = '';
-
+  @observable ServiceMap objectPool;
   @observable ServiceMap function;
   String name;
   String vmName;
@@ -547,7 +781,7 @@
         '($inclusiveTicks)';
     formattedExclusiveTicks =
         '${formatPercent(exclusiveTicks, totalSamplesInProfile)} '
-        '($inclusiveTicks)';
+        '($exclusiveTicks)';
   }
 
   void _update(ObservableMap m) {
@@ -559,8 +793,8 @@
     kind = CodeKind.fromString(m['kind']);
     startAddress = int.parse(m['start'], radix:16);
     endAddress = int.parse(m['end'], radix:16);
-    // Upgrade the function.
-    function = _upgradeToServiceObject(isolate.vm, isolate, m['function']);
+    function = _upgradeToServiceObject(vm, isolate, m['function']);
+    objectPool = _upgradeToServiceObject(vm, isolate, m['object_pool']);
     var disassembly = m['disassembly'];
     if (disassembly != null) {
       _processDisassembly(disassembly);
diff --git a/runtime/bin/vmservice/client/lib/src/service/service.dart b/runtime/bin/vmservice/client/lib/src/service/service.dart
index 3671116..bc160d8 100644
--- a/runtime/bin/vmservice/client/lib/src/service/service.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/service.dart
@@ -4,126 +4,6 @@
 
 part of service;
 
-/// A [ServiceObject] is an object known to the VM service and is tied
-/// to an owning [Isolate].
-abstract class ServiceObject extends Observable {
-  Isolate _isolate;
-
-  /// Owning isolate.
-  @reflectable Isolate get isolate => _isolate;
-
-  /// Owning vm.
-  @reflectable VM get vm => _isolate.vm;
-
-  /// The complete service url of this object.
-  @reflectable String get link => isolate.relativeLink(_id);
-
-  /// The complete service url of this object with a '#/' prefix.
-  @reflectable String get hashLink => isolate.relativeHashLink(_id);
-  set hashLink(var o) { /* silence polymer */ }
-
-  String _id;
-  /// The id of this object.
-  @reflectable String get id => _id;
-
-  String _serviceType;
-  /// The service type of this object.
-  @reflectable String get serviceType => _serviceType;
-
-  bool _ref;
-
-  @observable String name;
-  @observable String vmName;
-
-  ServiceObject(this._isolate, this._id, this._serviceType) {
-    _ref = isRefType(_serviceType);
-    _serviceType = stripRef(_serviceType);
-    _created();
-  }
-
-  ServiceObject.fromMap(this._isolate, ObservableMap m) {
-    assert(isServiceMap(m));
-    _id = m['id'];
-    _ref = isRefType(m['type']);
-    _serviceType = stripRef(m['type']);
-    _created();
-    update(m);
-  }
-
-  /// If [this] was created from a reference, load the full object
-  /// from the service by calling [reload]. Else, return [this].
-  Future<ServiceObject> load() {
-    if (!_ref) {
-      // Not a reference.
-      return new Future.value(this);
-    }
-    // Call refresh which will fill in the entire object.
-    return reload();
-  }
-
-  /// Reload [this]. Returns a future which completes to [this] or
-  /// a [ServiceError].
-  Future<ServiceObject> reload() {
-    assert(isolate != null);
-    if (id == '') {
-      // Errors don't have ids.
-      assert(serviceType == 'Error');
-      return new Future.value(this);
-    }
-    return isolate.vm.getAsMap(link).then(update);
-  }
-
-  /// Update [this] using [m] as a source. [m] can be a reference.
-  ServiceObject update(ObservableMap m) {
-    // Assert that m is a service map.
-    assert(ServiceObject.isServiceMap(m));
-    if ((m['type'] == 'Error') && (_serviceType != 'Error')) {
-      // Got an unexpected error. Don't update the object.
-      return _upgradeToServiceObject(vm, isolate, m);
-    }
-    // TODO(johnmccutchan): Should we allow for a ServiceObject's id
-    // or type to change?
-    _id = m['id'];
-    _serviceType = stripRef(m['type']);
-    _update(m);
-    return this;
-  }
-
-  // update internal state from [map]. [map] can be a reference.
-  void _update(ObservableMap map);
-
-  /// Returns true if [this] has only been partially initialized via
-  /// a reference. See [load].
-  bool isRef() => _ref;
-
-  void _created() {
-    var refNotice = _ref ? ' Created from reference.' : '';
-    Logger.root.info('Created ServiceObject for \'${_id}\' with type '
-                     '\'${_serviceType}\'.' + refNotice);
-  }
-
-  /// Returns true if [map] is a service map. i.e. it has the following keys:
-  /// 'id' and a 'type'.
-  static bool isServiceMap(ObservableMap m) {
-    return (m != null) && (m['id'] != null) && (m['type'] != null);
-  }
-
-  /// Returns true if [type] is a reference type. i.e. it begins with an
-  /// '@' character.
-  static bool isRefType(String type) {
-    return type.startsWith('@');
-  }
-
-  /// Returns the unreffed version of [type].
-  static String stripRef(String type) {
-    if (!isRefType(type)) {
-      return type;
-    }
-    // Strip off the '@' character.
-    return type.substring(1);
-  }
-}
-
 /// Recursively upgrades all [ServiceObject]s inside [collection] which must
 /// be an [ObservableMap] or an [ObservableList]. Upgraded elements will be
 /// associated with [vm] and [isolate].
@@ -164,6 +44,9 @@
 /// This acts like a factory which consumes an ObservableMap and returns
 /// a fully upgraded ServiceObject.
 ServiceObject _upgradeToServiceObject(VM vm, Isolate isolate, ObservableMap m) {
+  if (m == null) {
+    return null;
+  }
   if (!ServiceObject.isServiceMap(m)) {
     Logger.root.severe("Malformed service object: $m");
   }
diff --git a/runtime/bin/vmservice/client/lib/src/service/vm.dart b/runtime/bin/vmservice/client/lib/src/service/vm.dart
deleted file mode 100644
index 4886517..0000000
--- a/runtime/bin/vmservice/client/lib/src/service/vm.dart
+++ /dev/null
@@ -1,47 +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 service;
-
-abstract class VM extends Observable {
-  @reflectable IsolateList _isolates;
-  @reflectable IsolateList get isolates => _isolates;
-
-  void _initOnce() {
-    assert(_isolates == null);
-    _isolates = new IsolateList(this);
-  }
-
-  VM() {
-    _initOnce();
-  }
-
-  /// Get [id] as an [ObservableMap] from the service directly.
-  Future<ObservableMap> getAsMap(String id) {
-    return getString(id).then((response) {
-      try {
-        var map = JSON.decode(response);
-        Logger.root.info('Decoded $id');
-        return toObservable(map);
-      } catch (e, st) {
-        return toObservable({
-          'type': 'Error',
-          'id': '',
-          'kind': 'DecodeError',
-          'message': '$e',
-        });
-      }
-    }).catchError((error) {
-      return toObservable({
-        'type': 'Error',
-        'id': '',
-        'kind': 'LastResort',
-        'message': '$error'
-      });
-    });
-  }
-
-  /// Get [id] as a [String] from the service directly. See [getAsMap].
-  Future<String> getString(String id);
-}
diff --git a/runtime/lib/function.dart b/runtime/lib/function.dart
index a75b564..8147b2d 100644
--- a/runtime/lib/function.dart
+++ b/runtime/lib/function.dart
@@ -7,4 +7,6 @@
   bool operator ==(other) native "FunctionImpl_equals";
 
   int get hashCode native "FunctionImpl_hashCode";
+
+  _FunctionImpl get call => this;
 }
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 8f773f9..99d55dc 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -111,6 +111,16 @@
 }
 
 
+RawTypedData* CreateRandomState(Isolate* isolate, uint64_t seed) {
+  const TypedData& result = TypedData::Handle(
+      isolate, TypedData::New(kTypedDataUint32ArrayCid, 2));
+  result.SetUint32(0, static_cast<uint32_t>(seed));
+  result.SetUint32(result.ElementSizeInBytes(),
+                   static_cast<uint32_t>(seed >> 32));
+  return result.raw();
+}
+
+
 uint64_t mix64(uint64_t n) {
   // Thomas Wang 64-bit mix.
   // http://www.concentric.net/~Ttwang/tech/inthash.htm
@@ -135,14 +145,12 @@
 //   if (hash == 0) {
 //     hash = 0x5A17;
 //   }
-//   _state[kSTATE_LO] = hash & _MASK_32;
-//   _state[kSTATE_HI] = hash >> 32;
-DEFINE_NATIVE_ENTRY(Random_setupSeed, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Instance, receiver, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(1));
-  const TypedData& array = TypedData::Handle(GetRandomStateArray(receiver));
-  ASSERT(!seed_int.IsNull());
-  ASSERT(!array.IsNull());
+//   var result = new Uint32List(2);
+//   result[kSTATE_LO] = seed & _MASK_32;
+//   result[kSTATE_HI] = seed >> 32;
+//   return result;
+DEFINE_NATIVE_ENTRY(Random_setupSeed, 1) {
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, seed_int, arguments->NativeArgAt(0));
   uint64_t seed = 0;
   if (seed_int.IsBigint()) {
     const Bigint& mask64 = Bigint::Handle(
@@ -172,10 +180,15 @@
   if (seed == 0) {
     seed = 0x5a17;
   }
-  array.SetUint32(0, static_cast<uint32_t>(seed));
-  array.SetUint32(array.ElementSizeInBytes(),
-      static_cast<uint32_t>(seed >> 32));
-  return Object::null();
+  return CreateRandomState(isolate, seed);
+}
+
+
+DEFINE_NATIVE_ENTRY(Random_initialSeed, 0) {
+  Random* rnd = isolate->random();
+  uint64_t seed = rnd->NextUInt32();
+  seed |= (static_cast<uint64_t>(rnd->NextUInt32()) << 32);
+  return CreateRandomState(isolate, seed);
 }
 
 }  // namespace dart
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index b1301e9..279a549 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -71,34 +71,23 @@
 patch class Random {
 
   /*patch*/ factory Random([int seed]) {
-    if (seed == null) {
-      seed = _Random._nextSeed();
-    }
+    var state = _Random._setupSeed((seed == null) ? _Random._nextSeed() : seed);
     // Crank a couple of times to distribute the seed bits a bit further.
-    return new _Random().._setupSeed(seed)
-                        .._nextState()
-                        .._nextState()
-                        .._nextState()
-                        .._nextState();
+    return new _Random._withState(state).._nextState()
+                                        .._nextState()
+                                        .._nextState()
+                                        .._nextState();
   }
 }
 
 
 class _Random implements Random {
   // Internal state of the random number generator.
-  final _state = new Uint32List(2);
+  final _state;
   static const kSTATE_LO = 0;
   static const kSTATE_HI = 1;
 
-  // Implements:
-  //   do {
-  //     seed = (seed + 0x5A17) & _Random._MASK_64;
-  //   } while (seed == 0);
-  //   _state[kSTATE_LO] = seed & _MASK_32;
-  //   _state[kSTATE_HI] = seed >> 32;
-  // This is a native to prevent 64-bit operations in Dart, which
-  // fail with --throw_on_javascript_int_overflow.
-  void _setupSeed(int seed) native "Random_setupSeed";
+  _Random._withState(Uint32List this._state);
 
   // The algorithm used here is Multiply with Carry (MWC) with a Base b = 2^32.
   // http://en.wikipedia.org/wiki/Multiply-with-carry
@@ -154,13 +143,15 @@
   static const _A = 0xffffda61;
 
   // Use a singleton Random object to get a new seed if no seed was passed.
-  static var _prng = null;
+  static var _prng = new _Random._withState(_initialSeed());
+
+  // This is a native to prevent 64-bit operations in Dart, which
+  // fail with --throw_on_javascript_int_overflow.
+  static Uint32List _setupSeed(int seed) native "Random_setupSeed";
+  // Get a seed from the VM's random number provider.
+  static Uint32List _initialSeed() native "Random_initialSeed";
 
   static int _nextSeed() {
-    if (_prng == null) {
-      // TODO(iposva): Use system to get a random seed.
-      _prng = new Random(new DateTime.now().millisecondsSinceEpoch);
-    }
     // Trigger the PRNG once to change the internal state.
     _prng._nextState();
     return _prng._state[kSTATE_LO];
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 098ef1e..1ef4b3d 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -1550,23 +1550,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(ClosureMirror_apply, 2) {
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, args, arguments->NativeArgAt(0));
-  GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(1));
-
-  const Array& args_descriptor =
-      Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
-
-  const Object& result =
-      Object::Handle(DartEntry::InvokeClosure(args, args_descriptor));
-  if (result.IsError()) {
-    ThrowInvokeError(Error::Cast(result));
-    UNREACHABLE();
-  }
-  return result.raw();
-}
-
-
 DEFINE_NATIVE_ENTRY(ClosureMirror_find_in_context, 2) {
   if (!FLAG_support_find_in_context) {
     return Object::empty_array().raw();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index bb8b56e..4da4e96 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -446,40 +446,9 @@
     return _function;
   }
 
-  // TODO(12602): Remove this special case.
-  delegate(Invocation invocation) {
-    if (invocation.isMethod && (invocation.memberName == #call)) {
-      return this.apply(invocation.positionalArguments,
-                        invocation.namedArguments).reflectee;
-    }
-    return super.delegate(invocation);
-  }
-
   InstanceMirror apply(List<Object> positionalArguments,
                        [Map<Symbol, Object> namedArguments]) {
-    // TODO(12602): When closures get an ordinary call method, this can be
-    // replaced with
-    //   return this.invoke(#call, positionalArguments, namedArguments);
-    // and the native ClosureMirror_apply can be removed.
-    int numPositionalArguments = positionalArguments.length + 1;  // Receiver.
-    int numNamedArguments = namedArguments != null ? namedArguments.length : 0;
-    int numArguments = numPositionalArguments + numNamedArguments;
-    List arguments = new List(numArguments);
-    arguments[0] = _reflectee;  // Receiver.
-    arguments.setRange(1, numPositionalArguments, positionalArguments);
-    List names = new List(numNamedArguments);
-    int argumentIndex = numPositionalArguments;
-    int nameIndex = 0;
-    if (numNamedArguments > 0) {
-      namedArguments.forEach((name, value) {
-        arguments[argumentIndex++] = value;
-        names[nameIndex++] = _n(name);
-      });
-    }
-
-    // It is tempting to implement this in terms of Function.apply, but then
-    // lazy compilation errors would be fatal.
-    return reflect(_apply(arguments, names));
+    return this.invoke(#call, positionalArguments, namedArguments);
   }
 
   InstanceMirror findInContext(Symbol name, {ifAbsent: null}) {
@@ -500,9 +469,6 @@
 
   String toString() => "ClosureMirror on '${Error.safeToString(_reflectee)}'";
 
-  static _apply(arguments, argumentNames)
-      native 'ClosureMirror_apply';
-
   static _computeFunction(reflectee)
       native 'ClosureMirror_function';
 
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 6001a2f..1269903 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -474,24 +474,12 @@
 #endif
 
 #if !defined(TARGET_OS_WINDOWS)
-#if !defined(TEMP_FAILURE_RETRY)
-// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. The
-// definition below is copied from Linux and adapted to avoid lint
-// errors (type long int changed to intptr_t and do/while split on
-// separate lines with body in {}s).
-#define TEMP_FAILURE_RETRY(expression)                                         \
-    ({ intptr_t __result;                                                      \
-       do {                                                                    \
-         __result = (expression);                                              \
-       } while ((__result == -1L) && (errno == EINTR));                        \
-       __result; })
-#endif  // !defined(TEMP_FAILURE_RETRY)
-
-// This is a version of TEMP_FAILURE_RETRY which does not use the value
-// returned from the expression.
-#define VOID_TEMP_FAILURE_RETRY(expression)                                    \
-    (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
-
+#if defined(TEMP_FAILURE_RETRY)
+// TEMP_FAILURE_RETRY is defined in unistd.h on some platforms. We should
+// not use that version, but instead the one in signal_blocker.h, to ensure
+// we disable signal interrupts.
+#undef TEMP_FAILURE_RETRY
+#endif  // defined(TEMP_FAILURE_RETRY)
 #endif  // !defined(TARGET_OS_WINDOWS)
 
 #if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
diff --git a/runtime/platform/platform_sources.gypi b/runtime/platform/platform_sources.gypi
index eadf674..ecfb801 100644
--- a/runtime/platform/platform_sources.gypi
+++ b/runtime/platform/platform_sources.gypi
@@ -9,6 +9,7 @@
     'hashmap.cc',
     'json.cc',
     'floating_point_win.cc',
+    'signal_blocker.h',
     'thread_android.cc',
     'thread_linux.cc',
     'thread_macos.cc',
diff --git a/runtime/bin/signal_blocker.h b/runtime/platform/signal_blocker.h
similarity index 60%
rename from runtime/bin/signal_blocker.h
rename to runtime/platform/signal_blocker.h
index 2b5fe1e..4bfc228 100644
--- a/runtime/bin/signal_blocker.h
+++ b/runtime/platform/signal_blocker.h
@@ -2,8 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-#ifndef BIN_SIGNAL_BLOCKER_H_
-#define BIN_SIGNAL_BLOCKER_H_
+#ifndef PLATFORM_SIGNAL_BLOCKER_H_
+#define PLATFORM_SIGNAL_BLOCKER_H_
 
 #include "platform/globals.h"
 
@@ -16,7 +16,6 @@
 #include "platform/thread.h"
 
 namespace dart {
-namespace bin {
 
 class ThreadSignalBlocker {
  public:
@@ -54,7 +53,10 @@
 };
 
 
-#define TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)                           \
+// The definition below is copied from Linux and adapted to avoid lint
+// errors (type long int changed to intptr_t and do/while split on
+// separate lines with body in {}s) and to also block signals.
+#define TEMP_FAILURE_RETRY(expression)                                         \
     ({ ThreadSignalBlocker tsb(SIGPROF);                                       \
        intptr_t __result;                                                      \
        do {                                                                    \
@@ -62,10 +64,21 @@
        } while ((__result == -1L) && (errno == EINTR));                        \
        __result; })
 
-#define VOID_TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)                      \
-    (static_cast<void>(TEMP_FAILURE_RETRY_BLOCK_SIGNALS(expression)))
+// This is a version of TEMP_FAILURE_RETRY which does not use the value
+// returned from the expression.
+#define VOID_TEMP_FAILURE_RETRY(expression)                                    \
+    (static_cast<void>(TEMP_FAILURE_RETRY(expression)))
 
-}  // namespace bin
+// This macro can be used to insert checks that a call is made, that
+// was expected to not return EINTR, but did it anyway.
+#define NO_RETRY_EXPECTED(expression)                                          \
+    ({ intptr_t __result = (expression);                                       \
+       ASSERT(__result != -1L || errno != EINTR);                              \
+       __result; })
+
+#define VOID_NO_RETRY_EXPECTED(expression)                                     \
+    (static_cast<void>(NO_RETRY_EXPECTED(expression)))
+
 }  // namespace dart
 
-#endif  // BIN_SIGNAL_BLOCKER_H_
+#endif  // PLATFORM_SIGNAL_BLOCKER_H_
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 72e6022..aca8af4 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -27,6 +27,7 @@
 cc/ThreadInterrupterHigh: Skip
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
 
 [ $system == linux ]
 cc/ThreadInterrupterHigh: Skip
@@ -42,6 +43,7 @@
 cc/ThreadInterrupterHigh: Skip
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
+cc/Service_Profile: Skip
 
 [ $arch == simmips && $arch == mips ]
 cc/Service_Coverage: Skip # Dart bug 16250
@@ -70,7 +72,10 @@
 [ $arch == mips ]
 cc/Cop1CvtDL: Crash # Illegal instructions
 cc/Cop1CvtDL_neg: Crash # Illegal instructions
-cc/StaticNonNullSumCallCodegen: Crash # dartbug.com/17440
+cc/StaticNonNullSumCallCodegen: Crash, Pass # dartbug.com/17440
+
+[ $arch == mips && $mode == debug ]
+cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 dart/mirrored_compilation_error_test: Skip # Can't pass needed VM flag
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 4bedd21..7a954ee 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -2555,9 +2555,9 @@
 
 void Assembler::CompareObject(Register reg, const Object& object, Register pp) {
   if (CanLoadFromObjectPool(object)) {
-    ASSERT(reg != TMP);
-    LoadObject(TMP, object, pp);
-    cmpq(reg, TMP);
+    const int32_t offset =
+        Array::element_offset(FindObject(object, kNotPatchable));
+    cmpq(reg, Address(pp, offset-kHeapObjectTag));
   } else {
     CompareImmediate(
         reg, Immediate(reinterpret_cast<int64_t>(object.raw())), pp);
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index 5fb336d..33d1836 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -98,6 +98,14 @@
   static void AssertCurrent(BaseIsolate* isolate);
 #endif
 
+  uword vm_tag() const {
+    return vm_tag_;
+  }
+
+  void set_vm_tag(uword tag) {
+    vm_tag_ = tag;
+  }
+
  protected:
   BaseIsolate()
       : top_resource_(NULL),
@@ -107,7 +115,8 @@
         no_handle_scope_depth_(0),
         no_gc_scope_depth_(0),
 #endif
-        no_callback_scope_depth_(0)
+        no_callback_scope_depth_(0),
+        vm_tag_(0)
   {}
 
   ~BaseIsolate() {
@@ -122,6 +131,7 @@
   int32_t no_gc_scope_depth_;
 #endif
   int32_t no_callback_scope_depth_;
+  uword vm_tag_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseIsolate);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 172952f..ca91be4 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -120,7 +120,8 @@
   V(Math_log, 1)                                                               \
   V(Math_doublePow, 2)                                                         \
   V(Random_nextState, 1)                                                       \
-  V(Random_setupSeed, 2)                                                       \
+  V(Random_setupSeed, 1)                                                       \
+  V(Random_initialSeed, 0)                                                     \
   V(DateNatives_currentTimeMillis, 0)                                          \
   V(DateNatives_timeZoneName, 1)                                               \
   V(DateNatives_timeZoneOffsetInSeconds, 1)                                    \
@@ -296,7 +297,6 @@
   V(InstanceMirror_computeType, 1)                                             \
   V(ClosureMirror_find_in_context, 2)                                          \
   V(ClosureMirror_function, 1)                                                 \
-  V(ClosureMirror_apply, 2)                                                    \
   V(TypeMirror_subtypeTest, 2)                                                 \
   V(TypeMirror_moreSpecificTest, 2)                                            \
   V(ClassMirror_library, 1)                                                    \
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 0c284c2..1f77260 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1026,18 +1026,11 @@
                                 ic_data,
                                 &result)) {
     ArgumentsDescriptor desc(args_descriptor);
-    Function& target_function = Function::Handle();
-    if (receiver.IsClosure() && target_name.Equals(Symbols::Call())) {
-      target_function = receiver_class.GetInvocationDispatcher(
-          target_name,
-          args_descriptor,
-          RawFunction::kInvokeClosureDispatcher);
-    } else {
-      target_function = receiver_class.GetInvocationDispatcher(
-          target_name,
-          args_descriptor,
-          RawFunction::kNoSuchMethodDispatcher);
-    }
+    const Function& target_function =
+        Function::Handle(receiver_class.GetInvocationDispatcher(
+            target_name,
+            args_descriptor,
+            RawFunction::kNoSuchMethodDispatcher));
     // Update IC data.
     ASSERT(!target_function.IsNull());
     intptr_t receiver_cid = receiver.GetClassId();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 14e5a87..c0bbbe2 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -30,6 +30,7 @@
 #include "vm/parser.h"
 #include "vm/scanner.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 
 namespace dart {
@@ -261,6 +262,7 @@
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::codegen_timer);
   bool is_compiled = false;
   Isolate* isolate = Isolate::Current();
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   HANDLESCOPE(isolate);
   isolate->set_cha_used(false);
 
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 7ea19a5..219b6fc 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -30,6 +30,7 @@
 #include "vm/service.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
 #include "vm/verifier.h"
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 69fc769..00ea8f8 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1474,7 +1474,6 @@
       (kind == RawFunction::kMethodExtractor) ||
       (kind == RawFunction::kNoSuchMethodDispatcher) ||
       (kind == RawFunction::kInvokeFieldDispatcher) ||
-      (kind == RawFunction::kInvokeClosureDispatcher) ||
       func.IsImplicitConstructor()) {
     return false;
   }
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 1d49949..303bebd 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -13,6 +13,7 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 
 // Allow the use of ASan (AddressSanitizer). This is needed as ASan needs to be
 // told about areas where the VM does the equivalent of a long-jump.
@@ -273,6 +274,7 @@
   NoGCScope no_gc;
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
+  Isolate* isolate = Isolate::Current();
 
 #if defined(USING_SIMULATOR)
   // Unwinding of the C++ frames and destroying of their stack resources is done
@@ -282,12 +284,13 @@
   // Continue simulating at the given pc in the given frame after setting up the
   // exception object in the kExceptionObjectReg register and the stacktrace
   // object (may be raw null) in the kStackTraceObjectReg register.
+  isolate->set_vm_tag(VMTag::kScriptTagId);
   Simulator::Current()->Longjmp(program_counter, stack_pointer, frame_pointer,
                                 raw_exception, raw_stacktrace);
 #else
   // Prepare for unwinding frames by destroying all the stack resources
   // in the previous frames.
-  Isolate* isolate = Isolate::Current();
+
   while (isolate->top_resource() != NULL &&
          (reinterpret_cast<uword>(isolate->top_resource()) < stack_pointer)) {
     isolate->top_resource()->~StackResource();
@@ -304,6 +307,7 @@
   uword current_sp = reinterpret_cast<uword>(&program_counter) - 1024;
   __asan_unpoison_memory_region(reinterpret_cast<void*>(current_sp),
                                 stack_pointer - current_sp);
+  isolate->set_vm_tag(VMTag::kScriptTagId);
   func(program_counter, stack_pointer, frame_pointer,
        raw_exception, raw_stacktrace);
 #endif
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 4348d6b..18c26c6 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -15,6 +15,7 @@
 #include "vm/raw_object.h"
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
+#include "vm/tags.h"
 #include "vm/verifier.h"
 #include "vm/virtual_memory.h"
 #include "vm/weak_table.h"
@@ -176,9 +177,11 @@
 
 
 void Heap::CollectGarbage(Space space, ApiCallbacks api_callbacks) {
+  Isolate* isolate = Isolate::Current();
   bool invoke_api_callbacks = (api_callbacks == kInvokeApiCallbacks);
   switch (space) {
     case kNew: {
+      VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
       RecordBeforeGC(kNew, kNewSpace);
       UpdateClassHeapStatsBeforeGC(kNew);
       new_space_->Scavenge(invoke_api_callbacks);
@@ -192,6 +195,7 @@
     }
     case kOld:
     case kCode: {
+      VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
       bool promotion_failure = new_space_->HadPromotionFailure();
       RecordBeforeGC(kOld, promotion_failure ? kPromotionFailure : kOldSpace);
       UpdateClassHeapStatsBeforeGC(kOld);
@@ -229,16 +233,23 @@
 
 
 void Heap::CollectAllGarbage() {
-  RecordBeforeGC(kNew, kFull);
-  UpdateClassHeapStatsBeforeGC(kNew);
-  new_space_->Scavenge(kInvokeApiCallbacks);
-  RecordAfterGC();
-  PrintStats();
-  RecordBeforeGC(kOld, kFull);
-  UpdateClassHeapStatsBeforeGC(kOld);
-  old_space_->MarkSweep(kInvokeApiCallbacks);
-  RecordAfterGC();
-  PrintStats();
+  Isolate* isolate = Isolate::Current();
+  {
+    VMTagScope tagScope(isolate, VMTag::kGCNewSpaceTagId);
+    RecordBeforeGC(kNew, kFull);
+    UpdateClassHeapStatsBeforeGC(kNew);
+    new_space_->Scavenge(kInvokeApiCallbacks);
+    RecordAfterGC();
+    PrintStats();
+  }
+  {
+    VMTagScope tagScope(isolate, VMTag::kGCOldSpaceTagId);
+    RecordBeforeGC(kOld, kFull);
+    UpdateClassHeapStatsBeforeGC(kOld);
+    old_space_->MarkSweep(kInvokeApiCallbacks);
+    RecordAfterGC();
+    PrintStats();
+  }
 }
 
 
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index b5de9a3..0d32f42 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -28,6 +28,7 @@
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/thread.h"
 #include "vm/thread_interrupter.h"
 #include "vm/timer.h"
@@ -40,8 +41,10 @@
             "Track function usage and report.");
 DEFINE_FLAG(bool, trace_isolates, false,
             "Trace isolate creation and shut down.");
-DEFINE_FLAG(bool, pin_isolates, false,
-            "Stop isolates from being destroyed automatically.");
+DEFINE_FLAG(bool, pause_isolates_on_start, false,
+            "Pause isolates before starting.");
+DEFINE_FLAG(bool, pause_isolates_on_exit, false,
+            "Pause isolates exiting.");
 
 
 void Isolate::RegisterClass(const Class& cls) {
@@ -298,7 +301,6 @@
       message_notify_callback_(NULL),
       name_(NULL),
       start_time_(OS::GetCurrentTimeMicros()),
-      pin_port_(0),
       main_port_(0),
       heap_(NULL),
       object_store_(NULL),
@@ -336,6 +338,7 @@
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_INITIALIZERS)
       REUSABLE_HANDLE_LIST(REUSABLE_HANDLE_SCOPE_INIT)
       reusable_handles_() {
+  set_vm_tag(VMTag::kVMTagId);
 }
 #undef REUSABLE_HANDLE_SCOPE_INIT
 #undef REUSABLE_HANDLE_INITIALIZERS
@@ -434,9 +437,8 @@
   result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
   result->BuildName(name_prefix);
-  if (FLAG_pin_isolates) {
-    result->CreatePinPort();
-  }
+  result->message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start);
+  result->message_handler()->set_pause_on_exit(FLAG_pause_isolates_on_exit);
 
   result->debugger_ = new Debugger();
   result->debugger_->Initialize(result);
@@ -452,28 +454,6 @@
 }
 
 
-void Isolate::CreatePinPort() {
-  ASSERT(FLAG_pin_isolates);
-  // Only do this once.
-  ASSERT(pin_port_ == 0);
-  pin_port_ = PortMap::CreatePort(message_handler());
-  ASSERT(pin_port_ != 0);
-  PortMap::SetLive(pin_port_);
-}
-
-
-void Isolate::ClosePinPort() {
-  if (pin_port_ == 0) {
-    // Support multiple calls to close.
-    return;
-  }
-  ASSERT(pin_port_ != 0);
-  bool r = PortMap::ClosePort(pin_port_);
-  ASSERT(r);
-  pin_port_ = 0;
-}
-
-
 void Isolate::BuildName(const char* name_prefix) {
   ASSERT(name_ == NULL);
   if (name_prefix == NULL) {
@@ -914,7 +894,16 @@
     // inlined frames.
     jsobj.AddProperty("depth", (intptr_t)0);
   }
-
+  intptr_t live_ports = message_handler()->live_ports();
+  intptr_t control_ports = message_handler()->control_ports();
+  bool paused_on_exit = message_handler()->paused_on_exit();
+  bool pause_on_start = message_handler()->pause_on_start();
+  bool pause_on_exit = message_handler()->pause_on_exit();
+  jsobj.AddProperty("live_ports", live_ports);
+  jsobj.AddProperty("control_ports", control_ports);
+  jsobj.AddProperty("paused_on_exit", paused_on_exit);
+  jsobj.AddProperty("paused_on_start", pause_on_start);
+  jsobj.AddProperty("pause_on_exit", pause_on_exit);
   const Library& lib =
       Library::Handle(object_store()->root_library());
   jsobj.AddProperty("rootLib", lib);
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5410ab8..6743b33 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -142,12 +142,6 @@
 
   int64_t start_time() const { return start_time_; }
 
-  // Creates the pin port (responsible for stopping the isolate from being
-  // destroyed).
-  void CreatePinPort();
-  // Closes pin port.
-  void ClosePinPort();
-
   Dart_Port main_port() { return main_port_; }
   void set_main_port(Dart_Port port) {
     ASSERT(main_port_ == 0);  // Only set main port once.
@@ -176,6 +170,10 @@
     return OFFSET_OF(Isolate, top_exit_frame_info_);
   }
 
+  static intptr_t vm_tag_offset() {
+    return OFFSET_OF(Isolate, vm_tag_);
+  }
+
   ApiState* api_state() const { return api_state_; }
   void set_api_state(ApiState* value) { api_state_ = value; }
 
@@ -482,7 +480,6 @@
   Dart_MessageNotifyCallback message_notify_callback_;
   char* name_;
   int64_t start_time_;
-  Dart_Port pin_port_;
   Dart_Port main_port_;
   Heap* heap_;
   ObjectStore* object_store_;
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 332a6e6..d76e060 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.cc
@@ -34,6 +34,9 @@
       oob_queue_(new MessageQueue()),
       control_ports_(0),
       live_ports_(0),
+      pause_on_start_(false),
+      pause_on_exit_(false),
+      paused_on_exit_(false),
       pool_(NULL),
       task_(NULL),
       start_callback_(NULL),
@@ -197,6 +200,15 @@
     // Initialize the message handler by running its start function,
     // if we have one.  For an isolate, this will run the isolate's
     // main() function.
+    if (pause_on_start()) {
+      HandleMessages(false, false);
+      if (pause_on_start()) {
+        // Still paused.
+        task_ = NULL;  // No task in queue.
+        return;
+      }
+    }
+
     if (start_callback_) {
       monitor_.Exit();
       ok = start_callback_(callback_data_);
@@ -212,14 +224,19 @@
     task_ = NULL;  // No task in queue.
 
     if (!ok || !HasLivePorts()) {
-      if (FLAG_trace_isolates) {
+      if (pause_on_exit()) {
+        paused_on_exit_ = true;
+      } else {
+        if (FLAG_trace_isolates) {
         OS::Print("[-] Stopping message handler (%s):\n"
                   "\thandler:    %s\n",
                   (ok ? "no live ports" : "error"),
                   name());
+        }
+        pool_ = NULL;
+        run_end_callback = true;
+        paused_on_exit_ = false;
       }
-      pool_ = NULL;
-      run_end_callback = true;
     }
   }
   if (run_end_callback && end_callback_ != NULL) {
diff --git a/runtime/vm/message_handler.h b/runtime/vm/message_handler.h
index f7707aa..eb1056b 100644
--- a/runtime/vm/message_handler.h
+++ b/runtime/vm/message_handler.h
@@ -63,6 +63,35 @@
   // A message handler tracks how many live ports it has.
   bool HasLivePorts() const { return live_ports_ > control_ports_; }
 
+  intptr_t live_ports() const {
+    return live_ports_;
+  }
+
+  intptr_t control_ports() const {
+    return control_ports_;
+  }
+
+  bool pause_on_start() const {
+    return pause_on_start_;
+  }
+
+  void set_pause_on_start(bool pause_on_start) {
+    pause_on_start_ = pause_on_start;
+  }
+
+  bool pause_on_exit() const {
+    return pause_on_exit_;
+  }
+
+  void set_pause_on_exit(bool pause_on_exit) {
+    pause_on_exit_ = pause_on_exit;
+  }
+
+  bool paused_on_exit() const {
+    return paused_on_exit_;
+  }
+
+
 #if defined(DEBUG)
   // Check that it is safe to access this message handler.
   //
@@ -129,6 +158,9 @@
   MessageQueue* oob_queue_;
   intptr_t control_ports_;  // The number of open control ports usually 0 or 1.
   intptr_t live_ports_;  // The number of open ports, including control ports.
+  bool pause_on_start_;
+  bool pause_on_exit_;
+  bool paused_on_exit_;
   ThreadPool* pool_;
   ThreadPool::Task* task_;
   StartCallback start_callback_;
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index af4bd96..525bfea 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -8,6 +8,8 @@
 
 #include "vm/dart_api_impl.h"
 #include "vm/dart_api_state.h"
+#include "vm/tags.h"
+
 
 namespace dart {
 
@@ -51,6 +53,7 @@
   VERIFY_ON_TRANSITION;
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->isolate();
+
   ApiState* state = isolate->api_state();
   ASSERT(state != NULL);
   ApiLocalScope* current_top_scope = state->top_scope();
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index ec96fea..4db8ff7 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -40,6 +40,7 @@
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/unicode.h"
 
@@ -1680,9 +1681,15 @@
   ASSERT((FakeObject::kClassId != kInstanceCid));
   result.set_id(FakeObject::kClassId);
   result.set_state_bits(0);
-  // VM backed classes are almost ready: run checks and resolve class
-  // references, but do not recompute size.
-  result.set_is_prefinalized();
+  if (FakeObject::kClassId < kInstanceCid) {
+    // VM internal classes are done. There is no finalization needed or
+    // possible in this case.
+    result.set_is_finalized();
+  } else {
+    // VM backed classes are almost ready: run checks and resolve class
+    // references, but do not recompute size.
+    result.set_is_prefinalized();
+  }
   result.set_type_arguments_field_offset_in_words(kNoTypeArguments);
   result.set_num_type_arguments(0);
   result.set_num_own_type_arguments(0);
@@ -2254,8 +2261,7 @@
   };
 
   ASSERT(kind == RawFunction::kNoSuchMethodDispatcher ||
-         kind == RawFunction::kInvokeFieldDispatcher ||
-         kind == RawFunction::kInvokeClosureDispatcher);
+         kind == RawFunction::kInvokeFieldDispatcher);
   Function& dispatcher = Function::Handle();
   Array& cache = Array::Handle(invocation_dispatcher_cache());
   ASSERT(!cache.IsNull());
@@ -3774,37 +3780,81 @@
   jsobj.AddPropertyF("id", "classes/%" Pd "", id());
   jsobj.AddProperty("name", internal_class_name);
   jsobj.AddProperty("user_name", user_visible_class_name);
-  if (!ref) {
-    const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
-    if (!err.IsNull()) {
-      jsobj.AddProperty("error", err);
-    }
-    jsobj.AddProperty("implemented", is_implemented());
-    jsobj.AddProperty("abstract", is_abstract());
-    jsobj.AddProperty("patch", is_patch());
-    jsobj.AddProperty("finalized", is_finalized());
-    jsobj.AddProperty("const", is_const());
-    jsobj.AddProperty("super", Class::Handle(SuperClass()));
-    jsobj.AddProperty("library", Object::Handle(library()));
-    {
-      JSONArray fields_array(&jsobj, "fields");
-      const Array& field_array = Array::Handle(fields());
-      Field& field = Field::Handle();
-      if (!field_array.IsNull()) {
-        for (intptr_t i = 0; i < field_array.Length(); ++i) {
-          field ^= field_array.At(i);
-          fields_array.AddValue(field);
+  if (ref) {
+    return;
+  }
+
+  const Error& err = Error::Handle(EnsureIsFinalized(Isolate::Current()));
+  if (!err.IsNull()) {
+    jsobj.AddProperty("error", err);
+  }
+  jsobj.AddProperty("implemented", is_implemented());
+  jsobj.AddProperty("abstract", is_abstract());
+  jsobj.AddProperty("patch", is_patch());
+  jsobj.AddProperty("finalized", is_finalized());
+  jsobj.AddProperty("const", is_const());
+  jsobj.AddProperty("super", Class::Handle(SuperClass()));
+  jsobj.AddProperty("library", Object::Handle(library()));
+  const Script& script = Script::Handle(this->script());
+  if (!script.IsNull()) {
+    intptr_t line_number = 0;
+    intptr_t column_number = 0;
+    script.GetTokenLocation(token_pos(), &line_number, &column_number);
+    jsobj.AddProperty("script", script);
+    jsobj.AddProperty("line", line_number);
+    jsobj.AddProperty("col", column_number);
+  }
+  {
+    JSONArray interfaces_array(&jsobj, "interfaces");
+    const Array& interface_array = Array::Handle(interfaces());
+    Type& interface_type = Type::Handle();
+    Class& interface_cls = Class::Handle();
+    if (!interface_array.IsNull()) {
+      for (intptr_t i = 0; i < interface_array.Length(); ++i) {
+        // TODO(turnidge): Use the Type directly once regis has added
+        // types to the vmservice.
+        interface_type ^= interface_array.At(i);
+        if (interface_type.HasResolvedTypeClass()) {
+          interface_cls = interface_type.type_class();
+          interfaces_array.AddValue(interface_cls);
         }
       }
     }
-    {
-      JSONArray functions_array(&jsobj, "functions");
-      const Array& function_array = Array::Handle(functions());
-      Function& function = Function::Handle();
-      if (!function_array.IsNull()) {
-        for (intptr_t i = 0; i < function_array.Length(); i++) {
-          function ^= function_array.At(i);
-          functions_array.AddValue(function);
+  }
+  {
+    JSONArray fields_array(&jsobj, "fields");
+    const Array& field_array = Array::Handle(fields());
+    Field& field = Field::Handle();
+    if (!field_array.IsNull()) {
+      for (intptr_t i = 0; i < field_array.Length(); ++i) {
+        field ^= field_array.At(i);
+        fields_array.AddValue(field);
+      }
+    }
+  }
+  {
+    JSONArray functions_array(&jsobj, "functions");
+    const Array& function_array = Array::Handle(functions());
+    Function& function = Function::Handle();
+    if (!function_array.IsNull()) {
+      for (intptr_t i = 0; i < function_array.Length(); i++) {
+        function ^= function_array.At(i);
+        functions_array.AddValue(function);
+      }
+    }
+  }
+  {
+    JSONArray subclasses_array(&jsobj, "subclasses");
+    const GrowableObjectArray& subclasses =
+        GrowableObjectArray::Handle(direct_subclasses());
+    if (!subclasses.IsNull()) {
+      Class& subclass = Class::Handle();
+      if (!subclasses.IsNull()) {
+        for (intptr_t i = 0; i < subclasses.Length(); ++i) {
+          // TODO(turnidge): Use the Type directly once regis has added
+          // types to the vmservice.
+          subclass ^= subclasses.At(i);
+          subclasses_array.AddValue(subclass);
         }
       }
     }
@@ -4657,8 +4707,7 @@
 
 RawArray* Function::saved_args_desc() const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher ||
-         kind() == RawFunction::kInvokeClosureDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher);
   const Object& obj = Object::Handle(raw_ptr()->data_);
   ASSERT(obj.IsArray());
   return Array::Cast(obj).raw();
@@ -4667,8 +4716,7 @@
 
 void Function::set_saved_args_desc(const Array& value) const {
   ASSERT(kind() == RawFunction::kNoSuchMethodDispatcher ||
-         kind() == RawFunction::kInvokeFieldDispatcher ||
-         kind() == RawFunction::kInvokeClosureDispatcher);
+         kind() == RawFunction::kInvokeFieldDispatcher);
   ASSERT(raw_ptr()->data_ == Object::null());
   set_data(value);
 }
@@ -4817,9 +4865,6 @@
     case RawFunction::kInvokeFieldDispatcher:
       return "kInvokeFieldDispatcher";
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      return "kInvokeClosureDispatcher";
-      break;
     default:
       UNREACHABLE();
       return NULL;
@@ -6072,9 +6117,6 @@
     case RawFunction::kInvokeFieldDispatcher:
       kind_str = "invoke-field-dispatcher";
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      kind_str = "invoke-closure-dispatcher";
-      break;
     default:
       UNREACHABLE();
   }
@@ -6092,7 +6134,7 @@
 void Function::PrintToJSONStream(JSONStream* stream, bool ref) const {
   const char* internal_name = String::Handle(name()).ToCString();
   const char* user_name =
-      String::Handle(QualifiedUserVisibleName()).ToCString();
+      String::Handle(UserVisibleName()).ToCString();
   Class& cls = Class::Handle(Owner());
   ASSERT(!cls.IsNull());
   Error& err = Error::Handle();
@@ -6106,9 +6148,7 @@
   } else if (IsImplicitClosureFunction()) {
     id = cls.FindImplicitClosureFunctionIndex(*this);
     selector = "implicit_closures";
-  } else if (IsNoSuchMethodDispatcher() ||
-             IsInvokeFieldDispatcher() ||
-             IsInvokeClosureDispatcher()) {
+  } else if (IsNoSuchMethodDispatcher() || IsInvokeFieldDispatcher()) {
     id = cls.FindInvocationDispatcherFunctionIndex(*this);
     selector = "dispatchers";
   } else {
@@ -6123,9 +6163,15 @@
   jsobj.AddProperty("name", internal_name);
   jsobj.AddProperty("user_name", user_name);
   jsobj.AddProperty("class", cls);
+  const Function& parent = Function::Handle(parent_function());
+  if (!parent.IsNull()) {
+    jsobj.AddProperty("parent", parent);
+  }
   const char* kind_string = Function::KindToCString(kind());
   jsobj.AddProperty("kind", kind_string);
-  if (ref) return;
+  if (ref) {
+    return;
+  }
   jsobj.AddProperty("is_static", is_static());
   jsobj.AddProperty("is_const", is_const());
   jsobj.AddProperty("is_optimizable", is_optimizable());
@@ -7327,17 +7373,19 @@
 
 
 void Script::Tokenize(const String& private_key) const {
-  const TokenStream& tkns = TokenStream::Handle(tokens());
+  Isolate* isolate = Isolate::Current();
+  const TokenStream& tkns = TokenStream::Handle(isolate, tokens());
   if (!tkns.IsNull()) {
     // Already tokenized.
     return;
   }
-
   // Get the source, scan and allocate the token stream.
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::scanner_timer);
-  const String& src = String::Handle(Source());
+  const String& src = String::Handle(isolate, Source());
   Scanner scanner(src, private_key);
-  set_tokens(TokenStream::Handle(TokenStream::New(scanner.GetStream(),
+  set_tokens(TokenStream::Handle(isolate,
+                                 TokenStream::New(scanner.GetStream(),
                                                   private_key)));
   if (FLAG_compiler_stats) {
     CompilerStats::src_length += src.Length();
@@ -8779,15 +8827,18 @@
 
 void Library::PrintToJSONStream(JSONStream* stream, bool ref) const {
   const char* library_name = String::Handle(name()).ToCString();
-  const char* library_url = String::Handle(url()).ToCString();
   intptr_t id = index();
   ASSERT(id >= 0);
   JSONObject jsobj(stream);
   jsobj.AddProperty("type", JSONType(ref));
   jsobj.AddPropertyF("id", "libraries/%" Pd "", id);
+  jsobj.AddProperty("user_name", library_name);
   jsobj.AddProperty("name", library_name);
-  jsobj.AddProperty("user_name", library_url);
-  if (ref) return;
+  if (ref) {
+    return;
+  }
+  const char* library_url = String::Handle(url()).ToCString();
+  jsobj.AddProperty("url", library_url);
   {
     JSONArray jsarr(&jsobj, "classes");
     ClassDictionaryIterator class_iter(*this);
@@ -8801,7 +8852,7 @@
     }
   }
   {
-    JSONArray jsarr(&jsobj, "libraries");
+    JSONArray jsarr(&jsobj, "imports");
     Library& lib = Library::Handle();
     for (intptr_t i = 0; i < num_imports(); i++) {
       lib = ImportLibraryAt(i);
@@ -10530,6 +10581,8 @@
   if (ref) {
     return;
   }
+  const Array& array = Array::Handle(ObjectPool());
+  jsobj.AddProperty("object_pool", array);
   JSONArray jsarr(&jsobj, "disassembly");
   if (is_alive()) {
     // Only disassemble alive code objects.
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 7105637..ddbd50c 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1544,10 +1544,6 @@
     return kind() == RawFunction::kInvokeFieldDispatcher;
   }
 
-  bool IsInvokeClosureDispatcher() const {
-    return kind() == RawFunction::kInvokeClosureDispatcher;
-  }
-
   // Returns true iff an implicit closure function has been created
   // for this function.
   bool HasImplicitClosureFunction() const {
@@ -1600,7 +1596,6 @@
       case RawFunction::kMethodExtractor:
       case RawFunction::kNoSuchMethodDispatcher:
       case RawFunction::kInvokeFieldDispatcher:
-      case RawFunction::kInvokeClosureDispatcher:
         return true;
       case RawFunction::kClosureFunction:
       case RawFunction::kConstructor:
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 10a4034..797b523 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -28,6 +28,7 @@
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
+#include "vm/tags.h"
 #include "vm/timer.h"
 #include "vm/zone.h"
 
@@ -353,8 +354,10 @@
 
 void Parser::ParseCompilationUnit(const Library& library,
                                   const Script& script) {
-  ASSERT(Isolate::Current()->long_jump_base()->IsSafeToJump());
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->long_jump_base()->IsSafeToJump());
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   Parser parser(script, library, 0);
   parser.ParseTopLevel();
 }
@@ -702,8 +705,9 @@
 
 void Parser::ParseClass(const Class& cls) {
   if (!cls.is_synthesized_class()) {
-    TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
     Isolate* isolate = Isolate::Current();
+    VMTagScope tagScope(isolate, VMTag::kCompileTagId);
+    TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
     ASSERT(isolate->long_jump_base()->IsSafeToJump());
     const Script& script = Script::Handle(isolate, cls.script());
     const Library& lib = Library::Handle(isolate, cls.library());
@@ -760,9 +764,10 @@
 
 
 void Parser::ParseFunction(ParsedFunction* parsed_function) {
+  Isolate* isolate = Isolate::Current();
+  VMTagScope tagScope(isolate, VMTag::kCompileTagId);
   TimerScope timer(FLAG_compiler_stats, &CompilerStats::parser_timer);
   CompilerStats::num_functions_compiled++;
-  Isolate* isolate = Isolate::Current();
   ASSERT(isolate->long_jump_base()->IsSafeToJump());
   ASSERT(parsed_function != NULL);
   const Function& func = parsed_function->function();
@@ -810,10 +815,6 @@
       node_sequence =
           parser.ParseInvokeFieldDispatcher(func, default_parameter_values);
       break;
-    case RawFunction::kInvokeClosureDispatcher:
-      node_sequence =
-          parser.ParseInvokeClosureDispatcher(func, default_parameter_values);
-      break;
     default:
       UNREACHABLE();
   }
@@ -1409,53 +1410,6 @@
 }
 
 
-SequenceNode* Parser::ParseInvokeClosureDispatcher(const Function& func,
-                                                   Array& default_values) {
-  TRACE_PARSER("ParseInvokeClosureDispatcher");
-
-  ASSERT(func.IsInvokeClosureDispatcher());
-  intptr_t token_pos = func.token_pos();
-  ASSERT(func.token_pos() == 0);
-  ASSERT(current_class().raw() == func.Owner());
-
-  const Array& args_desc = Array::Handle(func.saved_args_desc());
-  ArgumentsDescriptor desc(args_desc);
-  ASSERT(desc.Count() > 0);
-
-  // Set up scope for this function.
-  BuildDispatcherScope(func, desc, default_values);
-
-  // Receiver is local 0.
-  LocalScope* scope = current_block_->scope;
-  LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
-
-  // Pass arguments 1..n to the closure call.
-  ArgumentListNode* closure_args = new ArgumentListNode(token_pos);
-  const Array& names = Array::Handle(Array::New(desc.NamedCount(), Heap::kOld));
-  // Positional parameters.
-  intptr_t i = 1;
-  for (; i < desc.PositionalCount(); ++i) {
-    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-  }
-  // Named parameters.
-  for (; i < desc.Count(); i++) {
-    closure_args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
-    intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(desc.NameAt(index)));
-  }
-  closure_args->set_names(names);
-
-  EnsureSavedCurrentContext();
-  ClosureCallNode* closure_call = new ClosureCallNode(token_pos,
-                                                      receiver,
-                                                      closure_args);
-
-  ReturnNode* return_node = new ReturnNode(token_pos, closure_call);
-  current_block_->statements->Add(return_node);
-  return CloseBlock();
-}
-
-
 void Parser::SkipBlock() {
   ASSERT(CurrentToken() == Token::kLBRACE);
   GrowableArray<Token::Kind> token_stack(8);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 97ff35f..8760eab 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -450,8 +450,6 @@
                                             Array& default_values);
   SequenceNode* ParseInvokeFieldDispatcher(const Function& func,
                                            Array& default_values);
-  SequenceNode* ParseInvokeClosureDispatcher(const Function& func,
-                                             Array& default_values);
   void BuildDispatcherScope(const Function& func,
                             const ArgumentsDescriptor& desc,
                             Array& default_values);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 112183a..68de13c 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -201,13 +201,109 @@
   }
 };
 
+
 struct CallEntry {
   intptr_t code_table_index;
   intptr_t count;
 };
 
+
 typedef bool (*RegionCompare)(uword pc, uword region_start, uword region_end);
 
+
+class CodeRegionTrieNode : public ZoneAllocated {
+ public:
+  explicit CodeRegionTrieNode(intptr_t code_region_index)
+      : code_region_index_(code_region_index),
+        count_(0),
+        children_(new ZoneGrowableArray<CodeRegionTrieNode*>()) {
+  }
+
+  void Tick() {
+    ASSERT(code_region_index_ >= 0);
+    count_++;
+  }
+
+  intptr_t count() const {
+    ASSERT(code_region_index_ >= 0);
+    return count_;
+  }
+
+  intptr_t code_region_index() const {
+    return code_region_index_;
+  }
+
+  ZoneGrowableArray<CodeRegionTrieNode*>& children() const {
+    return *children_;
+  }
+
+  CodeRegionTrieNode* GetChild(intptr_t child_code_region_index) {
+    const intptr_t length = children_->length();
+    intptr_t i = 0;
+    while (i < length) {
+      CodeRegionTrieNode* child = (*children_)[i];
+      if (child->code_region_index() == child_code_region_index) {
+        return child;
+      }
+      if (child->code_region_index() > child_code_region_index) {
+        break;
+      }
+      i++;
+    }
+    // Add new CodeRegion, sorted by CodeRegionTable index.
+    CodeRegionTrieNode* child = new CodeRegionTrieNode(child_code_region_index);
+    if (i < length) {
+      // Insert at i.
+      children_->InsertAt(i, child);
+    } else {
+      // Add to end.
+      children_->Add(child);
+    }
+    return child;
+  }
+
+  // Sort this's children and (recursively) all descendants by count.
+  // This should only be called after the trie is completely built.
+  void SortByCount() {
+    children_->Sort(CodeRegionTrieNodeCompare);
+    ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+    intptr_t child_count = kids.length();
+    // Recurse.
+    for (intptr_t i = 0; i < child_count; i++) {
+      kids[i]->SortByCount();
+    }
+  }
+
+  void PrintToJSONArray(JSONArray* array) const {
+    ASSERT(array != NULL);
+    // Write CodeRegion index.
+    array->AddValue(code_region_index_);
+    // Write count.
+    array->AddValue(count_);
+    // Write number of children.
+    ZoneGrowableArray<CodeRegionTrieNode*>& kids = children();
+    intptr_t child_count = kids.length();
+    array->AddValue(child_count);
+    // Recurse.
+    for (intptr_t i = 0; i < child_count; i++) {
+      kids[i]->PrintToJSONArray(array);
+    }
+  }
+
+ private:
+  static int CodeRegionTrieNodeCompare(CodeRegionTrieNode* const* a,
+                                       CodeRegionTrieNode* const* b) {
+    ASSERT(a != NULL);
+    ASSERT(b != NULL);
+    return (*b)->count() - (*a)->count();
+  }
+
+  const intptr_t code_region_index_;
+  intptr_t count_;
+  ZoneGrowableArray<CodeRegionTrieNode*>* children_;
+};
+
+
 // A contiguous address region that holds code. Each CodeRegion has a "kind"
 // which describes the type of code contained inside the region. Each
 // region covers the following interval: [start, end).
@@ -221,19 +317,19 @@
     kTagCode,        // A special kind of code representing a tag.
   };
 
-  CodeRegion(Kind kind, uword start, uword end, int64_t timestamp) :
-      kind_(kind),
-      start_(start),
-      end_(end),
-      inclusive_ticks_(0),
-      exclusive_ticks_(0),
-      inclusive_tick_serial_(0),
-      name_(NULL),
-      compile_timestamp_(timestamp),
-      creation_serial_(0),
-      address_table_(new ZoneGrowableArray<AddressEntry>()),
-      callers_table_(new ZoneGrowableArray<CallEntry>()),
-      callees_table_(new ZoneGrowableArray<CallEntry>()) {
+  CodeRegion(Kind kind, uword start, uword end, int64_t timestamp)
+      : kind_(kind),
+        start_(start),
+        end_(end),
+        inclusive_ticks_(0),
+        exclusive_ticks_(0),
+        inclusive_tick_serial_(0),
+        name_(NULL),
+        compile_timestamp_(timestamp),
+        creation_serial_(0),
+        address_table_(new ZoneGrowableArray<AddressEntry>()),
+        callers_table_(new ZoneGrowableArray<CallEntry>()),
+        callees_table_(new ZoneGrowableArray<CallEntry>()) {
     ASSERT(start_ < end_);
   }
 
@@ -346,12 +442,12 @@
     TickAddress(pc, exclusive);
   }
 
-  void AddCaller(intptr_t index) {
-    AddCallEntry(callers_table_, index);
+  void AddCaller(intptr_t index, intptr_t count) {
+    AddCallEntry(callers_table_, index, count);
   }
 
-  void AddCallee(intptr_t index) {
-    AddCallEntry(callees_table_, index);
+  void AddCallee(intptr_t index, intptr_t count) {
+    AddCallEntry(callees_table_, index, count);
   }
 
   void PrintNativeCode(JSONObject* profile_code_obj) {
@@ -417,6 +513,27 @@
     }
   }
 
+  void  PrintTagCode(JSONObject* profile_code_obj) {
+    ASSERT(kind() == kTagCode);
+    JSONObject obj(profile_code_obj, "code");
+    obj.AddProperty("type", "@Code");
+    obj.AddProperty("kind", "Tag");
+    obj.AddPropertyF("id", "code/tag-%" Px "", start());
+    obj.AddProperty("name", name());
+    obj.AddProperty("user_name", name());
+    obj.AddPropertyF("start", "%" Px "", start());
+    obj.AddPropertyF("end", "%" Px "", end());
+    {
+      // Generate a fake function entry.
+      JSONObject func(&obj, "function");
+      func.AddProperty("type", "@Function");
+      func.AddProperty("kind", "Tag");
+      obj.AddPropertyF("id", "functions/tag-%" Px "", start());
+      func.AddProperty("name", name());
+      func.AddProperty("user_name", name());
+    }
+  }
+
   void PrintToJSONArray(Isolate* isolate, JSONArray* events, bool full) {
     JSONObject obj(events);
     obj.AddProperty("type", "CodeRegion");
@@ -445,6 +562,13 @@
         GenerateAndSetSymbolName("[Reused]");
       }
       PrintOverwrittenCode(&obj);
+    } else if (kind() == kTagCode) {
+      if (name() == NULL) {
+        const char* tag_name = start() == 0 ? "root" : VMTag::TagName(start());
+        ASSERT(tag_name != NULL);
+        SetName(tag_name);
+      }
+      PrintTagCode(&obj);
     } else {
       ASSERT(kind() == kNativeCode);
       if (name() == NULL) {
@@ -511,13 +635,14 @@
   }
 
 
-  void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index) {
+  void AddCallEntry(ZoneGrowableArray<CallEntry>* table, intptr_t index,
+                    intptr_t count) {
     const intptr_t length = table->length();
     intptr_t i = 0;
     for (; i < length; i++) {
       CallEntry& entry = (*table)[i];
       if (entry.code_table_index == index) {
-        entry.count++;
+        entry.count += count;
         return;
       }
       if (entry.code_table_index > index) {
@@ -526,7 +651,7 @@
     }
     CallEntry entry;
     entry.code_table_index = index;
-    entry.count = 1;
+    entry.count = count;
     if (i < length) {
       table->InsertAt(i, entry);
     } else {
@@ -567,6 +692,7 @@
   DISALLOW_COPY_AND_ASSIGN(CodeRegion);
 };
 
+
 // A sorted table of CodeRegions. Does not allow for overlap.
 class CodeRegionTable : public ValueObject {
  public:
@@ -729,6 +855,8 @@
                      uword start, uword end) {
     // We should never see overlapping Dart code regions.
     ASSERT(region->kind() != CodeRegion::kDartCode);
+    // We should never see overlapping Tag code regions.
+    ASSERT(region->kind() != CodeRegion::kTagCode);
     // When code regions overlap, they should be of the same kind.
     ASSERT(region->kind() == code_region->kind());
     region->AdjustExtent(start, end);
@@ -771,14 +899,17 @@
  public:
   CodeRegionTableBuilder(Isolate* isolate,
                          CodeRegionTable* live_code_table,
-                         CodeRegionTable* dead_code_table)
+                         CodeRegionTable* dead_code_table,
+                         CodeRegionTable* tag_code_table)
       : SampleVisitor(isolate),
         live_code_table_(live_code_table),
         dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table),
         isolate_(isolate),
         vm_isolate_(Dart::vm_isolate()) {
     ASSERT(live_code_table_ != NULL);
     ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
     frames_ = 0;
     min_time_ = kMaxInt64;
     max_time_ = 0;
@@ -794,6 +925,8 @@
     if (timestamp < min_time_) {
       min_time_ = timestamp;
     }
+    // Make sure VM tag is created.
+    CreateTag(sample->vm_tag());
     // Exclusive tick for bottom frame.
     Tick(sample->At(0), true, timestamp);
     // Inclusive tick for all frames.
@@ -814,6 +947,45 @@
   int64_t  max_time() const { return max_time_; }
 
  private:
+  void CreateTag(uword tag) {
+    intptr_t index = tag_code_table_->FindIndex(tag);
+    if (index >= 0) {
+      // Already created.
+      return;
+    }
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+                                        tag,
+                                        tag + 1,
+                                        0);
+    index = tag_code_table_->InsertCodeRegion(region);
+    ASSERT(index >= 0);
+    region->set_creation_serial(visited());
+  }
+
+  void TickTag(uword tag, bool exclusive) {
+    CodeRegionTable::TickResult r;
+    intptr_t serial = exclusive ? -1 : visited();
+    r = tag_code_table_->Tick(tag, exclusive, serial, 0);
+    if (r == CodeRegionTable::kTicked) {
+      // Live code found and ticked.
+      return;
+    }
+    ASSERT(r == CodeRegionTable::kNotFound);
+    CreateAndTickTagCodeRegion(tag, exclusive, serial);
+  }
+
+  void CreateAndTickTagCodeRegion(uword tag, bool exclusive, intptr_t serial) {
+    // Need to create tag code.
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode,
+                                        tag,
+                                        tag + 1,
+                                        0);
+    intptr_t index = tag_code_table_->InsertCodeRegion(region);
+    region->set_creation_serial(visited());
+    ASSERT(index >= 0);
+    tag_code_table_->At(index)->Tick(tag, exclusive, serial);
+  }
+
   void Tick(uword pc, bool exclusive, int64_t timestamp) {
     CodeRegionTable::TickResult r;
     intptr_t serial = exclusive ? -1 : visited();
@@ -913,53 +1085,82 @@
   int64_t max_time_;
   CodeRegionTable* live_code_table_;
   CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
   Isolate* isolate_;
   Isolate* vm_isolate_;
 };
 
 
-class CodeRegionTableCallersBuilder : public SampleVisitor {
+class CodeRegionExclusiveTrieBuilder : public SampleVisitor {
  public:
-  CodeRegionTableCallersBuilder(Isolate* isolate,
-                                CodeRegionTable* live_code_table,
-                                CodeRegionTable* dead_code_table)
+  CodeRegionExclusiveTrieBuilder(Isolate* isolate,
+                                 CodeRegionTable* live_code_table,
+                                 CodeRegionTable* dead_code_table,
+                                 CodeRegionTable* tag_code_table)
       : SampleVisitor(isolate),
         live_code_table_(live_code_table),
-        dead_code_table_(dead_code_table) {
+        dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table) {
     ASSERT(live_code_table_ != NULL);
     ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
     dead_code_table_offset_ = live_code_table_->Length();
+    tag_code_table_offset_ = dead_code_table_offset_ +
+                             dead_code_table_->Length();
+    intptr_t root_index = tag_code_table_->FindIndex(0);
+    // Verify that the "0" tag does not exist.
+    ASSERT(root_index < 0);
+    // Insert the dummy tag CodeRegion that is used for the Trie root.
+    CodeRegion* region = new CodeRegion(CodeRegion::kTagCode, 0, 1, 0);
+    root_index = tag_code_table_->InsertCodeRegion(region);
+    ASSERT(root_index >= 0);
+    region->set_creation_serial(0);
+    root_ = new CodeRegionTrieNode(tag_code_table_offset_ + root_index);
+    // Use tags by default.
+    set_use_tags(true);
   }
 
   void VisitSample(Sample* sample) {
-    int64_t timestamp = sample->timestamp();
-    intptr_t current_index = FindFinalIndex(sample->At(0), timestamp);
-    ASSERT(current_index >= 0);
-    CodeRegion* current = At(current_index);
-    intptr_t caller_index = -1;
-    CodeRegion* caller = NULL;
-    intptr_t callee_index = -1;
-    CodeRegion* callee = NULL;
-    for (intptr_t i = 1; i < FLAG_profile_depth; i++) {
+    // Give the root a tick.
+    root_->Tick();
+    CodeRegionTrieNode* current = root_;
+    if (use_tags()) {
+      intptr_t tag_index = FindTagIndex(sample->vm_tag());
+      current = current->GetChild(tag_index);
+      // Give the tag a tick.
+      current->Tick();
+    }
+    // Walk the sampled PCs.
+    for (intptr_t i = 0; i < FLAG_profile_depth; i++) {
       if (sample->At(i) == 0) {
         break;
       }
-      caller_index = FindFinalIndex(sample->At(i), timestamp);
-      ASSERT(caller_index >= 0);
-      caller = At(caller_index);
-      current->AddCaller(caller_index);
-      if (callee != NULL) {
-        current->AddCallee(callee_index);
-      }
-      // Move cursors.
-      callee_index = current_index;
-      callee = current;
-      current_index = caller_index;
-      current = caller;
+      intptr_t index = FindFinalIndex(sample->At(i), sample->timestamp());
+      current = current->GetChild(index);
+      current->Tick();
     }
   }
 
+  CodeRegionTrieNode* root() const {
+    return root_;
+  }
+
+  bool use_tags() const {
+    return use_tags_;
+  }
+
+  void set_use_tags(bool use_tags) {
+    use_tags_ = use_tags;
+  }
+
  private:
+  intptr_t FindTagIndex(uword tag) const {
+    intptr_t index = tag_code_table_->FindIndex(tag);
+    ASSERT(index >= 0);
+    ASSERT((tag_code_table_->At(index))->contains(tag));
+    return tag_code_table_offset_ + index;
+  }
+
   intptr_t FindFinalIndex(uword pc, int64_t timestamp) const {
     intptr_t index = live_code_table_->FindIndex(pc);
     ASSERT(index >= 0);
@@ -978,22 +1179,80 @@
     return index;
   }
 
+  bool use_tags_;
+  CodeRegionTrieNode* root_;
+  CodeRegionTable* live_code_table_;
+  CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
+  intptr_t dead_code_table_offset_;
+  intptr_t tag_code_table_offset_;
+};
+
+
+class CodeRegionTableCallersBuilder {
+ public:
+  CodeRegionTableCallersBuilder(CodeRegionTrieNode* exclusive_root,
+                                CodeRegionTable* live_code_table,
+                                CodeRegionTable* dead_code_table,
+                                CodeRegionTable* tag_code_table)
+      : exclusive_root_(exclusive_root),
+        live_code_table_(live_code_table),
+        dead_code_table_(dead_code_table),
+        tag_code_table_(tag_code_table) {
+    ASSERT(exclusive_root_ != NULL);
+    ASSERT(live_code_table_ != NULL);
+    ASSERT(dead_code_table_ != NULL);
+    ASSERT(tag_code_table_ != NULL);
+    dead_code_table_offset_ = live_code_table_->Length();
+    tag_code_table_offset_ = dead_code_table_offset_ +
+                             dead_code_table_->Length();
+  }
+
+  void Build() {
+    ProcessNode(exclusive_root_);
+  }
+
+ private:
+  void ProcessNode(CodeRegionTrieNode* parent) {
+    const ZoneGrowableArray<CodeRegionTrieNode*>& children = parent->children();
+    intptr_t parent_index = parent->code_region_index();
+    ASSERT(parent_index >= 0);
+    CodeRegion* parent_region = At(parent_index);
+    ASSERT(parent_region != NULL);
+    for (intptr_t i = 0; i < children.length(); i++) {
+      CodeRegionTrieNode* node = children[i];
+      ProcessNode(node);
+      intptr_t index = node->code_region_index();
+      ASSERT(index >= 0);
+      CodeRegion* region = At(index);
+      ASSERT(region != NULL);
+      region->AddCallee(parent_index, node->count());
+      parent_region->AddCaller(index, node->count());
+    }
+  }
+
   CodeRegion* At(intptr_t final_index) {
     ASSERT(final_index >= 0);
     if (final_index < dead_code_table_offset_) {
       return live_code_table_->At(final_index);
-    } else {
+    } else if (final_index < tag_code_table_offset_) {
       return dead_code_table_->At(final_index - dead_code_table_offset_);
+    } else {
+      return tag_code_table_->At(final_index - tag_code_table_offset_);
     }
   }
 
+  CodeRegionTrieNode* exclusive_root_;
   CodeRegionTable* live_code_table_;
   CodeRegionTable* dead_code_table_;
+  CodeRegionTable* tag_code_table_;
   intptr_t dead_code_table_offset_;
+  intptr_t tag_code_table_offset_;
 };
 
+
 void Profiler::PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                 bool full) {
+                                 bool full, bool use_tags) {
   ASSERT(isolate == Isolate::Current());
   // Disable profile interrupts while processing the buffer.
   EndExecution(isolate);
@@ -1014,12 +1273,15 @@
       CodeRegionTable live_code_table;
       // Dead code holds Overwritten CodeRegions.
       CodeRegionTable dead_code_table;
+      // Tag code holds Tag CodeRegions.
+      CodeRegionTable tag_code_table;
       CodeRegionTableBuilder builder(isolate,
                                      &live_code_table,
-                                     &dead_code_table);
+                                     &dead_code_table,
+                                     &tag_code_table);
       {
         // Build CodeRegion tables.
-        ScopeStopwatch sw("CodeTableBuild");
+        ScopeStopwatch sw("CodeRegionTableBuilder");
         sample_buffer->VisitSamples(&builder);
       }
       intptr_t samples = builder.visited();
@@ -1027,25 +1289,40 @@
       if (FLAG_trace_profiled_isolates) {
         intptr_t total_live_code_objects = live_code_table.Length();
         intptr_t total_dead_code_objects = dead_code_table.Length();
+        intptr_t total_tag_code_objects = tag_code_table.Length();
         OS::Print("Processed %" Pd " frames\n", frames);
-        OS::Print("CodeTables: live=%" Pd " dead=%" Pd "\n",
+        OS::Print("CodeTables: live=%" Pd " dead=%" Pd " tag=%" Pd "\n",
                   total_live_code_objects,
-                  total_dead_code_objects);
+                  total_dead_code_objects,
+                  total_tag_code_objects);
       }
 #if defined(DEBUG)
       live_code_table.Verify();
       dead_code_table.Verify();
+      tag_code_table.Verify();
       if (FLAG_trace_profiled_isolates) {
         OS::Print("CodeRegionTables verified to be ordered and not overlap.\n");
       }
 #endif
-      CodeRegionTableCallersBuilder build_callers(isolate,
+      CodeRegionExclusiveTrieBuilder build_trie(isolate,
+                                                &live_code_table,
+                                                &dead_code_table,
+                                                &tag_code_table);
+      build_trie.set_use_tags(use_tags);
+      {
+        // Build CodeRegion trie.
+        ScopeStopwatch sw("CodeRegionExclusiveTrieBuilder");
+        sample_buffer->VisitSamples(&build_trie);
+        build_trie.root()->SortByCount();
+      }
+      CodeRegionTableCallersBuilder build_callers(build_trie.root(),
                                                   &live_code_table,
-                                                  &dead_code_table);
+                                                  &dead_code_table,
+                                                  &tag_code_table);
       {
         // Build CodeRegion callers.
-        ScopeStopwatch sw("CodeTableCallersBuild");
-        sample_buffer->VisitSamples(&build_callers);
+        ScopeStopwatch sw("CodeRegionTableCallersBuilder");
+        build_callers.Build();
       }
       {
         ScopeStopwatch sw("CodeTableStream");
@@ -1054,7 +1331,15 @@
         obj.AddProperty("type", "Profile");
         obj.AddProperty("id", "profile");
         obj.AddProperty("samples", samples);
+        obj.AddProperty("depth", static_cast<intptr_t>(FLAG_profile_depth));
+        obj.AddProperty("period", static_cast<intptr_t>(FLAG_profile_period));
         obj.AddProperty("time_delta_micros", builder.TimeDeltaMicros());
+        {
+          JSONArray exclusive_trie(&obj, "exclusive_trie");
+          CodeRegionTrieNode* root = build_trie.root();
+          ASSERT(root != NULL);
+          root->PrintToJSONArray(&exclusive_trie);
+        }
         JSONArray codes(&obj, "codes");
         for (intptr_t i = 0; i < live_code_table.Length(); i++) {
           CodeRegion* region = live_code_table.At(i);
@@ -1066,6 +1351,11 @@
           ASSERT(region != NULL);
           region->PrintToJSONArray(isolate, &codes, full);
         }
+        for (intptr_t i = 0; i < tag_code_table.Length(); i++) {
+          CodeRegion* region = tag_code_table.At(i);
+          ASSERT(region != NULL);
+          region->PrintToJSONArray(isolate, &codes, full);
+        }
       }
     }
   }
@@ -1096,7 +1386,7 @@
   ASSERT(Isolate::Current() == isolate);
   JSONStream stream(10 * MB);
   intptr_t pid = OS::ProcessId();
-  PrintToJSONStream(isolate, &stream, true);
+  PrintToJSONStream(isolate, &stream, true, false);
   const char* format = "%s/dart-profile-%" Pd "-%" Pd ".json";
   intptr_t len = OS::SNPrint(NULL, 0, format,
                              FLAG_profile_dir, pid, isolate->main_port());
@@ -1165,11 +1455,13 @@
     ASSERT(sample_ != NULL);
   }
 
-  int walk(Heap* heap) {
+  int walk(Heap* heap, uword vm_tag) {
     const intptr_t kMaxStep = 0x1000;  // 4K.
     const bool kWalkStack = true;  // Walk the stack.
     // Always store the exclusive PC.
     sample_->SetAt(0, original_pc_);
+    // Always store the vm tag.
+    sample_->set_vm_tag(vm_tag);
     if (!kWalkStack) {
       // Not walking the stack, only took exclusive sample.
       return 1;
@@ -1287,7 +1579,7 @@
   }
   ProfilerSampleStackWalker stackWalker(sample, stack_lower, stack_upper,
                                         state.pc, state.fp, state.sp);
-  stackWalker.walk(isolate->heap());
+  stackWalker.walk(isolate->heap(), isolate->vm_tag());
 }
 
 
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index 9fb098a..81dccd0 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -8,6 +8,7 @@
 #include "vm/allocation.h"
 #include "vm/code_observers.h"
 #include "vm/globals.h"
+#include "vm/tags.h"
 #include "vm/thread.h"
 #include "vm/thread_interrupter.h"
 
@@ -37,7 +38,7 @@
   static void EndExecution(Isolate* isolate);
 
   static void PrintToJSONStream(Isolate* isolate, JSONStream* stream,
-                                bool full);
+                                bool full, bool use_tags);
   static void WriteProfile(Isolate* isolate);
 
   static SampleBuffer* sample_buffer() {
@@ -109,6 +110,7 @@
     timestamp_ = timestamp;
     tid_ = tid;
     isolate_ = isolate;
+    vm_tag_ = VMTag::kInvalidTagId;
     for (intptr_t i = 0; i < kSampleFramesSize; i++) {
       pcs_[i] = 0;
     }
@@ -138,10 +140,19 @@
     pcs_[i] = pc;
   }
 
+  uword vm_tag() const {
+    return vm_tag_;
+  }
+  void set_vm_tag(uword tag) {
+    ASSERT(tag != VMTag::kInvalidTagId);
+    vm_tag_ = tag;
+  }
+
  private:
   int64_t timestamp_;
   ThreadId tid_;
   Isolate* isolate_;
+  uword vm_tag_;
   uword pcs_[kSampleFramesSize];
 };
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 087be7d..fcb27ab 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -592,7 +592,6 @@
     kMethodExtractor,  // converts method into implicit closure on the receiver.
     kNoSuchMethodDispatcher,  // invokes noSuchMethod.
     kInvokeFieldDispatcher,  // invokes a field as a closure.
-    kInvokeClosureDispatcher  // invokes this as a closure (implements .call)
   };
 
  private:
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 1903e4b..ece6c70 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -14,6 +14,7 @@
 #include "vm/debugger.h"
 #include "vm/isolate.h"
 #include "vm/message.h"
+#include "vm/message_handler.h"
 #include "vm/native_entry.h"
 #include "vm/native_arguments.h"
 #include "vm/object.h"
@@ -263,6 +264,9 @@
   if (isolate == NULL) {
     return NULL;
   }
+  // We don't want to pause the service isolate.
+  isolate->message_handler()->set_pause_on_start(false);
+  isolate->message_handler()->set_pause_on_exit(false);
   Isolate::SetCurrent(isolate);
   {
     // Install the dart:vmservice library.
@@ -366,6 +370,11 @@
   MessageWriter writer(&data, &allocator);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
+  if (FLAG_trace_service) {
+    OS::Print("Isolate %s %" Pd64 " registered with service \n",
+              name.ToCString(),
+              Dart_GetMainPortId());
+  }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
 }
@@ -378,15 +387,22 @@
   Isolate* isolate = Isolate::Current();
   ASSERT(isolate != NULL);
   HANDLESCOPE(isolate);
+  const String& name = String::Handle(String::New(isolate->name()));
+  ASSERT(!name.IsNull());
   const Array& list = Array::Handle(
       MakeServiceControlMessage(Dart_GetMainPortId(),
                                 VM_SERVICE_ISOLATE_SHUTDOWN_MESSAGE_ID,
-                                String::Handle(String::null())));
+                                name));
   ASSERT(!list.IsNull());
   uint8_t* data = NULL;
   MessageWriter writer(&data, &allocator);
   writer.WriteMessage(list);
   intptr_t len = writer.BytesWritten();
+  if (FLAG_trace_service) {
+    OS::Print("Isolate %s %" Pd64 " deregistered with service \n",
+              name.ToCString(),
+              Dart_GetMainPortId());
+  }
   return PortMap::PostMessage(
       new Message(port_, data, len, Message::kNormalPriority));
 }
@@ -802,6 +818,29 @@
 }
 
 
+static bool HandleClassesEval(Isolate* isolate, const Class& cls,
+                              JSONStream* js) {
+  if (js->num_arguments() > 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  const char* expr = js->LookupOption("expr");
+  if (expr == NULL) {
+    PrintError(js, "eval expects an 'expr' option\n",
+               js->num_arguments());
+    return true;
+  }
+  const String& expr_str = String::Handle(isolate, String::New(expr));
+  const Object& result = Object::Handle(cls.Evaluate(expr_str));
+  if (result.IsNull()) {
+    Object::null_instance().PrintToJSONStream(js, true);
+  } else {
+    result.PrintToJSONStream(js, true);
+  }
+  return true;
+}
+
+
 static bool HandleClassesDispatchers(Isolate* isolate, const Class& cls,
                                      JSONStream* js) {
   intptr_t id;
@@ -912,7 +951,9 @@
     return true;
   } else if (js->num_arguments() >= 3) {
     const char* second = js->GetArgument(2);
-    if (strcmp(second, "closures") == 0) {
+    if (strcmp(second, "eval") == 0) {
+      return HandleClassesEval(isolate, cls, js);
+    } else if (strcmp(second, "closures") == 0) {
       return HandleClassesClosures(isolate, cls, js);
     } else if (strcmp(second, "fields") == 0) {
       return HandleClassesFields(isolate, cls, js);
@@ -932,6 +973,29 @@
 }
 
 
+static bool HandleLibrariesEval(Isolate* isolate, const Library& lib,
+                                JSONStream* js) {
+  if (js->num_arguments() > 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  const char* expr = js->LookupOption("expr");
+  if (expr == NULL) {
+    PrintError(js, "eval expects an 'expr' option\n",
+               js->num_arguments());
+    return true;
+  }
+  const String& expr_str = String::Handle(isolate, String::New(expr));
+  const Object& result = Object::Handle(lib.Evaluate(expr_str));
+  if (result.IsNull()) {
+    Object::null_instance().PrintToJSONStream(js, true);
+  } else {
+    result.PrintToJSONStream(js, true);
+  }
+  return true;
+}
+
+
 static bool HandleLibraries(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): Support fields and functions on libraries.
   REQUIRE_COLLECTION_ID("libraries");
@@ -944,7 +1008,19 @@
   Library& lib = Library::Handle();
   lib ^= libs.At(id);
   ASSERT(!lib.IsNull());
-  lib.PrintToJSONStream(js, false);
+  if (js->num_arguments() == 2) {
+    lib.PrintToJSONStream(js, false);
+    return true;
+  } else if (js->num_arguments() >= 3) {
+    const char* second = js->GetArgument(2);
+    if (strcmp(second, "eval") == 0) {
+      return HandleLibrariesEval(isolate, lib, js);
+    } else {
+      PrintError(js, "Invalid sub collection %s", second);
+      return true;
+    }
+  }
+  UNREACHABLE();
   return true;
 }
 
@@ -1113,7 +1189,11 @@
     ASSERT(obj.IsInstance());
     const Instance& instance = Instance::Cast(obj);
     const Object& result = Object::Handle(instance.Evaluate(expr_str));
-    result.PrintToJSONStream(js, true);
+    if (result.IsNull()) {
+      Object::null_instance().PrintToJSONStream(js, true);
+    } else {
+      result.PrintToJSONStream(js, true);
+    }
     return true;
   }
 
@@ -1310,7 +1390,16 @@
   // A full profile includes disassembly of all Dart code objects.
   // TODO(johnmccutchan): Add sub command to trigger full code dump.
   bool full_profile = false;
-  Profiler::PrintToJSONStream(isolate, js, full_profile);
+  const char* tags_option = js->LookupOption("tags");
+  bool use_tags = true;
+  if (tags_option != NULL) {
+    if (strcmp("hide", tags_option) != 0) {
+      PrintError(js, "Invalid tags option value: %s\n", tags_option);
+      return true;
+    }
+    use_tags = false;
+  }
+  Profiler::PrintToJSONStream(isolate, js, full_profile, use_tags);
   return true;
 }
 
@@ -1341,9 +1430,16 @@
 }
 
 
-static bool HandleUnpin(Isolate* isolate, JSONStream* js) {
+static bool HandleResume(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): What do I respond with??
-  isolate->ClosePinPort();
+  if (isolate->message_handler()->pause_on_start()) {
+    isolate->message_handler()->set_pause_on_start(false);
+    return true;
+  }
+  if (isolate->message_handler()->pause_on_exit()) {
+    isolate->message_handler()->set_pause_on_exit(false);
+    return true;
+  }
   return true;
 }
 
@@ -1367,7 +1463,7 @@
   { "libraries", HandleLibraries },
   { "objects", HandleObjects },
   { "profile", HandleProfile },
-  { "unpin", HandleUnpin },
+  { "resume", HandleResume },
   { "scripts", HandleScripts },
   { "stacktrace", HandleStackTrace },
 };
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 7c16a22..88d5ef8 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -497,6 +497,17 @@
       "\"user_name\":\"int\"},\"preview\":\"222\"}",
       handler.msg());
 
+  // eval returning null works
+  service_msg = Eval(lib,
+                     "[port, ['objects', 'int-123', 'eval'], "
+                     "['expr'], ['null']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Null\",\"id\":\"objects\\/null\",\"preview\":\"null\"}",
+      handler.msg());
+
   // object id ring / invalid => expired
   service_msg = Eval(lib, "[port, ['objects', '99999999', 'eval'], "
                      "['expr'], ['this']]");
@@ -526,6 +537,64 @@
 }
 
 
+TEST_CASE(Service_Libraries) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "var libVar = 54321;\n"
+      "\n"
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+
+  // Find the current library.
+  intptr_t lib_id = -1;
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    if (libs.At(i) == lib.raw()) {
+      lib_id = i;
+    }
+  }
+  ASSERT(lib_id > 0);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port =
+      Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+
+  // Request library.
+  service_msg = EvalF(h_lib,
+                      "[port, ['libraries', '%" Pd "'], [], []]", lib_id);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_SUBSTRING("\"type\":\"Library\"", handler.msg());
+  EXPECT_SUBSTRING("\"url\":\"dart:test-lib\"", handler.msg());
+
+  // Evaluate an expression from a library.
+  service_msg = EvalF(h_lib,
+                      "[port, ['libraries', '%" Pd "', 'eval'], "
+                      "['expr'], ['libVar - 1']]", lib_id);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-54320\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"54320\"}",
+      handler.msg());
+}
+
 
 TEST_CASE(Service_Classes) {
   const char* kScript =
@@ -533,6 +602,7 @@
       "\n"
       "class A {\n"
       "  var a;\n"
+      "  static var cobra = 11235;\n"
       "  dynamic b() {}\n"
       "  dynamic c() {\n"
       "    var d = () { b(); };\n"
@@ -581,11 +651,24 @@
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "'], [], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
   handler.HandleNextMessage();
-
   EXPECT_SUBSTRING("\"type\":\"Class\"", handler.msg());
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"classes\\/%" Pd "\",\"name\":\"A\",", cid);
 
+  // Evaluate an expression from class A.
+  service_msg = EvalF(h_lib,
+                      "[port, ['classes', '%" Pd "', 'eval'], "
+                      "['expr'], ['cobra + 100000']]", cid);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  handler.filterMsg("name");
+  EXPECT_STREQ(
+      "{\"type\":\"@Smi\",\"id\":\"objects\\/int-111235\","
+      "\"class\":{\"type\":\"@Class\",\"id\":\"classes\\/42\","
+      "\"user_name\":\"int\"},\"preview\":\"111235\"}",
+      handler.msg());
+
+  // Request function 0 from class A.
   service_msg = EvalF(h_lib, "[port, ['classes', '%" Pd "', 'functions', '0'],"
                               "[], []]", cid);
   Service::HandleIsolateMessage(isolate, service_msg);
@@ -1024,4 +1107,51 @@
   EXPECT_STREQ("beta", handler.msg());
 }
 
+TEST_CASE(Service_Profile) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // Build a mock message handler and wrap it in a dart port.
+  ServiceTestMessageHandler handler;
+  Dart_Port port_id = PortMap::CreatePort(&handler);
+  Dart_Handle port =
+      Api::NewHandle(isolate, DartLibraryCalls::NewSendPort(port_id));
+  EXPECT_VALID(port);
+  EXPECT_VALID(Dart_SetField(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, "[port, ['profile'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect profile
+  EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+  service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hide']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect profile
+  EXPECT_SUBSTRING("\"type\":\"Profile\"", handler.msg());
+
+  service_msg = Eval(h_lib, "[port, ['profile'], ['tags'], ['hidden']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  // Expect error.
+  EXPECT_SUBSTRING("\"type\":\"Error\"", handler.msg());
+}
+
 }  // namespace dart
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index f2949adf..ef2bd1e 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -43,8 +43,9 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -26;
-static const int kExitLinkSlotFromEntryFp = -25;
+static const int kSavedContextSlotFromEntryFp = -27;
+static const int kExitLinkSlotFromEntryFp = -26;
+static const int kSavedVMTagSlotFromEntryFp = -25;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index f36863b..b7d5997 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -42,8 +42,9 @@
 static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -5;
-static const int kExitLinkSlotFromEntryFp = -4;
+static const int kSavedContextSlotFromEntryFp = -6;
+static const int kExitLinkSlotFromEntryFp = -5;
+static const int kSavedVMTagSlotFromEntryFp = -4;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index 84f8dc7..94c8c25 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -41,8 +41,9 @@
 static const int kCallerSpSlotFromFp = 3;
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -23;
-static const int kExitLinkSlotFromEntryFp = -22;
+static const int kSavedContextSlotFromEntryFp = -24;
+static const int kExitLinkSlotFromEntryFp = -23;
+static const int kSavedVMTagSlotFromEntryFp = -22;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index dcd964a..d85e8ec 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,8 +45,9 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kSavedContextSlotFromEntryFp = -9;
-static const int kExitLinkSlotFromEntryFp = -8;
+static const int kSavedContextSlotFromEntryFp = -10;
+static const int kExitLinkSlotFromEntryFp = -9;
+static const int kSavedVMTagSlotFromEntryFp = -8;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index aa913be..602253a 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -20,8 +20,8 @@
 // List of stubs created in the VM isolate, these stubs are shared by different
 // isolates running in this dart process.
 #define VM_STUB_CODE_LIST(V)                                                   \
-  V(CallToRuntime)                                                             \
   V(PrintStopMessage)                                                          \
+  V(CallToRuntime)                                                             \
   V(CallBootstrapCFunction)                                                    \
   V(CallNativeCFunction)                                                       \
   V(AllocateArray)                                                             \
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index ea1334f..6b40a5c 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -15,6 +15,7 @@
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -24,7 +25,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -58,6 +58,21 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ LoadImmediate(R6, VMTag::kVMTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
   ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -85,6 +100,10 @@
   // Call runtime or redirection via simulator.
   __ blx(R5);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -154,6 +173,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // R0) and align frame before entering the C++ world.
@@ -207,6 +241,10 @@
 
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -257,6 +295,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, ShifterOperand(R0));
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ LoadFromOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+    __ CompareImmediate(R6, VMTag::kScriptTagId);
+    __ b(&ok, EQ);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(R6, VMTag::kRuntimeNativeTagId);
+  __ StoreToOffset(kWord, R6, CTX, Isolate::vm_tag_offset());
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // R0) and align frame before entering the C++ world.
@@ -288,6 +341,10 @@
   // Call native function or redirection via simulator.
   __ blx(R5);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R2, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R2, CTX, Isolate::vm_tag_offset());
+
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
   __ StoreToOffset(kWord, R2, CTX, Isolate::top_exit_frame_info_offset());
@@ -837,6 +894,15 @@
   // Load Isolate pointer from Context structure into temporary register R8.
   __ ldr(R8, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -25);
+  __ LoadFromOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+  __ Push(R5);
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(R5, VMTag::kScriptTagId);
+  __ StoreToOffset(kWord, R5, R8, Isolate::vm_tag_offset());
+
   // Save the top exit frame info. Use R5 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ LoadFromOffset(kWord, R5, R8, Isolate::top_exit_frame_info_offset());
@@ -852,8 +918,8 @@
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -25);
-  ASSERT(kSavedContextSlotFromEntryFp == -26);
+  ASSERT(kExitLinkSlotFromEntryFp == -26);
+  ASSERT(kSavedContextSlotFromEntryFp == -27);
   __ PushList((1 << R4) | (1 << R5));
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -903,6 +969,10 @@
   __ StoreToOffset(kWord, R4, CTX, Isolate::top_context_offset());
   __ StoreToOffset(kWord, R5, CTX, Isolate::top_exit_frame_info_offset());
 
+  // Restore the current VMTag from the stack.
+  __ Pop(R4);
+  __ StoreToOffset(kWord, R4, CTX, Isolate::vm_tag_offset());
+
   // Restore C++ ABI callee-saved registers.
   // Restore FPU registers. 2 D registers per Q register.
   __ vldmd(IA_W, SP, firstd, 2 * kAbiPreservedFpuRegCount);
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 525e8ce..edc3f12 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -16,6 +16,7 @@
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 
 #define __ assembler->
@@ -26,7 +27,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -58,6 +58,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ movl(CTX, EAX);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EAX, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EAX, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
   // Reserve space for arguments and align frame before entering C++ world.
   __ AddImmediate(ESP, Immediate(-sizeof(NativeArguments)));
   if (OS::ActivationFrameAlignment() > 1) {
@@ -75,6 +89,10 @@
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
   __ call(ECX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -148,6 +166,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movl(CTX, EDI);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure, the outgoing parameters
   // (pointer to the native arguments structure, the C function entry point)
   // and align frame before entering the C++ world.
@@ -177,6 +210,10 @@
   __ call(ECX);
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -229,6 +266,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movl(CTX, EDI);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movl(EDI, Address(CTX, Isolate::vm_tag_offset()));
+    __ cmpl(EDI, Immediate(VMTag::kScriptTagId));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure, the outgoing parameter
   // (pointer to the native arguments structure) and align frame before
   // entering the C++ world.
@@ -247,6 +299,10 @@
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
   __ call(ECX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -816,11 +872,20 @@
   // Load Isolate pointer from Context structure into EDI.
   __ movl(EDI, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -4);
+  __ movl(ECX, Address(EDI, Isolate::vm_tag_offset()));
+  __ pushl(ECX);
+
+  // Mark that the isolate is executing Dart code.
+  __ movl(Address(EDI, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Save the top exit frame info. Use EDX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -4);
+  ASSERT(kExitLinkSlotFromEntryFp == -5);
   __ movl(EDX, Address(EDI, Isolate::top_exit_frame_info_offset()));
   __ pushl(EDX);
   __ movl(Address(EDI, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -832,7 +897,7 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -5);
+  ASSERT(kSavedContextSlotFromEntryFp == -6);
   __ movl(ECX, Address(EDI, Isolate::top_context_offset()));
   __ pushl(ECX);
 
@@ -892,6 +957,10 @@
   __ popl(EDX);
   __ movl(Address(CTX, Isolate::top_exit_frame_info_offset()), EDX);
 
+  // Restore the current VMTag from the stack.
+  __ popl(ECX);
+  __ movl(Address(CTX, Isolate::vm_tag_offset()), ECX);
+
   // Restore C++ ABI callee-saved registers.
   __ popl(EDI);
   __ popl(ESI);
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ad15047..17ed5e6 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -15,6 +15,7 @@
 #include "vm/object_store.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -24,7 +25,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -62,6 +62,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ LoadImmediate(T0, VMTag::kVMTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
   ASSERT(sizeof(NativeArguments) == 4 * kWordSize);
@@ -96,6 +110,10 @@
   __ delay_slot()->addiu(A3, A2, Immediate(kWordSize));
   __ TraceSimMsg("CallToRuntimeStub return");
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -171,6 +189,20 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
@@ -231,6 +263,10 @@
 
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -287,6 +323,20 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ mov(CTX, A0);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ lw(T0, Address(A0, Isolate::vm_tag_offset()));
+    __ BranchEqual(T0, VMTag::kScriptTagId, &ok);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ LoadImmediate(T0, VMTag::kRuntimeNativeTagId);
+  __ sw(T0, Address(A0, Isolate::vm_tag_offset()));
+
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
 
@@ -324,6 +374,10 @@
   __ jalr(T9);
   __ TraceSimMsg("CallNativeCFunctionStub return");
 
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(A2, VMTag::kScriptTagId);
+  __ sw(A2, Address(CTX, Isolate::vm_tag_offset()));
+
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(CTX, Isolate::top_exit_frame_info_offset()));
 
@@ -945,8 +999,8 @@
 
   // Save new context and C++ ABI callee-saved registers.
 
-  // The new context, the top exit frame, and the old context.
-  const intptr_t kPreservedContextSlots = 3;
+  // The new context, saved vm tag, the top exit frame, and the old context.
+  const intptr_t kPreservedContextSlots = 4;
   const intptr_t kNewContextOffsetFromFp =
       -(1 + kAbiPreservedCpuRegCount + kAbiPreservedFpuRegCount) * kWordSize;
   const intptr_t kPreservedRegSpace =
@@ -969,7 +1023,7 @@
     __ swc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ sw(A3, Address(SP, 2 * kWordSize));
+  __ sw(A3, Address(SP, 3 * kWordSize));
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -988,6 +1042,15 @@
   // Load Isolate pointer from Context structure into temporary register R8.
   __ lw(T2, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -22);
+  __ lw(T1, Address(T2, Isolate::vm_tag_offset()));
+  __ sw(T1, Address(SP, 2 * kWordSize));
+
+  // Mark that the isolate is executing Dart code.
+  __ LoadImmediate(T0, VMTag::kScriptTagId);
+  __ sw(T0, Address(T2, Isolate::vm_tag_offset()));
+
   // Save the top exit frame info. Use T0 as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   __ lw(T0, Address(T2, Isolate::top_exit_frame_info_offset()));
@@ -1002,8 +1065,8 @@
 
   // The constants kSavedContextSlotFromEntryFp and
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -22);
-  ASSERT(kSavedContextSlotFromEntryFp == -23);
+  ASSERT(kExitLinkSlotFromEntryFp == -23);
+  ASSERT(kSavedContextSlotFromEntryFp == -24);
   __ sw(T0, Address(SP, 1 * kWordSize));
   __ sw(T1, Address(SP, 0 * kWordSize));
 
@@ -1052,6 +1115,10 @@
   // Load Isolate pointer from Context structure into CTX. Drop Context.
   __ lw(CTX, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Restore the current VMTag from the stack.
+  __ lw(T1, Address(SP, 2 * kWordSize));
+  __ sw(T1, Address(CTX, Isolate::vm_tag_offset()));
+
   // Restore the saved Context pointer into the Isolate structure.
   // Uses T1 as a temporary register for this.
   // Restore the saved top exit frame info back into the Isolate structure.
@@ -1077,7 +1144,7 @@
     __ lwc1(r, Address(SP, slot * kWordSize));
   }
 
-  __ lw(A3, Address(SP, 2 * kWordSize));
+  __ lw(A3, Address(SP, 3 * kWordSize));
   __ addiu(SP, SP, Immediate(kPreservedRegSpace));
 
   // Restore the frame pointer and return.
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index a079813..0580f513 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -16,7 +16,7 @@
 #include "vm/scavenger.h"
 #include "vm/stack_frame.h"
 #include "vm/stub_code.h"
-
+#include "vm/tags.h"
 
 #define __ assembler->
 
@@ -26,7 +26,6 @@
 DEFINE_FLAG(bool, use_slow_path, false,
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
-DECLARE_FLAG(int, optimization_counter_threshold);
 
 
 // Input parameters:
@@ -59,6 +58,20 @@
   // Cache Isolate pointer into CTX while executing runtime code.
   __ movq(CTX, RAX);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(RAX, Immediate(VMTag::kScriptTagId));
+    __ cmpq(RAX, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing VM code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()), Immediate(VMTag::kVMTagId));
+
   // Reserve space for arguments and align frame before entering C++ world.
   __ subq(RSP, Immediate(sizeof(NativeArguments)));
   if (OS::ActivationFrameAlignment() > 1) {
@@ -76,6 +89,10 @@
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
   __ call(RBX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -140,12 +157,27 @@
   // to transition to native code.
   __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), RSP);
 
-  // Save current Context pointer into Isolate structure.
+// Save current Context pointer into Isolate structure.
   __ movq(Address(R8, Isolate::top_context_offset()), CTX);
 
   // Cache Isolate pointer into CTX while executing native code.
   __ movq(CTX, R8);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(R8, Immediate(VMTag::kScriptTagId));
+    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // RDI) and align frame before entering the C++ world.
@@ -174,6 +206,10 @@
   __ call(RBX);
   __ Bind(&done);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -224,6 +260,21 @@
   // Cache Isolate pointer into CTX while executing native code.
   __ movq(CTX, R8);
 
+#if defined(DEBUG)
+  { Label ok;
+    // Check that we are always entering from Dart code.
+    __ movq(R8, Immediate(VMTag::kScriptTagId));
+    __ cmpq(R8, Address(CTX, Isolate::vm_tag_offset()));
+    __ j(EQUAL, &ok, Assembler::kNearJump);
+    __ Stop("Not coming from Dart code.");
+    __ Bind(&ok);
+  }
+#endif
+
+  // Mark that the isolate is executing Native code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kRuntimeNativeTagId));
+
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
   // RDI) and align frame before entering the C++ world.
@@ -241,6 +292,10 @@
   __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
   __ call(RBX);
 
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(CTX, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Reset exit frame information in Isolate structure.
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), Immediate(0));
 
@@ -820,11 +875,20 @@
   // Load Isolate pointer from Context structure into R8.
   __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
 
+  // Save the current VMTag on the stack.
+  ASSERT(kSavedVMTagSlotFromEntryFp == -8);
+  __ movq(RAX, Address(R8, Isolate::vm_tag_offset()));
+  __ pushq(RAX);
+
+  // Mark that the isolate is executing Dart code.
+  __ movq(Address(R8, Isolate::vm_tag_offset()),
+          Immediate(VMTag::kScriptTagId));
+
   // Save the top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -8);
+  ASSERT(kExitLinkSlotFromEntryFp == -9);
   __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
   __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
@@ -836,7 +900,7 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -9);
+  ASSERT(kSavedContextSlotFromEntryFp == -10);
   __ movq(RAX, Address(R8, Isolate::top_context_offset()));
   __ pushq(RAX);
 
@@ -893,6 +957,10 @@
   __ popq(RDX);
   __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
 
+  // Restore the current VMTag from the stack.
+  __ popq(RDX);
+  __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
+
   // Restore C++ ABI callee-saved registers.
   __ popq(R15);
   __ popq(R14);
diff --git a/runtime/vm/tags.cc b/runtime/vm/tags.cc
new file mode 100644
index 0000000..84b40f4
--- /dev/null
+++ b/runtime/vm/tags.cc
@@ -0,0 +1,44 @@
+// 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.
+
+#include "vm/tags.h"
+
+#include "vm/isolate.h"
+
+namespace dart {
+
+const char* VMTag::TagName(uword id) {
+  ASSERT(id != kInvalidTagId);
+  ASSERT(id < kNumVMTags);
+  const TagEntry& entry = entries_[id];
+  ASSERT(entry.id == id);
+  return entry.name;
+}
+
+
+VMTag::TagEntry VMTag::entries_[] = {
+  { "InvalidTag", kInvalidTagId, },
+#define DEFINE_VM_TAG_ENTRY(tag)                                               \
+  { ""#tag, k##tag##TagId },
+  VM_TAG_LIST(DEFINE_VM_TAG_ENTRY)
+#undef DEFINE_VM_TAG_ENTRY
+  { "kNumVMTags", kNumVMTags },
+};
+
+
+VMTagScope::VMTagScope(Isolate* base_isolate, uword tag)
+    : StackResource(base_isolate) {
+  ASSERT(isolate() != NULL);
+  previous_tag_ = isolate()->vm_tag();
+  isolate()->set_vm_tag(tag);
+}
+
+
+VMTagScope::~VMTagScope() {
+  ASSERT(isolate() != NULL);
+  isolate()->set_vm_tag(previous_tag_);
+}
+
+
+}  // namespace dart
diff --git a/runtime/vm/tags.h b/runtime/vm/tags.h
new file mode 100644
index 0000000..98be468
--- /dev/null
+++ b/runtime/vm/tags.h
@@ -0,0 +1,58 @@
+// 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.
+
+#ifndef VM_TAGS_H_
+#define VM_TAGS_H_
+
+#include "vm/allocation.h"
+
+class Isolate;
+
+namespace dart {
+
+#define VM_TAG_LIST(V)                                                         \
+  V(VM) /* Catch all */                                                        \
+  V(Compile)                                                                   \
+  V(Script)                                                                    \
+  V(GCNewSpace)                                                                \
+  V(GCOldSpace)                                                                \
+  V(RuntimeNative)                                                             \
+  V(Idle)                                                                      \
+
+
+class VMTag : public AllStatic {
+ public:
+  enum VMTagId {
+    kInvalidTagId = 0,
+#define DEFINE_VM_TAG_ID(tag)                                                  \
+    k##tag##TagId,
+    VM_TAG_LIST(DEFINE_VM_TAG_ID)
+#undef DEFINE_VM_TAG_KIND
+    kNumVMTags,
+  };
+
+  static const char* TagName(uword id);
+
+ private:
+  struct TagEntry {
+    const char* name;
+    uword id;
+  };
+  static TagEntry entries_[];
+};
+
+class VMTagScope : StackResource {
+ public:
+  VMTagScope(Isolate* isolate, uword tag);
+  ~VMTagScope();
+ private:
+  uword previous_tag_;
+
+  DISALLOW_ALLOCATION();
+  DISALLOW_IMPLICIT_CONSTRUCTORS(VMTagScope);
+};
+
+}  // namespace dart
+
+#endif  // VM_TAGS_H_
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 2481ac61..94434e2 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -350,6 +350,8 @@
     'stub_code_x64_test.cc',
     'symbols.cc',
     'symbols.h',
+    'tags.cc',
+    'tags.h',
     'thread.h',
     'thread_interrupter.cc',
     'thread_interrupter.h',
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index 72b7b3d..76de97a 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -43,7 +43,8 @@
       if (node is FunctionExpression) {
         translator.translateFunction(element, node);
       } else if (element.isSynthesized) {
-        return new ClosureClassMap(null, null, null, new ThisElement(element));
+        return new ClosureClassMap(null, null, null,
+            new ThisElement(element, compiler.types.dynamicType));
       } else {
         assert(element.isField());
         VariableElement field = element;
@@ -53,7 +54,8 @@
         } else {
           assert(element.isInstanceMember());
           closureMappingCache[node] =
-              new ClosureClassMap(null, null, null, new ThisElement(element));
+              new ClosureClassMap(null, null, null,
+                  new ThisElement(element, compiler.types.dynamicType));
         }
       }
       assert(closureMappingCache[node] != null);
@@ -77,7 +79,7 @@
 // more general solution.
 class ClosureFieldElement extends ElementX implements VariableElement {
   /// The source variable this element refers to.
-  final Element variableElement;
+  final TypedElement variableElement;
 
   ClosureFieldElement(String name,
                       this.variableElement,
@@ -94,9 +96,11 @@
   bool isAssignable() => false;
 
   DartType computeType(Compiler compiler) {
-    return variableElement.computeType(compiler);
+    return variableElement.type;
   }
 
+  DartType get type => variableElement.type;
+
   String toString() => "ClosureFieldElement($name)";
 
   accept(ElementVisitor visitor) => visitor.visitClosureFieldElement(this);
@@ -128,12 +132,12 @@
         ? compiler.boundClosureClass
         : compiler.closureClass;
     superclass.ensureResolved(compiler);
-    supertype = superclass.computeType(compiler);
+    supertype = superclass.thisType;
     interfaces = const Link<DartType>();
     thisType = rawType = new InterfaceType(this);
     allSupertypesAndSelf =
         superclass.allSupertypesAndSelf.extendClass(thisType);
-    callType = methodElement.computeType(compiler);
+    callType = methodElement.type;
   }
 
   bool isClosure() => true;
@@ -145,7 +149,7 @@
   /**
    * The most outer method this closure is declared into.
    */
-  final Element methodElement;
+  final TypedElement methodElement;
 
   // A [ClosureClassElement] is nested inside a function or initializer in terms
   // of [enclosingElement], but still has to be treated as a top-level
@@ -160,11 +164,13 @@
 // TODO(ahe): These classes continuously cause problems.  We need to
 // move these classes to elements/modelx.dart or see if we can find a
 // more general solution.
-class BoxElement extends ElementX {
-  BoxElement(String name, Element enclosingElement)
+class BoxElement extends ElementX implements TypedElement {
+  final DartType type;
+
+  BoxElement(String name, Element enclosingElement, this.type)
       : super(name, ElementKind.VARIABLE_LIST, enclosingElement);
 
-  DartType computeType(Compiler compiler) => compiler.types.dynamicType;
+  DartType computeType(Compiler compiler) => type;
 
   accept(ElementVisitor visitor) => visitor.visitBoxElement(this);
 }
@@ -172,17 +178,17 @@
 // TODO(ngeoffray, ahe): These classes continuously cause problems.  We need to
 // move these classes to elements/modelx.dart or see if we can find a
 // more general solution.
-class BoxFieldElement extends ElementX {
+class BoxFieldElement extends ElementX implements TypedElement {
   BoxFieldElement(String name,
                   this.variableElement,
                   BoxElement enclosingBox)
       : super(name, ElementKind.FIELD, enclosingBox);
 
-  DartType computeType(Compiler compiler) {
-    return variableElement.computeType(compiler);
-  }
+  DartType computeType(Compiler compiler) => type;
 
-  final Element variableElement;
+  DartType get type => variableElement.type;
+
+  final VariableElement variableElement;
 
   accept(ElementVisitor visitor) => visitor.visitBoxFieldElement(this);
 }
@@ -190,8 +196,10 @@
 // TODO(ahe): These classes continuously cause problems.  We need to
 // move these classes to elements/modelx.dart or see if we can find a
 // more general solution.
-class ThisElement extends ElementX {
-  ThisElement(Element enclosing)
+class ThisElement extends ElementX implements TypedElement {
+  final DartType type;
+
+  ThisElement(Element enclosing, this.type)
       : super('this', ElementKind.PARAMETER, enclosing);
 
   bool isAssignable() => false;
@@ -454,7 +462,7 @@
          !link.isEmpty;
          link = link.tail) {
       Node definition = link.head;
-      Element element = elements[definition];
+      VariableElement element = elements[definition];
       assert(element != null);
       declareLocal(element);
       // We still need to visit the right-hand sides of the init-assignments.
@@ -547,7 +555,8 @@
     if (Elements.isLocal(element)) {
       mutatedVariables.add(element);
       if (compiler.enableTypeAssertions) {
-        analyzeTypeVariables(element.computeType(compiler));
+        TypedElement typedElement = element;
+        analyzeTypeVariables(typedElement.type);
       }
     }
     super.visitSendSet(node);
@@ -604,7 +613,8 @@
           // TODO(floitsch): construct better box names.
           String boxName =
               namer.getClosureVariableName('box', closureFieldCounter++);
-          box = new BoxElement(boxName, currentElement);
+          box = new BoxElement(
+              boxName, currentElement, compiler.types.dynamicType);
         }
         String elementName = element.name;
         String boxedName =
@@ -700,7 +710,8 @@
     return sb.toString();
   }
 
-  ClosureClassMap globalizeClosure(FunctionExpression node, Element element) {
+  ClosureClassMap globalizeClosure(FunctionExpression node,
+                                   TypedElement element) {
     String closureName = computeClosureName(element);
     ClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.getCompilationUnit());
@@ -718,7 +729,7 @@
                                callElement, thisElement);
   }
 
-  void visitInvokable(Element element, Node node, void visitChildren()) {
+  void visitInvokable(TypedElement element, Node node, void visitChildren()) {
     bool oldInsideClosure = insideClosure;
     Element oldFunctionElement = currentElement;
     ClosureClassMap oldClosureData = closureData;
@@ -732,7 +743,7 @@
       outermostElement = element;
       Element thisElement = null;
       if (element.isInstanceMember() || element.isGenerativeConstructor()) {
-        thisElement = new ThisElement(element);
+        thisElement = new ThisElement(element, compiler.types.dynamicType);
       }
       closureData = new ClosureClassMap(null, null, null, thisElement);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index aeeae12..b02a293 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -118,8 +118,8 @@
         if (compiler.enableTypeAssertions &&
             value != null &&
             element.isField()) {
-          DartType elementType = element.computeType(compiler);
-          if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull()) {
+          DartType elementType = element.type;
+          if (elementType.kind == TypeKind.MALFORMED_TYPE && !value.isNull) {
             if (isConst) {
               ErroneousElement element = elementType.element;
               compiler.reportFatalError(
@@ -312,7 +312,7 @@
     bool onlyStringKeys = true;
     Constant protoValue = null;
     for (var key in keys) {
-      if (key.isString()) {
+      if (key.isString) {
         if (key.value == MapConstant.PROTO_PROPERTY) {
           protoValue = map[key];
         }
@@ -377,10 +377,10 @@
       DartString expressionString;
       if (expression == null) {
         return signalNotCompileTimeConstant(part.expression);
-      } else if (expression.isNum() || expression.isBool()) {
+      } else if (expression.isNum || expression.isBool) {
         PrimitiveConstant primitive = expression;
         expressionString = new DartString.literal(primitive.value.toString());
-      } else if (expression.isString()) {
+      } else if (expression.isString) {
         PrimitiveConstant primitive = expression;
         expressionString = primitive.value;
       } else {
@@ -395,7 +395,7 @@
   }
 
   Constant visitLiteralSymbol(LiteralSymbol node) {
-    InterfaceType type = compiler.symbolClass.computeType(compiler);
+    InterfaceType type = compiler.symbolClass.rawType;
     List<Constant> createArguments(_) {
       return [constantSystem.createString(
         new DartString.literal(node.slowNameString))];
@@ -404,17 +404,51 @@
         node, type, compiler.symbolConstructor, createArguments);
   }
 
-  Constant makeTypeConstant(Element element) {
-    DartType elementType = element.computeType(compiler).asRaw();
+  Constant makeTypeConstant(TypeDeclarationElement element) {
+    DartType elementType = element.rawType;
     DartType constantType =
         compiler.backend.typeImplementation.computeType(compiler);
     return new TypeConstant(elementType, constantType);
   }
 
+  /// Returns true if the prefix of the send resolves to a deferred import
+  /// prefix.
+  bool isDeferredUse(Send send) {
+    // We handle:
+    // 1. Send(Send(Send(null, Prefix), className), staticName)
+    // 2. Send(Send(Prefix, Classname), staticName)
+    // 3. Send(Send(null, Prefix), staticName | className)
+    // 4. Send(Send(Prefix), staticName | className)
+    // Nodes of the forms 2,4 occur in metadata.
+    if (send == null) return false;
+    while (send.receiver is Send) {
+      send = send.receiver;
+    }
+    Identifier prefixNode;
+    if (send.receiver is Identifier) {
+      prefixNode = send.receiver;
+    } else if (send.receiver == null &&
+        send.selector is Identifier) {
+      prefixNode = send.selector;
+    }
+    if (prefixNode != null) {
+      Element maybePrefix = elements[prefixNode.asIdentifier()];
+      if (maybePrefix != null && maybePrefix.isPrefix() &&
+          (maybePrefix as PrefixElement).isDeferred) {
+        return true;
+      }
+    }
+    return false;
+  }
+
   // TODO(floitsch): provide better error-messages.
   Constant visitSend(Send send) {
     Element element = elements[send];
     if (send.isPropertyAccess) {
+      if (isDeferredUse(send)) {
+        return signalNotCompileTimeConstant(send,
+            message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
+      }
       if (Elements.isStaticOrTopLevelFunction(element)) {
         return new FunctionConstant(element);
       } else if (Elements.isStaticOrTopLevelField(element)) {
@@ -533,7 +567,7 @@
           folded = constantSystem.greaterEqual.fold(left, right);
           break;
         case "==":
-          if (left.isPrimitive() && right.isPrimitive()) {
+          if (left.isPrimitive && right.isPrimitive) {
             folded = constantSystem.equal.fold(left, right);
           }
           break;
@@ -541,7 +575,7 @@
           folded = constantSystem.identity.fold(left, right);
           break;
         case "!=":
-          if (left.isPrimitive() && right.isPrimitive()) {
+          if (left.isPrimitive && right.isPrimitive) {
             BoolConstant areEquals = constantSystem.equal.fold(left, right);
             if (areEquals == null) {
               folded = null;
@@ -570,7 +604,7 @@
     Constant condition = evaluate(node.condition);
     if (condition == null) {
       return null;
-    } else if (!condition.isBool()) {
+    } else if (!condition.isBool) {
       DartType conditionType = condition.computeType(compiler);
       if (isEvaluatingConstant) {
         compiler.reportFatalError(
@@ -630,16 +664,9 @@
 
     // Deferred types can not be used in const instance creation expressions.
     // Check if the constructor comes from a deferred library.
-    Send selectorSend = node.send.selector.asSend();
-    if (selectorSend != null) {
-      Identifier receiver = selectorSend.receiver.asIdentifier();
-      if (receiver != null) {
-        Element element = elements[receiver];
-        if (element.isPrefix() && (element as PrefixElement).isDeferred) {
-          return signalNotCompileTimeConstant(node,
-              message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT);
-        }
-      }
+    if (isDeferredUse(node.send.selector.asSend())) {
+      return signalNotCompileTimeConstant(node,
+          message: MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION);
     }
 
     // TODO(ahe): This is nasty: we must eagerly analyze the
@@ -828,9 +855,11 @@
     return super.visitSend(send);
   }
 
-  void potentiallyCheckType(Node node, Element element, Constant constant) {
+  void potentiallyCheckType(Node node,
+                            TypedElement element,
+                            Constant constant) {
     if (compiler.enableTypeAssertions) {
-      DartType elementType = element.computeType(compiler);
+      DartType elementType = element.type;
       DartType constantType = constant.computeType(compiler);
       // TODO(ngeoffray): Handle type parameters.
       if (elementType.element.isTypeVariable()) return;
@@ -842,7 +871,7 @@
     }
   }
 
-  void updateFieldValue(Node node, Element element, Constant constant) {
+  void updateFieldValue(Node node, TypedElement element, Constant constant) {
     potentiallyCheckType(node, element, constant);
     fieldValues[element] = constant;
   }
@@ -854,7 +883,7 @@
    */
   void assignArgumentsToParameters(List<Constant> arguments) {
     // Assign arguments to parameters.
-    FunctionSignature parameters = constructor.computeSignature(compiler);
+    FunctionSignature parameters = constructor.functionSignature;
     int index = 0;
     parameters.orderedForEachParameter((Element parameter) {
       Constant argument = arguments[index++];
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 05fe6c7..b3044bb 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -803,9 +803,13 @@
       try {
         if (!hasCrashed) {
           hasCrashed = true;
-          reportDiagnostic(new SourceSpan(uri, 0, 0),
-                           MessageKind.COMPILER_CRASHED.message(),
-                           api.Diagnostic.CRASH);
+          if (error is SpannableAssertionFailure) {
+            reportAssertionFailure(error);
+          } else {
+            reportDiagnostic(new SourceSpan(uri, 0, 0),
+                             MessageKind.COMPILER_CRASHED.message(),
+                             api.Diagnostic.CRASH);
+          }
           pleaseReportCrash();
         }
       } catch (doubleFault) {
@@ -1295,6 +1299,8 @@
            element.isGetter() ||
            element.isSetter(),
            message: 'Unexpected element kind: ${element.kind}'));
+    assert(invariant(element, element is AnalyzableElement,
+        message: 'Element $element is not analyzable.'));
     assert(invariant(element, element.isDeclaration));
     ResolutionEnqueuer world = enqueuer.resolution;
     TreeElements elements = world.getCachedElements(element);
@@ -1458,7 +1464,7 @@
     String message = (ex.message != null) ? tryToString(ex.message)
                                           : tryToString(ex);
     SourceSpan span = spanFromSpannable(ex.node);
-    reportError(ex.node, MessageKind.GENERIC, {'text': message});
+    reportInternalError(ex.node, MessageKind.GENERIC, {'text': message});
   }
 
   SourceSpan spanFromTokens(Token begin, Token end, [Uri uri]) {
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index cf86e65..df33125 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -10,7 +10,7 @@
   final String name = '~';
   const BitNotOperation();
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       return DART_CONSTANT_SYSTEM.createInt(~intConstant.value);
     }
@@ -22,11 +22,11 @@
   final String name = 'negate';
   const NegateOperation();
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       return DART_CONSTANT_SYSTEM.createInt(-intConstant.value);
     }
-    if (constant.isDouble()) {
+    if (constant.isDouble) {
       DoubleConstant doubleConstant = constant;
       return DART_CONSTANT_SYSTEM.createDouble(-doubleConstant.value);
     }
@@ -38,7 +38,7 @@
   final String name = '!';
   const NotOperation();
   Constant fold(Constant constant) {
-    if (constant.isBool()) {
+    if (constant.isBool) {
       BoolConstant boolConstant = constant;
       return DART_CONSTANT_SYSTEM.createBool(!boolConstant.value);
     }
@@ -52,7 +52,7 @@
 abstract class BinaryBitOperation implements BinaryOperation {
   const BinaryBitOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isInt() && right.isInt()) {
+    if (left.isInt && right.isInt) {
       IntConstant leftInt = left;
       IntConstant rightInt = right;
       int resultValue = foldInts(leftInt.value, rightInt.value);
@@ -111,7 +111,7 @@
 abstract class BinaryBoolOperation implements BinaryOperation {
   const BinaryBoolOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isBool() && right.isBool()) {
+    if (left.isBool && right.isBool) {
       BoolConstant leftBool = left;
       BoolConstant rightBool = right;
       bool resultValue = foldBools(leftBool.value, rightBool.value);
@@ -140,18 +140,18 @@
 abstract class ArithmeticNumOperation implements BinaryOperation {
   const ArithmeticNumOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       num foldedValue;
-      if (left.isInt() && right.isInt()) {
+      if (left.isInt && right.isInt) {
         foldedValue = foldInts(leftNum.value, rightNum.value);
       } else {
         foldedValue = foldNums(leftNum.value, rightNum.value);
       }
       // A division by 0 means that we might not have a folded value.
       if (foldedValue == null) return null;
-      if (left.isInt() && right.isInt() && !isDivide() ||
+      if (left.isInt && right.isInt && !isDivide() ||
           isTruncatingDivide()) {
         assert(foldedValue is int);
         return DART_CONSTANT_SYSTEM.createInt(foldedValue);
@@ -221,12 +221,12 @@
   final String name = '+';
   const AddOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isInt() && right.isInt()) {
+    if (left.isInt && right.isInt) {
       IntConstant leftInt = left;
       IntConstant rightInt = right;
       int result = leftInt.value + rightInt.value;
       return DART_CONSTANT_SYSTEM.createInt(result);
-    } else if (left.isNum() && right.isNum()) {
+    } else if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       double result = leftNum.value + rightNum.value;
@@ -241,7 +241,7 @@
 abstract class RelationalNumOperation implements BinaryOperation {
   const RelationalNumOperation();
   Constant fold(Constant left, Constant right) {
-    if (!left.isNum() || !right.isNum()) return null;
+    if (!left.isNum || !right.isNum) return null;
     NumConstant leftNum = left;
     NumConstant rightNum = right;
     bool foldedValue = foldNums(leftNum.value, rightNum.value);
@@ -284,7 +284,7 @@
   final String name = '==';
   const EqualsOperation();
   Constant fold(Constant left, Constant right) {
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       // Numbers need to be treated specially because: NaN != NaN, -0.0 == 0.0,
       // and 1 == 1.0.
       NumConstant leftNum = left;
@@ -292,7 +292,7 @@
       bool result = leftNum.value == rightNum.value;
       return DART_CONSTANT_SYSTEM.createBool(result);
     }
-    if (left.isConstructedObject()) {
+    if (left.isConstructedObject) {
       // Unless we know that the user-defined object does not implement the
       // equality operator we cannot fold here.
       return null;
@@ -309,7 +309,7 @@
     // In order to preserve runtime semantics which says that NaN !== NaN don't
     // constant fold NaN === NaN. Otherwise the output depends on inlined
     // variables and other optimizations.
-    if (left.isNaN() && right.isNaN()) return null;
+    if (left.isNaN && right.isNaN) return null;
     return DART_CONSTANT_SYSTEM.createBool(left == right);
   }
   apply(left, right) => identical(left, right);
@@ -353,11 +353,11 @@
   BoolConstant createBool(bool value) => new BoolConstant(value);
   NullConstant createNull() => new NullConstant();
 
-  bool isInt(Constant constant) => constant.isInt();
-  bool isDouble(Constant constant) => constant.isDouble();
-  bool isString(Constant constant) => constant.isString();
-  bool isBool(Constant constant) => constant.isBool();
-  bool isNull(Constant constant) => constant.isNull();
+  bool isInt(Constant constant) => constant.isInt;
+  bool isDouble(Constant constant) => constant.isDouble;
+  bool isString(Constant constant) => constant.isString;
+  bool isBool(Constant constant) => constant.isBool;
+  bool isNull(Constant constant) => constant.isNull;
 
   bool isSubtype(Compiler compiler, DartType s, DartType t) {
     return compiler.types.isSubtype(s, t);
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 213f28b..b5bb3c0 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -23,31 +23,30 @@
 abstract class Constant {
   const Constant();
 
-  // TODO: Make all the isXXX in Constant checks getters.
-  bool isNull() => false;
-  bool isBool() => false;
-  bool isTrue() => false;
-  bool isFalse() => false;
-  bool isInt() => false;
-  bool isDouble() => false;
-  bool isNum() => false;
-  bool isString() => false;
-  bool isList() => false;
-  bool isMap() => false;
-  bool isConstructedObject() => false;
-  bool isFunction() => false;
+  bool get isNull => false;
+  bool get isBool => false;
+  bool get isTrue => false;
+  bool get isFalse => false;
+  bool get isInt => false;
+  bool get isDouble => false;
+  bool get isNum => false;
+  bool get isString => false;
+  bool get isList => false;
+  bool get isMap => false;
+  bool get isConstructedObject => false;
+  bool get isFunction => false;
   /** Returns true if the constant is null, a bool, a number or a string. */
-  bool isPrimitive() => false;
+  bool get isPrimitive => false;
   /** Returns true if the constant is a list, a map or a constructed object. */
-  bool isObject() => false;
-  bool isType() => false;
-  bool isInterceptor() => false;
-  bool isDummy() => false;
+  bool get isObject => false;
+  bool get isType => false;
+  bool get isInterceptor => false;
+  bool get isDummy => false;
 
-  bool isNaN() => false;
-  bool isMinusZero() => false;
-  bool isZero() => false;
-  bool isOne() => false;
+  bool get isNaN => false;
+  bool get isMinusZero => false;
+  bool get isZero => false;
+  bool get isOne => false;
 
   // TODO(johnniwinther): Replace with a 'type' getter.
   DartType computeType(Compiler compiler);
@@ -64,7 +63,7 @@
 
   FunctionConstant(this.element);
 
-  bool isFunction() => true;
+  bool get isFunction => true;
 
   bool operator ==(var other) {
     if (other is !FunctionConstant) return false;
@@ -92,7 +91,7 @@
 abstract class PrimitiveConstant extends Constant {
   get value;
   const PrimitiveConstant();
-  bool isPrimitive() => true;
+  bool get isPrimitive => true;
 
   bool operator ==(var other) {
     if (other is !PrimitiveConstant) return false;
@@ -115,7 +114,7 @@
 
   factory NullConstant() => const NullConstant._internal();
   const NullConstant._internal();
-  bool isNull() => true;
+  bool get isNull => true;
   get value => null;
 
   DartType computeType(Compiler compiler) {
@@ -136,7 +135,7 @@
 abstract class NumConstant extends PrimitiveConstant {
   num get value;
   const NumConstant();
-  bool isNum() => true;
+  bool get isNum => true;
 }
 
 class IntConstant extends NumConstant {
@@ -160,15 +159,15 @@
     }
   }
   const IntConstant._internal(this.value);
-  bool isInt() => true;
+  bool get isInt => true;
   bool isUInt31() => value >= 0 && value < (1 << 31);
   bool isUInt32() => value >= 0 && value < (1 << 32);
   bool isPositive() => value >= 0;
-  bool isZero() => value == 0;
-  bool isOne() => value == 1;
+  bool get isZero => value == 0;
+  bool get isOne => value == 1;
 
   DartType computeType(Compiler compiler) {
-    return compiler.intClass.computeType(compiler);
+    return compiler.intClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -212,15 +211,15 @@
     }
   }
   const DoubleConstant._internal(this.value);
-  bool isDouble() => true;
-  bool isNaN() => value.isNaN;
+  bool get isDouble => true;
+  bool get isNaN => value.isNaN;
   // We need to check for the negative sign since -0.0 == 0.0.
-  bool isMinusZero() => value == 0.0 && value.isNegative;
-  bool isZero() => value == 0.0;
-  bool isOne() => value == 1.0;
+  bool get isMinusZero => value == 0.0 && value.isNegative;
+  bool get isZero => value == 0.0;
+  bool get isOne => value == 1.0;
 
   DartType computeType(Compiler compiler) {
-    return compiler.doubleClass.computeType(compiler);
+    return compiler.doubleClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -228,7 +227,7 @@
     // -0.0 is an integer.
     // TODO(17235): this kind of special casing should only happen in the
     // backend.
-    if (isMinusZero() && compiler.backend.constantSystem.isInt(this)) {
+    if (isMinusZero && compiler.backend.constantSystem.isInt(this)) {
       return compiler.typesTask.uint31Type;
     }
     assert(!compiler.backend.constantSystem.isInt(this));
@@ -259,10 +258,10 @@
     return value ? new TrueConstant() : new FalseConstant();
   }
   const BoolConstant._internal();
-  bool isBool() => true;
+  bool get isBool => true;
 
   DartType computeType(Compiler compiler) {
-    return compiler.boolClass.computeType(compiler);
+    return compiler.boolClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -277,7 +276,7 @@
 
   factory TrueConstant() => const TrueConstant._internal();
   const TrueConstant._internal() : super._internal();
-  bool isTrue() => true;
+  bool get isTrue => true;
 
   FalseConstant negate() => new FalseConstant();
 
@@ -295,7 +294,7 @@
 
   factory FalseConstant() => const FalseConstant._internal();
   const FalseConstant._internal() : super._internal();
-  bool isFalse() => true;
+  bool get isFalse => true;
 
   TrueConstant negate() => new TrueConstant();
 
@@ -318,10 +317,10 @@
   StringConstant(DartString value)
       : this.value = value,
         this.hashCode = value.slowToString().hashCode;
-  bool isString() => true;
+  bool get isString => true;
 
   DartType computeType(Compiler compiler) {
-    return compiler.stringClass.computeType(compiler);
+    return compiler.stringClass.rawType;
   }
 
   ti.TypeMask computeMask(Compiler compiler) {
@@ -349,7 +348,7 @@
 
   ObjectConstant(this.type);
 
-  bool isObject() => true;
+  bool get isObject => true;
 
   DartType computeType(Compiler compiler) => type;
 }
@@ -360,7 +359,7 @@
 
   TypeConstant(this.representedType, type) : super(type);
 
-  bool isType() => true;
+  bool get isType => true;
 
   bool operator ==(other) {
     return other is TypeConstant && representedType == other.representedType;
@@ -387,7 +386,7 @@
       : this.entries = entries,
         hashCode = _computeHash(type, entries),
         super(type);
-  bool isList() => true;
+  bool get isList => true;
 
   static int _computeHash(DartType type, List<Constant> entries) {
     // TODO(floitsch): create a better hash.
@@ -463,7 +462,7 @@
       : this.values = values,
         this.hashCode = computeHash(type, values),
         super(type);
-  bool isMap() => true;
+  bool get isMap => true;
 
   static int computeHash(DartType type, List<Constant> values) {
     // TODO(floitsch): create a better hash.
@@ -529,7 +528,7 @@
 
   InterceptorConstant(this.dispatchedType);
 
-  bool isInterceptor() => true;
+  bool get isInterceptor => true;
 
   bool operator ==(other) {
     return other is InterceptorConstant
@@ -558,7 +557,7 @@
 
   DummyConstant(this.typeMask);
 
-  bool isDummy() => true;
+  bool get isDummy => true;
 
   bool operator ==(other) {
     return other is DummyConstant
@@ -590,7 +589,7 @@
       super(type) {
     assert(type != null);
   }
-  bool isConstructedObject() => true;
+  bool get isConstructedObject => true;
 
   static int computeHash(DartType type, List<Constant> fields) {
     // TODO(floitsch): create a better hash.
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index ed9fd82..5c058f4 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -17,7 +17,8 @@
          CompilationUnitElementX,
          LibraryElementX,
          PrefixElementX,
-         VoidElementX;
+         VoidElementX,
+         AnalyzableElement;
 import 'js_backend/js_backend.dart' as js_backend;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index 57e36da..19c3976 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -59,17 +59,17 @@
    */
   bool isSafeToRemoveTypeDeclarations(
       Map<ClassElement, Set<Element>> classMembers) {
+    ClassElement typeErrorElement = compiler.coreLibrary.find('TypeError');
+    if (classMembers.containsKey(typeErrorElement) ||
+        compiler.resolverWorld.isChecks.any(
+            (DartType type) => type.element == typeErrorElement)) {
+      return false;
+    }
     Set<DartType> processedTypes = new Set<DartType>();
     List<DartType> workQueue = new List<DartType>();
     workQueue.addAll(
         classMembers.keys.map((classElement) => classElement.thisType));
     workQueue.addAll(compiler.resolverWorld.isChecks);
-    Element typeErrorElement =
-        compiler.coreLibrary.find('TypeError');
-    DartType typeErrorType = typeErrorElement.computeType(compiler);
-    if (workQueue.indexOf(typeErrorType) != -1) {
-      return false;
-    }
 
     while (!workQueue.isEmpty) {
       DartType type = workQueue.removeLast();
@@ -302,14 +302,8 @@
       SynthesizedConstructorElementX constructor =
           new SynthesizedConstructorElementX(
               classElement.name, null, classElement, false);
-      constructor.type = new FunctionType(
-          constructor,
-          compiler.types.voidType,
-          const Link<DartType>(),
-          const Link<DartType>(),
-          const Link<String>(),
-          const Link<DartType>()
-          );
+      constructor.typeCache =
+          new FunctionType(constructor, compiler.types.voidType);
       constructor.cachedNode = new FunctionExpression(
           new Send(classNode.name, synthesizedIdentifier),
           new NodeList(new StringToken.fromString(OPEN_PAREN_INFO, '(', -1),
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 6faf905..528673f 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -392,7 +392,7 @@
       // Do not forget to rename them as well.
       FunctionElement constructorFunction = constructor;
       Link<Element> optionalParameters =
-          constructorFunction.computeSignature(compiler).optionalParameters;
+          constructorFunction.functionSignature.optionalParameters;
       for (final argument in send.argumentsNode) {
         NamedArgument named = argument.asNamedArgument();
         if (named == null) continue;
diff --git a/sdk/lib/_internal/compiler/implementation/dart_types.dart b/sdk/lib/_internal/compiler/implementation/dart_types.dart
index aedc7ea..4177c5b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_types.dart
@@ -8,7 +8,11 @@
 
 import 'dart2jslib.dart' show Compiler, invariant, Script, Message;
 import 'elements/modelx.dart'
-    show VoidElementX, LibraryElementX, BaseClassElementX;
+    show VoidElementX,
+         LibraryElementX,
+         BaseClassElementX,
+         TypeDeclarationElementX,
+         TypedefElementX;
 import 'elements/elements.dart';
 import 'ordered_typeset.dart' show OrderedTypeSet;
 import 'util/util.dart' show Link, LinkBuilder, CURRENT_ELEMENT_SPANNABLE;
@@ -356,11 +360,20 @@
 }
 
 abstract class GenericType extends DartType {
+  final TypeDeclarationElement element;
   final Link<DartType> typeArguments;
 
-  GenericType(Link<DartType> this.typeArguments);
-
-  TypeDeclarationElement get element;
+  GenericType(TypeDeclarationElementX element,
+              Link<DartType> this.typeArguments,
+              {bool checkTypeArgumentCount: true})
+      : this.element = element {
+    assert(invariant(element,
+        !checkTypeArgumentCount ||
+        element.thisTypeCache == null ||
+        typeArguments.slowLength() == element.typeVariables.slowLength(),
+        message: () => 'Invalid type argument count on ${element.thisType}. '
+                       'Provided type arguments: $typeArguments.'));
+  }
 
   /// Creates a new instance of this type using the provided type arguments.
   GenericType createInstantiation(Link<DartType> newTypeArguments);
@@ -444,22 +457,18 @@
 }
 
 class InterfaceType extends GenericType {
-  final ClassElement element;
-
-  InterfaceType(this.element,
+  InterfaceType(BaseClassElementX element,
                 [Link<DartType> typeArguments = const Link<DartType>()])
-      : super(typeArguments) {
+      : super(element, typeArguments) {
     assert(invariant(element, element.isDeclaration));
-    assert(invariant(element, element.thisType == null ||
-        typeArguments.slowLength() == element.typeVariables.slowLength(),
-        message: () => 'Invalid type argument count on ${element.thisType}. '
-                       'Provided type arguments: $typeArguments.'));
   }
 
-  InterfaceType.forUserProvidedBadType(this.element,
+  InterfaceType.forUserProvidedBadType(BaseClassElementX element,
                                        [Link<DartType> typeArguments =
                                            const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments, checkTypeArgumentCount: false);
+
+  ClassElement get element => super.element;
 
   TypeKind get kind => TypeKind.INTERFACE;
 
@@ -749,27 +758,25 @@
 }
 
 class TypedefType extends GenericType {
-  final TypedefElement element;
-
-  // TODO(johnniwinther): Assert that the number of arguments and parameters
-  // match, like for [InterfaceType].
-  TypedefType(this.element,
+  TypedefType(TypedefElementX element,
               [Link<DartType> typeArguments = const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments);
 
-  TypedefType createInstantiation(Link<DartType> newTypeArguments) {
-    return new TypedefType(element, newTypeArguments);
-  }
-
-  TypedefType.forUserProvidedBadType(this.element,
+  TypedefType.forUserProvidedBadType(TypedefElementX element,
                                      [Link<DartType> typeArguments =
                                          const Link<DartType>()])
-      : super(typeArguments);
+      : super(element, typeArguments, checkTypeArgumentCount: false);
+
+  TypedefElement get element => super.element;
 
   TypeKind get kind => TypeKind.TYPEDEF;
 
   String get name => element.name;
 
+  TypedefType createInstantiation(Link<DartType> newTypeArguments) {
+    return new TypedefType(element, newTypeArguments);
+  }
+
   DartType unalias(Compiler compiler) {
     // TODO(ahe): This should be [ensureResolved].
     compiler.resolveTypedef(element);
@@ -1178,7 +1185,7 @@
     LibraryElement library = new LibraryElementX(new Script(null, null, null));
     VoidType voidType = new VoidType(new VoidElementX(library));
     DynamicType dynamicType = new DynamicType(dynamicElement);
-    dynamicElement.rawTypeCache = dynamicElement.thisType = dynamicType;
+    dynamicElement.rawTypeCache = dynamicElement.thisTypeCache = dynamicType;
     MoreSpecificVisitor moreSpecificVisitor =
         new MoreSpecificVisitor(compiler, dynamicType, voidType);
     SubtypeVisitor subtypeVisitor =
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 3e92c1c..08c1775 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -497,7 +497,7 @@
     for (Constant constant in allConstants) {
       // If the constant is not a "constructed" constant, it can stay where
       // it is.
-      if (!constant.isConstructedObject()) continue;
+      if (!constant.isConstructedObject) continue;
       OutputUnit constantUnit = _constantToOutputUnit[constant];
       Setlet<Import> constantImports = constantUnit.imports;
       ConstructedConstant constructed = constant;
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 63eb7ea..29f0ace 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -378,7 +378,7 @@
     }
     List contents = [];
     if (emittedCode != null) {
-      FunctionSignature signature = element.computeSignature(compiler);
+      FunctionSignature signature = element.functionSignature;
       signature.forEachParameter((parameter) {
         contents.add(new InferredInfoNode(
             description: "parameter",
@@ -412,7 +412,7 @@
       return null;
     }
     return new ElementInfoNode(
-        type: element.type.toString(),
+        type: element.computeType(compiler).toString(),
         kind: kindString,
         name: nameString,
         size: size,
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index 010438f..1615fcf 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -186,8 +186,7 @@
 
   /// Do not use [computeType] outside of the resolver; instead retrieve the
   /// type from the corresponding field:
-  /// - `variables.type` for fields and variables.
-  /// - `type` for function elements.
+  /// - `type` for fields, variables, type variable, and function elements.
   /// - `thisType` or `rawType` for [TypeDeclarationElement]s (classes and
   ///    typedefs), depending on the use case.
   /// Trying to access a type that has not been computed in resolution is an
@@ -279,6 +278,8 @@
 
   void diagnose(Element context, DiagnosticListener listener);
 
+  TreeElements get treeElements;
+
   accept(ElementVisitor visitor);
 }
 
@@ -765,7 +766,7 @@
   void checkCyclicReference(Compiler compiler);
 }
 
-abstract class VariableElement extends Element {
+abstract class VariableElement extends Element implements TypedElement {
   Expression get initializer;
 }
 
@@ -814,7 +815,8 @@
   bool isCompatibleWith(FunctionSignature constructorSignature);
 }
 
-abstract class FunctionElement extends Element implements ClosureContainer {
+abstract class FunctionElement extends Element
+    implements TypedElement, ClosureContainer {
   FunctionExpression get cachedNode;
   DartType get type;
   FunctionSignature get functionSignature;
@@ -838,10 +840,13 @@
   void set defaultImplementation(FunctionElement value);
 
   void setPatch(FunctionElement patchElement);
-  FunctionSignature computeSignature(Compiler compiler);
-  int requiredParameterCount(Compiler compiler);
-  int optionalParameterCount(Compiler compiler);
-  int parameterCount(Compiler compiler);
+
+  /// Do not use [computeSignature] outside of the resolver; instead retrieve
+  /// the signature through the [functionSignature] field.
+  /// Trying to access a function signature that has not been computed in
+  /// resolution is an error and calling [computeSignature] covers that error.
+  /// This method will go away!
+  @deprecated FunctionSignature computeSignature(Compiler compiler);
 
   FunctionExpression parseNode(DiagnosticListener listener);
 }
@@ -902,7 +907,6 @@
   bool get hasLocalScopeMembers;
 
   // TODO(kasperl): These are bit fishy. Do we really need them?
-  void set thisType(InterfaceType value);
   void set supertype(DartType value);
   void set interfaces(Link<DartType> value);
   void set patch(ClassElement value);
@@ -927,7 +931,7 @@
   /// Returns `true` if the class hierarchy for this class contains errors.
   bool get hasIncompleteHierarchy;
 
-  ClassElement ensureResolved(Compiler compiler);
+  void ensureResolved(Compiler compiler);
 
   void addMember(Element element, DiagnosticListener listener);
   void addToScope(Element element, DiagnosticListener listener);
@@ -1023,13 +1027,14 @@
   LabelElement addLabel(Label label, String labelName);
 }
 
-abstract class TypeVariableElement extends Element {
+/// The [Element] for a type variable declaration on a generic class or typedef.
+abstract class TypeVariableElement extends Element implements TypedElement {
+  /// The [type] defined by the type variable.
   TypeVariableType get type;
-  DartType get bound;
 
-  // TODO(kasperl): Try to get rid of these.
-  void set type(TypeVariableType value);
-  void set bound(DartType value);
+  /// The upper bound on the type variable. If not explicitly declared, this is
+  /// `Object`.
+  DartType get bound;
 }
 
 abstract class MetadataAnnotation implements Spannable {
@@ -1048,6 +1053,11 @@
 
 abstract class VoidElement extends Element {}
 
+/// An [Element] that has a type.
+abstract class TypedElement extends Element {
+  DartType get type;
+}
+
 /// A [MemberSignature] is a member of an interface.
 ///
 /// A signature is either a method or a getter or setter, possibly implicitly
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 707aaa8..eb48b99 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -67,6 +67,7 @@
     metadata = metadata.prepend(annotation);
   }
 
+
   bool isFunction() => identical(kind, ElementKind.FUNCTION);
   bool isConstructor() => isFactoryConstructor() || isGenerativeConstructor();
   bool isClosure() => false;
@@ -298,6 +299,8 @@
   FunctionElement get targetConstructor => null;
 
   void diagnose(Element context, DiagnosticListener listener) {}
+
+  TreeElements get treeElements => enclosingElement.treeElements;
 }
 
 /**
@@ -577,7 +580,7 @@
   }
 }
 
-class CompilationUnitElementX extends ElementX
+class CompilationUnitElementX extends ElementX with AnalyzableElement
     implements CompilationUnitElement {
   final Script script;
   PartOf partTag;
@@ -750,7 +753,8 @@
   Element operator [](String name) => importScope[name];
 }
 
-class LibraryElementX extends ElementX implements LibraryElement {
+class LibraryElementX extends ElementX with AnalyzableElement
+    implements LibraryElement {
   final Uri canonicalUri;
   CompilationUnitElement entryCompilationUnit;
   Link<CompilationUnitElement> compilationUnits =
@@ -1043,30 +1047,12 @@
   }
 }
 
-class TypedefElementX extends ElementX implements TypedefElement {
+class TypedefElementX extends ElementX
+    with AnalyzableElement, TypeDeclarationElementX<TypedefType>
+    implements TypedefElement {
   Typedef cachedNode;
 
   /**
-   * The type of this typedef in which the type arguments are the type
-   * variables.
-   *
-   * This resembles the [ClassElement.thisType] though a typedef has no notion
-   * of [:this:].
-   *
-   * This type is computed in [computeType].
-   */
-  TypedefType thisType;
-
-  /**
-   * Canonicalized raw version of [thisType].
-   *
-   * See [ClassElement.rawType] for motivation.
-   *
-   * The [rawType] is computed together with [thisType] in [computeType].
-   */
-  TypedefType rawType;
-
-  /**
    * The type annotation which defines this typedef.
    */
   DartType alias;
@@ -1074,10 +1060,7 @@
   /// [:true:] if the typedef has been checked for cyclic reference.
   bool hasBeenCheckedForCycles = false;
 
-  bool get isResolved => mapping != null;
-
-  // TODO(johnniwinther): Store the mapping in the resolution enqueuer instead.
-  TreeElements mapping;
+  bool get isResolved => hasTreeElements;
 
   TypedefElementX(String name, Element enclosing)
       : super(name, ElementKind.TYPEDEF, enclosing);
@@ -1093,26 +1076,16 @@
   FunctionSignature functionSignature;
 
   TypedefType computeType(Compiler compiler) {
-    if (thisType != null) return thisType;
+    if (thisTypeCache != null) return thisTypeCache;
     Typedef node = parseNode(compiler);
-    Link<DartType> parameters =
-        TypeDeclarationElementX.createTypeVariables(this, node.typeParameters);
-    thisType = new TypedefType(this, parameters);
-    if (parameters.isEmpty) {
-      rawType = thisType;
-    } else {
-      var dynamicParameters = const Link<DartType>();
-      parameters.forEach((_) {
-        dynamicParameters =
-            dynamicParameters.prepend(compiler.types.dynamicType);
-      });
-      rawType = new TypedefType(this, dynamicParameters);
-    }
+    setThisAndRawTypes(compiler, createTypeVariables(node.typeParameters));
     compiler.resolveTypedef(this);
-    return thisType;
+    return thisTypeCache;
   }
 
-  Link<DartType> get typeVariables => thisType.typeArguments;
+  TypedefType createType(Link<DartType> typeArguments) {
+    return new TypedefType(this, typeArguments);
+  }
 
   Scope buildScope() {
     return new TypeDeclarationScope(enclosingElement.buildScope(), this);
@@ -1152,7 +1125,8 @@
   DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX implements VariableElement {
+class VariableElementX extends ElementX with AnalyzableElement
+    implements VariableElement {
   final Token token;
   final VariableList variables;
   VariableDefinitions definitionsCache;
@@ -1236,6 +1210,12 @@
     return variables.computeType(this, compiler);
   }
 
+  DartType get type {
+    assert(invariant(this, variables.type != null,
+        message: "Type has not been computed for $this."));
+    return variables.type;
+  }
+
   bool isInstanceMember() => isMember() && !modifiers.isStatic();
 
   // Note: cachedNode.getBeginToken() will not be correct in all
@@ -1489,9 +1469,10 @@
   }
 }
 
-class FunctionElementX extends ElementX implements FunctionElement {
+class FunctionElementX extends ElementX with AnalyzableElement
+    implements FunctionElement {
   FunctionExpression cachedNode;
-  DartType type;
+  DartType typeCache;
   final Modifiers modifiers;
 
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
@@ -1622,10 +1603,16 @@
   }
 
   FunctionType computeType(Compiler compiler) {
-    if (type != null) return type;
-    type = compiler.computeFunctionType(declaration,
-                                        computeSignature(compiler));
-    return type;
+    if (typeCache != null) return typeCache;
+    typeCache = compiler.computeFunctionType(declaration,
+                                             computeSignature(compiler));
+    return typeCache;
+  }
+
+  FunctionType get type {
+    assert(invariant(this, typeCache != null,
+        message: "Type has not been computed for $this."));
+    return typeCache;
   }
 
   FunctionExpression parseNode(DiagnosticListener listener) {
@@ -1767,49 +1754,25 @@
   accept(ElementVisitor visitor) => visitor.visitVoidElement(this);
 }
 
-class TypeDeclarationElementX {
+abstract class TypeDeclarationElementX<T extends GenericType>
+    implements TypeDeclarationElement {
   /**
-   * Creates the type variables, their type and corresponding element, for the
-   * type variables declared in [parameter] on [element]. The bounds of the type
-   * variables are not set until [element] has been resolved.
-   */
-  static Link<DartType> createTypeVariables(TypeDeclarationElement element,
-                                            NodeList parameters) {
-    if (parameters == null) return const Link<DartType>();
-
-    // Create types and elements for type variable.
-    var arguments = new LinkBuilder<DartType>();
-    for (Link link = parameters.nodes; !link.isEmpty; link = link.tail) {
-      TypeVariable node = link.head;
-      String variableName = node.name.source;
-      TypeVariableElement variableElement =
-          new TypeVariableElementX(variableName, element, node);
-      TypeVariableType variableType = new TypeVariableType(variableElement);
-      variableElement.type = variableType;
-      arguments.addLast(variableType);
-    }
-    return arguments.toLink();
-  }
-}
-
-abstract class BaseClassElementX extends ElementX implements ClassElement {
-  final int id;
-
-  /**
-   * The type of [:this:] for this class declaration.
+   * The `this type` for this type declaration.
    *
-   * The type of [:this:] is the interface type based on this element in which
+   * The type of [:this:] is the generic type based on this element in which
    * the type arguments are the declared type variables. For instance,
    * [:List<E>:] for [:List:] and [:Map<K,V>:] for [:Map:].
    *
+   * For a class declaration this is the type of [:this:].
+   *
    * This type is computed in [computeType].
    */
-  InterfaceType thisType;
+  T thisTypeCache;
 
   /**
-   * The raw type for this class declaration.
+   * The raw type for this type declaration.
    *
-   * The raw type is the interface type base on this element in which the type
+   * The raw type is the generic type base on this element in which the type
    * arguments are all [dynamic]. For instance [:List<dynamic>:] for [:List:]
    * and [:Map<dynamic,dynamic>:] for [:Map:]. For non-generic classes [rawType]
    * is the same as [thisType].
@@ -1824,7 +1787,70 @@
    *
    * This type is computed together with [thisType] in [computeType].
    */
-  InterfaceType rawTypeCache;
+  T rawTypeCache;
+
+  T get thisType {
+    assert(invariant(this, thisTypeCache != null,
+                     message: 'This type has not been computed for $this'));
+    return thisTypeCache;
+  }
+
+  T get rawType {
+    assert(invariant(this, rawTypeCache != null,
+                     message: 'Raw type has not been computed for $this'));
+    return rawTypeCache;
+  }
+
+  T createType(Link<DartType> typeArguments);
+
+  void setThisAndRawTypes(Compiler compiler, Link<DartType> typeParameters) {
+    assert(invariant(this, thisTypeCache == null,
+        message: "This type has already been set on $this."));
+    assert(invariant(this, rawTypeCache == null,
+        message: "Raw type has already been set on $this."));
+    thisTypeCache = createType(typeParameters);
+    if (typeParameters.isEmpty) {
+      rawTypeCache = thisTypeCache;
+    } else {
+      Link<DartType> dynamicParameters = const Link<DartType>();
+      typeParameters.forEach((_) {
+        dynamicParameters =
+            dynamicParameters.prepend(compiler.types.dynamicType);
+      });
+      rawTypeCache = createType(dynamicParameters);
+    }
+  }
+
+  Link<DartType> get typeVariables => thisType.typeArguments;
+
+  /**
+   * Creates the type variables, their type and corresponding element, for the
+   * type variables declared in [parameter] on [element]. The bounds of the type
+   * variables are not set until [element] has been resolved.
+   */
+  Link<DartType> createTypeVariables(NodeList parameters) {
+    if (parameters == null) return const Link<DartType>();
+
+    // Create types and elements for type variable.
+    LinkBuilder<DartType> arguments = new LinkBuilder<DartType>();
+    for (Link<Node> link = parameters.nodes; !link.isEmpty; link = link.tail) {
+      TypeVariable node = link.head;
+      String variableName = node.name.source;
+      TypeVariableElementX variableElement =
+          new TypeVariableElementX(variableName, this, node);
+      TypeVariableType variableType = new TypeVariableType(variableElement);
+      variableElement.typeCache = variableType;
+      arguments.addLast(variableType);
+    }
+    return arguments.toLink();
+  }
+}
+
+abstract class BaseClassElementX extends ElementX
+    with AnalyzableElement, TypeDeclarationElementX<InterfaceType>
+    implements ClassElement {
+  final int id;
+
   DartType supertype;
   Link<DartType> interfaces;
   String nativeTagInfo;
@@ -1865,40 +1891,26 @@
 
   bool get isUnnamedMixinApplication => false;
 
+  InterfaceType computeType(Compiler compiler) {
+    if (thisTypeCache == null) {
+      computeThisAndRawType(compiler, computeTypeParameters(compiler));
+    }
+    return thisTypeCache;
+  }
+
   void computeThisAndRawType(Compiler compiler, Link<DartType> typeVariables) {
-    if (thisType == null) {
+    if (thisTypeCache == null) {
       if (origin == null) {
-        Link<DartType> parameters = typeVariables;
-        thisType = new InterfaceType(this, parameters);
-        if (parameters.isEmpty) {
-          rawTypeCache = thisType;
-        } else {
-          var dynamicParameters = const Link<DartType>();
-          parameters.forEach((_) {
-            dynamicParameters =
-                dynamicParameters.prepend(compiler.types.dynamicType);
-          });
-          rawTypeCache = new InterfaceType(this, dynamicParameters);
-        }
+        setThisAndRawTypes(compiler, typeVariables);
       } else {
-        thisType = origin.computeType(compiler);
+        thisTypeCache = origin.computeType(compiler);
         rawTypeCache = origin.rawType;
       }
     }
   }
 
-  // TODO(johnniwinther): Add [thisType] getter similar to [rawType].
-  InterfaceType computeType(Compiler compiler) {
-    if (thisType == null) {
-      computeThisAndRawType(compiler, computeTypeParameters(compiler));
-    }
-    return thisType;
-  }
-
-  InterfaceType get rawType {
-    assert(invariant(this, rawTypeCache != null,
-                     message: 'Raw type has not been computed for $this'));
-    return rawTypeCache;
+  InterfaceType createType(Link<DartType> typeArguments) {
+    return new InterfaceType(this, typeArguments);
   }
 
   Link<DartType> computeTypeParameters(Compiler compiler);
@@ -1909,13 +1921,10 @@
   bool isObject(Compiler compiler) =>
       identical(declaration, compiler.objectClass);
 
-  Link<DartType> get typeVariables => thisType.typeArguments;
-
-  ClassElement ensureResolved(Compiler compiler) {
+  void ensureResolved(Compiler compiler) {
     if (resolutionState == STATE_NOT_STARTED) {
       compiler.resolver.resolveClass(this);
     }
-    return this;
   }
 
   void setDefaultConstructor(FunctionElement constructor, Compiler compiler);
@@ -2299,8 +2308,7 @@
 
   Link<DartType> computeTypeParameters(Compiler compiler) {
     ClassNode node = parseNode(compiler);
-    return TypeDeclarationElementX.createTypeVariables(
-        this, node.typeParameters);
+    return createTypeVariables(node.typeParameters);
   }
 
   Scope buildScope() => new ClassScope(enclosingElement.buildScope(), this);
@@ -2399,8 +2407,7 @@
           "Type variables on unnamed mixin applications must be set on "
           "creation.");
     }
-    return TypeDeclarationElementX.createTypeVariables(
-        this, named.typeParameters);
+    return createTypeVariables(named.typeParameters);
   }
 
   accept(ElementVisitor visitor) => visitor.visitMixinApplicationElement(this);
@@ -2476,15 +2483,26 @@
 
 class TypeVariableElementX extends ElementX implements TypeVariableElement {
   final Node cachedNode;
-  TypeVariableType type;
-  DartType bound;
+  TypeVariableType typeCache;
+  DartType boundCache;
 
-  TypeVariableElementX(String name, Element enclosing, this.cachedNode,
-                       [this.type, this.bound])
+  TypeVariableElementX(String name, Element enclosing, this.cachedNode)
     : super(name, ElementKind.TYPE_VARIABLE, enclosing);
 
   TypeVariableType computeType(compiler) => type;
 
+  TypeVariableType get type {
+    assert(invariant(this, typeCache != null,
+        message: "Type has not been set on $this."));
+    return typeCache;
+  }
+
+  DartType get bound {
+    assert(invariant(this, boundCache != null,
+        message: "Bound has not been set on $this."));
+    return boundCache;
+  }
+
   Node parseNode(compiler) => cachedNode;
 
   String toString() => "${enclosingElement.toString()}.${name}";
@@ -2558,3 +2576,4 @@
 
   Token get endToken => metadata.getEndToken();
 }
+
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index 85c558e..c700d59 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -631,6 +631,8 @@
   }
 
   void internalAddToWorkList(Element element) {
+    assert(invariant(element, element is AnalyzableElement,
+        message: 'Element $element is not analyzable.'));
     if (getCachedElements(element) != null) return;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 3533dcc..e926165 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -1573,7 +1573,7 @@
       FunctionElement function,
       ArgumentsTypes<ConcreteType> argumentsTypes) {
     final Map<Element, ConcreteType> result = new Map<Element, ConcreteType>();
-    final FunctionSignature signature = function.computeSignature(compiler);
+    final FunctionSignature signature = function.functionSignature;
 
     // guard 1: too many arguments
     if (argumentsTypes.length > signature.parameterCount) {
@@ -1798,7 +1798,7 @@
                                    ConcreteTypesEnvironment environment) {
     // We trust the return type of native elements
     if (isNativeElement(element)) {
-      var elementType = element.computeType(compiler);
+      var elementType = element.type;
       assert(elementType.kind == TypeKind.FUNCTION);
       return typeOfNativeBehavior(
           native.NativeBehavior.ofMethod(element, compiler));
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index f15a77f..5b7a33d 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -369,10 +369,10 @@
     }
   }
 
-  void update(Element local, T type, Node node) {
+  void update(TypedElement local, T type, Node node) {
     assert(type != null);
     if (compiler.trustTypeAnnotations || compiler.enableTypeAssertions) {
-      type = types.narrowType(type, local.computeType(compiler));
+      type = types.narrowType(type, local.type);
     }
     updateLocal() {
       T currentType = locals[local];
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index 03d318f..0cae963 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -470,7 +470,7 @@
     }
 
     FunctionElement function = analyzedElement;
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.forEachOptionalParameter((element) {
       ast.Expression defaultValue = element.initializer;
       T type = (defaultValue == null) ? types.nullType : visit(defaultValue);
@@ -947,7 +947,7 @@
                && compiler.world.fieldNeverChanges(element)) {
       var constant =
           compiler.constantHandler.getConstantForVariable(element);
-      if (constant != null && constant.isInt()) {
+      if (constant != null && constant.isInt) {
         return constant.value;
       }
     }
@@ -1180,8 +1180,8 @@
   T synthesizeForwardingCall(Spannable node, FunctionElement element) {
     element = element.implementation;
     FunctionElement function = analyzedElement;
-    FunctionSignature signature = function.computeSignature(compiler);
-    FunctionSignature calleeSignature = element.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
+    FunctionSignature calleeSignature = element.functionSignature;
     if (!calleeSignature.isCompatibleWith(signature)) {
       return types.nonNullEmpty();
     }
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index bac4d44..cfe1661 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -646,7 +646,7 @@
             Constant value =
                 compiler.constantHandler.getConstantForVariable(element);
             if (value != null) {
-              if (value.isFunction()) {
+              if (value.isFunction) {
                 FunctionConstant functionConstant = value;
                 type = types.allocateClosure(node, functionConstant.element);
               } else {
@@ -761,7 +761,7 @@
           types.allocatedClosures.add(info);
         }
         FunctionElement function = callee.implementation;
-        FunctionSignature signature = function.computeSignature(compiler);
+        FunctionSignature signature = function.functionSignature;
         signature.forEachParameter((Element parameter) {
           ElementTypeInformation info = types.getInferredTypeOf(parameter);
           info.giveUp(this, clearAssignments: false);
@@ -770,7 +770,7 @@
       }
     } else {
       FunctionElement function = callee.implementation;
-      FunctionSignature signature = function.computeSignature(compiler);
+      FunctionSignature signature = function.functionSignature;
       int parameterIndex = 0;
       bool visitingRequiredParameter = true;
       signature.forEachParameter((Element parameter) {
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index b411f48..2c45b4a 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -325,7 +325,8 @@
         assert(element.isFunction() ||
                element.isGetter() ||
                element.isSetter());
-        var elementType = element.computeType(inferrer.compiler);
+        TypedElement typedElement = element;
+        var elementType = typedElement.type;
         if (elementType.kind != TypeKind.FUNCTION) {
           return type;
         } else {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 2f0f639..1b87d53 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -10,7 +10,7 @@
 import '../source_file.dart';
 import '../tree/tree.dart' as ast;
 import '../scanner/scannerlib.dart' show Token;
-import '../js_backend/js_backend.dart' show JavaScriptBackend;
+import '../dart_backend/dart_backend.dart' show DartBackend;
 import 'ir_pickler.dart' show Unpickler, IrConstantPool;
 
 /**
@@ -81,7 +81,6 @@
             nodes[element] = function;
           }
         }
-        ensureIr(element);
       });
     });
   }
@@ -89,7 +88,7 @@
   bool irEnabled() {
     // TODO(lry): support checked-mode checks.
     if (compiler.enableTypeAssertions ||
-        compiler.backend is !JavaScriptBackend ||
+        compiler.backend is !DartBackend ||
         compiler.enableConcreteTypeInference) {
       return false;
     }
@@ -102,20 +101,12 @@
     if (function == null) return false;
 
     // TODO(lry): support functions with parameters.
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     if (signature.parameterCount > 0) return false;
 
-    // TODO(lry): support intercepted methods. Then the dependency on
-    // JavaScriptBackend will go away.
-    JavaScriptBackend backend = compiler.backend;
-    if (backend.isInterceptedMethod(element)) return false;
-
     // TODO(lry): support native functions (also in [visitReturn]).
     if (function.isNative()) return false;
 
-    // Methods annotated @IrRepresentation(false).
-    if (enforceAstRepresentation(function)) return false;
-
     return true;
   }
 
@@ -125,50 +116,6 @@
     return result;
   }
 
-  bool enforceAstRepresentation(Element element) {
-    return irRepresentationValue(element, false);
-  }
-
-  bool enforceIrRepresentation(Element element) {
-    return irRepresentationValue(element, true);
-  }
-
-  /**
-   * In host-checked mode, the @IrRepresentation annotation can be used to
-   * enforce the internal representation of a function.
-   */
-  bool irRepresentationValue(Element element, bool expected) {
-    if (!inCheckedMode || compiler.backend is !JavaScriptBackend) return false;
-    JavaScriptBackend backend = compiler.backend;
-    for (MetadataAnnotation metadata in element.metadata) {
-      if (metadata.value == null ||
-          !metadata.value.isConstructedObject()) {
-        continue;
-      }
-      ObjectConstant value = metadata.value;
-      ClassElement cls = value.type.element;
-      if (cls == backend.irRepresentationClass) {
-        ConstructedConstant classConstant = value;
-        BoolConstant constant = classConstant.fields[0];
-        return constant.value == expected;
-      }
-    }
-    return false;
-  }
-
-  void ensureIr(Element element) {
-    // If no IR was built for [element], ensure it is not annotated
-    // @IrRepresentation(true).
-    if (inCheckedMode &&
-        !compiler.irBuilder.hasIr(element) &&
-        enforceIrRepresentation(element)) {
-      compiler.reportFatalError(
-          element,
-          MessageKind.GENERIC,
-          {'text': "Error: cannot build IR for $element."});
-    }
-  }
-
   SourceFile elementSourceFile(Element element) {
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
@@ -183,10 +130,10 @@
  * to the [builder] and return the last added statement for trees that represent
  * an expression.
  */
-class IrBuilder extends ResolvedVisitor<ir.Trivial> {
+class IrBuilder extends ResolvedVisitor<ir.Definition> {
   final SourceFile sourceFile;
   ir.Continuation returnContinuation = null;
-  
+
   // The IR builder maintains a context, which is an expression with a hole in
   // it.  The hole represents the focus where new expressions can be added.
   // The context is implemented by 'root' which is the root of the expression
@@ -202,17 +149,17 @@
   // expression and current is null.
   //
   // Conceptually again, visiting an expression takes a context as input and
-  // returns either a pair of a new context and a trivial expression denoting
+  // returns either a pair of a new context and a definition denoting
   // the expression's value, or else an expression without a hole if all
   // control-flow paths through the expression have exited.
   //
   // We do not pass and return contexts, rather we use the current context
   // (root, current) as the visitor state and mutate current.  Visiting a
   // statement returns null; visiting an expression optionally returns the
-  // trivial expression denoting its value.
+  // definition denoting its value.
   ir.Expression root = null;
   ir.Expression current = null;
-  
+
   IrBuilder(TreeElements elements, Compiler compiler, this.sourceFile)
       : super(elements, compiler);
 
@@ -258,7 +205,7 @@
       current = current.plug(expr);
     }
   }
-  
+
   /**
    * Add an explicit [:return null:] for functions that don't have a return
    * statement on each branch. This includes functions with an empty body,
@@ -271,13 +218,13 @@
     add(new ir.InvokeContinuation(returnContinuation, constant));
     current = null;
   }
-  
-  ir.Trivial visitEmptyStatement(ast.EmptyStatement node) {
+
+  ir.Definition visitEmptyStatement(ast.EmptyStatement node) {
     assert(isOpen);
     return null;
   }
 
-  ir.Trivial visitBlock(ast.Block node) {
+  ir.Definition visitBlock(ast.Block node) {
     assert(isOpen);
     for (var n in node.statements.nodes) {
       n.accept(this);
@@ -289,11 +236,11 @@
   // Build(Return)    = let val x = null in InvokeContinuation(return, x)
   // Build(Return(e)) = C[InvokeContinuation(return, x)]
   //   where (C, x) = Build(e)
-  ir.Trivial visitReturn(ast.Return node) {
+  ir.Definition visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
     if (node.beginToken.value == 'native') return giveup();
-    ir.Trivial value;
+    ir.Definition value;
     if (node.expression == null) {
       value = new ir.Constant(constantSystem.createNull());
       add(new ir.LetVal(value));
@@ -305,10 +252,10 @@
     current = null;
     return null;
   }
-  
+
   // For all simple literals:
   // Build(Literal(c)) = (let val x = Constant(c) in [], x)
-  ir.Trivial visitLiteralBool(ast.LiteralBool node) {
+  ir.Definition visitLiteralBool(ast.LiteralBool node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createBool(node.value));
@@ -316,7 +263,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralDouble(ast.LiteralDouble node) {
+  ir.Definition visitLiteralDouble(ast.LiteralDouble node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createDouble(node.value));
@@ -324,7 +271,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralInt(ast.LiteralInt node) {
+  ir.Definition visitLiteralInt(ast.LiteralInt node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createInt(node.value));
@@ -332,7 +279,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralString(ast.LiteralString node) {
+  ir.Definition visitLiteralString(ast.LiteralString node) {
     assert(isOpen);
     ir.Constant constant =
         new ir.Constant(constantSystem.createString(node.dartString));
@@ -340,7 +287,7 @@
     return constant;
   }
 
-  ir.Trivial visitLiteralNull(ast.LiteralNull node) {
+  ir.Definition visitLiteralNull(ast.LiteralNull node) {
     assert(isOpen);
     ir.Constant constant = new ir.Constant(constantSystem.createNull());
     add(new ir.LetVal(constant));
@@ -353,29 +300,29 @@
 //  IrNode visitLiteralMapEntry(LiteralMapEntry node) => visitNode(node);
 //  IrNode visitLiteralSymbol(LiteralSymbol node) => visitExpression(node);
 
-  ir.Trivial visitAssert(ast.Send node) {
+  ir.Definition visitAssert(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitClosureSend(ast.Send node) {
+  ir.Definition visitClosureSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitDynamicSend(ast.Send node) {
+  ir.Definition visitDynamicSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitGetterSend(ast.Send node) {
+  ir.Definition visitGetterSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitOperatorSend(ast.Send node) {
+  ir.Definition visitOperatorSend(ast.Send node) {
     return giveup();
   }
 
   // Build(StaticSend(f, a...)) = C[InvokeStatic(f, x...)]
   //   where (C, x...) = BuildList(a...)
-  ir.Trivial visitStaticSend(ast.Send node) {
+  ir.Definition visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
     // TODO(lry): support static fields. (separate IR instruction?)
@@ -415,17 +362,17 @@
     return v;
   }
 
-  ir.Trivial visitSuperSend(ast.Send node) {
+  ir.Definition visitSuperSend(ast.Send node) {
     return giveup();
   }
 
-  ir.Trivial visitTypeReferenceSend(ast.Send node) {
+  ir.Definition visitTypeReferenceSend(ast.Send node) {
     return giveup();
   }
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Trivial giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Definition giveup() => throw ABORT_IRNODE_BUILDER;
 
   ir.Function nullIfGiveup(ir.Function action()) {
     try {
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index b2ed5a6..4825e68 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -23,64 +23,64 @@
   Expression plug(Expression expr) => throw 'impossible';
 }
 
-// Trivial is the base class of things that variables can refer to: primitives,
-// continuations, function and continuation parameters, etc.
-abstract class Trivial extends Node {
+/// The base class of things that variables can refer to: primitives,
+/// continuations, function and continuation parameters, etc.
+abstract class Definition extends Node {
   // The head of a linked-list of occurrences, in no particular order.
   Variable firstUse = null;
 }
 
-// Operands to invocations and primitives are always variables.  They point to
-// their definition and are linked into a list of occurrences.
+/// Operands to invocations and primitives are always variables.  They point to
+/// their definition and are linked into a list of occurrences.
 class Variable {
-  Trivial definition;
+  Definition definition;
   Variable nextUse = null;
-  
+
   Variable(this.definition) {
     nextUse = definition.firstUse;
     definition.firstUse = this;
   }
 }
 
-// Binding a value (primitive or constant): 'let val x = V in E'.  The bound
-// value is in scope in the body.
-// During one-pass construction a LetVal with an empty body is used to
-// represent one-level context 'let val x = V in []'.
+/// Binding a value (primitive or constant): 'let val x = V in E'.  The bound
+/// value is in scope in the body.
+/// During one-pass construction a LetVal with an empty body is used to
+/// represent one-level context 'let val x = V in []'.
 class LetVal extends Expression {
-  final Trivial value;
+  final Definition value;
   Expression body = null;
-  
+
   LetVal(this.value);
-  
+
   Expression plug(Expression expr) {
     assert(body == null);
     return body = expr;
   }
-  
+
   accept(Visitor visitor) => visitor.visitLetVal(this);
 }
 
 
-// Binding a continuation: 'let cont k(v) = E in E'.  The bound continuation is
-// in scope in the body and the continuation parameter is in scope in the
-// continuation body.
-// During one-pass construction a LetCont with an empty continuation body is
-// used to represent the one-level context 'let cont k(v) = [] in E'.
+/// Binding a continuation: 'let cont k(v) = E in E'.  The bound continuation
+/// is in scope in the body and the continuation parameter is in scope in the
+/// continuation body.
+/// During one-pass construction a LetCont with an empty continuation body is
+/// used to represent the one-level context 'let cont k(v) = [] in E'.
 class LetCont extends Expression {
   final Continuation continuation;
   final Expression body;
-  
+
   LetCont(this.continuation, this.body);
-  
+
   Expression plug(Expression expr) {
     assert(continuation.body == null);
     return continuation.body = expr;
   }
-  
+
   accept(Visitor visitor) => visitor.visitLetCont(this);
 }
 
-// Invoke a static function in tail position.
+/// Invoke a static function in tail position.
 class InvokeStatic extends Expression {
   final FunctionElement target;
 
@@ -93,9 +93,9 @@
 
   final Variable continuation;
   final List<Variable> arguments;
-  
+
   InvokeStatic(this.target, this.selector, Continuation cont,
-               List<Trivial> args)
+               List<Definition> args)
       : continuation = new Variable(cont),
         arguments = args.map((t) => new Variable(t)).toList(growable: false) {
     assert(selector.kind == SelectorKind.CALL);
@@ -105,54 +105,52 @@
   accept(Visitor visitor) => visitor.visitInvokeStatic(this);
 }
 
-// Invoke a continuation in tail position.
+/// Invoke a continuation in tail position.
 class InvokeContinuation extends Expression {
   final Variable continuation;
   final Variable argument;
-  
-  InvokeContinuation(Continuation cont, Trivial arg)
+
+  InvokeContinuation(Continuation cont, Definition arg)
       : continuation = new Variable(cont),
         argument = new Variable(arg);
-  
+
   accept(Visitor visitor) => visitor.visitInvokeContinuation(this);
 }
 
-// Constants are values, they are always bound by 'let val'.
-class Constant extends Trivial {
+class Constant extends Definition {
   final dart2js.Constant value;
-  
+
   Constant(this.value);
-  
+
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
-// Function and continuation parameters are trivial.
-class Parameter extends Trivial {
+class Parameter extends Definition {
   Parameter();
-  
+
   accept(Visitor visitor) => visitor.visitParameter(this);
 }
 
-// Continuations are trivial.  They are normally bound by 'let cont'.  A
-// continuation with no parameter (or body) is used to represent a function's
-// return continuation.
-class Continuation extends Trivial {
+/// Continuations are normally bound by 'let cont'.  A continuation with no
+/// parameter (or body) is used to represent a function's return continuation.
+/// The return continuation is bound by the Function, not by 'let cont'.
+class Continuation extends Definition {
   final Parameter parameter;
   Expression body = null;
-  
+
   Continuation(this.parameter);
-  
+
   Continuation.retrn() : parameter = null;
-  
+
   accept(Visitor visitor) => visitor.visitContinuation(this);
 }
 
-// A function definition, consisting of parameters and a body.  The parameters
-// include a distinguished continuation parameter.
-class Function extends Expression {
+/// A function definition, consisting of parameters and a body.  The parameters
+/// include a distinguished continuation parameter.
+class Function extends Node {
   final int endOffset;
   final int namePosition;
-  
+
   final Continuation returnContinuation;
   final Expression body;
 
@@ -168,39 +166,39 @@
 
 abstract class Visitor<T> {
   T visitNode(Node node) => node.accept(this);
-  
+
   T visitFunction(Function node) => visitNode(node);
   T visitExpression(Expression node) => visitNode(node);
-  T visitTrivial(Trivial node) => visitNode(node);
-  
+  T visitDefinition(Definition node) => visitNode(node);
+
   T visitLetVal(LetVal expr) => visitExpression(expr);
   T visitLetCont(LetCont expr) => visitExpression(expr);
   T visitInvokeStatic(InvokeStatic expr) => visitExpression(expr);
   T visitInvokeContinuation(InvokeContinuation expr) => visitExpression(expr);
-  
-  T visitConstant(Constant triv) => visitTrivial(triv);
-  T visitParameter(Parameter triv) => visitTrivial(triv);
-  T visitContinuation(Continuation triv) => visitTrivial(triv);
+
+  T visitConstant(Constant triv) => visitDefinition(triv);
+  T visitParameter(Parameter triv) => visitDefinition(triv);
+  T visitContinuation(Continuation triv) => visitDefinition(triv);
 }
 
-// Generate a Lisp-like S-expression representation of an IR node as a string.
-// The representation is not pretty-printed, but it can easily be quoted and
-// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
-// pretty-printed.
+/// Generate a Lisp-like S-expression representation of an IR node as a string.
+/// The representation is not pretty-printed, but it can easily be quoted and
+/// dropped into the REPL of one's favorite Lisp or Scheme implementation to be
+/// pretty-printed.
 class SExpressionStringifier extends Visitor<String> {
-  final Map<Trivial, String> names = <Trivial, String>{};
-  
+  final Map<Definition, String> names = <Definition, String>{};
+
   int _valueCounter = 0;
   int _continuationCounter = 0;
-  
+
   String newValueName() => 'v${_valueCounter++}';
   String newContinuationName() => 'k${_continuationCounter++}';
-  
+
   String visitFunction(Function node) {
     names[node.returnContinuation] = 'return';
     return '(Function ${node.body.accept(this)})';
   }
-  
+
   String visitLetVal(LetVal expr) {
     String name = newValueName();
     names[expr.value] = name;
@@ -208,7 +206,7 @@
     String body = expr.body.accept(this);
     return '(LetVal $name $value) $body';
   }
-  
+
   String visitLetCont(LetCont expr) {
     String cont = newContinuationName();
     String param = newValueName();
@@ -218,7 +216,7 @@
     String body = expr.body == null ? 'null' : expr.body.accept(this);
     return '(LetCont ($cont $param) $contBody) $body';
   }
-  
+
   String visitInvokeStatic(InvokeStatic expr) {
     String name = expr.target.name;
     String cont = names[expr.continuation.definition];
@@ -226,21 +224,21 @@
         expr.arguments.map((v) => names[v.definition]).toList(growable: false);
     return '(InvokeStatic $name $cont ${args.join(' ')})';
   }
-  
+
   String visitInvokeContinuation(InvokeContinuation expr) {
     String cont = names[expr.continuation.definition];
     String arg = names[expr.argument.definition];
     return '(InvokeContinuation $cont $arg)';
   }
-  
+
   String visitConstant(Constant triv) {
     return '(Constant ${triv.value})';
   }
-  
+
   String visitParameter(Parameter triv) {
     return '(Unexpected Parameter)';
   }
-  
+
   String visitContinuation(Continuation triv) {
     return '(Unexpected Continuation)';
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
index 2ac626b..075d0f1 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_unpickler.dart
@@ -121,7 +121,7 @@
     int tag = readByte();
     switch (tag) {
       case Pickles.NODE_CONSTANT:
-        ir.Trivial constant = readConstantNode();
+        ir.Definition constant = readConstantNode();
         unpickled[index++] = constant;
         addExpression(new ir.LetVal(constant));
         break;
@@ -169,9 +169,9 @@
     return unpickled[entryIndex];
   }
 
-  List<ir.Trivial> readBackReferenceList() {
+  List<ir.Definition> readBackReferenceList() {
     int length = readInt();
-    List<ir.Trivial> result = new List<ir.Trivial>(length);
+    List<ir.Definition> result = new List<ir.Definition>(length);
     for (int i = 0; i < length; i++) {
       result[i] = readBackReference();
     }
@@ -199,14 +199,14 @@
     FunctionElement functionElement = readElement();
     Selector selector = readSelector();
     ir.Continuation continuation = readBackReference();
-    List<ir.Trivial> arguments = readBackReferenceList();
+    List<ir.Definition> arguments = readBackReferenceList();
     return new ir.InvokeStatic(functionElement, selector, continuation,
                                arguments);
   }
 
   ir.InvokeContinuation readInvokeContinuationNode() {
     ir.Continuation continuation = readBackReference();
-    ir.Trivial argument = readBackReference();
+    ir.Definition argument = readBackReference();
     return new ir.InvokeContinuation(continuation, argument);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index d157b56..78f901f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -652,14 +652,14 @@
     DartType type = constant.computeType(compiler);
     registerInstantiatedConstantType(type, elements);
 
-    if (constant.isFunction()) {
+    if (constant.isFunction) {
       FunctionConstant function = constant;
       compiler.enqueuer.codegen.registerGetOfStaticFunction(function.element);
-    } else if (constant.isInterceptor()) {
+    } else if (constant.isInterceptor) {
       // An interceptor constant references the class's prototype chain.
       InterceptorConstant interceptor = constant;
       registerInstantiatedConstantType(interceptor.dispatchedType, elements);
-    } else if (constant.isType()) {
+    } else if (constant.isType) {
       TypeConstant typeConstant = constant;
       registerTypeLiteral(typeConstant.representedType.element,
           compiler.enqueuer.codegen, elements);
@@ -1820,7 +1820,7 @@
     bool hasNoSideEffects = false;
     for (MetadataAnnotation metadata in element.metadata) {
       metadata.ensureResolved(compiler);
-      if (!metadata.value.isConstructedObject()) continue;
+      if (!metadata.value.isConstructedObject) continue;
       ObjectConstant value = metadata.value;
       ClassElement cls = value.type.element;
       if (cls == noInlineClass) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 206b3df..68fb5dc7 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -12,7 +12,7 @@
   Constant fold(Constant constant) {
     if (JAVA_SCRIPT_CONSTANT_SYSTEM.isInt(constant)) {
       // In JavaScript we don't check for -0 and treat it as if it was zero.
-      if (constant.isMinusZero()) constant = DART_CONSTANT_SYSTEM.createInt(0);
+      if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
       IntConstant intConstant = constant;
       // We convert the result of bit-operations to 32 bit unsigned integers.
       return JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.value);
@@ -34,8 +34,8 @@
 
   Constant fold(Constant left, Constant right) {
     // In JavaScript we don't check for -0 and treat it as if it was zero.
-    if (left.isMinusZero()) left = DART_CONSTANT_SYSTEM.createInt(0);
-    if (right.isMinusZero()) right = DART_CONSTANT_SYSTEM.createInt(0);
+    if (left.isMinusZero) left = DART_CONSTANT_SYSTEM.createInt(0);
+    if (right.isMinusZero) right = DART_CONSTANT_SYSTEM.createInt(0);
     IntConstant result = dartBitOperation.fold(left, right);
     if (result != null) {
       // We convert the result of bit-operations to 32 bit unsigned integers.
@@ -52,7 +52,7 @@
 
   Constant fold(Constant left, Constant right) {
     // Truncate the input value to 32 bits if necessary.
-    if (left.isInt()) {
+    if (left.isInt) {
       IntConstant intConstant = left;
       int value = intConstant.value;
       int truncatedValue = value & JAVA_SCRIPT_CONSTANT_SYSTEM.BITS32;
@@ -81,7 +81,7 @@
   String get name => dartNegateOperation.name;
 
   Constant fold(Constant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       if (intConstant.value == 0) {
         return JAVA_SCRIPT_CONSTANT_SYSTEM.createDouble(-0.0);
@@ -119,7 +119,7 @@
     if (result == null || result.value) return result;
     // In JavaScript -0.0 === 0 and all doubles are equal to their integer
     // values. Furthermore NaN !== NaN.
-    if (left.isNum() && right.isNum()) {
+    if (left.isNum && right.isNum) {
       NumConstant leftNum = left;
       NumConstant rightNum = right;
       double leftDouble = leftNum.value.toDouble();
@@ -181,7 +181,7 @@
   }
 
   NumConstant convertToJavaScriptConstant(NumConstant constant) {
-    if (constant.isInt()) {
+    if (constant.isInt) {
       IntConstant intConstant = constant;
       int intValue = intConstant.value;
       if (integerBecomesNanOrInfinity(intValue)) {
@@ -193,11 +193,11 @@
       if (floorValue != intValue) {
         return new IntConstant(floorValue);
       }
-    } else if (constant.isDouble()) {
+    } else if (constant.isDouble) {
       DoubleConstant doubleResult = constant;
       double doubleValue = doubleResult.value;
       if (!doubleValue.isInfinite && !doubleValue.isNaN &&
-          !constant.isMinusZero()) {
+          !constant.isMinusZero) {
         int intValue = doubleValue.truncate();
         if (intValue == doubleValue) {
           return new IntConstant(intValue);
@@ -217,12 +217,12 @@
   NullConstant createNull() => new NullConstant();
 
   // Integer checks don't verify that the number is not -0.0.
-  bool isInt(Constant constant) => constant.isInt() || constant.isMinusZero();
+  bool isInt(Constant constant) => constant.isInt || constant.isMinusZero;
   bool isDouble(Constant constant)
-      => constant.isDouble() && !constant.isMinusZero();
-  bool isString(Constant constant) => constant.isString();
-  bool isBool(Constant constant) => constant.isBool();
-  bool isNull(Constant constant) => constant.isNull();
+      => constant.isDouble && !constant.isMinusZero;
+  bool isString(Constant constant) => constant.isString;
+  bool isBool(Constant constant) => constant.isBool;
+  bool isNull(Constant constant) => constant.isNull;
 
   bool isSubtype(Compiler compiler, DartType s, DartType t) {
     // At runtime, an integer is both an integer and a double: the
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 2a9c15f..8fa9596 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -171,8 +171,8 @@
   }
 
   TypeConstant makeTypeConstant(ClassElement element) {
-    DartType elementType = element.computeType(compiler).asRaw();
-    DartType constantType = backend.typeImplementation.computeType(compiler);
+    DartType elementType = element.rawType;
+    DartType constantType = backend.typeImplementation.rawType;
     return new TypeConstant(elementType, constantType);
   }
 
@@ -187,7 +187,7 @@
       if (member.isGenerativeConstructor()) {
         // Ignore constructors that cannot be called with zero arguments.
         FunctionElement constructor = member;
-        FunctionSignature parameters = constructor.computeSignature(compiler);
+        FunctionSignature parameters = constructor.functionSignature;
         if (parameters.requiredParameterCount == 0) {
           result.add(member);
         }
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index e148cee..19519e8 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -305,7 +305,7 @@
     // In the current implementation it doesn't make sense to give names to
     // function constants since the function-implementation itself serves as
     // constant and can be accessed directly.
-    assert(!constant.isFunction());
+    assert(!constant.isFunction);
     String result = constantNames[constant];
     if (result == null) {
       String longName = constantLongName(constant);
@@ -382,7 +382,7 @@
     if (element.isGenerativeConstructorBody()) {
       name = Elements.reconstructConstructorNameSourceString(element);
     }
-    FunctionSignature signature = element.computeSignature(compiler);
+    FunctionSignature signature = element.functionSignature;
     String methodName =
         '${privateName(library, name)}\$${signature.parameterCount}';
     if (signature.optionalParametersAreNamed &&
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index d6a2229..0f50edd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -370,19 +370,19 @@
       List<jsAst.Statement> statements,
       FunctionElement member,
       List<jsAst.Parameter> stubParameters) {
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     Element converter =
         compiler.findHelper('convertDartClosureToJS');
     String closureConverter = backend.namer.isolateAccess(converter);
     Set<String> stubParameterNames = new Set<String>.from(
         stubParameters.map((param) => param.name));
-    parameters.forEachParameter((Element parameter) {
+    parameters.forEachParameter((ParameterElement parameter) {
       String name = parameter.name;
       // If [name] is not in [stubParameters], then the parameter is an optional
       // parameter that was not provided for this stub.
       for (jsAst.Parameter stubParameter in stubParameters) {
         if (stubParameter.name == name) {
-          DartType type = parameter.computeType(compiler).unalias(compiler);
+          DartType type = parameter.type.unalias(compiler);
           if (type is FunctionType) {
             // The parameter type is a function type either directly or through
             // typedef(s).
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index df46098..0f0cb0c 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -186,8 +186,8 @@
           potentiallyAddForRti(contextClass);
         }
         if (type.kind == TypeKind.FUNCTION) {
-          void analyzeMethod(Element method) {
-            DartType memberType = method.computeType(compiler);
+          void analyzeMethod(TypedElement method) {
+            DartType memberType = method.type;
             ClassElement contextClass = Types.getClassContext(memberType);
             if (contextClass != null &&
                 compiler.types.isPotentialSubtype(memberType, type)) {
@@ -201,8 +201,8 @@
       }
     });
     if (compiler.enableTypeAssertions) {
-      void analyzeMethod(Element method) {
-        DartType memberType = method.computeType(compiler);
+      void analyzeMethod(TypedElement method) {
+        DartType memberType = method.type;
         ClassElement contextClass = Types.getClassContext(memberType);
         if (contextClass != null) {
           potentiallyAddForRti(contextClass);
@@ -282,14 +282,14 @@
       }
     }
     for (FunctionElement element in universe.staticFunctionsNeedingGetter) {
-      instantiatedTypes.add(element.computeType(compiler));
+      instantiatedTypes.add(element.type);
     }
     // TODO(johnniwinther): We should get this information through the
     // [neededClasses] computed in the emitter instead of storing it and pulling
     // it from resolution, but currently it would introduce a cyclic dependency
     // between [computeRequiredChecks] and [computeNeededClasses].
-    for (Element element in compiler.resolverWorld.closurizedMembers) {
-      instantiatedTypes.add(element.computeType(compiler));
+    for (TypedElement element in compiler.resolverWorld.closurizedMembers) {
+      instantiatedTypes.add(element.type);
     }
     return instantiatedTypes;
   }
@@ -432,7 +432,7 @@
       return true;
     }
 
-    InterfaceType originalType = cls.computeType(compiler);
+    InterfaceType originalType = cls.thisType;
     InterfaceType type = originalType.asInstanceOf(check);
     // [type] is not a subtype of [check]. we do not generate a check and do not
     // need a substitution.
@@ -498,7 +498,7 @@
     // Unnamed mixin application classes do not need substitutions, because they
     // are never instantiated and their checks are overwritten by the class that
     // they are mixed into.
-    InterfaceType type = cls.computeType(compiler);
+    InterfaceType type = cls.thisType;
     InterfaceType target = type.asInstanceOf(check);
     Link<DartType> typeVariables = cls.typeVariables;
     if (typeVariables.isEmpty && !alwaysGenerateFunction) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
index 746f7f8..a847d3e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/type_variable_handler.dart
@@ -63,7 +63,7 @@
         return;
       }
 
-      InterfaceType typeVariableType = typeVariableClass.computeType(compiler);
+      InterfaceType typeVariableType = typeVariableClass.thisType;
       List<int> constants = <int>[];
       evaluator = new CompileTimeConstantEvaluator(
           compiler.constantHandler,
@@ -100,7 +100,8 @@
     if (!enqueuer.isResolutionQueue || typeVariableClasses == null) return;
     backend.enqueueClass(
           enqueuer, typeVariableClass, compiler.globalDependencies);
-    Link constructors = typeVariableClass.ensureResolved(compiler).constructors;
+    typeVariableClass.ensureResolved(compiler);
+    Link constructors = typeVariableClass.constructors;
     if (constructors.isEmpty && constructors.tail.isEmpty) {
       compiler.reportInternalError(
           typeVariableClass,
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
index b28becf..c3b54b1 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/class_emitter.dart
@@ -494,10 +494,10 @@
     return field is ClosureFieldElement;
   }
 
-  bool canAvoidGeneratedCheckedSetter(Element member) {
+  bool canAvoidGeneratedCheckedSetter(VariableElement member) {
     // We never generate accessors for top-level/static fields.
     if (!member.isInstanceMember()) return true;
-    DartType type = member.computeType(compiler);
+    DartType type = member.type;
     return type.treatAsDynamic || (type.element == compiler.objectClass);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index d0218e4..4cb149e 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -703,9 +703,9 @@
           isConstructor = true;
           name = Elements.reconstructConstructorName(function);
         }
-        requiredParameterCount = function.requiredParameterCount(compiler);
-        optionalParameterCount = function.optionalParameterCount(compiler);
-        FunctionSignature signature = function.computeSignature(compiler);
+        FunctionSignature signature = function.functionSignature;
+        requiredParameterCount = signature.requiredParameterCount;
+        optionalParameterCount = signature.optionalParameterCount;
         if (signature.optionalParametersAreNamed) {
           var names = [];
           for (Element e in signature.optionalParameters) {
@@ -922,7 +922,7 @@
       }
 
       String name = namer.constantName(constant);
-      if (constant.isList()) emitMakeConstantListIfNotEmitted(buffer);
+      if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
       jsAst.Expression init = js(
           '${namer.globalObjectForConstant(constant)}.$name = #',
           constantInitializerExpression(constant));
@@ -932,9 +932,9 @@
   }
 
   bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
-    if (constant.isFunction()) return true;    // Already emitted.
-    if (constant.isPrimitive()) return true;   // Inlined.
-    if (constant.isDummy()) return true;       // Inlined.
+    if (constant.isFunction) return true;    // Already emitted.
+    if (constant.isPrimitive) return true;   // Inlined.
+    if (constant.isDummy) return true;       // Inlined.
     // The name is null when the constant is already a JS constant.
     // TODO(floitsch): every constant should be registered, so that we can
     // share the ones that take up too much space (like some strings).
@@ -1009,7 +1009,7 @@
 
         js('var rootProperty = "_${generateIsolateTagRoot()}"'),
         js.for_('var i = 0', null, 'i++', [
-            js('property = intern(rootProperty + "_" + i + "_")'),
+            js('var property = intern(rootProperty + "_" + i + "_")'),
             js.if_('!(property in usedProperties)', [
                 js('usedProperties[property] = 1'),
                 js('init.isolateTag = property'),
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 836bc58..6111f23 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -30,7 +30,7 @@
                         Selector selector,
                         AddStubFunction addStub,
                         Set<String> alreadyGenerated) {
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     int positionalArgumentCount = selector.positionalArgumentCount;
     if (positionalArgumentCount == parameters.parameterCount) {
       assert(selector.namedArgumentCount == 0);
@@ -103,7 +103,7 @@
           if (value == null) {
             argumentsBuffer[count] = task.constantReference(new NullConstant());
           } else {
-            if (!value.isNull()) {
+            if (!value.isNull) {
               // If the value is the null constant, we should not pass it
               // down to the native method.
               indexOfLastOptionalArgumentInParameters = count;
@@ -349,7 +349,7 @@
     if (code == null) return;
     String name = namer.getNameOfMember(member);
     task.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
-    FunctionSignature parameters = member.computeSignature(compiler);
+    FunctionSignature parameters = member.functionSignature;
     bool needsStubs = !parameters.optionalParameters.isEmpty;
     bool canTearOff = false;
     bool isClosure = false;
@@ -472,9 +472,9 @@
       DartType memberType;
       if (member.isGenerativeConstructorBody()) {
         var body = member;
-        memberType = body.constructor.computeType(compiler);
+        memberType = body.constructor.type;
       } else {
-        memberType = member.computeType(compiler);
+        memberType = member.type;
       }
       if (memberType.containsTypeVariables) {
         jsAst.Expression thisAccess = js(r'this.$receiver');
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
index b6eb5c8..43ec0dd 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/metadata_emitter.dart
@@ -43,7 +43,7 @@
   }
 
   List<int> reifyDefaultArguments(FunctionElement function) {
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     if (signature.optionalParameterCount == 0) return const [];
     List<int> defaultValues = <int>[];
     for (Element element in signature.optionalParameters) {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
index c3c2b39..e8f5a70 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
@@ -21,17 +21,12 @@
 }
 
 abstract class InstanceMirrorMixin implements InstanceMirror {
-
   bool get hasReflectee => false;
 
   get reflectee {
     throw new UnsupportedError('InstanceMirror.reflectee unsupported.');
   }
 
-  Function operator [](Symbol name) {
-    throw new UnsupportedError('InstanceMirror.operator [] unsupported.');
-  }
-
   delegate(Invocation invocation) {
     throw new UnsupportedError('InstanceMirror.delegate unsupported');
   }
@@ -68,8 +63,7 @@
 ////////////////////////////////////////////////////////////////////////////////
 
 class Dart2JsConstantMirror extends Object
-    with ObjectMirrorMixin, InstanceMirrorMixin
-    implements InstanceMirror {
+    with ObjectMirrorMixin, InstanceMirrorMixin {
   final Dart2JsMirrorSystem mirrorSystem;
   final Constant _constant;
 
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
index 132308b..82e593d 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_library_mirror.dart
@@ -153,6 +153,8 @@
   bool get isImport => _node.asImport() != null;
 
   bool get isExport => _node.asExport() != null;
+
+  List<InstanceMirror> get metadata => const <InstanceMirror>[];
 }
 
 class Dart2JsCombinatorMirror implements CombinatorSourceMirror {
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
index 64ba2d3..0400664 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_member_mirrors.dart
@@ -136,11 +136,11 @@
 
   List<ParameterMirror> get parameters {
     return _parametersFromFunctionSignature(this,
-        _function.computeSignature(mirrorSystem.compiler));
+        _function.functionSignature);
   }
 
   TypeMirror get returnType => owner._getTypeMirror(
-      _function.computeSignature(mirrorSystem.compiler).returnType);
+      _function.functionSignature.returnType);
 
   bool get isAbstract => _function.isAbstract;
 
@@ -194,8 +194,7 @@
 
   bool get isConst => _variable.modifiers.isConst();
 
-  TypeMirror get type =>
-      owner._getTypeMirror(_variable.computeType(mirrorSystem.compiler));
+  TypeMirror get type => owner._getTypeMirror(_variable.type);
 
 
 }
@@ -227,9 +226,8 @@
 
   ParameterElement get _element => super._element;
 
-  TypeMirror get type => owner._getTypeMirror(
-      _element.computeType(mirrorSystem.compiler),
-      _element.functionSignature);
+  TypeMirror get type => owner._getTypeMirror(_element.type,
+                                              _element.functionSignature);
 
 
   bool get isFinal => false;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index 5359a09..37f542b 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -343,13 +343,11 @@
     return null;
   }
 
-  DeclarationMirror _getTypeDeclarationMirror(Element element) {
+  DeclarationMirror _getTypeDeclarationMirror(TypeDeclarationElement element) {
     if (element.isClass()) {
-      return new Dart2JsClassDeclarationMirror(
-          this, element.computeType(compiler));
+      return new Dart2JsClassDeclarationMirror(this, element.thisType);
     } else if (element.isTypedef()) {
-      return new Dart2JsTypedefDeclarationMirror(this,
-          element.computeType(compiler));
+      return new Dart2JsTypedefDeclarationMirror(this, element.thisType);
     }
     compiler.internalError("Unexpected element $element");
     return null;
@@ -395,15 +393,16 @@
 DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system,
                                                      Element element) {
   if (element.isTypeVariable()) {
-    return new Dart2JsTypeVariableMirror(
-        system, element.computeType(system.compiler));
+    TypeVariableElement typeVariable = element;
+    return new Dart2JsTypeVariableMirror(system, typeVariable.type);
   }
 
   Dart2JsLibraryMirror library = system._libraryMap[element.getLibrary()];
   if (element.isLibrary()) return library;
   if (element.isTypedef()) {
+    TypedefElement typedefElement = element;
     return new Dart2JsTypedefMirror.fromLibrary(
-        library, element.computeType(system.compiler));
+        library, typedefElement.thisType);
   }
 
   Dart2JsDeclarationMirror container = library;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
index 3d3b668..1ac23d0 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_type_mirrors.dart
@@ -167,8 +167,7 @@
 
 class Dart2JsInterfaceTypeMirror
     extends Dart2JsGenericTypeMirror
-    with ObjectMirrorMixin, InstanceMirrorMixin, ClassMirrorMixin,
-         ContainerMixin
+    with ObjectMirrorMixin, ClassMirrorMixin, ContainerMixin
     implements ClassMirror {
   Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
                              InterfaceType interfaceType)
@@ -255,7 +254,7 @@
       Dart2JsClassDeclarationMirror otherDeclaration =
           other.originalDeclaration;
       return _element.isSubclassOf(otherDeclaration._element);
-    } else if (other is TypeMirror) {
+    } else if (other is FunctionTypeMirror) {
       return false;
     }
     throw new ArgumentError(other);
@@ -351,8 +350,7 @@
 }
 
 class Dart2JsFunctionTypeMirror extends Dart2JsTypeMirror
-    with ObjectMirrorMixin, InstanceMirrorMixin,
-         ClassMirrorMixin, DeclarationMixin
+    with ObjectMirrorMixin, ClassMirrorMixin, DeclarationMixin
     implements FunctionTypeMirror {
   final FunctionSignature _functionSignature;
   List<ParameterMirror> _parameters;
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
index d9e860d..034d209 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors_used.dart
@@ -395,16 +395,16 @@
   /// and a hint is emitted).
   List convertConstantToUsageList(
       Constant constant, { bool onlyStrings: false }) {
-    if (constant.isNull()) {
+    if (constant.isNull) {
       return null;
-    } else if (constant.isList()) {
+    } else if (constant.isList) {
       ListConstant list = constant;
       List result = onlyStrings ? <String> [] : [];
       for (Constant entry in list.entries) {
-        if (entry.isString()) {
+        if (entry.isString) {
           StringConstant string = entry;
           result.add(string.value.slowToString());
-        } else if (!onlyStrings && entry.isType()) {
+        } else if (!onlyStrings && entry.isType) {
           TypeConstant type = entry;
           result.add(type.representedType);
         } else {
@@ -418,10 +418,10 @@
         }
       }
       return result;
-    } else if (!onlyStrings && constant.isType()) {
+    } else if (!onlyStrings && constant.isType) {
       TypeConstant type = constant;
       return [type.representedType];
-    } else if (constant.isString()) {
+    } else if (constant.isString) {
       StringConstant string = constant;
       var iterable =
           string.value.slowToString().split(',').map((e) => e.trim());
@@ -445,7 +445,8 @@
     if (type.kind == TypeKind.INTERFACE && library.isInternalLibrary) {
       InterfaceType interface = type;
       ClassElement cls = type.element;
-      for (DartType supertype in cls.ensureResolved(compiler).allSupertypes) {
+      cls.ensureResolved(compiler);
+      for (DartType supertype in cls.allSupertypes) {
         if (supertype.kind == TypeKind.INTERFACE
             && !supertype.element.getLibrary().isInternalLibrary) {
           return interface.asInstanceOf(supertype.element);
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index 12563b5..966c5b3 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -815,9 +815,9 @@
     // TODO(sra): Optional arguments are currently missing from the
     // DartType. This should be fixed so the following work-around can be
     // removed.
-    method.computeSignature(compiler).forEachOptionalParameter(
-        (Element parameter) {
-          behavior._escape(parameter.computeType(compiler), compiler);
+    method.functionSignature.forEachOptionalParameter(
+        (ParameterElement parameter) {
+          behavior._escape(parameter.type, compiler);
         });
 
     behavior._overrideWithAnnotations(method, compiler);
@@ -853,7 +853,7 @@
       if (e is! ClassElement) return null;
       ClassElement cls = e;
       cls.ensureResolved(compiler);
-      return cls.computeType(compiler);
+      return cls.thisType;
     }
 
     NativeEnqueuer enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
@@ -1090,7 +1090,7 @@
     nativeEmitter.nativeMethods.add(element);
   }
 
-  FunctionSignature parameters = element.computeSignature(builder.compiler);
+  FunctionSignature parameters = element.functionSignature;
   if (!hasBody) {
     List<String> arguments = <String>[];
     List<HInstruction> inputs = <HInstruction>[];
@@ -1099,8 +1099,8 @@
       receiver = '#.';
       inputs.add(builder.localsHandler.readThis());
     }
-    parameters.forEachParameter((Element parameter) {
-      DartType type = parameter.computeType(compiler).unalias(compiler);
+    parameters.forEachParameter((ParameterElement parameter) {
+      DartType type = parameter.type.unalias(compiler);
       HInstruction input = builder.localsHandler.readLocal(parameter);
       if (type is FunctionType) {
         // The parameter type is a function type either directly or through
diff --git a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
index c21996e..d9af606 100644
--- a/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
+++ b/sdk/lib/_internal/compiler/implementation/ordered_typeset.dart
@@ -121,7 +121,7 @@
   void add(Compiler compiler, InterfaceType type) {
     if (type.element == cls) {
       if (type.element != compiler.objectClass) {
-        allSupertypes.addLast(compiler.objectClass.computeType(compiler));
+        allSupertypes.addLast(compiler.objectClass.rawType);
       }
       _addAtDepth(compiler, type, maxDepth + 1);
     } else {
@@ -141,7 +141,7 @@
       if (existingType.element == type.element) {
         compiler.reportInternalError(cls,
             MessageKind.MULTI_INHERITANCE,
-            {'thisType': cls.computeType(compiler),
+            {'thisType': cls.thisType,
              'firstType': existingType,
              'secondType': type});
         return;
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index 3e5e15f..832b2cd 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -271,10 +271,6 @@
 
       if (identical(kind, ElementKind.FIELD)) return resolveField(element);
 
-      if (identical(kind, ElementKind.PARAMETER) ||
-          identical(kind, ElementKind.FIELD_PARAMETER)) {
-        return resolveParameter(element);
-      }
       if (element.isClass()) {
         ClassElement cls = element;
         cls.ensureResolved(compiler);
@@ -452,7 +448,7 @@
     }
   }
 
-  TreeElements resolveMethodElement(FunctionElement element) {
+  TreeElements resolveMethodElement(FunctionElementX element) {
     assert(invariant(element, element.isDeclaration));
     return compiler.withCurrentElement(element, () {
       bool isConstructor =
@@ -462,7 +458,7 @@
       if (elements != null) {
         // TODO(karlklose): Remove the check for [isConstructor]. [elememts]
         // should never be non-null, not even for constructors.
-        assert(invariant(element, isConstructor,
+        assert(invariant(element, element.isConstructor(),
             message: 'Non-constructor element $element '
                      'has already been analyzed.'));
         return elements;
@@ -477,7 +473,7 @@
           compiler.enqueuer.resolution.registerStaticUse(
               element.targetConstructor);
         }
-        return new TreeElementMapping(element);
+        return _ensureTreeElements(element);
       }
       if (element.isPatched) {
         checkMatchingPatchSignatures(element, element.patch);
@@ -550,8 +546,7 @@
   /// This method should only be used by this library (or tests of
   /// this library).
   ResolverVisitor visitorFor(Element element) {
-    var mapping = new TreeElementMapping(element);
-    return new ResolverVisitor(compiler, element, mapping);
+    return new ResolverVisitor(compiler, element, _ensureTreeElements(element));
   }
 
   TreeElements resolveField(VariableElementX element) {
@@ -580,6 +575,9 @@
       compiler.reportError(element, MessageKind.CONST_WITHOUT_INITIALIZER);
     } else if (modifiers.isFinal() && !element.isInstanceMember()) {
       compiler.reportError(element, MessageKind.FINAL_WITHOUT_INITIALIZER);
+    } else {
+      compiler.enqueuer.resolution.registerInstantiatedClass(
+          compiler.nullClass, visitor.mapping);
     }
 
     if (Elements.isStaticOrTopLevelField(element)) {
@@ -593,9 +591,6 @@
           // unnecessary registrations.
           compiler.backend.registerLazyField(visitor.mapping);
         }
-      } else {
-        compiler.enqueuer.resolution.registerInstantiatedClass(
-            compiler.nullClass, visitor.mapping);
       }
     }
 
@@ -605,13 +600,6 @@
     return visitor.mapping;
   }
 
-  TreeElements resolveParameter(ParameterElement element) {
-    element.parseNode(compiler);
-    ResolverVisitor visitor = visitorFor(element.enclosingElement);
-    visitor.visit(element.initializer);
-    return visitor.mapping;
-  }
-
   DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
     DartType type = resolveReturnType(element, annotation);
     if (type == compiler.types.voidType) {
@@ -768,11 +756,11 @@
    * Warning: Do not call this method directly. Instead use
    * [:element.ensureResolved(compiler):].
    */
-  void resolveClass(ClassElement element) {
+  TreeElements resolveClass(BaseClassElementX element) {
     _resolveTypeDeclaration(element, () {
       // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
-      TreeElementMapping mapping = new TreeElementMapping(element);
-      resolveClassInternal(element, mapping);
+      resolveClassInternal(element, _ensureTreeElements(element));
+      return element.treeElements;
     });
   }
 
@@ -1139,7 +1127,7 @@
   }
 
 
-  FunctionSignature resolveSignature(FunctionElement element) {
+  FunctionSignature resolveSignature(FunctionElementX element) {
     MessageKind defaultValuesError = null;
     if (element.isFactoryConstructor()) {
       FunctionExpression body = element.parseNode(compiler);
@@ -1152,19 +1140,15 @@
           compiler.parser.measure(() => element.parseNode(compiler));
       return measure(() => SignatureResolver.analyze(
           compiler, node.parameters, node.returnType, element,
-          // TODO(johnniwinther): Use the [TreeElements] used for resolution of
-          // the method body.
-          new TreeElementMapping(element),
+          _ensureTreeElements(element),
           defaultValuesError: defaultValuesError));
     });
   }
 
   TreeElements resolveTypedef(TypedefElementX element) {
-    if (element.isResolved) return element.mapping;
+    if (element.isResolved) return element.treeElements;
     return _resolveTypeDeclaration(element, () {
-      TreeElementMapping mapping = new TreeElementMapping(element);
-      // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
-      element.mapping = mapping;
+      TreeElementMapping mapping = _ensureTreeElements(element);
       return compiler.withCurrentElement(element, () {
         return measure(() {
           Typedef node =
@@ -1218,6 +1202,8 @@
       annotation.resolutionState = STATE_STARTED;
 
       Node node = annotation.parseNode(compiler);
+      // TODO(johnniwinther): Find the right analyzable element to hold the
+      // [TreeElements] for the annotation.
       Element annotatedElement = annotation.annotatedElement;
       Element context = annotatedElement.enclosingElement;
       if (context == null) {
@@ -2859,9 +2845,9 @@
         world.registerDynamicInvocation(selector);
       }
     } else if (Elements.isStaticOrTopLevel(target)) {
-      // TODO(kasperl): It seems like we're not supposed to register
-      // the use of classes. Wouldn't it be simpler if we just did?
-      if (!target.isClass()) {
+      // Avoid registration of type variables since they are not analyzable but
+      // instead resolved through their enclosing type declaration.
+      if (!target.isTypeVariable()) {
         // [target] might be the implementation element and only declaration
         // elements may be registered.
         world.registerStaticUse(target.declaration);
@@ -3108,7 +3094,7 @@
         Node argumentNode = node.send.arguments.head;
         Constant name = compiler.constantHandler.compileNodeWithDefinitions(
             argumentNode, mapping, isConst: true);
-        if (!name.isString()) {
+        if (!name.isString) {
           DartType type = name.computeType(compiler);
           compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED,
                                    {'type': type});
@@ -3141,7 +3127,7 @@
   void checkConstMapKeysDontOverrideEquals(Spannable spannable,
                                            MapConstant map) {
     for (Constant key in map.keys.entries) {
-      if (!key.isObject()) continue;
+      if (!key.isObject) continue;
       ObjectConstant objectConstant = key;
       DartType keyType = objectConstant.type;
       ClassElement cls = keyType.element;
@@ -3160,7 +3146,7 @@
       Constant constant = compiler.constantHandler.compileNodeWithDefinitions(
           node, mapping, isConst: isConst);
 
-      if (isConst && constant != null && constant.isMap()) {
+      if (isConst && constant != null && constant.isMap) {
         checkConstMapKeysDontOverrideEquals(node, constant);
       }
 
@@ -3169,7 +3155,7 @@
       // native class dispatch record referencing the interceptor.
       if (argumentsToJsInterceptorConstant != null &&
           argumentsToJsInterceptorConstant.contains(node)) {
-        if (constant.isType()) {
+        if (constant.isType) {
           TypeConstant typeConstant = constant;
           if (typeConstant.representedType is InterfaceType) {
             world.registerInstantiatedType(typeConstant.representedType,
@@ -3508,13 +3494,13 @@
   }
 
   DartType typeOfConstant(Constant constant) {
-    if (constant.isInt()) return compiler.intClass.rawType;
-    if (constant.isBool()) return compiler.boolClass.rawType;
-    if (constant.isDouble()) return compiler.doubleClass.rawType;
-    if (constant.isString()) return compiler.stringClass.rawType;
-    if (constant.isNull()) return compiler.nullClass.rawType;
-    if (constant.isFunction()) return compiler.functionClass.rawType;
-    assert(constant.isObject());
+    if (constant.isInt) return compiler.intClass.rawType;
+    if (constant.isBool) return compiler.boolClass.rawType;
+    if (constant.isDouble) return compiler.doubleClass.rawType;
+    if (constant.isString) return compiler.stringClass.rawType;
+    if (constant.isNull) return compiler.nullClass.rawType;
+    if (constant.isFunction) return compiler.functionClass.rawType;
+    assert(constant.isObject);
     ObjectConstant objectConstant = constant;
     return objectConstant.type;
   }
@@ -3564,7 +3550,7 @@
           } else if (caseType.element == compiler.functionClass) {
             compiler.reportError(node, MessageKind.SWITCH_CASE_FORBIDDEN,
                                  {'type': "Function"});
-          } else if (constant.isObject() && overridesEquals(caseType)) {
+          } else if (constant.isObject && overridesEquals(caseType)) {
             compiler.reportError(firstCase.expression,
                 MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
                 {'type': caseType});
@@ -3789,11 +3775,11 @@
       }
       nameSet.add(typeName);
 
-      TypeVariableElement variableElement = typeVariable.element;
+      TypeVariableElementX variableElement = typeVariable.element;
       if (typeNode.bound != null) {
         DartType boundType = typeResolver.resolveTypeAnnotation(
             this, typeNode.bound);
-        variableElement.bound = boundType;
+        variableElement.boundCache = boundType;
 
         void checkTypeVariableBound() {
           Link<TypeVariableElement> seenTypeVariables =
@@ -3817,7 +3803,7 @@
         }
         addDeferredAction(element, checkTypeVariableBound);
       } else {
-        variableElement.bound = objectType;
+        variableElement.boundCache = objectType;
       }
       nodeLink = nodeLink.tail;
       typeLink = typeLink.tail;
@@ -4112,9 +4098,9 @@
     Link<DartType> link = typeVariables;
     element.typeVariables.forEach((TypeVariableType type) {
       TypeVariableType typeVariable = link.head;
-      TypeVariableElement typeVariableElement = typeVariable.element;
-      typeVariableElement.type = typeVariable;
-      typeVariableElement.bound =
+      TypeVariableElementX typeVariableElement = typeVariable.element;
+      typeVariableElement.typeCache = typeVariable;
+      typeVariableElement.boundCache =
           type.element.bound.subst(typeVariables, element.typeVariables);
       link = link.tail;
     });
@@ -4688,3 +4674,22 @@
                       Scope scope, String name) {
   return Elements.unwrap(scope.lookup(name), compiler, node);
 }
+
+TreeElements _ensureTreeElements(AnalyzableElement element) {
+  if (element._treeElements == null) {
+    element._treeElements = new TreeElementMapping(element);
+  }
+  return element._treeElements;
+}
+
+abstract class AnalyzableElement implements Element {
+  TreeElements _treeElements;
+
+  bool get hasTreeElements => _treeElements != null;
+
+  TreeElements get treeElements {
+    assert(invariant(this, _treeElements !=null,
+        message: "TreeElements have not been computed for $this."));
+    return _treeElements;
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index fd29dc9..10ddfe0 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -8,6 +8,7 @@
  * [SignatureResolver] resolves function signatures.
  */
 class SignatureResolver extends MappingVisitor<ParameterElementX> {
+  final ResolverVisitor resolver;
   final Element enclosingElement;
   final Scope scope;
   final MessageKind defaultValuesError;
@@ -23,6 +24,8 @@
                     {this.defaultValuesError})
       : this.enclosingElement = enclosingElement,
         this.scope = enclosingElement.buildScope(),
+        this.resolver =
+            new ResolverVisitor(compiler, enclosingElement, treeElements),
         super(compiler, treeElements);
 
   bool get defaultValuesAllowed => defaultValuesError == null;
@@ -84,8 +87,7 @@
 
   void computeParameterType(ParameterElementX element) {
     if (currentDefinitions.type != null) {
-      element.type = compiler.resolver.resolveTypeAnnotation(element,
-          currentDefinitions.type);
+      element.type = resolveTypeAnnotation(currentDefinitions.type);
     } else {
       // Is node.definitions exactly one FunctionExpression?
       Link<Node> link = currentDefinitions.definitions.nodes;
@@ -254,15 +256,14 @@
     }
     DartType returnType;
     if (element.isFactoryConstructor()) {
-      returnType = element.getEnclosingClass().computeType(compiler);
+      returnType = element.getEnclosingClass().thisType;
       // Because there is no type annotation for the return type of
       // this element, we explicitly add one.
       if (compiler.enableTypeAssertions) {
-        compiler.enqueuer.resolution.registerIsCheck(
-            returnType, new TreeElementMapping(element));
+        compiler.enqueuer.resolution.registerIsCheck(returnType, mapping);
       }
     } else {
-      returnType = compiler.resolver.resolveReturnType(element, returnNode);
+      returnType = visitor.resolveReturnType(returnNode);
     }
 
     if (element.isSetter() && (requiredParameterCount != 1 ||
@@ -281,10 +282,27 @@
                                   returnType);
   }
 
+  DartType resolveTypeAnnotation(TypeAnnotation annotation) {
+    DartType type = resolveReturnType(annotation);
+    if (type == compiler.types.voidType) {
+      compiler.reportError(annotation, MessageKind.VOID_NOT_ALLOWED);
+    }
+    return type;
+  }
+
+  DartType resolveReturnType(TypeAnnotation annotation) {
+    if (annotation == null) return compiler.types.dynamicType;
+    DartType result = resolver.resolveTypeAnnotation(annotation);
+    if (result == null) {
+      return compiler.types.dynamicType;
+    }
+    return result;
+  }
+
   // TODO(ahe): This is temporary.
   void resolveExpression(Node node) {
     if (node == null) return;
-    node.accept(new ResolverVisitor(compiler, enclosingElement, mapping));
+    node.accept(resolver);
   }
 
   // TODO(ahe): This is temporary.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index f785e40..3202bdc 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -6,10 +6,10 @@
 
 /**
  * A special element for the extra parameter taken by intercepted
- * methods. We need to override [Element.computeType] because our
+ * methods. We need to implement [TypedElement.type] because our
  * optimizers may look at its declared type.
  */
-class InterceptedElement extends ElementX {
+class InterceptedElement extends ElementX implements TypedElement {
   final DartType type;
   InterceptedElement(this.type, String name, Element enclosing)
       : super(name, ElementKind.PARAMETER, enclosing);
@@ -60,7 +60,7 @@
         assert(graph.isValid());
         if (!identical(kind, ElementKind.FIELD)) {
           FunctionElement function = element;
-          FunctionSignature signature = function.computeSignature(compiler);
+          FunctionSignature signature = function.functionSignature;
           signature.forEachOptionalParameter((Element parameter) {
             // This ensures the default value will be computed.
             Constant constant =
@@ -231,7 +231,7 @@
 
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
-      FunctionSignature params = functionElement.computeSignature(compiler);
+      FunctionSignature params = functionElement.functionSignature;
       params.orderedForEachParameter((Element parameterElement) {
         if (element.isGenerativeConstructorBody()) {
           ClosureScope scopeData = closureData.capturingScopes[node];
@@ -293,7 +293,7 @@
       bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
       String name = isInterceptorClass ? 'receiver' : '_';
       Element parameter = new InterceptedElement(
-          cls.computeType(compiler), name, element);
+          cls.thisType, name, element);
       HParameterValue value =
           new HParameterValue(parameter, builder.getTypeOfThis());
       builder.graph.explicitReceiverParameter = value;
@@ -305,7 +305,7 @@
       }
     } else if (isNativeUpgradeFactory) {
       Element parameter = new InterceptedElement(
-          cls.computeType(compiler), 'receiver', element);
+          cls.thisType, 'receiver', element);
       // Unlike `this`, receiver is nullable since direct calls to generative
       // constructor call the constructor with `null`.
       HParameterValue value =
@@ -885,7 +885,6 @@
  * This class builds SSA nodes for functions represented in AST.
  */
 class SsaBuilder extends ResolvedVisitor {
-  final Compiler compiler;
   final JavaScriptBackend backend;
   final ConstantSystem constantSystem;
   final CodegenWorkItem work;
@@ -964,10 +963,9 @@
   List<HInstruction> stack = <HInstruction>[];
 
   SsaBuilder(JavaScriptBackend backend,
-                    CodegenWorkItem work,
-                    this.nativeEmitter)
+             CodegenWorkItem work,
+             this.nativeEmitter)
     : this.backend = backend,
-      this.compiler = backend.compiler,
       this.constantSystem = backend.constantSystem,
       this.work = work,
       this.rti = backend.rti,
@@ -1101,7 +1099,7 @@
       FunctionElement function,
       List<HInstruction> providedArguments) {
     assert(selector.applies(function, compiler));
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     List<HInstruction> compiledArguments = new List<HInstruction>(
         signature.parameterCount + 1); // Plus one for receiver.
 
@@ -1447,7 +1445,7 @@
     // to be the first parameter.
     graph.entry.addBefore(graph.entry.last, parameter);
     HInstruction value =
-        potentiallyCheckType(parameter, field.computeType(compiler));
+        potentiallyCheckType(parameter, field.type);
     add(new HFieldSet(field, thisInstruction, value));
     return closeFunction();
   }
@@ -1458,7 +1456,7 @@
     assert(variable.initializer != null);
     visit(variable.initializer);
     HInstruction value = pop();
-    value = potentiallyCheckType(value, variable.computeType(compiler));
+    value = potentiallyCheckType(value, variable.type);
     closeAndGotoExit(new HReturn(value));
     return closeFunction();
   }
@@ -1545,7 +1543,7 @@
           compiledArguments[argumentIndex++]);
     }
 
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.orderedForEachParameter((Element parameter) {
       HInstruction argument = compiledArguments[argumentIndex++];
       localsHandler.updateLocal(parameter, argument);
@@ -1618,10 +1616,10 @@
    * function.
    */
   void potentiallyCheckInlinedParameterTypes(FunctionElement function) {
-    FunctionSignature signature = function.computeSignature(compiler);
-    signature.orderedForEachParameter((Element parameter) {
+    FunctionSignature signature = function.functionSignature;
+    signature.orderedForEachParameter((ParameterElement parameter) {
       HInstruction argument = localsHandler.readLocal(parameter);
-      potentiallyCheckType(argument, parameter.computeType(compiler));
+      potentiallyCheckType(argument, parameter.type);
     });
   }
 
@@ -1676,7 +1674,7 @@
       }
 
       int index = 0;
-      FunctionSignature params = callee.computeSignature(compiler);
+      FunctionSignature params = callee.functionSignature;
       params.orderedForEachParameter((Element parameter) {
         HInstruction argument = compiledArguments[index++];
         // Because we are inlining the initializer, we must update
@@ -1828,7 +1826,7 @@
     classElement.forEachInstanceField(
         (ClassElement enclosingClass, VariableElement member) {
           compiler.withCurrentElement(member, () {
-            TreeElements definitions = compiler.analyzeElement(member);
+            TreeElements definitions = member.treeElements;
             ast.Node node = member.parseNode(compiler);
             ast.Expression initializer = member.initializer;
             if (initializer == null) {
@@ -1885,7 +1883,7 @@
     buildFieldInitializers(classElement, fieldValues);
 
     // Compile field-parameters such as [:this.x:].
-    FunctionSignature params = functionElement.computeSignature(compiler);
+    FunctionSignature params = functionElement.functionSignature;
     params.orderedForEachParameter((Element element) {
       if (element.kind == ElementKind.FIELD_PARAMETER) {
         // If the [element] is a field-parameter then
@@ -1906,7 +1904,7 @@
     List<Element> fields = <Element>[];
 
     classElement.forEachInstanceField(
-        (ClassElement enclosingClass, Element member) {
+        (ClassElement enclosingClass, VariableElement member) {
           HInstruction value = fieldValues[member];
           if (value == null) {
             // Uninitialized native fields are pre-initialized by the native
@@ -1914,13 +1912,20 @@
             assert(isNativeUpgradeFactory);
           } else {
             fields.add(member);
-            constructorArguments.add(
-                potentiallyCheckType(value, member.computeType(compiler)));
+            DartType type = member.type;
+            if (enclosingClass.isMixinApplication) {
+              // TODO(johnniwinther): Add a member-like abstraction for fields
+              // that normalizes this.
+              type = type.substByContext(
+                  enclosingClass.thisType.asInstanceOf(
+                      member.enclosingElement));
+            }
+            constructorArguments.add(potentiallyCheckType(value, type));
           }
         },
         includeSuperAndInjectedMembers: true);
 
-    InterfaceType type = classElement.computeType(compiler);
+    InterfaceType type = classElement.thisType;
     TypeMask ssaType = new TypeMask.nonNullExact(classElement.declaration);
     List<DartType> instantiatedTypes;
     addInlinedInstantiation(type);
@@ -2030,8 +2035,7 @@
       List bodyCallInputs = <HInstruction>[];
       if (isNativeUpgradeFactory) {
         if (interceptor == null) {
-          Constant constant = new InterceptorConstant(
-              classElement.computeType(compiler));
+          Constant constant = new InterceptorConstant(classElement.thisType);
           interceptor = graph.addConstant(constant, compiler);
         }
         bodyCallInputs.add(interceptor);
@@ -2043,7 +2047,7 @@
       ClosureClassMap parameterClosureData =
           compiler.closureToClassMapper.getMappingForNestedFunction(node);
 
-      FunctionSignature functionSignature = body.computeSignature(compiler);
+      FunctionSignature functionSignature = body.functionSignature;
       // Provide the parameters to the generative constructor body.
       functionSignature.orderedForEachParameter((parameter) {
         // If [parameter] is boxed, it will be a field in the box passed as the
@@ -2119,13 +2123,13 @@
 
     if (element is FunctionElement) {
       FunctionElement functionElement = element;
-      FunctionSignature signature = functionElement.computeSignature(compiler);
+      FunctionSignature signature = functionElement.functionSignature;
 
       // Put the type checks in the first successor of the entry,
       // because that is where the type guards will also be inserted.
       // This way we ensure that a type guard will dominate the type
       // check.
-      signature.orderedForEachParameter((Element parameterElement) {
+      signature.orderedForEachParameter((ParameterElement parameterElement) {
         if (element.isGenerativeConstructorBody()) {
           ClosureScope scopeData =
               localsHandler.closureData.capturingScopes[node];
@@ -2139,7 +2143,7 @@
         }
         HInstruction newParameter = potentiallyCheckType(
             localsHandler.directLocals[parameterElement],
-            parameterElement.computeType(compiler));
+            parameterElement.type);
         localsHandler.directLocals[parameterElement] = newParameter;
       });
 
@@ -2235,7 +2239,7 @@
     if (compiler.enableTypeAssertions) {
       return potentiallyCheckType(
           value,
-          compiler.boolClass.computeType(compiler),
+          compiler.boolClass.rawType,
           kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
     }
     HInstruction result = new HBoolify(value, backend.boolType);
@@ -3012,8 +3016,9 @@
         pushInvokeStatic(location, element, <HInstruction>[value]);
         pop();
       } else {
+        VariableElement field = element;
         value =
-            potentiallyCheckType(value, element.computeType(compiler));
+            potentiallyCheckType(value, field.type);
         addWithPosition(new HStaticStore(element, value), location);
       }
       stack.add(value);
@@ -3431,7 +3436,7 @@
     // and implementation signatures. Currently it is need because the
     // signatures have different elements for parameters.
     FunctionElement implementation = function.implementation;
-    FunctionSignature params = implementation.computeSignature(compiler);
+    FunctionSignature params = implementation.functionSignature;
     if (params.optionalParameterCount != 0) {
       compiler.cancel(
           '"$name" does not handle closure with optional parameters',
@@ -4133,8 +4138,8 @@
         stack.add(addConstant(node));
       }
     } else if (element.isTypeVariable()) {
-      HInstruction value =
-          addTypeVariableReference(element.computeType(compiler));
+      TypeVariableElement typeVariable = element;
+      HInstruction value = addTypeVariableReference(typeVariable.type);
       pushInvokeStatic(node,
                        backend.getRuntimeTypeToString(),
                        [value],
@@ -4236,7 +4241,7 @@
                                        FunctionElement function,
                                        Link<ast.Node> argumentNodes) {
     List<String> existingArguments = <String>[];
-    FunctionSignature signature = function.computeSignature(compiler);
+    FunctionSignature signature = function.functionSignature;
     signature.forEachParameter((Element parameter) {
       existingArguments.add(parameter.name);
     });
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index bd98b6b..5bcc8fe 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -1413,7 +1413,7 @@
 
     if (condition.isConstant()) {
       HConstant constant = condition;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         generateStatements(info.thenGraph);
       } else {
         generateStatements(info.elseGraph);
@@ -1746,11 +1746,11 @@
   }
 
   void generateConstant(Constant constant) {
-    if (constant.isFunction()) {
+    if (constant.isFunction) {
       FunctionConstant function = constant;
       world.registerStaticUse(function.element);
     }
-    if (constant.isType()) {
+    if (constant.isType) {
       // If the type is a web component, we need to ensure the constructors are
       // available to 'upgrade' the native object.
       TypeConstant type = constant;
@@ -2537,7 +2537,7 @@
       // TODO(5022): We currently generate $isFunction checks for
       // function types.
       world.registerIsCheck(
-          compiler.functionClass.computeType(compiler), work.resolutionTree);
+          compiler.functionClass.rawType, work.resolutionTree);
     }
     world.registerIsCheck(type, work.resolutionTree);
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
index 1e83906..5dbea83 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen_helpers.dart
@@ -285,16 +285,66 @@
         markAsGenerateAtUseSite(instruction);
         continue;
       }
-      if (instruction.isJsStatement()) {
-        expectedInputs.clear();
-      }
       if (instruction.isPure()) {
         if (pureInputs.contains(instruction)) {
           tryGenerateAtUseSite(instruction);
         } else {
           // If the input is not in the [pureInputs] set, it has not
-          // been visited.
+          // been visited or should not be generated at use-site. The most
+          // likely reason for the latter, is that the instruction is used
+          // in more than one location.
+          // We must either clear the expectedInputs, or move the pure
+          // instruction's inputs in front of the existing ones.
+          // Example:
+          //   t1 = foo();  // side-effect.
+          //   t2 = bar();  // side-effect.
+          //   t3 = pure(t2);    // used more than once.
+          //   f(t1, t3);   // expected inputs of 'f': t1.
+          //   use(t3);
+          //
+          // If we don't clear the expected inputs we end up in a situation
+          // where pure pushes "t2" on top of "t1" leading to:
+          //   t3 = pure(bar());
+          //   f(foo(), t3);
+          //   use(t3);
+          //
+          // If we clear the expected-inputs list we have the correct
+          // output:
+          //   t1 = foo();
+          //   t3 = pure(bar());
+          //   f(t1, t3);
+          //   use(t3);
+          //
+          // Clearing is, however, not optimal.
+          // Example:
+          //   t1 = foo();  // t1 is now used by `pure`.
+          //   t2 = bar();  // t2 is now used by `f`.
+          //   t3 = pure(t1);
+          //   f(t2, t3);
+          //   use(t3);
+          //
+          // If we clear the expected-inputs we can't generate-at-use any of
+          // the instructions.
+          //
+          // The optimal solution is to move the inputs of 'pure' in
+          // front of the expectedInputs list. This makes sense, since we
+          // push expected-inputs from left-to right, and the `pure` function
+          // invocation is "more left" (i.e. before) the first argument of `f`.
+          // With that approach we end up with:
+          //   t3 = pure(foo();
+          //   f(bar(), t3);
+          //   use(t3);
+          //
+          int oldLength = expectedInputs.length;
           instruction.accept(this);
+          if (oldLength != 0 && oldLength != expectedInputs.length) {
+            // Move the pure instruction's inputs to the front.
+            List<HInstruction> newInputs = expectedInputs.sublist(oldLength);
+            int newCount = newInputs.length;
+            expectedInputs.setRange(
+                newCount, newCount + oldLength, expectedInputs);
+            expectedInputs.setRange(0, newCount, newInputs);
+          }
         }
       } else {
         if (findInInputsAndPopNonMatching(instruction)) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
index 6e2f2fe..a25b079 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/interceptor_simplifier.dart
@@ -149,8 +149,7 @@
       return graph.thisInstruction;
     }
 
-    Constant constant = new InterceptorConstant(
-        constantInterceptor.computeType(compiler));
+    Constant constant = new InterceptorConstant(constantInterceptor.thisType);
     return graph.addConstant(constant, compiler);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
index 3b0443e..ba34bb2 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/nodes.dart
@@ -1932,17 +1932,17 @@
   accept(HVisitor visitor) => visitor.visitConstant(this);
 
   bool isConstant() => true;
-  bool isConstantBoolean() => constant.isBool();
-  bool isConstantNull() => constant.isNull();
-  bool isConstantNumber() => constant.isNum();
-  bool isConstantInteger() => constant.isInt();
-  bool isConstantString() => constant.isString();
-  bool isConstantList() => constant.isList();
-  bool isConstantMap() => constant.isMap();
-  bool isConstantFalse() => constant.isFalse();
-  bool isConstantTrue() => constant.isTrue();
+  bool isConstantBoolean() => constant.isBool;
+  bool isConstantNull() => constant.isNull;
+  bool isConstantNumber() => constant.isNum;
+  bool isConstantInteger() => constant.isInt;
+  bool isConstantString() => constant.isString;
+  bool isConstantList() => constant.isList;
+  bool isConstantMap() => constant.isMap;
+  bool isConstantFalse() => constant.isFalse;
+  bool isConstantTrue() => constant.isTrue;
 
-  bool isInterceptor(Compiler compiler) => constant.isInterceptor();
+  bool isInterceptor(Compiler compiler) => constant.isInterceptor;
 
   // Maybe avoid this if the literal is big?
   bool isCodeMotionInvariant() => true;
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index 7931074..b575772 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -184,7 +184,7 @@
     HInstruction input = inputs[0];
     if (input is HConstant) {
       HConstant constant = input;
-      bool isTrue = constant.constant.isTrue();
+      bool isTrue = constant.constant.isTrue;
       return graph.addConstantBool(!isTrue, compiler);
     } else if (input is HNot) {
       return input.inputs[0];
@@ -329,7 +329,7 @@
       } else {
         // TODO(ngeoffray): If the method has optional parameters,
         // we should pass the default values.
-        FunctionSignature parameters = method.computeSignature(compiler);
+        FunctionSignature parameters = method.functionSignature;
         if (parameters.optionalParameterCount == 0
             || parameters.parameterCount == node.selector.argumentCount) {
           node.element = element;
@@ -357,7 +357,7 @@
     //   foo() native 'return something';
     // They should not be used.
 
-    FunctionSignature signature = method.computeSignature(compiler);
+    FunctionSignature signature = method.functionSignature;
     if (signature.optionalParametersAreNamed) return null;
 
     // Return types on native methods don't need to be checked, since the
@@ -369,10 +369,10 @@
     List<HInstruction> inputs = node.inputs.sublist(1);
     int inputPosition = 1;  // Skip receiver.
     bool canInline = true;
-    signature.forEachParameter((Element element) {
+    signature.forEachParameter((ParameterElement element) {
       if (inputPosition < inputs.length && canInline) {
         HInstruction input = inputs[inputPosition++];
-        DartType type = element.computeType(compiler).unalias(compiler);
+        DartType type = element.type.unalias(compiler);
         if (type is FunctionType) {
           canInline = false;
         }
@@ -405,7 +405,7 @@
     if (index.isInteger(compiler)) return node;
     if (index.isConstant()) {
       HConstant constantInstruction = index;
-      assert(!constantInstruction.constant.isInt());
+      assert(!constantInstruction.constant.isInt);
       if (!constantSystem.isInt(constantInstruction.constant)) {
         // -0.0 is a double but will pass the runtime integer check.
         node.staticChecks = HBoundsCheck.ALWAYS_FALSE;
@@ -432,8 +432,8 @@
     // We can only perform this rewriting on Integer, as it is not
     // valid for -0.0.
     if (left.isInteger(compiler) && right.isInteger(compiler)) {
-      if (left is HConstant && left.constant.isZero()) return right;
-      if (right is HConstant && right.constant.isZero()) return left;
+      if (left is HConstant && left.constant.isZero) return right;
+      if (right is HConstant && right.constant.isZero) return left;
     }
     return super.visitAdd(node);
   }
@@ -442,8 +442,8 @@
     HInstruction left = node.left;
     HInstruction right = node.right;
     if (left.isNumber(compiler) && right.isNumber(compiler)) {
-      if (left is HConstant && left.constant.isOne()) return right;
-      if (right is HConstant && right.constant.isOne()) return left;
+      if (left is HConstant && left.constant.isOne) return right;
+      if (right is HConstant && right.constant.isOne) return left;
     }
     return super.visitMultiply(node);
   }
@@ -497,7 +497,7 @@
 
     if (left.isConstantBoolean() && right.isBoolean(compiler)) {
       HConstant constant = left;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         return right;
       } else {
         return new HNot(right, backend.boolType);
@@ -506,7 +506,7 @@
 
     if (right.isConstantBoolean() && left.isBoolean(compiler)) {
       HConstant constant = right;
-      if (constant.constant.isTrue()) {
+      if (constant.constant.isTrue) {
         return left;
       } else {
         return new HNot(left, backend.boolType);
@@ -657,8 +657,8 @@
     return inputType.isInMask(checkedType, compiler) ? input : node;
   }
 
-  Element findConcreteFieldForDynamicAccess(HInstruction receiver,
-                                            Selector selector) {
+  VariableElement findConcreteFieldForDynamicAccess(HInstruction receiver,
+                                                    Selector selector) {
     TypeMask receiverType = receiver.instructionType;
     return compiler.world.locateSingleField(
         new TypedSelector(receiverType, selector));
@@ -746,14 +746,15 @@
     }
 
     HInstruction receiver = node.getDartReceiver(compiler);
-    Element field = findConcreteFieldForDynamicAccess(receiver, node.selector);
+    VariableElement field =
+        findConcreteFieldForDynamicAccess(receiver, node.selector);
     if (field == null || !field.isAssignable()) return node;
     // Use [:node.inputs.last:] in case the call follows the
     // interceptor calling convention, but is not a call on an
     // interceptor.
     HInstruction value = node.inputs.last;
     if (compiler.enableTypeAssertions) {
-      DartType type = field.computeType(compiler);
+      DartType type = field.type;
       if (!type.treatAsRaw || type.kind == TypeKind.TYPE_VARIABLE) {
         // We cannot generate the correct type representation here, so don't
         // inline this access.
@@ -816,7 +817,7 @@
     if (input.isString(compiler)) return input;
     if (input.isConstant()) {
       HConstant constant = input;
-      if (!constant.constant.isPrimitive()) return node;
+      if (!constant.constant.isPrimitive) return node;
       PrimitiveConstant primitive = constant.constant;
       return graph.addConstant(constantSystem.createString(
           primitive.toDartString()), compiler);
@@ -1528,32 +1529,72 @@
 
     List<HInstruction> ifUsers = <HInstruction>[];
     List<HInstruction> notIfUsers = <HInstruction>[];
-    for (HInstruction user in instruction.usedBy) {
-      if (user is HIf) {
-        ifUsers.add(user);
-      } else if (user is HNot) {
-        for (HInstruction notUser in user.usedBy) {
-          if (notUser is HIf) notIfUsers.add(notUser);
-        }
-      }
-    }
+
+    collectIfUsers(instruction, ifUsers, notIfUsers);
 
     if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
 
     TypeMask convertedType = new TypeMask.nonNullSubtype(element);
     HInstruction input = instruction.expression;
+
     for (HIf ifUser in ifUsers) {
       changeUsesDominatedBy(ifUser.thenBlock, input, convertedType);
       // TODO(ngeoffray): Also change uses for the else block on a type
       // that knows it is not of a specific type.
     }
-
     for (HIf ifUser in notIfUsers) {
       changeUsesDominatedBy(ifUser.elseBlock, input, convertedType);
       // TODO(ngeoffray): Also change uses for the then block on a type
       // that knows it is not of a specific type.
     }
   }
+
+  void visitIdentity(HIdentity instruction) {
+    // At HIf(HIdentity(x, null)) strengthens x to non-null on else branch.
+    HInstruction left = instruction.left;
+    HInstruction right = instruction.right;
+    HInstruction input;
+
+    if (left.isConstantNull()) {
+      input = right;
+    } else if (right.isConstantNull()) {
+      input = left;
+    } else {
+      return;
+    }
+
+    if (!input.instructionType.isNullable) return;
+
+    List<HInstruction> ifUsers = <HInstruction>[];
+    List<HInstruction> notIfUsers = <HInstruction>[];
+
+    collectIfUsers(instruction, ifUsers, notIfUsers);
+
+    if (ifUsers.isEmpty && notIfUsers.isEmpty) return;
+
+    TypeMask nonNullType = input.instructionType.nonNullable();
+
+    for (HIf ifUser in ifUsers) {
+      changeUsesDominatedBy(ifUser.elseBlock, input, nonNullType);
+      // Uses in thenBlock are `null`, but probably not common.
+    }
+    for (HIf ifUser in notIfUsers) {
+      changeUsesDominatedBy(ifUser.thenBlock, input, nonNullType);
+      // Uses in elseBlock are `null`, but probably not common.
+    }
+  }
+
+  collectIfUsers(HInstruction instruction,
+                 List<HInstruction> ifUsers,
+                 List<HInstruction> notIfUsers) {
+    for (HInstruction user in instruction.usedBy) {
+      if (user is HIf) {
+        ifUsers.add(user);
+      } else if (user is HNot) {
+        collectIfUsers(user, notIfUsers, ifUsers);
+      }
+    }
+  }
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
index 775cd43..19e3ab9 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/value_range_analyzer.dart
@@ -135,7 +135,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.add.fold(
         constantSystem.createInt(value), constantSystem.createInt(other.value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -145,7 +145,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.subtract.fold(
         constantSystem.createInt(value), constantSystem.createInt(other.value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -154,7 +154,7 @@
     ConstantSystem constantSystem = info.constantSystem;
     var constant = constantSystem.negate.fold(
         constantSystem.createInt(value));
-    if (!constant.isInt()) return const UnknownValue();
+    if (!constant.isInt) return const UnknownValue();
     return info.newIntValue(constant.value);
   }
 
@@ -670,7 +670,7 @@
   Range visitConstant(HConstant constant) {
     if (!constant.isInteger(compiler)) return info.newUnboundRange();
     NumConstant constantNum = constant.constant;
-    if (constantNum.isMinusZero()) constantNum = new IntConstant(0);
+    if (constantNum.isMinusZero) constantNum = new IntConstant(0);
     Value value = info.newIntValue(constantNum.value);
     return info.newNormalizedRange(value, value);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
index 559c5db..920aa45 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/variable_allocator.dart
@@ -437,17 +437,10 @@
     : ownName = new Map<HInstruction, String>(),
       copyHandlers = new Map<HBasicBlock, CopyHandler>(),
       allUsedNames = new Set<String>(),
-      swapTemp = computeFreshWithPrefix("t");
+      swapTemp = 't0';
 
   int get numberOfVariables => allUsedNames.length;
 
-  /** Returns a fresh variable with the given prefix. */
-  static String computeFreshWithPrefix(String prefix) {
-    String name = '${prefix}0';
-    int i = 1;
-    return name;
-  }
-
   String getName(HInstruction instruction) {
     return ownName[instruction];
   }
diff --git a/sdk/lib/_internal/compiler/implementation/typechecker.dart b/sdk/lib/_internal/compiler/implementation/typechecker.dart
index 048c1a8..401645f 100644
--- a/sdk/lib/_internal/compiler/implementation/typechecker.dart
+++ b/sdk/lib/_internal/compiler/implementation/typechecker.dart
@@ -156,8 +156,7 @@
     assert(element != null);
   }
 
-  DartType computeType(Compiler compiler) =>
-      compiler.typeClass.computeType(compiler);
+  DartType computeType(Compiler compiler) => compiler.typeClass.rawType;
 
   String toString() => 'TypeLiteralAccess($element)';
 }
@@ -297,7 +296,7 @@
   DartType getKnownType(VariableElement element) {
     TypePromotion typePromotion = getKnownTypePromotion(element);
     if (typePromotion != null) return typePromotion.type;
-    return element.computeType(compiler);
+    return element.type;
   }
 
   TypeCheckerVisitor(this.compiler, TreeElements elements, this.types)
@@ -312,7 +311,7 @@
     listType = compiler.listClass.computeType(compiler);
 
     if (currentClass != null) {
-      thisType = currentClass.computeType(compiler);
+      thisType = currentClass.thisType;
       superType = currentClass.supertype;
     }
   }
@@ -569,11 +568,10 @@
       type = types.dynamicType;
       returnType = types.voidType;
 
-      element.functionSignature.forEachParameter((Element parameter) {
+      element.functionSignature.forEachParameter((ParameterElement parameter) {
         if (parameter.isFieldParameter()) {
           FieldParameterElement fieldParameter = parameter;
-          checkAssignable(parameter,
-              parameter.computeType(compiler),
+          checkAssignable(parameter, parameter.type,
               fieldParameter.fieldElement.computeType(compiler));
         }
       });
@@ -1459,7 +1457,7 @@
   }
 
   DartType visitLiteralSymbol(LiteralSymbol node) {
-    return compiler.symbolClass.computeType(compiler);
+    return compiler.symbolClass.rawType;
   }
 
   DartType computeConstructorType(Element constructor, DartType type) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index ee598d7..27da00d 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -194,7 +194,7 @@
         return new Selector.indexSet();
       }
       FunctionSignature signature =
-          element.asFunctionElement().computeSignature(compiler);
+          element.asFunctionElement().functionSignature;
       int arity = signature.parameterCount;
       List<String> namedArguments = null;
       if (signature.optionalParametersAreNamed) {
@@ -407,7 +407,7 @@
     assert(invariant(element, element.isImplementation));
     if (!this.applies(element, compiler)) return false;
 
-    FunctionSignature parameters = element.computeSignature(compiler);
+    FunctionSignature parameters = element.functionSignature;
     parameters.forEachRequiredParameter((element) {
       list.add(compileArgument(arguments.head));
       arguments = arguments.tail;
@@ -465,7 +465,7 @@
       compileConstant(Element element),
       Compiler compiler) {
 
-    FunctionSignature signature = caller.computeSignature(compiler);
+    FunctionSignature signature = caller.functionSignature;
     Map mapping = new Map();
 
     // TODO(ngeoffray): This is a hack that fakes up AST nodes, so
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index ca5d04d..abbcb91 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -61,7 +61,7 @@
 }
 
 void useConstant(dart2jslib.Constant constant, dart2jslib.ConstantSystem cs) {
-  constant.isObject();
+  constant.isObject;
   cs.isBool(constant);
 }
 
diff --git a/sdk/lib/_internal/compiler/implementation/util/util.dart b/sdk/lib/_internal/compiler/implementation/util/util.dart
index 0b51aed..dc4474e 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util.dart
@@ -37,7 +37,8 @@
   final String message;
   SpannableAssertionFailure(this.node, this.message);
 
-  String toString() => 'Assertion failure: $message';
+  String toString() => 'Assertion failure'
+                       '${message != null ? ': $message' : ''}';
 }
 
 /**
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index a67dc21..e1f4f33 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -554,7 +554,11 @@
       "Not a compile-time constant.");
 
   static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT = const MessageKind(
-      "Deferred classes cannot be used to create compile-time constants.");
+      "A Deferred value cannot be used as a compile-time constant.");
+
+  static const MessageKind DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION =
+      const MessageKind("A deferred class cannot be used to create a"
+          "compile-time constant.");
 
   static const MessageKind CYCLIC_COMPILE_TIME_CONSTANTS = const MessageKind(
       "Cycle in the compile-time constant computation.");
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 0bd0544..6e0821a 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -179,6 +179,9 @@
   patch static void _setExitCode(int status) {
     throw new UnsupportedError("ProcessUtils._setExitCode");
   }
+  patch static int _getExitCode() {
+    throw new UnsupportedError("ProcessUtils._getExitCode");
+  }
   patch static void _sleep(int millis) {
     throw new UnsupportedError("ProcessUtils._sleep");
   }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 74df1a4..d707a13 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -2100,51 +2100,51 @@
     case 1:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(){'
-              'return s(this)[n](r(this))'
+              'return f.call(s(this),r(this))'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 2:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a){'
-              'return s(this)[n](r(this),a)'
+              'return f.call(s(this),r(this),a)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 3:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b){'
-              'return s(this)[n](r(this),a,b)'
+              'return f.call(s(this),r(this),a,b)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 4:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c){'
-              'return s(this)[n](r(this),a,b,c)'
+              'return f.call(s(this),r(this),a,b,c)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 5:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c,d){'
-              'return s(this)[n](r(this),a,b,c,d)'
+              'return f.call(s(this),r(this),a,b,c,d)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     case 6:
       return JS(
           '',
-          'function(n,s,r){'
+          'function(f,s,r){'
             'return function(a,b,c,d,e){'
-              'return s(this)[n](r(this),a,b,c,d,e)'
+              'return f.call(s(this),r(this),a,b,c,d,e)'
             '}'
-          '}(#,#,#)', name, getSelf, getReceiver);
+          '}(#,#,#)', function, getSelf, getReceiver);
     default:
       return JS(
           '',
@@ -2159,16 +2159,22 @@
   }
 
   static forwardInterceptedCallTo(function) {
+    String selfField = BoundClosure.selfFieldName();
+    String receiverField = BoundClosure.receiverFieldName();
     String stubName = JS('String|Null', '#.\$stubName', function);
     int arity = JS('int', '#.length', function);
     bool isCsp = JS('bool', 'typeof dart_precompiled == "function"');
     if (isCsp) {
       return cspForwardInterceptedCall(arity, stubName, function);
     } else if (arity == 1) {
-      return JS('', 'new Function(#)',
-                'return this.${BoundClosure.selfFieldName()}.$stubName('
-                    'this.${BoundClosure.receiverFieldName()});'
-                '${functionCounter++}');
+      return JS(
+          '',
+          '(new Function("F",#))(#)',
+          'return function(){'
+            'return F.call(this.$selfField, this.$receiverField);'
+            '${functionCounter++}'
+          '}',
+          function);
     } else if (1 < arity && arity < 28) {
       String arguments = JS(
           'String',
@@ -2176,12 +2182,12 @@
           arity - 1);
       return JS(
           '',
-          '(new Function(#))()',
+          '(new Function("F",#))(#)',
           'return function($arguments){'
-            'return this.${BoundClosure.selfFieldName()}.$stubName('
-                'this.${BoundClosure.receiverFieldName()},$arguments);'
+            'return F.call(this.$selfField, this.$receiverField, $arguments);'
             '${functionCounter++}'
-          '}');
+          '}',
+          function);
     } else {
       return cspForwardInterceptedCall(arity, stubName, function);
     }
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
new file mode 100644
index 0000000..43328e1
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart
@@ -0,0 +1,100 @@
+// 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.
+
+library pub.asset.serialize;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+import 'package:source_maps/span.dart';
+
+import 'serialize/exception.dart';
+
+export 'serialize/exception.dart';
+export 'serialize/transform.dart';
+export 'serialize/transformer.dart';
+
+/// Converts [id] into a serializable map.
+Map serializeId(AssetId id) => {'package': id.package, 'path': id.path};
+
+/// Converts a serializable map into an [AssetId].
+AssetId deserializeId(Map id) => new AssetId(id['package'], id['path']);
+
+/// Converts [span] into a serializable map.
+Map serializeSpan(Span span) {
+  // TODO(nweiz): convert FileSpans to FileSpans.
+  return {
+    'type': 'fixed',
+    'sourceUrl': span.sourceUrl,
+    'start': serializeLocation(span.start),
+    'text': span.text,
+    'isIdentifier': span.isIdentifier
+  };
+}
+
+/// Converts a serializable map into a [Span].
+Span deserializeSpan(Map span) {
+  assert(span['type'] == 'fixed');
+  var location = deserializeLocation(span['start']);
+  return new FixedSpan(span['sourceUrl'], location.offset, location.line,
+      location.column, text: span['text'], isIdentifier: span['isIdentifier']);
+}
+
+/// Converts [location] into a serializable map.
+Map serializeLocation(Location location) {
+  // TODO(nweiz): convert FileLocations to FileLocations.
+  return {
+    'type': 'fixed',
+    'sourceUrl': location.sourceUrl,
+    'offset': location.offset,
+    'line': location.line,
+    'column': location.column
+  };
+}
+
+/// Converts a serializable map into a [Location].
+Location deserializeLocation(Map location) {
+  assert(location['type'] == 'fixed');
+  return new FixedLocation(location['offset'], location['sourceUrl'],
+      location['line'], location['column']);
+}
+
+/// Wraps [message] and sends it across [port], then waits for a response which
+/// should be sent using [respond].
+///
+/// The returned Future will complete to the value or error returned by
+/// [respond].
+Future call(SendPort port, message) {
+  var receivePort = new ReceivePort();
+  port.send({
+    'message': message,
+    'replyTo': receivePort.sendPort
+  });
+
+  return receivePort.first.then((response) {
+    if (response['type'] == 'success') return response['value'];
+    assert(response['type'] == 'error');
+    var exception = deserializeException(response['error']);
+    return new Future.error(exception, exception.stackTrace);
+  });
+}
+
+/// Responds to a message sent by [call].
+///
+/// [wrappedMessage] is the raw message sent by [call]. This unwraps it and
+/// passes the contents of the message to [callback], then sends the return
+/// value of [callback] back to [call]. If [callback] returns a Future or
+/// throws an error, that will also be sent.
+void respond(wrappedMessage, callback(message)) {
+  var replyTo = wrappedMessage['replyTo'];
+  new Future.sync(() => callback(wrappedMessage['message']))
+      .then((result) => replyTo.send({'type': 'success', 'value': result}))
+      .catchError((error, stackTrace) {
+    replyTo.send({
+      'type': 'error',
+      'error': serializeException(error, stackTrace)
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart b/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart
new file mode 100644
index 0000000..26040a9
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/exception.dart
@@ -0,0 +1,102 @@
+// 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.
+
+library pub.asset.serialize.exception;
+
+import 'package:barback/barback.dart';
+import 'package:stack_trace/stack_trace.dart';
+
+import '../utils.dart';
+
+/// An exception that was originally raised in another isolate.
+///
+/// Exception objects can't cross isolate boundaries in general, so this class
+/// wraps as much information as can be consistently serialized.
+class CrossIsolateException implements Exception {
+  /// The name of the type of exception thrown.
+  ///
+  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
+  /// that objects in different libraries may have the same type name.
+  final String type;
+
+  /// The exception's message, or its [toString] if it didn't expose a `message`
+  /// property.
+  final String message;
+
+  /// The exception's stack chain, or `null` if no stack chain was available.
+  final Chain stackTrace;
+
+  /// Loads a [CrossIsolateException] from a serialized representation.
+  ///
+  /// [error] should be the result of [CrossIsolateException.serialize].
+  CrossIsolateException.deserialize(Map error)
+      : type = error['type'],
+        message = error['message'],
+        stackTrace = error['stack'] == null ? null :
+            new Chain.parse(error['stack']);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(error, [StackTrace stack]) {
+    if (stack == null && error is Error) stack = error.stackTrace;
+    return {
+      'type': error.runtimeType.toString(),
+      'message': getErrorMessage(error),
+      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
+    };
+  }
+
+  String toString() => "$message\n$stackTrace";
+}
+
+/// An [AssetNotFoundException] that was originally raised in another isolate. 
+class _CrossIsolateAssetNotFoundException extends CrossIsolateException
+    implements AssetNotFoundException {
+  final AssetId id;
+
+  String get message => "Could not find asset $id.";
+
+  /// Loads a [_CrossIsolateAssetNotFoundException] from a serialized
+  /// representation.
+  ///
+  /// [error] should be the result of
+  /// [_CrossIsolateAssetNotFoundException.serialize].
+  _CrossIsolateAssetNotFoundException.deserialize(Map error)
+      : id = new AssetId(error['package'], error['path']),
+        super.deserialize(error);
+
+  /// Serializes [error] to an object that can safely be passed across isolate
+  /// boundaries.
+  static Map serialize(AssetNotFoundException error, [StackTrace stack]) {
+    var map = CrossIsolateException.serialize(error);
+    map['package'] = error.id.package;
+    map['path'] = error.id.path;
+    return map;
+  }
+}
+
+/// Serializes [error] to an object that can safely be passed across isolate
+/// boundaries.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+Map serializeException(error, [StackTrace stack]) {
+  if (error is AssetNotFoundException) {
+    return _CrossIsolateAssetNotFoundException.serialize(error, stack);
+  } else {
+    return CrossIsolateException.serialize(error, stack);
+  }
+}
+
+/// Loads an exception from a serialized representation.
+///
+/// This handles [AssetNotFoundException]s specially, ensuring that their
+/// metadata is preserved.
+CrossIsolateException deserializeException(Map error) {
+  if (error['type'] == 'AssetNotFoundException') {
+    return new _CrossIsolateAssetNotFoundException.deserialize(error);
+  } else {
+    return new CrossIsolateException.deserialize(error);
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
new file mode 100644
index 0000000..cc5e052
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
@@ -0,0 +1,126 @@
+// 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.
+
+library pub.asset.serialize.transform;
+
+import 'dart:async';
+import 'dart:isolate';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import '../utils.dart';
+
+/// Converts [transform] into a serializable map.
+Map serializeTransform(Transform transform) {
+  var receivePort = new ReceivePort();
+  receivePort.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'getInput') {
+        return transform.getInput(deserializeId(message['id']))
+            .then((asset) => serializeAsset(asset));
+      }
+
+      if (message['type'] == 'addOutput') {
+        transform.addOutput(deserializeAsset(message['output']));
+        return null;
+      }
+
+      if (message['type'] == 'consumePrimary') {
+        transform.consumePrimary();
+        return null;
+      }
+
+      assert(message['type'] == 'log');
+      var method;
+      if (message['level'] == 'Info') {
+        method = transform.logger.info;
+      } else if (message['level'] == 'Fine') {
+        method = transform.logger.fine;
+      } else if (message['level'] == 'Warning') {
+        method = transform.logger.warning;
+      } else {
+        assert(message['level'] == 'Error');
+        method = transform.logger.error;
+      }
+
+      var assetId = message['assetId'] == null ? null :
+        deserializeId(message['assetId']);
+      var span = message['span'] == null ? null :
+        deserializeSpan(message['span']);
+      method(message['message'], asset: assetId, span: span);
+    });
+  });
+
+  return {
+    'port': receivePort.sendPort,
+    'primaryInput': serializeAsset(transform.primaryInput)
+  };
+}
+
+/// A wrapper for a [Transform] that's in the host isolate.
+///
+/// This retrieves inputs from and sends outputs and logs to the host isolate.
+class ForeignTransform implements Transform {
+  /// The port with which we communicate with the host isolate.
+  ///
+  /// This port and all messages sent across it are specific to this transform.
+  final SendPort _port;
+
+  final Asset primaryInput;
+
+  TransformLogger get logger => _logger;
+  TransformLogger _logger;
+
+  /// Creates a transform from a serializable map sent from the host isolate.
+  ForeignTransform(Map transform)
+      : _port = transform['port'],
+        primaryInput = deserializeAsset(transform['primaryInput']) {
+    _logger = new TransformLogger((assetId, level, message, span) {
+      call(_port, {
+        'type': 'log',
+        'level': level.name,
+        'message': message,
+        'assetId': assetId == null ? null : serializeId(assetId),
+        'span': span == null ? null : serializeSpan(span)
+      });
+    });
+  }
+
+  Future<Asset> getInput(AssetId id) {
+    return call(_port, {
+      'type': 'getInput',
+      'id': serializeId(id)
+    }).then(deserializeAsset);
+  }
+
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) => input.readAsString(encoding: encoding));
+  }
+
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+
+  void addOutput(Asset output) {
+    call(_port, {
+      'type': 'addOutput',
+      'output': serializeAsset(output)
+    });
+  }
+
+  void consumePrimary() {
+    call(_port, {'type': 'consumePrimary'});
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
new file mode 100644
index 0000000..608eaa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -0,0 +1,60 @@
+// 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.
+
+library pub.asset.serialize.transformer;
+
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import 'transform.dart';
+
+/// Converts [transformer] into a serializable map.
+Map serializeTransformer(Transformer transformer) {
+  var port = new ReceivePort();
+  port.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'isPrimary') {
+        return transformer.isPrimary(deserializeAsset(message['asset']));
+      } else {
+        assert(message['type'] == 'apply');
+
+        // Make sure we return null so that if the transformer's [apply] returns
+        // a non-serializable value it doesn't cause problems.
+        return transformer.apply(
+            new ForeignTransform(message['transform'])).then((_) => null);
+      }
+    });
+  });
+
+  return {
+    'type': 'Transformer',
+    'toString': transformer.toString(),
+    'port': port.sendPort
+  };
+}
+
+// Converts [group] into a serializable map.
+Map serializeTransformerGroup(TransformerGroup group) {
+  return {
+    'type': 'TransformerGroup',
+    'toString': group.toString(),
+    'phases': group.phases.map((phase) {
+      return phase.map(serializeTransformerOrGroup).toList();
+    }).toList()
+  };
+}
+
+/// Converts [transformerOrGroup] into a serializable map.
+Map serializeTransformerOrGroup(transformerOrGroup) {
+  if (transformerOrGroup is Transformer) {
+    return serializeTransformer(transformerOrGroup);
+  } else {
+    assert(transformerOrGroup is TransformerGroup);
+    return serializeTransformerGroup(transformerOrGroup);
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
new file mode 100644
index 0000000..5b6dfa7
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -0,0 +1,71 @@
+// 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.
+
+library pub.asset.transformer_isolate;
+
+import 'dart:convert';
+import 'dart:isolate';
+import 'dart:mirrors';
+
+import 'package:barback/barback.dart';
+
+import 'serialize.dart';
+
+/// Sets up the initial communication with the host isolate.
+void loadTransformers(SendPort replyTo) {
+  var port = new ReceivePort();
+  replyTo.send(port.sendPort);
+  port.first.then((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      var library = Uri.parse(message['library']);
+      var configuration = JSON.decode(message['configuration']);
+      var mode = new BarbackMode(message['mode']);
+      return _initialize(library, configuration, mode).
+          map(serializeTransformerOrGroup).toList();
+    });
+  });
+}
+
+/// Loads all the transformers and groups defined in [uri].
+///
+/// Loads the library, finds any Transformer or TransformerGroup subclasses in
+/// it, instantiates them with [configuration] and [mode], and returns them.
+Iterable _initialize(Uri uri, Map configuration, BarbackMode mode) {
+  var mirrors = currentMirrorSystem();
+  var transformerClass = reflectClass(Transformer);
+  var groupClass = reflectClass(TransformerGroup);
+
+  // TODO(nweiz): if no valid transformers are found, throw an error message
+  // describing candidates and why they were rejected.
+  return mirrors.libraries[uri].declarations.values.map((declaration) {
+    if (declaration is! ClassMirror) return null;
+    var classMirror = declaration;
+    if (classMirror.isPrivate) return null;
+    if (classMirror.isAbstract) return null;
+    if (!classMirror.isSubtypeOf(transformerClass) &&
+        !classMirror.isSubtypeOf(groupClass)) {
+      return null;
+    }
+
+    var constructor = _getConstructor(classMirror, 'asPlugin');
+    if (constructor == null) return null;
+    if (constructor.parameters.isEmpty) {
+      if (configuration.isNotEmpty) return null;
+      return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
+    }
+    if (constructor.parameters.length != 1) return null;
+
+    return classMirror.newInstance(const Symbol('asPlugin'),
+        [new BarbackSettings(configuration, mode)]).reflectee;
+  }).where((classMirror) => classMirror != null);
+}
+
+// TODO(nweiz): clean this up when issue 13248 is fixed.
+MethodMirror _getConstructor(ClassMirror classMirror, String constructor) {
+  var name = new Symbol("${MirrorSystem.getName(classMirror.simpleName)}"
+      ".$constructor");
+  var candidate = classMirror.declarations[name];
+  if (candidate is MethodMirror && candidate.isConstructor) return candidate;
+  return null;
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/utils.dart b/sdk/lib/_internal/pub/asset/dart/utils.dart
new file mode 100644
index 0000000..72150ed
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/utils.dart
@@ -0,0 +1,86 @@
+// 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.
+
+/// Functions go in this file as opposed to lib/src/utils.dart if they need to
+/// be accessible to the transformer-loading isolate.
+library pub.asset.utils;
+
+import 'dart:async';
+
+/// A regular expression to match the exception prefix that some exceptions'
+/// [Object.toString] values contain.
+final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
+
+/// Get a string description of an exception.
+///
+/// Many exceptions include the exception class name at the beginning of their
+/// [toString], so we remove that if it exists.
+String getErrorMessage(error) =>
+  error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a buffered stream that will emit the same values as the stream
+/// returned by [future] once [future] completes.
+///
+/// If [future] completes to an error, the return value will emit that error and
+/// then close.
+///
+/// If [broadcast] is true, a broadcast stream is returned. This assumes that
+/// the stream returned by [future] will be a broadcast stream as well.
+/// [broadcast] defaults to false.
+Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
+  var subscription;
+  var controller;
+
+  future = future.catchError((e, stackTrace) {
+    // Since [controller] is synchronous, it's likely that emitting an error
+    // will cause it to be cancelled before we call close.
+    if (controller != null) controller.addError(e, stackTrace);
+    if (controller != null) controller.close();
+    controller = null;
+  });
+
+  onListen() {
+    future.then((stream) {
+      if (controller == null) return;
+      subscription = stream.listen(
+          controller.add,
+          onError: controller.addError,
+          onDone: controller.close);
+    });
+  }
+
+  onCancel() {
+    if (subscription != null) subscription.cancel();
+    subscription = null;
+    controller = null;
+  }
+
+  if (broadcast) {
+    controller = new StreamController.broadcast(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  } else {
+    controller = new StreamController(
+        sync: true, onListen: onListen, onCancel: onCancel);
+  }
+  return controller.stream;
+}
+
+/// Returns a [Stream] that will emit the same values as the stream returned by
+/// [callback].
+///
+/// [callback] will only be called when the returned [Stream] gets a subscriber.
+Stream callbackStream(Stream callback()) {
+  var subscription;
+  var controller;
+  controller = new StreamController(onListen: () {
+    subscription = callback().listen(controller.add,
+        onError: controller.addError,
+        onDone: controller.close);
+  },
+      onCancel: () => subscription.cancel(),
+      onPause: () => subscription.pause(),
+      onResume: () => subscription.resume(),
+      sync: true);
+  return controller.stream;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
new file mode 100644
index 0000000..2c8cc19
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_directory.dart
@@ -0,0 +1,54 @@
+// 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.
+
+library pub.barback.build_environment;
+
+import 'dart:async';
+
+import 'package:watcher/watcher.dart';
+
+import 'build_environment.dart';
+import 'server.dart';
+
+/// A directory in the entrypoint package whose contents have been made
+/// available to barback and that are bound to a server.
+class BuildDirectory {
+  final BuildEnvironment _environment;
+
+  /// The relative directory path within the package.
+  final String directory;
+
+  /// The server bound to this directory.
+  BarbackServer get server => _server;
+  BarbackServer _server;
+
+  /// The subscription to the [DirectoryWatcher] used to watch this directory
+  /// for changes.
+  ///
+  /// If the directory is not being watched, this will be `null`.
+  StreamSubscription<WatchEvent> watchSubscription;
+
+  BuildDirectory(this._environment, this.directory);
+
+  /// Binds a server running on [hostname]:[port] to this directory.
+  Future<BarbackServer> serve(String hostname, int port) {
+    return BarbackServer.bind(_environment, hostname, port, directory)
+        .then((server) => _server = server);
+  }
+
+  /// Removes the build directory from the build environment.
+  ///
+  /// Closes the server, removes the assets from barback, and stops watching it.
+  Future close() {
+    var futures = [server.close()];
+
+    // Stop watching the directory.
+    if (watchSubscription != null) {
+      var cancel = watchSubscription.cancel();
+      if (cancel != null) futures.add(cancel);
+    }
+
+    return Future.wait(futures);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
index 9cc8128..99890b7 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/build_environment.dart
@@ -8,7 +8,7 @@
 import 'dart:io';
 
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as p;
+import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 import 'package:watcher/watcher.dart';
 
@@ -17,6 +17,7 @@
 import '../log.dart' as log;
 import '../package.dart';
 import '../package_graph.dart';
+import 'build_directory.dart';
 import 'dart_forwarding_transformer.dart';
 import 'dart2js_transformer.dart';
 import 'load_all_transformers.dart';
@@ -52,7 +53,6 @@
   /// transformers, and server are loaded and ready.
   static Future<BuildEnvironment> create(Entrypoint entrypoint,
       String hostname, int basePort, BarbackMode mode, WatcherType watcherType,
-      Iterable<String> rootDirectories,
       {bool useDart2JS: true}) {
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
@@ -60,63 +60,16 @@
       barback.log.listen(_log);
 
       var environment = new BuildEnvironment._(graph, barback, mode,
-          watcherType, rootDirectories);
-      return environment._startServers(hostname, basePort).then((_) {
-        log.fine("Started servers.");
-        // If the entrypoint package manually configures the dart2js
-        // transformer, don't include it in the built-in transformer list.
-        //
-        // TODO(nweiz): if/when we support more built-in transformers, make
-        // this more general.
-        var containsDart2JS = graph.entrypoint.root.pubspec.transformers
-            .any((transformers) => transformers
-            .any((id) => id.package == '\$dart2js'));
+          watcherType, hostname, basePort);
 
-        if (!containsDart2JS && useDart2JS) {
-          environment._builtInTransformers.addAll([
-            new Dart2JSTransformer(environment, mode),
-            new DartForwardingTransformer(mode)
-          ]);
-        }
-
-        return environment._load(barback).then((_) => environment);
-      });
+      return environment._load(useDart2JS: useDart2JS)
+          .then((_) => environment);
     });
   }
 
-  /// Start the [BarbackServer]s that will serve [rootDirectories].
-  Future<List<BarbackServer>> _startServers(String hostname, int basePort) {
-    _bind(port, rootDirectory) {
-      if (basePort == 0) port = 0;
-      return BarbackServer.bind(this, hostname, port, rootDirectory);
-    }
-
-    var rootDirectoryList = _rootDirectories.toList();
-
-    // For consistency, "web/" should always have the first available port and
-    // "test/" should always have the second. Other directories are assigned
-    // the following ports in alphabetical order.
-    var serverFutures = [];
-    if (rootDirectoryList.remove('web')) {
-      serverFutures.add(_bind(basePort, 'web'));
-    }
-    if (rootDirectoryList.remove('test')) {
-      serverFutures.add(_bind(basePort + 1, 'test'));
-    }
-
-    var i = 0;
-    for (var dir in rootDirectoryList) {
-      serverFutures.add(_bind(basePort + 2 + i, dir));
-      i += 1;
-    }
-
-    return Future.wait(serverFutures).then((boundServers) {
-      servers.addAll(boundServers);
-    });
-  }
-
-  /// The servers serving this environment's assets.
-  final servers = <BarbackServer>[];
+  /// The public directories in the root package that are available for
+  /// building, keyed by their root directory.
+  final _directories = new Map<String, BuildDirectory>();
 
   /// The [Barback] instance used to process assets in this environment.
   final Barback barback;
@@ -137,13 +90,33 @@
   /// How source files should be watched.
   final WatcherType _watcherType;
 
-  /// The set of top-level directories in the entrypoint package that will be
-  /// exposed.
-  final Set<String> _rootDirectories;
+  /// The hostname that servers are bound to.
+  final String _hostname;
+
+  /// The starting number for ports that servers will be bound to.
+  ///
+  /// Servers will be bound to ports starting at this number and then
+  /// incrementing from there. However, if this is zero, then ephemeral port
+  /// numbers will be selected for each server.
+  final int _basePort;
+
+  /// The modified source assets that have not been sent to barback yet.
+  ///
+  /// The build environment can be paused (by calling [pauseUpdates]) and
+  /// resumed ([resumeUpdates]). While paused, all source asset updates that
+  /// come from watching or adding new directories are not sent to barback.
+  /// When resumed, all pending source updates are sent to barback.
+  ///
+  /// This lets pub serve and pub build create an environment and bind several
+  /// servers before barback starts building and producing results
+  /// asynchronously.
+  ///
+  /// If this is `null`, then the environment is "live" and all updates will
+  /// go to barback immediately.
+  Set<AssetId> _modifiedSources;
 
   BuildEnvironment._(this.graph, this.barback, this.mode, this._watcherType,
-      Iterable<String> rootDirectories)
-      : _rootDirectories = rootDirectories.toSet();
+      this._hostname, this._basePort);
 
   /// Gets the built-in [Transformer]s that should be added to [package].
   ///
@@ -159,16 +132,154 @@
     return _builtInTransformers;
   }
 
-  /// Gets the names of the top-level directories in [package] whose contents
-  /// should be provided as source assets.
-  Set<String> getPublicDirectories(String package) {
-    var directories = ["asset", "lib"];
-
-    if (package == graph.entrypoint.root.name) {
-      directories.addAll(_rootDirectories);
+  /// Binds a new port to serve assets from within [rootDirectory] in the
+  /// entrypoint package.
+  ///
+  /// Adds and watches the sources within that directory. Returns a [Future]
+  /// that completes to the bound server.
+  ///
+  /// If [rootDirectory] is already being served, returns that existing server.
+  Future<BarbackServer> serveDirectory(String rootDirectory) {
+    // See if there is already a server bound to the directory.
+    var directory = _directories[rootDirectory];
+    if (directory != null) {
+      log.fine('Already serving $rootDirectory on ${directory.server.url}.');
+      return new Future.value(directory.server);
     }
 
-    return directories.toSet();
+    var port = _basePort;
+
+    // If not using an ephemeral port, find the lowest-numbered available one.
+    if (port != 0) {
+      var boundPorts = _directories.values
+          .map((directory) => directory.server.port).toSet();
+      while (boundPorts.contains(port)) {
+        port++;
+      }
+    }
+
+    var buildDirectory = new BuildDirectory(this, rootDirectory);
+    _directories[rootDirectory] = buildDirectory;
+
+    return _provideDirectorySources(rootPackage, rootDirectory)
+        .then((subscription) {
+      buildDirectory.watchSubscription = subscription;
+      return buildDirectory.serve(_hostname, port);
+    });
+  }
+
+  /// Stops the server bound to [rootDirectory].
+  ///
+  /// Also removes any source files within that directory from barback. Returns
+  /// the URL of the unbound server, of `null` if [rootDirectory] was not
+  /// bound to a server.
+  Future<Uri> unserveDirectory(String rootDirectory) {
+    log.fine("Unserving $rootDirectory.");
+    var directory = _directories.remove(rootDirectory);
+    if (directory == null) return new Future.value();
+
+    var url = directory.server.url;
+    return directory.close().then((_) {
+      // Remove the sources from barback, unless some other build directory
+      // includes them.
+      return _removeDirectorySources(rootDirectory);
+    }).then((_) => url);
+  }
+
+  /// Return all URLs serving [assetPath] in this environment.
+  List<Uri> getUrlsForAssetPath(String assetPath) {
+    // Check the three (mutually-exclusive) places the path could be pointing.
+    var urls = _lookUpPathInServerRoot(assetPath);
+    if (urls.isEmpty) urls = _lookUpPathInPackagesDirectory(assetPath);
+    if (urls.isEmpty) urls = _lookUpPathInDependency(assetPath);
+    return urls.toList();
+  }
+
+  /// Look up [assetPath] in the root directories of servers running in the
+  /// entrypoint package.
+  Iterable<Uri> _lookUpPathInServerRoot(String assetPath) {
+    // Find all of the servers whose root directories contain the asset and
+    // generate appropriate URLs for each.
+    return _directories.values
+        .where((dir) => path.isWithin(dir.directory, assetPath))
+        .map((dir) {
+      var relativePath = path.relative(assetPath, from: dir.directory);
+      return dir.server.url.resolveUri(path.toUri(relativePath));
+    });
+  }
+
+  /// Look up [assetPath] in the "packages" directory in the entrypoint package.
+  Iterable<Uri> _lookUpPathInPackagesDirectory(String assetPath) {
+    var components = path.split(path.relative(assetPath));
+    if (components.first != "packages") return [];
+    if (!graph.packages.containsKey(components[1])) return [];
+    return _directories.values.map((dir) =>
+        dir.server.url.resolveUri(path.toUri(assetPath)));
+  }
+
+  /// Look up [assetPath] in the "lib" or "asset" directory of a dependency
+  /// package.
+  Iterable<Uri> _lookUpPathInDependency(String assetPath) {
+    for (var package in graph.packages.values) {
+      var libDir = path.join(package.dir, 'lib');
+      var assetDir = path.join(package.dir, 'asset');
+
+      var uri;
+      if (path.isWithin(libDir, assetPath)) {
+        uri = path.toUri(path.join('packages', package.name,
+            path.relative(assetPath, from: libDir)));
+      } else if (path.isWithin(assetDir, assetPath)) {
+        uri = path.toUri(path.join('assets', package.name,
+            path.relative(assetPath, from: assetDir)));
+      } else {
+        continue;
+      }
+
+      return _directories.values.map((dir) => dir.server.url.resolveUri(uri));
+    }
+
+    return [];
+  }
+
+  /// Given a URL to an asset served by this environment, returns the ID of the
+  /// asset that would be accessed by that URL.
+  ///
+  /// If no server can serve [url], returns `null`.
+  AssetId getAssetIdForUrl(Uri url) {
+    var directory = _directories.values.firstWhere(
+        (dir) => dir.server.address.host == url.host &&
+            dir.server.port == url.port,
+        orElse: () => null);
+    if (directory == null) return null;
+
+    return directory.server.urlToId(url);
+  }
+
+  /// Determines if [sourcePath] is contained within any of the directories in
+  /// the root package that are visible to this build environment.
+  bool containsPath(String sourcePath) {
+    var directories = ["asset", "lib"];
+    directories.addAll(_directories.keys);
+
+    return directories.any((dir) => path.isWithin(dir, sourcePath));
+  }
+
+  /// Pauses sending source asset updates to barback.
+  void pauseUpdates() {
+    // Cannot pause while already paused.
+    assert(_modifiedSources == null);
+
+    _modifiedSources = new Set<AssetId>();
+  }
+
+  /// Sends any pending source updates to barback and begins the asynchronous
+  /// build process.
+  void resumeUpdates() {
+    // Cannot resume while not paused.
+    assert(_modifiedSources != null);
+
+    barback.updateSources(_modifiedSources);
+    _modifiedSources = null;
   }
 
   /// Loads the assets and transformers for this environment.
@@ -178,16 +289,53 @@
   /// in packages in [graph] and re-runs them as necessary when any input files
   /// change.
   ///
+  /// If [useDart2JS] is `true`, then the [Dart2JSTransformer] is implicitly
+  /// added to end of the root package's transformer phases.
+  ///
   /// Returns a [Future] that completes once all inputs and transformers are
   /// loaded.
-  Future _load(Barback barback) {
-    return _provideSources(barback).then((_) {
+  Future _load({bool useDart2JS}) {
+    // If the entrypoint package manually configures the dart2js
+    // transformer, don't include it in the built-in transformer list.
+    //
+    // TODO(nweiz): if/when we support more built-in transformers, make
+    // this more general.
+    var containsDart2JS = graph.entrypoint.root.pubspec.transformers
+        .any((transformers) => transformers
+        .any((id) => id.package == '\$dart2js'));
+
+    if (!containsDart2JS && useDart2JS) {
+      _builtInTransformers.addAll([
+        new Dart2JSTransformer(this, mode),
+        new DartForwardingTransformer(mode)
+      ]);
+    }
+
+    // "$pub" is a psuedo-package that allows pub's transformer-loading
+    // infrastructure to share code with pub proper. We provide it only during
+    // the initial transformer loading process.
+    var dartPath = assetPath('dart');
+    var pubSources = listDir(dartPath, recursive: true).map((library) {
+      return new AssetId('\$pub',
+          path.join('lib', path.relative(library, from: dartPath)));
+    });
+
+    // Bind a server that we can use to load the transformers.
+    var transformerServer;
+    return BarbackServer.bind(this, _hostname, 0, null).then((server) {
+      transformerServer = server;
+
+      return log.progress("Loading source assets", () {
+        barback.updateSources(pubSources);
+        return _provideSources();
+      });
+    }).then((_) {
       log.fine("Provided sources.");
       var completer = new Completer();
 
-      // If any errors get emitted either by barback or by the primary server,
-      // including non-programmatic barback errors, they should take down the
-      // whole program.
+      // If any errors get emitted either by barback or by the transformer
+      // server, including non-programmatic barback errors, they should take
+      // down the whole program.
       var subscriptions = [
         barback.errors.listen((error) {
           if (error is TransformerException) {
@@ -207,16 +355,16 @@
           if (completer.isCompleted) return;
           completer.completeError(error, stackTrace);
         }),
-        // We only listen to the first server here because that's the one used
-        // to initialize all the transformers during the initial load.
-        servers.first.results.listen((_) {}, onError: (error, stackTrace) {
+        transformerServer.results.listen((_) {}, onError: (error, stackTrace) {
           if (completer.isCompleted) return;
           completer.completeError(error, stackTrace);
         })
       ];
 
-      loadAllTransformers(this).then((_) {
+      loadAllTransformers(this, transformerServer).then((_) {
         log.fine("Loaded transformers.");
+        return transformerServer.close();
+      }).then((_) {
         if (!completer.isCompleted) completer.complete();
       }).catchError((error, stackTrace) {
         if (!completer.isCompleted) {
@@ -229,125 +377,179 @@
           subscription.cancel();
         }
       });
-    });
+    }).then((_) => barback.removeSources(pubSources));
   }
 
-  /// Provides all of the source assets in the environment to barback.
+  /// Provides the public source assets in the environment to barback.
   ///
   /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
-  Future _provideSources(Barback barback) {
-    if (_watcherType != WatcherType.NONE) {
-      return _watchSources(barback);
-    }
-
-    return _loadSources(barback);
-  }
-
-  /// Provides all of the source assets in the environment to barback.
-  Future _loadSources(Barback barback) {
-    return Future.wait(graph.packages.values.map(_updateSources));
-  }
-
-  /// Adds all of the source assets in this environment to barback and then
-  /// watches the public directories for changes.
-  ///
-  /// Returns a Future that completes when the sources are loaded and the
-  /// watchers are active.
-  Future _watchSources(Barback barback) {
+  Future _provideSources() {
     return Future.wait(graph.packages.values.map((package) {
-      // If this package comes from a cached source, its contents won't change
-      // so we don't need to monitor it. `packageId` will be null for the
-      // application package, since that's not locked.
-      var packageId = graph.lockFile.packages[package.name];
-      if (packageId != null &&
-          graph.entrypoint.cache.sources[packageId.source].shouldCache) {
-        return _updateSources(package);
-      }
-
-      // Watch the visible package directories for changes.
-      return Future.wait(getPublicDirectories(package.name).map((name) {
-        var subdirectory = p.join(package.dir, name);
-        if (!dirExists(subdirectory)) return new Future.value();
-
-        // TODO(nweiz): close these watchers when [barback] is closed.
-        var watcher = _watcherType.create(subdirectory);
-        watcher.events.listen((event) {
-          // Don't watch files symlinked into these directories.
-          // TODO(rnystrom): If pub gets rid of symlinks, remove this.
-          var parts = p.split(event.path);
-          if (parts.contains("packages") || parts.contains("assets")) return;
-
-          // Skip files that were (most likely) compiled from nearby ".dart"
-          // files. These are created by the Editor's "Run as JavaScript"
-          // command and are written directly into the package's directory.
-          // When pub's dart2js transformer then tries to create the same file
-          // name, we get a build error. To avoid that, just don't consider
-          // that file to be a source.
-          // TODO(rnystrom): Remove these when the Editor no longer generates
-          // .js files and users have had enough time that they no longer have
-          // these files laying around. See #15859.
-          if (event.path.endsWith(".dart.js")) return;
-          if (event.path.endsWith(".dart.js.map")) return;
-          if (event.path.endsWith(".dart.precompiled.js")) return;
-
-          var id = new AssetId(package.name,
-              p.relative(event.path, from: package.dir));
-          if (event.type == ChangeType.REMOVE) {
-            barback.removeSources([id]);
-          } else {
-            barback.updateSources([id]);
-          }
-        });
-        return watcher.ready;
-      })).then((_) => _updateSources(package));
+      // Just include the "shared" directories in each package. We'll add the
+      // other build directories in the root package by calling
+      // [serveDirectory].
+      return Future.wait([
+        _provideDirectorySources(package, "asset"),
+        _provideDirectorySources(package, "lib")
+      ]);
     }));
   }
 
-  /// Lists all of the visible files in [package] and updates them in barback.
+  /// Provides all of the source assets within [dir] in [package] to barback.
   ///
-  /// This is the recursive contents of the "asset" and "lib" directories (if
-  /// present). If [package] is the entrypoint package, it also includes the
-  /// build directories.
+  /// If [watcherType] is not [WatcherType.NONE], enables watching on them.
+  /// Returns the subscription to the watcher, or `null` if none was created.
+  Future<StreamSubscription<WatchEvent>> _provideDirectorySources(
+      Package package, String dir) {
+    log.fine("Providing sources for ${package.name}|$dir.");
+    // TODO(rnystrom): Handle overlapping directories. If two served
+    // directories overlap like so:
+    //
+    // $ pub serve example example/subdir
+    //
+    // Then the sources of the subdirectory will be updated and watched twice.
+    // See: #17454
+    if (_watcherType == WatcherType.NONE) {
+      return _updateDirectorySources(package, dir);
+    }
+
+    // Watch the directory before listing is so we don't miss files that
+    // are added between the initial list and registering the watcher.
+    return _watchDirectorySources(package, dir).then((_) {
+      return _updateDirectorySources(package, dir);
+    });
+  }
+
+  /// Updates barback with all of the files in [dir] inside [package].
+  Future _updateDirectorySources(Package package, String dir) {
+    return _listDirectorySources(package, dir).then((ids) {
+      if (_modifiedSources == null) {
+        barback.updateSources(ids);
+      } else {
+        _modifiedSources.addAll(ids);
+      }
+    });
+  }
+
+  /// Removes all of the files in [dir] in the root package from barback unless
+  /// some other build directory still contains them.
+  Future _removeDirectorySources(String dir) {
+    return _listDirectorySources(rootPackage, dir, where: (relative) {
+      // TODO(rnystrom): This is O(n*m) where n is the number of files and
+      // m is the number of served directories. Consider something more
+      // optimal if this becomes a bottleneck.
+      // Don't remove a source if some other directory still includes it.
+      return !_directories.keys.any((dir) => path.isWithin(dir, relative));
+    }).then((ids) {
+      if (_modifiedSources == null) {
+        barback.removeSources(ids);
+      } else {
+        _modifiedSources.removeAll(ids);
+      }
+    });
+  }
+
+  /// Lists all of the source assets in [dir] inside [package].
   ///
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  Future _updateSources(Package package) {
-    return Future.wait(getPublicDirectories(package.name).map((dirPath) {
-      var dir = p.join(package.dir, dirPath);
-      if (!dirExists(dir)) return new Future.value();
+  ///
+  /// If [where] is given, then it is used to filter the resulting list of
+  /// packages. Only assets whose relative path within [package] matches that
+  /// will be included in the results.
+  Future<List<AssetId>> _listDirectorySources(Package package, String dir,
+      {bool where(String relativePath)}) {
+    var subdirectory = path.join(package.dir, dir);
+    if (!dirExists(subdirectory)) return new Future.value([]);
 
-      return new Directory(dir).list(recursive: true, followLinks: true)
-          .expand((entry) {
-        // Skip directories and (broken) symlinks.
-        if (entry is Directory) return [];
-        if (entry is Link) return [];
+    return new Directory(subdirectory).list(recursive: true, followLinks: true)
+        .expand((entry) {
+      // Skip directories and (broken) symlinks.
+      if (entry is Directory) return [];
+      if (entry is Link) return [];
 
-        var relative = p.normalize(
-            p.relative(entry.path, from: package.dir));
+      var relative = path.normalize(
+          path.relative(entry.path, from: package.dir));
 
-        // Ignore hidden files or files in "packages" and hidden directories.
-        if (p.split(relative).any((part) =>
-            part.startsWith(".") || part == "packages")) {
-          return [];
+      // Ignore hidden files or files in "packages" and hidden directories.
+      if (path.split(relative).any((part) =>
+          part.startsWith(".") || part == "packages")) {
+        return [];
+      }
+
+      // Skip files that were (most likely) compiled from nearby ".dart"
+      // files. These are created by the Editor's "Run as JavaScript"
+      // command and are written directly into the package's directory.
+      // When pub's dart2js transformer then tries to create the same file
+      // name, we get a build error. To avoid that, just don't consider
+      // that file to be a source.
+      // TODO(rnystrom): Remove these when the Editor no longer generates
+      // .js files and users have had enough time that they no longer have
+      // these files laying around. See #15859.
+      if (relative.endsWith(".dart.js")) return [];
+      if (relative.endsWith(".dart.js.map")) return [];
+      if (relative.endsWith(".dart.precompiled.js")) return [];
+
+      if (where != null && !where(relative)) return [];
+
+      return [new AssetId(package.name, relative)];
+    }).toList();
+  }
+
+  /// Adds a file watcher for [dir] within [package], if the directory exists
+  /// and the package needs watching.
+  Future<StreamSubscription<WatchEvent>> _watchDirectorySources(
+      Package package, String dir) {
+    // If this package comes from a cached source, its contents won't change so
+    // we don't need to monitor it. `packageId` will be null for the
+    // application package, since that's not locked.
+    var packageId = graph.lockFile.packages[package.name];
+    if (packageId != null &&
+        graph.entrypoint.cache.sources[packageId.source].shouldCache) {
+      return new Future.value();
+    }
+
+    var subdirectory = path.join(package.dir, dir);
+    if (!dirExists(subdirectory)) return new Future.value();
+
+    // TODO(nweiz): close this watcher when [barback] is closed.
+    var watcher = _watcherType.create(subdirectory);
+    var subscription = watcher.events.listen((event) {
+      // Don't watch files symlinked into these directories.
+      // TODO(rnystrom): If pub gets rid of symlinks, remove this.
+      var parts = path.split(event.path);
+      if (parts.contains("packages") || parts.contains("assets")) return;
+
+      // Skip files that were (most likely) compiled from nearby ".dart"
+      // files. These are created by the Editor's "Run as JavaScript"
+      // command and are written directly into the package's directory.
+      // When pub's dart2js transformer then tries to create the same file
+      // name, we get a build error. To avoid that, just don't consider
+      // that file to be a source.
+      // TODO(rnystrom): Remove these when the Editor no longer generates
+      // .js files and users have had enough time that they no longer have
+      // these files laying around. See #15859.
+      if (event.path.endsWith(".dart.js")) return;
+      if (event.path.endsWith(".dart.js.map")) return;
+      if (event.path.endsWith(".dart.precompiled.js")) return;
+
+      var id = new AssetId(package.name,
+          path.relative(event.path, from: package.dir));
+      if (event.type == ChangeType.REMOVE) {
+        if (_modifiedSources != null) {
+          _modifiedSources.remove(id);
+        } else {
+          barback.removeSources([id]);
         }
+      } else if (_modifiedSources != null) {
+        _modifiedSources.add(id);
+      } else {
+        barback.updateSources([id]);
+      }
+    });
 
-        // Skip files that were (most likely) compiled from nearby ".dart"
-        // files. These are created by the Editor's "Run as JavaScript"
-        // command and are written directly into the package's directory.
-        // When pub's dart2js transformer then tries to create the same file
-        // name, we get a build error. To avoid that, just don't consider
-        // that file to be a source.
-        // TODO(rnystrom): Remove these when the Editor no longer generates
-        // .js files and users have had enough time that they no longer have
-        // these files laying around. See #15859.
-        if (relative.endsWith(".dart.js")) return [];
-        if (relative.endsWith(".dart.js.map")) return [];
-        if (relative.endsWith(".dart.precompiled.js")) return [];
-
-        return [new AssetId(package.name, relative)];
-      }).toList().then(barback.updateSources);
-    }));
+    return watcher.ready.then((_) => subscription);
   }
 }
 
@@ -362,7 +564,7 @@
 
   messageMentionsAsset(id) =>
       messageMentions(id.toString()) ||
-      messageMentions(p.joinAll(p.url.split(entry.assetId.path)));
+      messageMentions(path.fromUri(entry.assetId.path));
 
   var prefixParts = [];
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
index 44225d6..de74c74 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/dart2js_transformer.dart
@@ -19,7 +19,6 @@
 import '../../../../compiler/implementation/source_file.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
-import '../io.dart';
 import '../pool.dart';
 import '../utils.dart';
 import 'build_environment.dart';
@@ -352,8 +351,7 @@
     // other files in the root package are not visible to transformers, so
     // should be loaded directly from disk.
     var sourcePath = path.fromUri(url);
-    if (_environment.getPublicDirectories(_environment.rootPackage.name)
-        .any((dir) => path.isWithin(dir, sourcePath))) {
+    if (_environment.containsPath(sourcePath)) {
       var relative = path.relative(sourcePath,
           from: _environment.rootPackage.dir);
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
index 5376635..fcfb3d0 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_all_transformers.dart
@@ -8,14 +8,16 @@
 
 import 'package:barback/barback.dart';
 
+import '../barback.dart';
+import '../log.dart' as log;
+import '../package_graph.dart';
+import '../utils.dart';
 import 'build_environment.dart';
 import 'dart2js_transformer.dart';
 import 'excluding_transformer.dart';
 import 'load_transformers.dart';
 import 'rewrite_import_transformer.dart';
-import '../barback.dart';
-import '../package_graph.dart';
-import '../utils.dart';
+import 'server.dart';
 
 /// Loads all transformers depended on by packages in [environment].
 ///
@@ -25,7 +27,8 @@
 ///
 /// Any built-in transformers that are provided by the environment will
 /// automatically be added to the end of the root package's cascade.
-Future loadAllTransformers(BuildEnvironment environment) {
+Future loadAllTransformers(BuildEnvironment environment,
+    BarbackServer transformerServer) {
   // In order to determine in what order we should load transformers, we need to
   // know which transformers depend on which others. This is different than
   // normal package dependencies. Let's begin with some terminology:
@@ -60,11 +63,12 @@
   for (var package in environment.graph.packages.values) {
     environment.barback.updateTransformers(package.name, [[rewrite]]);
   }
+  environment.barback.updateTransformers(r'$pub', [[rewrite]]);
 
   var orderingDeps = _computeOrderingDeps(environment.graph);
   var packageTransformers = _computePackageTransformers(environment.graph);
 
-  var loader = new _TransformerLoader(environment);
+  var loader = new _TransformerLoader(environment, transformerServer);
 
   // The packages on which no packages have ordering dependencies -- that is,
   // the packages that don't need to be loaded before any other packages. These
@@ -216,6 +220,8 @@
 class _TransformerLoader {
   final BuildEnvironment _environment;
 
+  final BarbackServer _transformerServer;
+
   /// The loaded transformers defined in the library identified by each
   /// transformer id.
   final _transformers = new Map<TransformerId, Set<Transformer>>();
@@ -225,7 +231,7 @@
   /// Used for error reporting.
   final _transformerUsers = new Map<Pair<String, String>, Set<String>>();
 
-  _TransformerLoader(this._environment) {
+  _TransformerLoader(this._environment, this._transformerServer) {
     for (var package in _environment.graph.packages.values) {
       for (var id in unionAll(package.pubspec.transformers)) {
         _transformerUsers.putIfAbsent(
@@ -245,7 +251,9 @@
 
     // TODO(nweiz): load multiple instances of the same transformer from the
     // same isolate rather than spinning up a separate isolate for each one.
-    return loadTransformers(_environment, id).then((transformers) {
+    return log.progress("Loading $id transformers",
+        () => loadTransformers(_environment, _transformerServer, id))
+        .then((transformers) {
       if (!transformers.isEmpty) {
         _transformers[id] = transformers;
         return;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
index 12e5c49..6726288 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -11,378 +11,43 @@
 import 'package:barback/barback.dart';
 // TODO(nweiz): don't import from "src" once issue 14966 is fixed.
 import 'package:barback/src/internal_asset.dart';
-import 'package:source_maps/source_maps.dart';
-import 'package:stack_trace/stack_trace.dart';
 
+import '../../../asset/dart/serialize.dart';
 import '../barback.dart';
 import '../dart.dart' as dart;
 import '../log.dart' as log;
 import '../utils.dart';
 import 'build_environment.dart';
 import 'excluding_transformer.dart';
-
-/// A Dart script to run in an isolate.
-///
-/// This script serializes one or more transformers defined in a Dart library
-/// and marshals calls to and from them with the host isolate.
-const _TRANSFORMER_ISOLATE = """
-import 'dart:async';
-import 'dart:isolate';
-import 'dart:convert';
-import 'dart:mirrors';
-
-import '<<URL_BASE>>/packages/source_maps/span.dart';
-import '<<URL_BASE>>/packages/stack_trace/stack_trace.dart';
-import '<<URL_BASE>>/packages/barback/barback.dart';
-// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
-import '<<URL_BASE>>/packages/barback/src/internal_asset.dart';
-
-/// Sets up the initial communication with the host isolate.
-void main(_, SendPort replyTo) {
-  var port = new ReceivePort();
-  replyTo.send(port.sendPort);
-  port.first.then((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      var library = Uri.parse(message['library']);
-      var configuration = JSON.decode(message['configuration']);
-      var mode = new BarbackMode(message['mode']);
-      return initialize(library, configuration, mode).
-          map(_serializeTransformerOrGroup).toList();
-    });
-  });
-}
-
-/// Loads all the transformers and groups defined in [uri].
-///
-/// Loads the library, finds any Transformer or TransformerGroup subclasses in
-/// it, instantiates them with [configuration] and [mode], and returns them.
-Iterable initialize(Uri uri, Map configuration, BarbackMode mode) {
-  var mirrors = currentMirrorSystem();
-  var transformerClass = reflectClass(Transformer);
-  var groupClass = reflectClass(TransformerGroup);
-
-  // TODO(nweiz): if no valid transformers are found, throw an error message
-  // describing candidates and why they were rejected.
-  return mirrors.libraries[uri].declarations.values.map((declaration) {
-    if (declaration is! ClassMirror) return null;
-    var classMirror = declaration;
-    if (classMirror.isPrivate) return null;
-    if (classMirror.isAbstract) return null;
-    if (!classIsA(classMirror, transformerClass) &&
-        !classIsA(classMirror, groupClass)) {
-      return null;
-    }
-
-    var constructor = getConstructor(classMirror, 'asPlugin');
-    if (constructor == null) return null;
-    if (constructor.parameters.isEmpty) {
-      if (configuration.isNotEmpty) return null;
-      return classMirror.newInstance(const Symbol('asPlugin'), []).reflectee;
-    }
-    if (constructor.parameters.length != 1) return null;
-
-    return classMirror.newInstance(const Symbol('asPlugin'),
-        [new BarbackSettings(configuration, mode)]).reflectee;
-  }).where((classMirror) => classMirror != null);
-}
-
-/// A wrapper for a [Transform] that's in the host isolate.
-///
-/// This retrieves inputs from and sends outputs and logs to the host isolate.
-class ForeignTransform implements Transform {
-  /// The port with which we communicate with the host isolate.
-  ///
-  /// This port and all messages sent across it are specific to this transform.
-  final SendPort _port;
-
-  final Asset primaryInput;
-
-  TransformLogger get logger => _logger;
-  TransformLogger _logger;
-
-  /// Creates a transform from a serializable map sent from the host isolate.
-  ForeignTransform(Map transform)
-      : _port = transform['port'],
-        primaryInput = deserializeAsset(transform['primaryInput']) {
-    _logger = new TransformLogger((assetId, level, message, span) {
-      _call(_port, {
-        'type': 'log',
-        'level': level.name,
-        'message': message,
-        'assetId': assetId == null ? null : _serializeId(assetId),
-        'span': span == null ? null : _serializeSpan(span)
-      });
-    });
-  }
-
-  Future<Asset> getInput(AssetId id) {
-    return _call(_port, {
-      'type': 'getInput',
-      'id': _serializeId(id)
-    }).then(deserializeAsset);
-  }
-
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
-
-  Stream<List<int>> readInput(AssetId id) =>
-      _futureStream(getInput(id).then((input) => input.read()));
-
-  void addOutput(Asset output) {
-    _call(_port, {
-      'type': 'addOutput',
-      'output': serializeAsset(output)
-    });
-  }
-}
-
-/// Returns the mirror for the root Object type.
-ClassMirror get objectMirror => reflectClass(Object);
-
-// TODO(nweiz): clean this up when issue 13248 is fixed.
-MethodMirror getConstructor(ClassMirror classMirror, String constructor) {
-  var name = new Symbol("\${MirrorSystem.getName(classMirror.simpleName)}"
-      ".\$constructor");
-  var candidate = classMirror.declarations[name];
-  if (candidate is MethodMirror && candidate.isConstructor) return candidate;
-  return null;
-}
-
-// TODO(nweiz): get rid of this when issue 12439 is fixed.
-/// Returns whether or not [mirror] is a subtype of [superclass].
-///
-/// This includes [superclass] being mixed in to or implemented by [mirror].
-bool classIsA(ClassMirror mirror, ClassMirror superclass) {
-  if (mirror == superclass) return true;
-  if (mirror == objectMirror) return false;
-  return classIsA(mirror.superclass, superclass) ||
-      mirror.superinterfaces.any((int) => classIsA(int, superclass));
-}
-
-/// Converts [transformerOrGroup] into a serializable map.
-Map _serializeTransformerOrGroup(transformerOrGroup) {
-  if (transformerOrGroup is Transformer) {
-    return _serializeTransformer(transformerOrGroup);
-  } else {
-    assert(transformerOrGroup is TransformerGroup);
-    return _serializeTransformerGroup(transformerOrGroup);
-  }
-}
-
-/// Converts [transformer] into a serializable map.
-Map _serializeTransformer(Transformer transformer) {
-  var port = new ReceivePort();
-  port.listen((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      if (message['type'] == 'isPrimary') {
-        return transformer.isPrimary(deserializeAsset(message['asset']));
-      } else {
-        assert(message['type'] == 'apply');
-
-        // Make sure we return null so that if the transformer's [apply] returns
-        // a non-serializable value it doesn't cause problems.
-        return transformer.apply(
-            new ForeignTransform(message['transform'])).then((_) => null);
-      }
-    });
-  });
-
-  return {
-    'type': 'Transformer',
-    'toString': transformer.toString(),
-    'port': port.sendPort
-  };
-}
-
-// Converts [group] into a serializable map.
-Map _serializeTransformerGroup(TransformerGroup group) {
-  return {
-    'type': 'TransformerGroup',
-    'toString': group.toString(),
-    'phases': group.phases.map((phase) {
-      return phase.map(_serializeTransformerOrGroup).toList();
-    }).toList()
-  };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Converts [span] into a serializable map.
-Map _serializeSpan(Span span) {
-  // TODO(nweiz): convert FileSpans to FileSpans.
-  return {
-    'type': 'fixed',
-    'sourceUrl': span.sourceUrl,
-    'start': _serializeLocation(span.start),
-    'text': span.text,
-    'isIdentifier': span.isIdentifier
-  };
-}
-
-/// Converts [location] into a serializable map.
-Map _serializeLocation(Location location) {
-  // TODO(nweiz): convert FileLocations to FileLocations.
-  return {
-    'type': 'fixed',
-    'sourceUrl': location.sourceUrl,
-    'offset': location.offset,
-    'line': location.line,
-    'column': location.column
-  };
-}
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
-  var replyTo = wrappedMessage['replyTo'];
-  new Future.sync(() => callback(wrappedMessage['message']))
-      .then((result) => replyTo.send({'type': 'success', 'value': result}))
-      .catchError((error, stackTrace) {
-    // TODO(nweiz): at least MissingInputException should be preserved here.
-    replyTo.send({
-      'type': 'error',
-      'error': CrossIsolateException.serialize(error, stackTrace)
-    });
-  });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
-  var receivePort = new ReceivePort();
-  port.send({
-    'message': message,
-    'replyTo': receivePort.sendPort
-  });
-
-  return receivePort.first.then((response) {
-    if (response['type'] == 'success') return response['value'];
-    assert(response['type'] == 'error');
-    return new Future.error(
-        new CrossIsolateException.deserialize(response['error']));
-  });
-}
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
-  /// The name of the type of exception thrown.
-  ///
-  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
-  /// that objects in different libraries may have the same type name.
-  final String type;
-
-  /// The exception's message, or its [toString] if it didn't expose a `message`
-  /// property.
-  final String message;
-
-  /// The exception's stack chain, or `null` if no stack chain was available.
-  final Chain stackTrace;
-
-  /// Loads a [CrossIsolateException] from a serialized representation.
-  ///
-  /// [error] should be the result of [CrossIsolateException.serialize].
-  CrossIsolateException.deserialize(Map error)
-      : type = error['type'],
-        message = error['message'],
-        stackTrace = error['stack'] == null ? null :
-            new Chain.parse(error['stack']);
-
-  /// Serializes [error] to an object that can safely be passed across isolate
-  /// boundaries.
-  static Map serialize(error, [StackTrace stack]) {
-    if (stack == null && error is Error) stack = error.stackTrace;
-    return {
-      'type': error.runtimeType.toString(),
-      'message': getErrorMessage(error),
-      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
-    };
-  }
-
-  String toString() => "\$message\\n\$stackTrace";
-}
-
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
-  error.toString().replaceFirst(_exceptionPrefix, '');
-
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes. If [future] completes to an
-/// error, the return value will emit that error and then close.
-Stream _futureStream(Future<Stream> future) {
-  var controller = new StreamController(sync: true);
-  future.then((stream) {
-    stream.listen(
-        controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  }).catchError((e, stackTrace) {
-    controller.addError(e, stackTrace);
-    controller.close();
-  });
-  return controller.stream;
-}
-
-Stream callbackStream(Stream callback()) {
-  var subscription;
-  var controller;
-  controller = new StreamController(onListen: () {
-    subscription = callback().listen(controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  },
-      onCancel: () => subscription.cancel(),
-      onPause: () => subscription.pause(),
-      onResume: () => subscription.resume(),
-      sync: true);
-  return controller.stream;
-}
-""";
+import 'server.dart';
 
 /// Load and return all transformers and groups from the library identified by
 /// [id].
-Future<Set> loadTransformers(BuildEnvironment environment, TransformerId id) {
+Future<Set> loadTransformers(BuildEnvironment environment,
+    BarbackServer transformerServer, TransformerId id) {
   return id.getAssetId(environment.barback).then((assetId) {
     var path = assetId.path.replaceFirst('lib/', '');
     // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
 
-    // We could load the transformers from any server, since they all serve the
-    // packages' library files. We choose the first one arbitrarily.
-    var baseUrl = baseUrlForAddress(environment.servers.first.address,
-                                    environment.servers.first.port);
-    var uri = '$baseUrl/packages/${id.package}/$path';
-    var code = 'import "$uri";\n' +
-        _TRANSFORMER_ISOLATE.replaceAll('<<URL_BASE>>', baseUrl);
+    var baseUrl = transformerServer.url;
+    var uri = baseUrl.resolve('packages/${id.package}/$path');
+    var code = """
+        import 'dart:isolate';
+
+        import '$uri';
+
+        import r'$baseUrl/packages/\$pub/transformer_isolate.dart';
+
+        void main(_, SendPort replyTo) => loadTransformers(replyTo);
+        """;
     log.fine("Loading transformers from $assetId");
 
     var port = new ReceivePort();
     return dart.runInIsolate(code, port.sendPort)
         .then((_) => port.first)
         .then((sendPort) {
-      return _call(sendPort, {
-        'library': uri,
+      return call(sendPort, {
+        'library': uri.toString(),
         'mode': environment.mode.name,
         // TODO(nweiz): support non-JSON-encodable configuration maps.
         'configuration': JSON.encode(id.configuration)
@@ -394,11 +59,11 @@
         return transformers;
       });
     }).catchError((error, stackTrace) {
-      if (error is! dart.CrossIsolateException) throw error;
+      if (error is! CrossIsolateException) throw error;
       if (error.type != 'IsolateSpawnException') throw error;
       // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
       // are fixed.
-      if (!error.message.split('\n')[1].startsWith('import "$uri";')) {
+      if (!error.message.split('\n')[1].endsWith("import '$uri';")) {
         throw error;
       }
 
@@ -427,16 +92,16 @@
         _toString = map['toString'];
 
   Future<bool> isPrimary(Asset asset) {
-    return _call(_port, {
+    return call(_port, {
       'type': 'isPrimary',
       'asset': serializeAsset(asset)
     });
   }
 
   Future apply(Transform transform) {
-    return _call(_port, {
+    return call(_port, {
       'type': 'apply',
-      'transform': _serializeTransform(transform)
+      'transform': serializeTransform(transform)
     });
   }
 
@@ -470,106 +135,3 @@
   assert(map['type'] == 'TransformerGroup');
   return new _ForeignGroup(id, map);
 }
-
-/// Converts [transform] into a serializable map.
-Map _serializeTransform(Transform transform) {
-  var receivePort = new ReceivePort();
-  receivePort.listen((wrappedMessage) {
-    _respond(wrappedMessage, (message) {
-      if (message['type'] == 'getInput') {
-        return transform.getInput(_deserializeId(message['id']))
-            .then((asset) => serializeAsset(asset));
-      }
-
-      if (message['type'] == 'addOutput') {
-        transform.addOutput(deserializeAsset(message['output']));
-        return null;
-      }
-
-      assert(message['type'] == 'log');
-      var method;
-      if (message['level'] == 'Info') {
-        method = transform.logger.info;
-      } else if (message['level'] == 'Fine') {
-        method = transform.logger.fine;
-      } else if (message['level'] == 'Warning') {
-        method = transform.logger.warning;
-      } else {
-        assert(message['level'] == 'Error');
-        method = transform.logger.error;
-      }
-
-      var assetId = message['assetId'] == null ? null :
-        _deserializeId(message['assetId']);
-      var span = message['span'] == null ? null :
-        _deserializeSpan(message['span']);
-      method(message['message'], asset: assetId, span: span);
-    });
-  });
-
-  return {
-    'port': receivePort.sendPort,
-    'primaryInput': serializeAsset(transform.primaryInput)
-  };
-}
-
-/// Converts a serializable map into an [AssetId].
-AssetId _deserializeId(Map id) => new AssetId(id['package'], id['path']);
-
-/// Converts a serializable map into a [Span].
-Span _deserializeSpan(Map span) {
-  assert(span['type'] == 'fixed');
-  var location = _deserializeLocation(span['start']);
-  return new FixedSpan(span['sourceUrl'], location.offset, location.line,
-      location.column, text: span['text'], isIdentifier: span['isIdentifier']);
-}
-
-/// Converts a serializable map into a [Location].
-Location _deserializeLocation(Map location) {
-  assert(location['type'] == 'fixed');
-  return new FixedLocation(location['offset'], location['sourceUrl'],
-      location['line'], location['column']);
-}
-
-/// Converts [id] into a serializable map.
-Map _serializeId(AssetId id) => {'package': id.package, 'path': id.path};
-
-/// Responds to a message sent by [_call].
-///
-/// [wrappedMessage] is the raw message sent by [_call]. This unwraps it and
-/// passes the contents of the message to [callback], then sends the return
-/// value of [callback] back to [_call]. If [callback] returns a Future or
-/// throws an error, that will also be sent.
-void _respond(wrappedMessage, callback(message)) {
-  var replyTo = wrappedMessage['replyTo'];
-  syncFuture(() => callback(wrappedMessage['message']))
-      .then((result) => replyTo.send({'type': 'success', 'value': result}))
-      .catchError((error, stackTrace) {
-    // TODO(nweiz): at least MissingInputException should be preserved here.
-    replyTo.send({
-      'type': 'error',
-      'error': dart.CrossIsolateException.serialize(error, stackTrace)
-    });
-  });
-}
-
-/// Wraps [message] and sends it across [port], then waits for a response which
-/// should be sent using [_respond].
-///
-/// The returned Future will complete to the value or error returned by
-/// [_respond].
-Future _call(SendPort port, message) {
-  var receivePort = new ReceivePort();
-  port.send({
-    'message': message,
-    'replyTo': receivePort.sendPort
-  });
-
-  return Chain.track(receivePort.first).then((response) {
-    if (response['type'] == 'success') return response['value'];
-    assert(response['type'] == 'error');
-    return new Future.error(
-        new dart.CrossIsolateException.deserialize(response['error']),
-        new Chain.current());
-  });
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
index 9e1d7b4..dd90b9f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/pub_package_provider.dart
@@ -10,18 +10,32 @@
 import 'package:path/path.dart' as path;
 
 import '../package_graph.dart';
+import '../io.dart';
 
 /// An implementation of barback's [PackageProvider] interface so that barback
 /// can find assets within pub packages.
 class PubPackageProvider implements PackageProvider {
   final PackageGraph _graph;
+  final List<String> packages;
 
-  PubPackageProvider(this._graph);
-
-  Iterable<String> get packages => _graph.packages.keys;
+  PubPackageProvider(PackageGraph graph)
+      : _graph = graph,
+        packages = new List.from(graph.packages.keys)..add(r"$pub");
 
   Future<Asset> getAsset(AssetId id) {
-    var file = path.join(_graph.packages[id.package].dir, id.path);
+    if (id.package != r'$pub') {
+      var nativePath = path.fromUri(id.path);
+      var file = path.join(_graph.packages[id.package].dir, nativePath);
+      return new Future.value(new Asset.fromPath(id, file));
+    }
+
+    // "$pub" is a psuedo-package that allows pub's transformer-loading
+    // infrastructure to share code with pub proper.
+    var components = path.url.split(id.path);
+    assert(components.isNotEmpty);
+    assert(components.first == 'lib');
+    components[0] = 'dart';
+    var file = assetPath(path.joinAll(components));
     return new Future.value(new Asset.fromPath(id, file));
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/server.dart b/sdk/lib/_internal/pub/lib/src/barback/server.dart
index 983e0c9..fabaddc 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/server.dart
@@ -34,17 +34,21 @@
 
   /// The directory in the root which will serve as the root of this server as
   /// a native platform path.
+  ///
+  /// This may be `null` in which case no files in the root package can be
+  /// served and only assets in public directories ("packages" and "assets")
+  /// are available.
   final String rootDirectory;
 
-  /// The root directory as an asset-style ("/") path.
-  String get rootAssetPath => path.url.joinAll(path.split(rootDirectory));
-
   /// The server's port.
   final int port;
 
   /// The server's address.
   final InternetAddress address;
 
+  /// The server's base URL.
+  Uri get url => baseUrlForAddress(address, port);
+
   /// Optional callback to determine if an asset should be served.
   ///
   /// This can be set to allow outside code to filter out assets. Pub serve
@@ -70,6 +74,7 @@
   static Future<BarbackServer> bind(BuildEnvironment environment,
       String host, int port, String rootDirectory) {
     return Chain.track(HttpServer.bind(host, port)).then((server) {
+      log.fine('Bound "$rootDirectory" to $host:$port.');
       return new BarbackServer._(environment, server, rootDirectory);
     });
   }
@@ -87,7 +92,7 @@
   /// Closes this server.
   Future close() {
     var futures = [_server.close(), _resultsController.close()];
-    futures.addAll(_webSockets);
+    futures.addAll(_webSockets.map((socket) => socket.close()));
     return Future.wait(futures);
   }
 
@@ -98,6 +103,11 @@
     var id = specialUrlToId(url);
     if (id != null) return id;
 
+    if (rootDirectory == null) {
+      throw new FormatException(
+          "This server cannot serve out of the root directory. Got $url.");
+    }
+
     // Otherwise, it's a path in current package's [rootDirectory].
     var parts = path.url.split(url.path);
 
@@ -137,9 +147,10 @@
     }
 
     _logRequest(request, "Loading $id");
-    _environment.barback.getAssetById(id)
-        .then((asset) => _serveAsset(request, asset))
-        .catchError((error, trace) {
+    _environment.barback.getAssetById(id).then((result) {
+      _logRequest(request, "getAssetById($id) returned");
+      return result;
+    }).then((asset) => _serveAsset(request, asset)).catchError((error, trace) {
       if (error is! AssetNotFoundException) throw error;
       return _environment.barback.getAssetById(id.addExtension("/index.html"))
           .then((asset) {
diff --git a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
index 47ab14f..eeb804f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
@@ -8,11 +8,16 @@
 import 'dart:convert';
 import 'dart:io';
 
+import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
 import 'package:stack_trace/stack_trace.dart';
 
+import '../log.dart' as log;
+import '../utils.dart';
 import 'build_environment.dart';
 
+import '../log.dart' as log;
+
 /// Implements the [WebSocket] API for communicating with a running pub serve
 /// process, mainly for use by the Editor.
 ///
@@ -57,7 +62,9 @@
   WebSocketApi(this._socket, this._environment) {
     _commands = {
       "urlToAssetId": _urlToAssetId,
-      "assetIdToUrls": _assetIdToUrls
+      "pathToUrls": _pathToUrls,
+      "serveDirectory": _serveDirectory,
+      "unserveDirectory": _unserveDirectory
     };
   }
 
@@ -68,8 +75,10 @@
   /// complete to `null`.
   Future listen() {
     return _socket.listen((data) {
-      try {
-        var command;
+      log.io("Web Socket command: $data");
+
+      var command;
+      return syncFuture(() {
         try {
           command = JSON.decode(data);
         } on FormatException catch (ex) {
@@ -93,24 +102,37 @@
               'Unknown command "${command["command"]}".');
         }
 
-        var response = handler(command);
-
+        return handler(command);
+      }).then((response) {
         // If the command has an ID, include it in the response.
         if (command.containsKey("id")) {
           response["id"] = command["id"];
         }
 
         _socket.add(JSON.encode(response));
-      } on _WebSocketException catch(ex) {
-        _socket.add(JSON.encode({"code": ex.code, "error": ex.message}));
-      } catch (ex, stack) {
-        // Catch any other errors and pipe them through the web socket.
-        _socket.add(JSON.encode({
-          "code": _ErrorCode.UNEXPECTED_ERROR,
-          "error": ex.toString(),
-          "stackTrace": new Chain.forTrace(stack).toString()
-        }));
-      }
+      }).catchError((error, [stackTrace]) {
+        var response;
+        if (error is _WebSocketException) {
+          response = {
+            "code": error.code,
+            "error": error.message
+          };
+        } else {
+          // Catch any other errors and pipe them through the web socket.
+          response = {
+            "code": _ErrorCode.UNEXPECTED_ERROR,
+            "error": error.toString(),
+            "stackTrace": new Chain.forTrace(stackTrace).toString()
+          };
+        }
+
+        // If the command has an ID, include it in the response.
+        if (command is Map && command.containsKey("id")) {
+          response["id"] = command["id"];
+        }
+
+        _socket.add(JSON.encode(response));
+      });
     }, cancelOnError: true).asFuture();
   }
 
@@ -133,6 +155,10 @@
   ///       "path": "web/index.html"
   ///     }
   ///
+  /// The "path" key in the result is a URL path that's relative to the root
+  /// directory of the package identified by "package". The location of this
+  /// package may vary depending on which source it was installed from.
+  ///
   /// An optional "line" key may be provided whose value must be an integer. If
   /// given, the result will also include a "line" key that maps the line in
   /// the served final file back to the corresponding source line in the asset
@@ -169,13 +195,11 @@
     // If a line number was given, map it to the output line.
     var line = _validateOptionalInt(command, "line");
 
-    // Find the server.
-    var server = _environment.servers.firstWhere(
-        (server) => server.address.host == url.host && server.port == url.port,
-        orElse: () => throw new _WebSocketException(_ErrorCode.NOT_SERVED,
-            '"${url.host}:${url.port}" is not being served by pub.'));
-
-    var id = server.urlToId(url);
+    var id = _environment.getAssetIdForUrl(url);
+    if (id == null) {
+      throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+          '"${url.host}:${url.port}" is not being served by pub.');
+    }
 
     // TODO(rnystrom): When this is hooked up to actually talk to barback to
     // see if assets exist, consider supporting implicit index.html at that
@@ -185,21 +209,22 @@
 
     // Map the line.
     // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using this
-    // API before we've fully implemented it. See #12339 and #16061.
+    // passes through the original line. This lets the editor start using
+    // this API before we've fully implemented it. See #12339 and #16061.
     if (line != null) result["line"] = line;
 
     return result;
   }
 
-  /// Given an asset ID in the root package, returns the URLs served by pub
-  /// that can be used to access that asset.
+  /// Given a path on the filesystem, returns the URLs served by pub that can be
+  /// used to access asset found at that path.
   ///
-  /// The command name is "assetIdToUrl" and it takes a "path" key for the
-  /// asset path being mapped:
+  /// The command name is "pathToUrls" and it takes a "path" key (a native OS
+  /// path which may be absolute or relative to the root directory of the
+  /// entrypoint package) for the path being mapped:
   ///
   ///     {
-  ///       "command": "assetIdToUrl",
+  ///       "command": "pathToUrls",
   ///       "path": "web/index.html"
   ///     }
   ///
@@ -210,6 +235,26 @@
   ///       "urls": ["http://localhost:8080/index.html"]
   ///     }
   ///
+  /// The "path" key may refer to a path in another package, either by referring
+  /// to its location within the top-level "packages" directory or by referring
+  /// to its location on disk. Only the "lib" and "asset" directories are
+  /// visible in other packages:
+  ///
+  ///     {
+  ///       "command": "assetIdToUrl",
+  ///       "path": "packages/http/http.dart"
+  ///     }
+  ///
+  /// Assets in the "lib" and "asset" directories will usually have one URL for
+  /// each server:
+  ///
+  ///     {
+  ///       "urls": [
+  ///         "http://localhost:8080/packages/http/http.dart",
+  ///         "http://localhost:8081/packages/http/http.dart"
+  ///       ]
+  ///     }
+  ///
   /// An optional "line" key may be provided whose value must be an integer. If
   /// given, the result will also include a "line" key that maps the line in
   /// the source file to the corresponding output line in the resulting asset
@@ -224,71 +269,130 @@
   /// If the asset is not in a directory being served by pub, returns an error:
   ///
   ///     example/index.html  -> NOT_SERVED error
-  ///
-  /// This cannot currently be used to access assets in other packages aside
-  /// from the root. Nor can it be used to access assets in the root package's
-  /// "lib" or "asset" directories.
-  ///
-  ///     lib/myapp.dart  -> BAD_ARGUMENT error
-  Map _assetIdToUrls(Map command) {
-    // TODO(rnystrom): Support assets in other packages. See #17146.
+  Map _pathToUrls(Map command) {
     var assetPath = _validateString(command, "path");
-
-    if (!path.url.isRelative(assetPath)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"path" must be a relative path. Got "$assetPath".');
-    }
-
-    if (!path.url.isWithin(".", assetPath)) {
-      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
-          '"path" cannot reach out of its containing directory. '
-          'Got "$assetPath".');
-    }
-
     var line = _validateOptionalInt(command, "line");
 
-    // Find all of the servers whose root directories contain the asset and
-    // generate appropriate URLs for each.
-    var urls = _environment.servers
-        .where((server) => path.url.isWithin(server.rootAssetPath, assetPath))
-        .map((server) =>
-            "http://${server.address.host}:${server.port}/" +
-            path.url.relative(assetPath, from: server.rootAssetPath))
-        .toList();
-
+    var urls = _environment.getUrlsForAssetPath(assetPath);
     if (urls.isEmpty) {
       throw new _WebSocketException(_ErrorCode.NOT_SERVED,
           'Asset path "$assetPath" is not currently being served.');
     }
 
-    var result = {"urls": urls};
+    var result = {"urls": urls.map((url) => url.toString()).toList()};
 
     // Map the line.
     // TODO(rnystrom): Right now, source maps are not supported and it just
-    // passes through the original line. This lets the editor start using this
-    // API before we've fully implemented it. See #12339 and #16061.
+    // passes through the original line. This lets the editor start using
+    // this API before we've fully implemented it. See #12339 and #16061.
     if (line != null) result["line"] = line;
 
     return result;
   }
 
+  /// Given a relative directory path within the entrypoint package, binds a
+  /// new port to serve from that path and returns its URL.
+  ///
+  /// The command name is "serveDirectory" and it takes a "path" key (a native
+  /// OS path relative to the root of the entrypoint package) for the directory
+  /// being served:
+  ///
+  ///     {
+  ///       "command": "serveDirectory",
+  ///       "path": "example/awesome"
+  ///     }
+  ///
+  /// If successful, it returns a map containing the URL that can be used to
+  /// access the directory.
+  ///
+  ///     {
+  ///       "url": "http://localhost:8083"
+  ///     }
+  ///
+  /// If the directory is already being served, returns the previous URL.
+  Future<Map> _serveDirectory(Map command) {
+    var rootDirectory = _validateRelativePath(command, "path");
+    return _environment.serveDirectory(rootDirectory).then((server) {
+      return {
+        "url": server.url.toString()
+      };
+    });
+  }
+
+  /// Given a relative directory path within the entrypoint package, unbinds
+  /// the server previously bound to that directory and returns its (now
+  /// unreachable) URL.
+  ///
+  /// The command name is "unserveDirectory" and it takes a "path" key (a
+  /// native OS path relative to the root of the entrypoint package) for the
+  /// directory being unserved:
+  ///
+  ///     {
+  ///       "command": "unserveDirectory",
+  ///       "path": "example/awesome"
+  ///     }
+  ///
+  /// If successful, it returns a map containing the URL that used to be used
+  /// to access the directory.
+  ///
+  ///     {
+  ///       "url": "http://localhost:8083"
+  ///     }
+  ///
+  /// If no server is bound to that directory, it returns a `NOT_SERVED` error.
+  Future<Map> _unserveDirectory(Map command) {
+    var rootDirectory = _validateRelativePath(command, "path");
+    return _environment.unserveDirectory(rootDirectory).then((url) {
+      if (url == null) {
+        throw new _WebSocketException(_ErrorCode.NOT_SERVED,
+            'Directory "$rootDirectory" is not bound to a server.');
+      }
+
+      return {"url": url.toString()};
+    });
+  }
+
   /// Validates that [command] has a field named [key] whose value is a string.
   ///
   /// Returns the string if found, or throws a [_WebSocketException] if
   /// validation failed.
-  String _validateString(Map command, String key) {
-    if (!command.containsKey(key)) {
+  String _validateString(Map command, String key, {bool optional: false}) {
+    if (!optional && !command.containsKey(key)) {
       throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
           'Missing "$key" argument.');
     }
 
     var field = command[key];
     if (field is String) return field;
+    if (field == null && optional) return null;
 
     throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
         '"$key" must be a string. Got ${JSON.encode(field)}.');
   }
 
+  /// Validates that [command] has a field named [key] whose value is a string
+  /// containing a relative path that doesn't reach out of the entrypoint
+  /// package's root directory.
+  ///
+  /// Returns the path if found, or throws a [_WebSocketException] if
+  /// validation failed.
+  String _validateRelativePath(Map command, String key) {
+    var pathString = _validateString(command, key);
+
+    if (!path.isRelative(pathString)) {
+      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+          '"$key" must be a relative path. Got "$pathString".');
+    }
+
+    if (!path.isWithin(".", pathString)) {
+      throw new _WebSocketException(_ErrorCode.BAD_ARGUMENT,
+          '"$key" cannot reach out of its containing directory. '
+          'Got "$pathString".');
+    }
+
+    return pathString;
+  }
+
   /// Validates that if [command] has a field named [key], then its value is a
   /// number.
   ///
@@ -306,7 +410,9 @@
 }
 
 /// Function for processing a single web socket command.
-typedef Map _CommandHandler(Map command);
+///
+/// It can return a [Map] or a [Future] that completes to one.
+typedef _CommandHandler(Map command);
 
 /// Web socket API error codenames.
 class _ErrorCode {
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index d57be72..d7a6e8e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -27,7 +27,7 @@
 /// Handles the `build` pub command.
 class BuildCommand extends PubCommand {
   String get description => "Apply transformers to build a package.";
-  String get usage => "pub build [options]";
+  String get usage => "pub build [options] [directories...]";
   List<String> get aliases => const ["deploy", "settle-up"];
   bool get takesArguments => true;
 
@@ -62,6 +62,7 @@
     _parseBuildDirectories();
     cleanDir(target);
 
+    var environment;
     var errorsJson = [];
     var logJson = [];
 
@@ -69,9 +70,17 @@
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
     return BuildEnvironment.create(entrypoint, "127.0.0.1", 0, mode,
-        WatcherType.NONE, buildDirectories, useDart2JS: true)
-          .then((environment) {
+        WatcherType.NONE, useDart2JS: true)
+          .then((env) {
+      environment = env;
 
+      // Register all of the build directories.
+      // TODO(rnystrom): We don't actually need to bind servers for these, we
+      // just need to add them to barback's sources. Add support to
+      // BuildEnvironment for going the latter without the former.
+      return Future.wait(buildDirectories.map(
+          (dir) => environment.serveDirectory(dir)));
+    }).then((_) {
       // Show in-progress errors, but not results. Those get handled implicitly
       // by getAllAssets().
       environment.barback.errors.listen((error) {
@@ -285,7 +294,7 @@
     var entrypointDirs = entrypoints
         // Convert the asset path to a native-separated one and get the
         // directory containing the entrypoint.
-        .map((id) => path.dirname(path.joinAll(path.url.split(id.path))))
+        .map((id) => path.dirname(path.fromUri(id.path)))
         // Don't copy files to the top levels of the build directories since
         // the normal lib asset copying will take care of that.
         .where((dir) => dir.contains(path.separator))
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 9bf6876..f43cc3a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -39,6 +39,10 @@
   /// The build mode.
   BarbackMode get mode => new BarbackMode(commandOptions['mode']);
 
+  /// This completer is used to keep pub running (by not completing) and to
+  /// pipe fatal errors to pub's top-level error-handling machinery.
+  final _completer = new Completer();
+
   ServeCommand() {
     commandParser.addOption('port', defaultsTo: '8080',
         help: 'The base port to listen on.');
@@ -68,82 +72,98 @@
       return flushThenExit(exit_codes.USAGE);
     }
 
+    var directories = _parseDirectoriesToServe();
+
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
     return BuildEnvironment.create(entrypoint, hostname, port, mode,
-        watcherType, _directoriesToServe,
-        useDart2JS: useDart2JS).then((environment) {
+        watcherType, useDart2JS: useDart2JS).then((environment) {
 
-      // In release mode, strip out .dart files since all relevant ones have
-      // been compiled to JavaScript already.
-      if (mode == BarbackMode.RELEASE) {
-        for (var server in environment.servers) {
-          server.allowAsset = (url) => !url.path.endsWith(".dart");
-        }
-      }
-
-      /// This completer is used to keep pub running (by not completing) and
-      /// to pipe fatal errors to pub's top-level error-handling machinery.
-      var completer = new Completer();
-
-      environment.barback.errors.listen((error) {
-        log.error(log.red("Build error:\n$error"));
-      });
-
-      environment.barback.results.listen((result) {
-        if (result.succeeded) {
-          // TODO(rnystrom): Report using growl/inotify-send where available.
-          log.message("Build completed ${log.green('successfully')}");
-        } else {
-          log.message("Build completed with "
-              "${log.red(result.errors.length)} errors.");
-        }
-      }, onError: (error, [stackTrace]) {
-        if (!completer.isCompleted) completer.completeError(error, stackTrace);
-      });
-
-      var directoryLength = environment.servers
-          .map((server) => server.rootDirectory.length)
+      var directoryLength = directories.map((dir) => dir.length)
           .reduce(math.max);
-      for (var server in environment.servers) {
-        // Add two characters to account for "[" and "]".
-        var directoryPrefix = log.gray(
-            padRight("[${server.rootDirectory}]", directoryLength + 2));
-        server.results.listen((result) {
-          if (result.isSuccess) {
-            log.message("$directoryPrefix ${log.green('GET')} "
-                "${result.url.path} $_arrow ${result.id}");
-            return;
-          }
 
-          var msg = "$directoryPrefix ${log.red('GET')} ${result.url.path} "
-              "$_arrow";
-          var error = result.error.toString();
-          if (error.contains("\n")) {
-            log.message("$msg\n${prefixLines(error)}");
-          } else {
-            log.message("$msg $error");
-          }
-        }, onError: (error, [stackTrace]) {
-          if (completer.isCompleted) return;
-          completer.completeError(error, stackTrace);
+      // Start up the servers. We pause updates while this is happening so that
+      // we don't log spurious build results in the middle of listing out the
+      // bound servers.
+      environment.pauseUpdates();
+      return Future.forEach(directories, (directory) {
+        return _startServer(environment, directory, directoryLength);
+      }).then((_) {
+        // Now that the servers are up and logged, send them to barback.
+        environment.barback.errors.listen((error) {
+          log.error(log.red("Build error:\n$error"));
         });
 
-        log.message("Serving ${entrypoint.root.name} "
-            "${padRight(server.rootDirectory, directoryLength)} "
-            "on ${log.bold('http://$hostname:${server.port}')}");
-      }
+        environment.barback.results.listen((result) {
+          if (result.succeeded) {
+            // TODO(rnystrom): Report using growl/inotify-send where available.
+            log.message("Build completed ${log.green('successfully')}");
+          } else {
+            log.message("Build completed with "
+                "${log.red(result.errors.length)} errors.");
+          }
+        }, onError: (error, [stackTrace]) {
+          if (!_completer.isCompleted) {
+            _completer.completeError(error, stackTrace);
+          }
+        });
 
-      return completer.future;
+        environment.resumeUpdates();
+        return _completer.future;
+      });
     });
   }
 
-  /// Returns the set of directories that will be served from servers exposed to
-  /// the user.
+  Future _startServer(BuildEnvironment environment, String rootDirectory,
+      int directoryLength) {
+    return environment.serveDirectory(rootDirectory).then((server) {
+      // In release mode, strip out .dart files since all relevant ones have
+      // been compiled to JavaScript already.
+      if (mode == BarbackMode.RELEASE) {
+        server.allowAsset = (url) => !url.path.endsWith(".dart");
+      }
+
+      // Add two characters to account for "[" and "]".
+      var prefix = log.gray(
+          padRight("[${server.rootDirectory}]", directoryLength + 2));
+
+      server.results.listen((result) {
+        var buffer = new StringBuffer();
+        buffer.write("$prefix ");
+
+        if (result.isSuccess) {
+          buffer.write(
+              "${log.green('GET')} ${result.url.path} $_arrow ${result.id}");
+        } else {
+          buffer.write("${log.red('GET')} ${result.url.path} $_arrow");
+
+          var error = result.error.toString();
+          if (error.contains("\n")) {
+            buffer.write("\n${prefixLines(error)}");
+          } else {
+            buffer.write(" $error");
+          }
+        }
+
+        log.message(buffer);
+
+      }, onError: (error, [stackTrace]) {
+        if (_completer.isCompleted) return;
+        _completer.completeError(error, stackTrace);
+      });
+
+      log.message("Serving ${entrypoint.root.name} "
+          "${padRight(server.rootDirectory, directoryLength)} "
+          "on ${log.bold('http://$hostname:${server.port}')}");
+    });
+  }
+
+  /// Returns the set of directories that will be served from servers exposed
+  /// to the user.
   ///
   /// Throws a [UsageException] if the command-line arguments are invalid.
-  List<String> get _directoriesToServe {
+  List<String> _parseDirectoriesToServe() {
     if (commandOptions.rest.isEmpty) {
       var directories = ['web', 'test'].where(dirExists).toList();
       if (directories.isNotEmpty) return directories;
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 530c798..9e84360 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -16,6 +16,7 @@
 import '../../../compiler/implementation/filenames.dart'
     show appendSlash;
 
+import '../../asset/dart/serialize.dart';
 import 'io.dart';
 import 'sdk.dart' as sdk;
 import 'utils.dart';
@@ -170,44 +171,3 @@
     });
   });
 }
-
-/// An exception that was originally raised in another isolate.
-///
-/// Exception objects can't cross isolate boundaries in general, so this class
-/// wraps as much information as can be consistently serialized.
-class CrossIsolateException implements Exception {
-  /// The name of the type of exception thrown.
-  ///
-  /// This is the return value of [error.runtimeType.toString()]. Keep in mind
-  /// that objects in different libraries may have the same type name.
-  final String type;
-
-  /// The exception's message, or its [toString] if it didn't expose a `message`
-  /// property.
-  final String message;
-
-  /// The exception's stack chain, or `null` if no stack chain was available.
-  final Chain stackTrace;
-
-  /// Loads a [CrossIsolateException] from a serialized representation.
-  ///
-  /// [error] should be the result of [CrossIsolateException.serialize].
-  CrossIsolateException.deserialize(Map error)
-      : type = error['type'],
-        message = error['message'],
-        stackTrace = error['stack'] == null ? null :
-            new Chain.parse(error['stack']);
-
-  /// Serializes [error] to an object that can safely be passed across isolate
-  /// boundaries.
-  static Map serialize(error, [StackTrace stack]) {
-    if (stack == null && error is Error) stack = error.stackTrace;
-    return {
-      'type': error.runtimeType.toString(),
-      'message': getErrorMessage(error),
-      'stack': stack == null ? null : new Chain.forTrace(stack).toString()
-    };
-  }
-
-  String toString() => "$message\n$stackTrace";
-}
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index e05713d..fd5af92 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -398,13 +398,13 @@
 bool get runningFromSdk => Platform.script.path.endsWith('.snapshot');
 
 /// Resolves [target] relative to the path to pub's `resource` directory.
-String resourcePath(String target) {
+String assetPath(String target) {
   if (runningFromSdk) {
     return path.join(
-        sdk.rootDirectory, 'lib', '_internal', 'pub', 'resource', target);
+        sdk.rootDirectory, 'lib', '_internal', 'pub', 'asset', target);
   } else {
     return path.join(
-        path.dirname(libraryPath('pub.io')), '..', '..', 'resource', target);
+        path.dirname(libraryPath('pub.io')), '..', '..', 'asset', target);
   }
 }
 
@@ -722,7 +722,7 @@
 }
 
 String get pathTo7zip {
-  if (runningFromSdk) return resourcePath(path.join('7zip', '7za.exe'));
+  if (runningFromSdk) return assetPath(path.join('7zip', '7za.exe'));
   return path.join(repoRoot, 'third_party', '7zip', '7za.exe');
 }
 
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 07a1195..0b93b3f 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -13,6 +13,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import 'io.dart';
+import 'progress.dart';
 import 'transcript.dart';
 import 'utils.dart';
 
@@ -36,12 +37,8 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// The timer used to write "..." during a progress log.
-Timer _progressTimer;
-
-/// The progress message as it's being incrementally appended. When the
-/// progress is done, a single entry will be added to the log for it.
-String _progressMessage;
+/// The currently-running progress indicator or `null` if there is none.
+Progress _progress;
 
 final _cyan = getSpecial('\u001b[36m');
 final _green = getSpecial('\u001b[32m');
@@ -224,23 +221,30 @@
   stderr.writeln('---- End log transcript ----');
 }
 
-/// Prints [message] then slowly prints additional "..." after it until the
-/// future returned by [callback] completes. If anything else is logged during
-/// this, it cancels the progress.
+/// Prints [message] then displays an updated elapsed time until the future
+/// returned by [callback] completes. If anything else is logged during this
+/// (include another call to [progress]) that cancels the progress.
 Future progress(String message, Future callback()) {
-  if (json.enabled) return callback();
+  _stopProgress();
+  _progress = new Progress(message);
+  return callback().whenComplete(() {
+    var message = _stopProgress();
 
-  if (_progressTimer != null) throw new StateError("Already in progress.");
-
-  _progressMessage = '$message...';
-  stdout.write(_progressMessage);
-
-  _progressTimer = new Timer.periodic(new Duration(milliseconds: 500), (_) {
-    stdout.write('.');
-    _progressMessage += '.';
+    // Add the progress message to the transcript.
+    if (_transcript != null && message != null) {
+      _transcript.add(new Entry(Level.MESSAGE, [message]));
+    }
   });
+}
 
-  return callback().whenComplete(_stopProgress);
+/// Stops the running progress indicator, if currently running.
+///
+/// Returns the final progress message, if any, otherwise `null`.
+String _stopProgress() {
+  if (_progress == null) return null;
+  var message = _progress.stop();
+  _progress = null;
+  return message;
 }
 
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
@@ -287,23 +291,6 @@
 /// do not prevent the user's goal from being reached.
 String yellow(text) => "$_yellow$text$_none";
 
-/// Stops the running progress indicator, if currently running.
-_stopProgress() {
-  if (_progressTimer == null) return;
-
-  // Stop the timer.
-  _progressTimer.cancel();
-  _progressTimer = null;
-  stdout.writeln();
-
-  // Add the progress message to the transcript.
-  if (_transcript != null) {
-    _transcript.add(new Entry(Level.MESSAGE, [_progressMessage]));
-  }
-
-  _progressMessage = null;
-}
-
 /// Sets the verbosity to "normal", which shows errors, warnings, and messages.
 void showNormal() {
   _loggers[Level.ERROR]   = _logToStderr;
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
new file mode 100644
index 0000000..059d480
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -0,0 +1,86 @@
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// for 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 pub.progress;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'log.dart' as log;
+
+/// A live-updating progress indicator for long-running log entries.
+class Progress {
+  /// The timer used to write "..." during a progress log.
+  Timer _timer;
+
+  /// The [Stopwatch] used to track how long a progress log has been running.
+  final _stopwatch = new Stopwatch();
+
+  /// The progress message as it's being incrementally appended. When the
+  /// progress is done, a single entry will be added to the log for it.
+  final String _message;
+
+  Progress(this._message) {
+    _stopwatch.start();
+
+    if (log.json.enabled) return;
+
+    // Only animate if we're writing to a TTY in human format.
+    if (stdioType(stdout) == StdioType.TERMINAL) {
+      _update();
+      _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
+        _update();
+      });
+    } else {
+      stdout.write("$_message... ");
+    }
+  }
+
+  /// Stops the progress indicator.
+  ///
+  /// Returns the complete final progress message.
+  String stop() {
+    _stopwatch.stop();
+
+    // If we aren't animating, just log the final time.
+    if (log.json.enabled) {
+      // Do nothing.
+    } else if (_timer == null) {
+      stdout.writeln(_time);
+    } else {
+      _timer.cancel();
+
+      // Show one final update.
+      _update();
+      stdout.writeln();
+    }
+
+    return "$_message... ${_time}";
+  }
+
+  /// Gets the current progress time as a parenthesized, formatted string.
+  String get _time {
+    var elapsed = _stopwatch.elapsed;
+    var time = "(";
+
+    // TODO(rnystrom): Move this somewhere reusable.
+    if (elapsed.inMinutes > 0) {
+      time += "${elapsed.inMinutes}:";
+    }
+
+    var s = elapsed.inSeconds % 59;
+    var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
+    return time + "$s.${ms}s)";
+  }
+
+  /// Refreshes the progress line.
+  void _update() {
+    stdout.write("\r$_message... ");
+
+    // Show the time only once it gets noticeably long.
+    if (_stopwatch.elapsed.inSeconds > 0) {
+      stdout.write(log.gray(_time));
+    }
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index 2584bc4..afdf94f 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -18,7 +18,9 @@
 import 'package:path/path.dart' as path;
 import "package:stack_trace/stack_trace.dart";
 
-import 'dart.dart';
+import '../../asset/dart/serialize.dart';
+
+export '../../asset/dart/utils.dart';
 
 /// A pair of values.
 class Pair<E, F> {
@@ -78,53 +80,6 @@
   Future<List> get future => _completer.future;
 }
 
-/// Returns a buffered stream that will emit the same values as the stream
-/// returned by [future] once [future] completes.
-///
-/// If [future] completes to an error, the return value will emit that error and
-/// then close.
-///
-/// If [broadcast] is true, a broadcast stream is returned. This assumes that
-/// the stream returned by [future] will be a broadcast stream as well.
-/// [broadcast] defaults to false.
-Stream futureStream(Future<Stream> future, {bool broadcast: false}) {
-  var subscription;
-  var controller;
-
-  future = future.catchError((e, stackTrace) {
-    // Since [controller] is synchronous, it's likely that emitting an error
-    // will cause it to be cancelled before we call close.
-    if (controller != null) controller.addError(e, stackTrace);
-    if (controller != null) controller.close();
-    controller = null;
-  });
-
-  onListen() {
-    future.then((stream) {
-      if (controller == null) return;
-      subscription = stream.listen(
-          controller.add,
-          onError: controller.addError,
-          onDone: controller.close);
-    });
-  }
-
-  onCancel() {
-    if (subscription != null) subscription.cancel();
-    subscription = null;
-    controller = null;
-  }
-
-  if (broadcast) {
-    controller = new StreamController.broadcast(
-        sync: true, onListen: onListen, onCancel: onCancel);
-  } else {
-    controller = new StreamController(
-        sync: true, onListen: onListen, onCancel: onCancel);
-  }
-  return controller.stream;
-}
-
 /// Like [new Future], but avoids around issue 11911 by using [new Future.value]
 /// under the covers.
 Future newFuture(callback()) => new Future.value().then((_) => callback());
@@ -233,14 +188,14 @@
 /// Creates a URL string for [address]:[port].
 ///
 /// Handles properly formatting IPv6 addresses.
-String baseUrlForAddress(InternetAddress address, int port) {
+Uri baseUrlForAddress(InternetAddress address, int port) {
   // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
   // URL ambiguity with the ":" in the address.
   if (address.type == InternetAddressType.IP_V6) {
-    return "http://[${address.address}]:$port";
+    return new Uri(scheme: "http", host: "[${address.address}]", port: port);
   }
 
-  return "http://${address.address}:$port";
+  return new Uri(scheme: "http", host: address.address, port: port);
 }
 
 /// Flattens nested lists inside an iterable into a single list containing only
@@ -523,25 +478,6 @@
   return controller.stream;
 }
 
-/// Returns a [Stream] that will emit the same values as the stream returned by
-/// [callback].
-///
-/// [callback] will only be called when the returned [Stream] gets a subscriber.
-Stream callbackStream(Stream callback()) {
-  var subscription;
-  var controller;
-  controller = new StreamController(onListen: () {
-    subscription = callback().listen(controller.add,
-        onError: controller.addError,
-        onDone: controller.close);
-  },
-      onCancel: () => subscription.cancel(),
-      onPause: () => subscription.pause(),
-      onResume: () => subscription.resume(),
-      sync: true);
-  return controller.stream;
-}
-
 /// A regular expression matching a trailing CR character.
 final _trailingCR = new RegExp(r"\r$");
 
@@ -828,17 +764,6 @@
   return buffer.toString();
 }
 
-/// A regular expression to match the exception prefix that some exceptions'
-/// [Object.toString] values contain.
-final _exceptionPrefix = new RegExp(r'^([A-Z][a-zA-Z]*)?(Exception|Error): ');
-
-/// Get a string description of an exception.
-///
-/// Many exceptions include the exception class name at the beginning of their
-/// [toString], so we remove that if it exists.
-String getErrorMessage(error) =>
-  error.toString().replaceFirst(_exceptionPrefix, '');
-
 /// An exception class for exceptions that are intended to be seen by the user.
 /// These exceptions won't have any debugging information printed when they're
 /// thrown.
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index 35bb8c3..084cf7e 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -4,8 +4,13 @@
 
 test/hosted/version_negotiation_test: Pass, Timeout # Issue 14346
 
+
+[ $runtime == vm && $system == macos ]
+test/serve/web_socket/path_to_urls_test: Skip # Issue 17601
+
 [ $runtime == vm && $system == windows ]
 test/serve/warns_on_assets_paths_test: Pass, Fail # Issue 15741
+test/transformer/can_log_messages_test: Pass, Fail # Issue 17603 
 
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
diff --git a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
index 3f3868c..37413b5 100644
--- a/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
+++ b/sdk/lib/_internal/pub/test/build/does_not_allow_args_with_all_test.dart
@@ -18,7 +18,7 @@
         error: '''
             Build directory names are not allowed if "--all" is passed.
 
-            Usage: pub build [options]
+            Usage: pub build [options] [directories...]
             -h, --help      Print usage information for this command.
                 --format    How output should be displayed.
                             [text (default), json]
diff --git a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
index bd0db68..e899b41 100644
--- a/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
+++ b/sdk/lib/_internal/pub/test/build/reports_dart_parse_errors_test.dart
@@ -30,6 +30,7 @@
     ]).create();
 
     var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Loading source assets..."));
     pub.stdout.expect(startsWith("Building myapp..."));
 
     var consumeFile = consumeThrough(inOrder([
diff --git a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
index 73b2b65..8ecc742 100644
--- a/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/build/unsupported_build_directories_test.dart
@@ -17,7 +17,7 @@
             Unsupported build directories "bar" and "foo".
             The allowed directories are "benchmark", "bin", "example", "test" and "web".
 
-            Usage: pub build [options]
+            Usage: pub build [options] [directories...]
             -h, --help      Print usage information for this command.
                 --format    How output should be displayed.
                             [text (default), json]
diff --git a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
index e549750..76d00e9 100644
--- a/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
+++ b/sdk/lib/_internal/pub/test/lish/archives_and_uploads_a_package_test.dart
@@ -32,7 +32,7 @@
       request.response.close();
     });
 
-    pub.stdout.expect(matches(r'Uploading\.\.\.+'));
+    pub.stdout.expect(startsWith('Uploading...'));
     pub.stdout.expect('Package test_pkg 1.0.0 uploaded!');
     pub.shouldExit(exit_codes.SUCCESS);
   });
diff --git a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
index a96f273..e127999 100644
--- a/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
+++ b/sdk/lib/_internal/pub/test/oauth2/with_server_rejected_credentials_authenticates_again_test.dart
@@ -5,6 +5,7 @@
 import 'dart:convert';
 
 import 'package:scheduled_test/scheduled_server.dart';
+import 'package:scheduled_test/scheduled_test.dart';
 
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
@@ -32,7 +33,7 @@
     });
 
     pub.stderr.expect('OAuth2 authorization failed (your token sucks).');
-    pub.stdout.expect('Uploading...');
+    pub.stdout.expect(startsWith('Uploading...'));
     pub.kill();
   });
 }
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 9de35b3..a830da4 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -150,6 +150,9 @@
     _pubServer.stdout.expect(consumeThrough("Got dependencies!"));
   }
 
+  _pubServer.stdout.expect(startsWith("Loading source assets..."));
+  _pubServer.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+
   // The server should emit one or more ports.
   _pubServer.stdout.expect(
       consumeWhile(predicate(_parsePort, 'emits server url')));
@@ -236,6 +239,17 @@
   }, "request $urlPath");
 }
 
+/// Schedules an HTTP request to the (theoretically) running pub server with
+/// [urlPath] and verifies that it cannot be connected to.
+///
+/// [root] indicates which server should be accessed, and defaults to "web".
+void requestShouldNotConnect(String urlPath, {String root}) {
+  schedule(() {
+    return expect(http.get(_getServerUrlSync(root, urlPath)),
+        throwsA(new isInstanceOf<SocketException>()));
+  }, "request $urlPath");
+}
+
 /// Reads lines from pub serve's stdout until it prints the build success
 /// message.
 ///
@@ -270,19 +284,21 @@
 ///
 /// Only one of [replyEquals] or [replyMatches] may be provided.
 ///
-/// [request] and [replyMatches] may contain futures, in which case this will
-/// wait until they've completed before matching.
+/// [request], [replyEquals], and [replyMatches] may contain futures, in which
+/// case this will wait until they've completed before matching.
 ///
 /// If [encodeRequest] is `false`, then [request] will be sent as-is over the
 /// socket. It omitted, request is JSON encoded to a string first.
-void expectWebSocketCall(request, {Map replyEquals, replyMatches,
+///
+/// Returns a [Future] that completes to the call's response.
+Future<Map> expectWebSocketCall(request, {Map replyEquals, replyMatches,
     bool encodeRequest: true}) {
   assert((replyEquals == null) != (replyMatches == null));
 
-  schedule(() => _ensureWebSocket().then((_) {
+  return schedule(() => _ensureWebSocket().then((_) {
     var matcherFuture;
     if (replyMatches != null) {
-      matcherFuture = new Future.value(replyMatches);
+      matcherFuture = awaitObject(replyMatches);
     } else {
       matcherFuture = awaitObject(replyEquals).then((reply) => equals(reply));
     }
@@ -293,7 +309,9 @@
         _webSocket.add(completeRequest);
 
         return _webSocketBroadcastStream.first.then((value) {
-          expect(JSON.decode(value), matcher);
+          value = JSON.decode(value);
+          expect(value, matcher);
+          return value;
         });
       });
     });
@@ -309,6 +327,14 @@
 Future<String> getServerUrl([String root, String path]) =>
     _portsCompleter.future.then((_) => _getServerUrlSync(root, path));
 
+/// Records that [root] has been bound to [port].
+///
+/// Used for testing the Web Socket API for binding new root directories to
+/// ports after pub serve has been started.
+registerServerPort(String root, int port) {
+  _ports[root] = port;
+}
+
 /// Returns a URL string for the server serving [path] from [root].
 ///
 /// If [root] is omitted, defaults to "web". If [path] is omitted, no path is
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
deleted file mode 100644
index f438c78..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_errors_test.dart
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for 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 pub_tests;
-
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("assetIdToUrls errors on bad inputs", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.file("top-level.txt", "top-level"),
-      d.dir("asset", [
-        d.file("foo.txt", "foo"),
-      ]),
-      d.dir("bin", [
-        d.file("foo.txt", "foo"),
-      ]),
-      d.dir("lib", [
-        d.file("myapp.dart", "myapp"),
-      ])
-    ]).create();
-
-    pubServe();
-
-    // Bad arguments.
-    expectWebSocketCall({
-      "command": "assetIdToUrls"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": 'Missing "path" argument.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": 123
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"path" must be a string. Got 123.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "/absolute.txt"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"path" must be a relative path. Got "/absolute.txt".'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "a/../../bad.txt"
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error":
-          '"path" cannot reach out of its containing directory. '
-          'Got "a/../../bad.txt".'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "main.dart",
-      "line": 12.34
-    }, replyEquals: {
-      "code": "BAD_ARGUMENT",
-      "error": '"line" must be an integer. Got 12.34.'
-    });
-
-    // Unserved directories.
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "bin/foo.txt"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "bin/foo.txt" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "lib/myapp.dart"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "lib/myapp.dart" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "asset/myapp.dart"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "asset/myapp.dart" is not currently being served.'
-    });
-
-    expectWebSocketCall({
-      "command": "assetIdToUrls",
-      "path": "nope/foo.txt"
-    }, replyEquals: {
-      "code": "NOT_SERVED",
-      "error": 'Asset path "nope/foo.txt" is not currently being served.'
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
deleted file mode 100644
index 6b02fb0..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_test.dart
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for 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 pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  // TODO(rnystrom): Split into independent tests.
-  initConfig();
-  integration("assetIdToUrls converts asset ids to matching URL paths", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("test", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("randomdir", [
-        d.file("index.html", "<body>")
-      ])
-    ]).create();
-
-    pubServe(args: ["test", "web", "randomdir"]);
-
-    schedule(() {
-      // Paths in web/.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/index.html"
-      }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
-
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/sub/bar.html"
-      }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
-
-      // Paths in test/.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "test/index.html"
-      }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
-
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "test/sub/bar.html"
-      }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
-
-      // A non-default directory.
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "randomdir/index.html"
-      }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
index 12bc06f..4adbd23 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/error_responds_with_id_test.dart
@@ -11,26 +11,20 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("an error includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "bad command",
+      "id": "some id"
+    }, replyMatches: containsPair("id", "some id"));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
new file mode 100644
index 0000000..ac77a1c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_errors_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  // TODO(rnystrom): Split into independent tests.
+  initConfig();
+  integration("pathToUrls errors on bad inputs", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+      d.file("top-level.txt", "top-level"),
+      d.dir("asset", [
+        d.file("foo.txt", "foo"),
+      ]),
+      d.dir("bin", [
+        d.file("foo.txt", "foo"),
+      ]),
+      d.dir("lib", [
+        d.file("myapp.dart", "myapp"),
+      ])
+    ]).create();
+
+    pubServe(shouldGetFirst: true);
+
+    // Bad arguments.
+    expectWebSocketCall({
+      "command": "pathToUrls"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": "main.dart",
+      "line": 12.34
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"line" must be an integer. Got 12.34.'
+    });
+
+    // Unserved directories.
+    expectNotServed(p.join('bin', 'foo.txt'));
+    expectNotServed(p.join('nope', 'foo.txt'));
+    expectNotServed(p.join("..", "bar", "lib", "bar.txt"));
+    expectNotServed(p.join("..", "foo", "web", "foo.txt"));
+
+    endPubServe();
+  });
+}
+
+void expectNotServed(String path) {
+  expectWebSocketCall({
+    "command": "pathToUrls",
+    "path": path
+  }, replyEquals: {
+    "code": "NOT_SERVED",
+    "error": 'Asset path "$path" is not currently being served.'
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
similarity index 83%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
index c5e35df..d31bf9d 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_multiple_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_multiple_test.dart
@@ -14,7 +14,7 @@
 main() {
   // TODO(rnystrom): Split into independent tests.
   initConfig();
-  integration("assetIdToUrls returns multiple urls if servers overlap", () {
+  integration("pathToUrls returns multiple urls if servers overlap", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("test", [
@@ -32,8 +32,8 @@
 
     schedule(() {
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/index.html"
+        "command": "pathToUrls",
+        "path": path.join("web", "index.html")
       }, replyEquals: {
         "urls": [
           getServerUrl("web", "index.html")
@@ -41,8 +41,8 @@
       });
 
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/sub/bar.html"
+        "command": "pathToUrls",
+        "path": path.join("web", "sub", "bar.html")
       }, replyEquals: {
         "urls": [
           getServerUrl("web", "sub/bar.html"),
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
index 12bc06f..f7db59e 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_responds_with_id_test.dart
@@ -4,33 +4,30 @@
 
 library pub_tests;
 
+import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 import '../utils.dart';
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("pathToUrls includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "id": "some id",
+      "path": p.join("web", "index.html")
+    }, replyMatches: containsPair("id", "some id"));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
new file mode 100644
index 0000000..ce6b620
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_test.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  // TODO(rnystrom): Split into independent tests.
+  initConfig();
+  integration("pathToUrls converts asset ids to matching URL paths", () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [
+        d.file("foo.dart", "foo() => null;")
+      ]),
+      d.dir("asset", [
+        d.file("foo.txt", "foo")
+      ]),
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+      d.dir("test", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ]),
+      d.dir("lib", [
+        d.file("app.dart", "app() => null;")
+      ]),
+      d.dir("asset", [
+        d.file("app.txt", "app")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>"),
+        d.dir("sub", [
+          d.file("bar.html", "bar"),
+        ])
+      ]),
+      d.dir("randomdir", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["test", "web", "randomdir"], shouldGetFirst: true);
+
+    // Paths in web/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("web", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("web", "index.html")]});
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("web", "sub", "bar.html")
+    }, replyEquals: {"urls": [getServerUrl("web", "sub/bar.html")]});
+
+    // Paths in test/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("test", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("test", "index.html")]});
+
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("test", "sub", "bar.html")
+    }, replyEquals: {"urls": [getServerUrl("test", "sub/bar.html")]});
+
+    // A non-default directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("randomdir", "index.html")
+    }, replyEquals: {"urls": [getServerUrl("randomdir", "index.html")]});
+
+    // A path in lib/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("lib", "app.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/myapp/app.dart"),
+      getServerUrl("web", "packages/myapp/app.dart"),
+      getServerUrl("randomdir", "packages/myapp/app.dart")
+    ]});
+
+    // A path in asset/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("asset", "app.txt")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/myapp/app.txt"),
+      getServerUrl("web", "assets/myapp/app.txt"),
+      getServerUrl("randomdir", "assets/myapp/app.txt")
+    ]});
+
+    // A path to this package in packages/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("packages", "myapp", "app.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/myapp/app.dart"),
+      getServerUrl("web", "packages/myapp/app.dart"),
+      getServerUrl("randomdir", "packages/myapp/app.dart")
+    ]});
+
+    // A path to another package in packages/.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("packages", "foo", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // A relative path to another package's lib/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("..", "foo", "lib", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // An absolute path to another package's lib/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join(sandboxDir, "foo", "lib", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "packages/foo/foo.dart"),
+      getServerUrl("web", "packages/foo/foo.dart"),
+      getServerUrl("randomdir", "packages/foo/foo.dart")
+    ]});
+
+    // A relative path to another package's asset/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join("..", "foo", "asset", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/foo/foo.dart"),
+      getServerUrl("web", "assets/foo/foo.dart"),
+      getServerUrl("randomdir", "assets/foo/foo.dart")
+    ]});
+
+    // An absolute path to another package's asset/ directory.
+    expectWebSocketCall({
+      "command": "pathToUrls",
+      "path": p.join(sandboxDir, "foo", "asset", "foo.dart")
+    }, replyEquals: {"urls": [
+      getServerUrl("test", "assets/foo/foo.dart"),
+      getServerUrl("web", "assets/foo/foo.dart"),
+      getServerUrl("randomdir", "assets/foo/foo.dart")
+    ]});
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
similarity index 80%
rename from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
rename to sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
index 12bc06f..4bc8307 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/path_to_urls_with_line_test.dart
@@ -4,14 +4,16 @@
 
 library pub_tests;
 
+import 'package:path/path.dart' as p;
 import 'package:scheduled_test/scheduled_test.dart';
+
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 import '../utils.dart';
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("pathToUrls provides output line if given source", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
@@ -23,8 +25,8 @@
 
     schedule(() {
       expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
+        "command": "pathToUrls",
+        "path": p.join("web", "main.dart"),
         "line": 12345
       }, replyEquals: {
         "urls": [getServerUrl("web", "main.dart")],
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
deleted file mode 100644
index 2061748..0000000
--- a/sdk/lib/_internal/pub/test/serve/web_socket/responds_with_id_if_given_test.dart
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
-// for 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 pub_tests;
-
-import 'package:scheduled_test/scheduled_test.dart';
-import '../../descriptor.dart' as d;
-import '../../test_pub.dart';
-import '../utils.dart';
-
-main() {
-  initConfig();
-  integration("includes id in response if given with command", () {
-    d.dir(appPath, [
-      d.appPubspec(),
-      d.dir("test", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("web", [
-        d.file("index.html", "<body>"),
-        d.dir("sub", [
-          d.file("bar.html", "bar"),
-        ])
-      ]),
-      d.dir("randomdir", [
-        d.file("index.html", "<body>")
-      ])
-    ]).create();
-
-    pubServe(args: ["test", "web", "randomdir"]);
-
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "id": "some id",
-        "path": "web/index.html"
-      }, replyMatches: containsPair("id", "some id"));
-
-      expectWebSocketCall({
-        "command": "urlToAssetId",
-        "id": 12345,
-        "url": getServerUrl("web", "index.html")
-      }, replyMatches: containsPair("id", 12345));
-    });
-
-    endPubServe();
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
new file mode 100644
index 0000000..a3c8f0c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_already_served_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("returns the old URL if the directory is already served", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "web"
+    }, replyMatches: {
+      "url": getServerUrl("web")
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..d0ffd78
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+  });
+
+  integration("responds with an error if 'path' is missing", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is not a string", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is absolute", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "/absolute.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a relative path. Got "/absolute.txt".'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' reaches out", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "a/../../bad.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error":
+          '"path" cannot reach out of its containing directory. '
+          'Got "a/../../bad.txt".'
+    });
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
index 12bc06f..e812e19 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_responds_with_id_test.dart
@@ -11,26 +11,24 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("serveDirectory includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
+      d.dir("example", [
+        d.file("index.html", "<body>")
+      ]),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "id": 12345,
+      "path": "example"
+    }, replyMatches: containsPair("id", 12345));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
new file mode 100644
index 0000000..876142f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("binds a directory to a new port", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe(args: ["web"]);
+
+    // Bind the new directory.
+    expectWebSocketCall({
+      "command": "serveDirectory",
+      "path": "test"
+    }, replyMatches: {"url": matches(r"http://127\.0\.0\.1:\d+")})
+        .then((response) {
+      var url = Uri.parse(response["url"]);
+      registerServerPort("test", url.port);
+    });
+
+    // It should be served now.
+    requestShouldSucceed("index.html", "<test body>", root: "test");
+
+    // And watched.
+    d.dir(appPath, [
+      d.dir("test", [
+        d.file("index.html", "after")
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("index.html", "after", root: "test");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
new file mode 100644
index 0000000..aaa3d9c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_arg_errors_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+
+  setUp(() {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+  });
+
+  integration("responds with an error if 'path' is missing", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": 'Missing "path" argument.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is not a string", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": 123
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a string. Got 123.'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' is absolute", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "/absolute.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error": '"path" must be a relative path. Got "/absolute.txt".'
+    });
+    endPubServe();
+  });
+
+  integration("responds with an error if 'path' reaches out", () {
+    pubServe();
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "a/../../bad.txt"
+    }, replyEquals: {
+      "code": "BAD_ARGUMENT",
+      "error":
+          '"path" cannot reach out of its containing directory. '
+          'Got "a/../../bad.txt".'
+    });
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
new file mode 100644
index 0000000..7d80601
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_not_served_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("errors if the directory is not served", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    // Unbind the directory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "test"
+    }, replyEquals: {
+      "code": "NOT_SERVED",
+      "error": 'Directory "test" is not bound to a server.'
+    });
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
new file mode 100644
index 0000000..20a4d2a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_responds_with_id_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("unserveDirectory includes id in response if given", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.file("index.html", "<body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    // TODO(rnystrom): "example" is in here so that that's the port the web
+    // socket is bound to. That way, when we unserve "web", we don't close the
+    // web socket connection itself.
+    // Remove this when #16957 is fixed.
+    pubServe(args: ["example", "web"]);
+
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "id": 12345,
+      "path": "web"
+    }, replyMatches: containsPair("id", 12345));
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
new file mode 100644
index 0000000..c08ff4b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_subdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("when a subdirectory is unbound it is still watched because the "
+      "superdirectory is watching it", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "before")
+        ])
+      ])
+    ]).create();
+
+    var exampleOne = p.join("example", "one");
+    pubServe(args: ["example", exampleOne]);
+
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // Unbind the subdirectory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": exampleOne
+    }, replyEquals: {
+      "url": getServerUrl(exampleOne)
+    });
+
+    // "example/one" should not be served now.
+    requestShouldNotConnect("foo.txt", root: exampleOne);
+
+    // "example" is still fine.
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+
+    // And still being watched.
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "after")
+        ])
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("one/foo.txt", "after", root: "example");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
new file mode 100644
index 0000000..2cb5d2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_superdirectory_still_watched_test.dart
@@ -0,0 +1,61 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'package:path/path.dart' as p;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("when a superdirectory is unbound it is still watched because "
+      "the subdirectory is watching it", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "before")
+        ])
+      ])
+    ]).create();
+
+    var exampleOne = p.join("example", "one");
+    pubServe(args: [exampleOne, "example"]);
+
+    requestShouldSucceed("one/foo.txt", "before", root: "example");
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // Unbind the subdirectory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "example"
+    }, replyEquals: {
+      "url": getServerUrl("example")
+    });
+
+    // "example" should not be served now.
+    requestShouldNotConnect("one/foo.txt", root: "example");
+
+    // "example/one" is still fine.
+    requestShouldSucceed("foo.txt", "before", root: exampleOne);
+
+    // And still being watched.
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("example", [
+        d.dir("one", [
+          d.file("foo.txt", "after")
+        ])
+      ])
+    ]).create();
+
+    waitForBuildSuccess();
+    requestShouldSucceed("foo.txt", "after", root: exampleOne);
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
new file mode 100644
index 0000000..361bb3f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/unserve_directory_test.dart
@@ -0,0 +1,45 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../utils.dart';
+
+main() {
+  initConfig();
+  integration("unbinds a directory from a port", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("test", [
+        d.file("index.html", "<test body>")
+      ]),
+      d.dir("web", [
+        d.file("index.html", "<body>")
+      ])
+    ]).create();
+
+    pubServe();
+
+    requestShouldSucceed("index.html", "<body>");
+    requestShouldSucceed("index.html", "<test body>", root: "test");
+
+    // Unbind the directory.
+    expectWebSocketCall({
+      "command": "unserveDirectory",
+      "path": "test"
+    }, replyEquals: {
+      "url": getServerUrl("test")
+    });
+
+    // "test" should not be served now.
+    requestShouldNotConnect("index.html", root: "test");
+
+    // "web" is still fine.
+    requestShouldSucceed("index.html", "<body>");
+
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
similarity index 60%
copy from sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
copy to sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
index 12bc06f..ce65421 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/asset_id_to_urls_with_line_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/url_to_asset_id_responds_with_id_test.dart
@@ -11,26 +11,21 @@
 
 main() {
   initConfig();
-  integration("assetIdToUrls provides output line if given source", () {
+  integration("urlToAssetId includes id in response if given", () {
     d.dir(appPath, [
       d.appPubspec(),
       d.dir("web", [
-        d.file("main.dart", "main"),
+        d.file("index.html", "<body>")
       ])
     ]).create();
 
     pubServe();
 
-    schedule(() {
-      expectWebSocketCall({
-        "command": "assetIdToUrls",
-        "path": "web/main.dart",
-        "line": 12345
-      }, replyEquals: {
-        "urls": [getServerUrl("web", "main.dart")],
-        "line": 12345
-      });
-    });
+    expectWebSocketCall({
+      "command": "urlToAssetId",
+      "id": 12345,
+      "url": getServerUrl("web", "index.html")
+    }, replyMatches: containsPair("id", 12345));
 
     endPubServe();
   });
diff --git a/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
new file mode 100644
index 0000000..1d8954c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/asset_not_found_exceptions_are_detectable_test.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import 'dart:convert';
+
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+final transformer = """
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+
+class GetInputTransformer extends Transformer {
+  GetInputTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return transform.readInputAsString(new AssetId('myapp', 'nonexistent'))
+        .catchError((error) {
+      if (error is! AssetNotFoundException) throw error;
+      transform.addOutput(new Asset.fromString(transform.primaryInput.id,
+          JSON.encode({
+        'package': error.id.package,
+        'path': error.id.path
+      })));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("AssetNotFoundExceptions are detectable", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", transformer)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    var server = pubServe();
+    requestShouldSucceed("foo.txt", JSON.encode({
+      "package": "myapp",
+      "path": "nonexistent"
+    }));
+    endPubServe();
+
+    // Since the AssetNotFoundException was caught and handled, the server
+    // shouldn't print any error information for it.
+    server.stderr.expect(isDone);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
index c818a73..d80994b 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
@@ -4,6 +4,10 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+import 'package:scheduled_test/scheduled_stream.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 
@@ -52,19 +56,22 @@
 
     createLockFile('myapp', pkg: ['barback']);
 
-    schedulePub(args: ["build"],
-        output: """
-Building myapp...
+    var pub = startPub(args: ["build"]);
+    pub.stdout.expect(startsWith("Loading source assets..."));
+    pub.stdout.expect(consumeWhile(matches("Loading .* transformers...")));
+    pub.stdout.expect(startsWith("Building myapp..."));
+
+    pub.stdout.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt]:
-info!
-""",
-        error: """
+info!"""));
+
+    pub.stderr.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt with input myapp|web/foo.foo]:
 Warning!
 [Rewrite on myapp|web/foo.txt]:
 http://fake.com/not_real.dart:2:1: ERROR!
-Build failed.
-""",
-        exitCode: 65);
+Build failed."""));
+
+    pub.shouldExit(exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
new file mode 100644
index 0000000..9b41b2b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_consume_primary_test.dart
@@ -0,0 +1,55 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    transform.consumePrimary();
+    return transform.primaryInput.readAsString().then((contents) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      var asset = new Asset.fromString(id, "\$contents.out");
+      transform.addOutput(asset);
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("a transform can use consumePrimary", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe();
+    requestShouldSucceed("foo.out", "foo.out");
+    requestShould404("foo.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
new file mode 100644
index 0000000..543bf01
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/can_use_has_input_test.dart
@@ -0,0 +1,57 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for 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 pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class RewriteTransformer extends Transformer {
+  RewriteTransformer.asPlugin();
+
+  String get allowedExtensions => '.txt';
+
+  Future apply(Transform transform) {
+    return Future.wait([
+      transform.hasInput(transform.primaryInput.id),
+      transform.hasInput(new AssetId('hooble', 'whatsit'))
+    ]).then((results) {
+      var id = transform.primaryInput.id.changeExtension(".out");
+      var asset = new Asset.fromString(id,
+          "primary: \${results[0]}, secondary: \${results[1]}");
+      transform.addOutput(asset);
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  integration("a transform can use hasInput", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp/src/transformer"]
+      }),
+      d.dir("lib", [d.dir("src", [
+        d.file("transformer.dart", TRANSFORMER)
+      ])]),
+      d.dir("web", [
+        d.file("foo.txt", "foo")
+      ])
+    ]).create();
+
+    createLockFile('myapp', pkg: ['barback']);
+
+    pubServe();
+    requestShouldSucceed("foo.out", "primary: true, secondary: false");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
index 9bb02a5..cc84127 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/describes_change_test.dart
@@ -52,7 +52,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 . description_changed 1\.0\.0 from path \.\.[/\\]description_changed_2 \(was 1\.0\.0 from path \.\.[/\\]description_changed_1\)
 . source_changed 2\.0\.0 from path \.\.[/\\]source_changed \(was 1\.0\.0\)
 . unchanged 1\.0\.0
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
index b442686..7925992 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/does_not_show_newer_versions_for_locked_packages_test.dart
@@ -36,7 +36,7 @@
 
     // Only upgrade "upgraded".
     pubUpgrade(args: ["upgraded"], output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
   not_upgraded 1\.0\.0
 . upgraded 2\.0\.0 \(was 1\.0\.0\) \(1 newer unstable version available\)
 """, multiLine: true));
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
index 6bbccc5..b91cd08 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/highlights_overrides_test.dart
@@ -25,7 +25,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 ! overridden 1\.0\.0 \(overridden\)
 """, multiLine: true));
   });
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
index 815f640..3d94d7a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/leading_character_shows_change_test.dart
@@ -77,7 +77,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 \+ added .*
 \* description_changed .*
 < downgraded .*
diff --git a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
index c887135..2de3d9a 100644
--- a/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/report/shows_newer_available_versions_test.dart
@@ -40,7 +40,7 @@
 
     // Upgrade everything.
     pubUpgrade(output: new RegExp(r"""
-Resolving dependencies\.+
+Resolving dependencies\.\.\..*
 . multiple_newer 1\.0\.0 \(1 newer version available\)
 . multiple_newer_stable 1\.0\.0 \(2 newer versions available\)
 . multiple_newer_unstable 1\.0\.0 \(2 newer unstable versions available\)
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index 7de40e6..adf54f1 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -43,8 +43,10 @@
  * ## Stream
  *
  * A Stream provides an asynchronous sequence of data.
- * Examples of data sequences include user-generated events,
- * such as mouse clicks, and a stream of bytes read from a file.
+ * 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.
diff --git a/sdk/lib/collection/linked_list.dart b/sdk/lib/collection/linked_list.dart
index fb5ac89..5bff429 100644
--- a/sdk/lib/collection/linked_list.dart
+++ b/sdk/lib/collection/linked_list.dart
@@ -6,10 +6,27 @@
 
 
 /**
- * A linked list implementation, providing O(1) removal(unlink) of elements and
- * manual traversal through [next] and [previous].
+ * A specialized double-linked list of elements that extends [LinkedListEntry].
  *
- * The list elements must extend [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 IterableBase<E>
@@ -28,30 +45,33 @@
   }
 
   /**
-   * Add [entry] to the beginning of the list.
+   * Add [entry] to the beginning of the linked list.
    */
   void addFirst(E entry) {
     _insertAfter(this, entry);
   }
 
   /**
-   * Add [entry] to the end of the list.
+   * Add [entry] to the end of the linked list.
    */
   void add(E entry) {
     _insertAfter(_previous, entry);
   }
 
   /**
-   * Add [entries] to the end of the list.
+   * Add [entries] to the end of the linked list.
    */
   void addAll(Iterable<E> entries) {
     entries.forEach((entry) => _insertAfter(_previous, entry));
   }
 
   /**
-   * Remove [entry] from the list. This is the same as calling `entry.unlink()`.
+   * Remove [entry] from the linked list.
    *
-   * If [entry] is not in the list, `false` is returned.
+   * 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;
@@ -61,11 +81,11 @@
 
   Iterator<E> get iterator => new _LinkedListIterator<E>(this);
 
-  // TODO(zarah) Remove this, and let it be inherited by IterableMixin
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
-
   int get length => _length;
 
+  /**
+   * Remove all elements from this linked list.
+   */
   void clear() {
     _modificationCount++;
     _LinkedListLink next = _next;
@@ -103,9 +123,9 @@
   }
 
   /**
-   * Call [action] with each entry in the list.
+   * Call [action] with each entry in this linked list.
    *
-   * It's an error if [action] modify the list.
+   * It's an error if [action] modify the linked list.
    */
   void forEach(void action(E entry)) {
     int modificationCount = _modificationCount;
@@ -183,7 +203,18 @@
 
 
 /**
- * Entry element for a [LinkedList]. Any entry must extend this class.
+ * 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>>
     implements _LinkedListLink {
@@ -192,27 +223,38 @@
   _LinkedListLink _previous;
 
   /**
-   * Get the list containing this element.
+   * 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 the 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 succeeding element in the list.
+   * 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(_next, _list)) return null;
-    return _next as E;
+    E result = _next;
+    return result;
   }
 
   /**
-   * Return the preceeding element in the list.
+   * 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(_previous, _list)) return null;
@@ -220,14 +262,20 @@
   }
 
   /**
-   * insert an element after this.
+   * 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._insertAfter(this, entry);
   }
 
   /**
-   * Insert an element before this.
+   * 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._insertAfter(_previous, entry);
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 82454e3..78f2638 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2261,9 +2261,9 @@
 @DomName('Console')
 class Console {
 
-  Console._safe() {}
+  const Console._safe();
 
-  static Console _safeConsole = new Console._safe();
+  static const Console _safeConsole = const Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
@@ -2289,7 +2289,7 @@
 
   @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.debug(#)', arg) : null;
+      JS('void', 'console.dir(#)', arg) : null;
 
   @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/sdk/lib/io/http.dart b/sdk/lib/io/http.dart
index acc5db1..366fd8d 100644
--- a/sdk/lib/io/http.dart
+++ b/sdk/lib/io/http.dart
@@ -590,6 +590,34 @@
  */
 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
@@ -720,19 +748,19 @@
  * package, which makes working with the low-level
  * dart:io HTTP server subsystem easier.
  *
- * HttpRequest objects are generated by an [HttpServer],
+ * `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.
+ * generates an `HttpRequest` object and adds it to the stream.
  *
- * An HttpRequest object delivers the body content of the request
- * as a stream of bytes.
+ * 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 and, within the callback function,
- * uses the HttpRequest object's `method` property to dispatch requests.
+ * uses the `HttpRequest` object's `method` property to dispatch requests.
  *
  *     final HOST = InternetAddress.LOOPBACK_IP_V4;
  *     final PORT = 4040;
@@ -750,9 +778,9 @@
  *       onError: handleError);    // listen() failed.
  *     }).catchError(handleError);
  *
- * Listen to the HttpRequest stream to handle the
+ * Listen to the `HttpRequest` stream to handle the
  * data and be notified once the entire body is received.
- * An HttpRequest object contains an [HttpResponse] object,
+ * An `HttpRequest` object contains an [HttpResponse] object,
  * to which the server can write its response.
  * For example, here's a skeletal callback function
  * that responds to a request:
@@ -1347,6 +1375,7 @@
 abstract class HttpClientRequest implements IOSink {
   /**
    * Gets and sets the requested persistent connection state.
+   *
    * The default value is [:true:].
    */
   bool persistentConnection;
diff --git a/sdk/lib/io/http_headers.dart b/sdk/lib/io/http_headers.dart
index 85706d1..bd56939 100644
--- a/sdk/lib/io/http_headers.dart
+++ b/sdk/lib/io/http_headers.dart
@@ -495,7 +495,11 @@
         }
         skipWS();
         String value = parseValue();
-        cookies.add(new _Cookie(name, value));
+        try {
+          cookies.add(new _Cookie(name, value));
+        } catch (_) {
+          // Skip it, invalid cookie data.
+        }
         skipWS();
         if (done()) return;
         if (!expect(";")) {
@@ -718,7 +722,9 @@
   bool httpOnly = false;
   bool secure = false;
 
-  _Cookie([this.name, this.value]);
+  _Cookie([this.name, this.value]) {
+    _validate();
+  }
 
   _Cookie.fromSetCookieValue(String value) {
     // Parse the 'set-cookie' header value.
@@ -806,6 +812,7 @@
     }
     index++;  // Skip the = character.
     value = parseValue();
+    _validate();
     if (done()) return;
     index++;  // Skip the ; character.
     parseAttributes();
@@ -830,6 +837,32 @@
     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/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index a6d9f53..0c27522 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -8,7 +8,7 @@
  * Helper class to wrap a [StreamConsumer<List<int>>] and provide
  * utility functions for writing to the StreamConsumer directly. The
  * [IOSink] buffers the input given by all [StringSink] methods and will delay
- * a [addStream] until the buffer is flushed.
+ * an [addStream] until the buffer is flushed.
  *
  * When the [IOSink] is bound to a stream (through [addStream]) any call
  * to the [IOSink] will throw a [StateError]. When the [addStream] completes,
@@ -18,6 +18,7 @@
  * ignored. Use the [done] future to be notified when the [IOSink] is closed.
  */
 abstract class IOSink implements StreamSink<List<int>>, StringSink {
+  // TODO(ajohnsen): Make _encodingMutable an argument.
   factory IOSink(StreamConsumer<List<int>> target,
                  {Encoding encoding: UTF8})
       => new _IOSinkImpl(target, encoding);
@@ -29,14 +30,68 @@
   Encoding encoding;
 
   /**
-   * Writes the bytes uninterpreted to the consumer. While the call is
-   * synchronous, the data may be buffered until the underlying resource is
-   * ready. The data should not be modified after a call to [add].
+   * Adds [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);
 
   /**
-   * Writes an error to the consumer.
+   * 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 [charCode] to `this`.
+   *
+   * 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]);
 
@@ -57,13 +112,14 @@
   Future flush();
 
   /**
-   * Close the target.
+   * Close the target consumer.
    */
   Future close();
 
   /**
-   * Get a future that will complete when all synchronous have completed, or an
-   * error happened. This future is identical to the future returned from 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;
 }
diff --git a/sdk/lib/io/process.dart b/sdk/lib/io/process.dart
index 828145e..db68773 100644
--- a/sdk/lib/io/process.dart
+++ b/sdk/lib/io/process.dart
@@ -9,6 +9,7 @@
 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);
@@ -49,7 +50,26 @@
 }
 
 /**
- * Global exit code for the Dart VM.
+ * 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
@@ -58,12 +78,7 @@
  * See [exit] for more information on how to chose a value for the
  * exit code.
  */
-set exitCode(int code) {
-  if (code is !int) {
-    throw new ArgumentError("Integer value for exit code expected");
-  }
-  _ProcessUtils._setExitCode(code);
-}
+int get exitCode => _ProcessUtils._getExitCode();
 
 /**
  * Sleep for the duration specified in [duration].
@@ -86,7 +101,7 @@
 
 /**
  * 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
@@ -138,10 +153,10 @@
  *     }
  *
  * ## 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 
+ * 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.
@@ -174,7 +189,7 @@
  * ## 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 
+ * provides additional task-oriented code samples that show how to use
  * various API from the [dart:io] library.
  */
 abstract class Process {
@@ -396,6 +411,10 @@
 /**
  * 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");
@@ -441,13 +460,16 @@
    * The following [ProcessSignal]s can be listened to:
    *
    *   * [ProcessSignal.SIGHUP].
-   *   * [ProcessSignal.SIGINT].
+   *   * [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);
 }
diff --git a/sdk/lib/io/secure_server_socket.dart b/sdk/lib/io/secure_server_socket.dart
index 7f928b1..4b64fe3 100644
--- a/sdk/lib/io/secure_server_socket.dart
+++ b/sdk/lib/io/secure_server_socket.dart
@@ -179,7 +179,7 @@
    * was received, the result will be null.
    */
   static Future<RawSecureServerSocket> bind(
-      String address,
+      address,
       int port,
       String certificateName,
       {int backlog: 0,
diff --git a/sdk/lib/io/timer_impl.dart b/sdk/lib/io/timer_impl.dart
index 495c70e..51f0901 100644
--- a/sdk/lib/io/timer_impl.dart
+++ b/sdk/lib/io/timer_impl.dart
@@ -190,7 +190,7 @@
     _clear();
     if (!_isInHeap) return;
     assert(_wakeupTime != 0);
-    bool update = _firstZeroTimer == null && _heap.isFirst(this);
+    bool update = (_firstZeroTimer == null) && _heap.isFirst(this);
     _heap.remove(this);
     if (update) {
       _notifyEventHandler();
@@ -207,10 +207,12 @@
   bool _addTimerToHeap() {
     if (_wakeupTime == 0) {
       if (_firstZeroTimer == null) {
-        _lastZeroTimer = _firstZeroTimer = this;
+        _lastZeroTimer = this;
+        _firstZeroTimer = this;
         return true;
       } else {
-        _lastZeroTimer = _lastZeroTimer._indexOrNext = this;
+        _lastZeroTimer._indexOrNext = this;
+        _lastZeroTimer = this;
         return false;
       }
     } else {
@@ -257,13 +259,16 @@
     // Collect all pending timers.
     var timer = _firstZeroTimer;
     var nextTimer = _lastZeroTimer;
-    _firstZeroTimer = _lastZeroTimer = null;
+    _firstZeroTimer = null;
+    _lastZeroTimer = null;
     while (_heap.isNotEmpty && _heap.first._wakeupTime <= currentTime) {
       var next = _heap.removeFirst();
       if (timer == null) {
-        nextTimer = timer = next;
+        nextTimer = next;
+        timer = next;
       } else {
-        nextTimer = nextTimer._indexOrNext = next;
+        nextTimer._indexOrNext = next;
+        nextTimer = next;
       }
     }
 
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index ee5f5bb..630eeac 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -13,7 +13,7 @@
 
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
 
-[ $runtime == vm || $runtime == dartium || $compiler == dart2dart || $compiler == dart2js ]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A12_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A20_t02: fail # co19-roll r587: Please triage this failure
 
@@ -31,7 +31,6 @@
 LibTest/collection/LinkedHashSet/LinkedHashSet_class_A01_t01: RuntimeError, OK # co19 issue 663
 LibTest/core/Set/IterableBase_A01_t01: RuntimeError, OK # co19 issue 663
 
-[ $runtime == vm || $runtime == dartium || $compiler == dart2js ]
 LibTest/math/acos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/asin_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/atan_A01_t01: PASS, FAIL, OK # co19 issue 44
@@ -49,11 +48,6 @@
 LibTest/isolate/SendPort/send_A02_t02: SKIP # co19 issue 493 (not fixed in r672)
 LibTest/isolate/SendPort/send_A02_t03: SKIP # co19 issue 495 (not fixed in r672)
 
-
-[ $runtime == dartium || $compiler == dart2js ]
-LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
-
-[ $runtime == vm || $compiler == none || $compiler == dart2js ]
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # Co19 issue 639 (Fixed in r674)
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # Co19 issue 639
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # Co19 issue 639
@@ -86,9 +80,11 @@
 
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: MissingRuntimeError, OK # co19 issue 638
 
+[ $runtime == dartium || $compiler == dart2js ]
+LibTest/async/Future/Future.delayed_A01_t02: Pass, Fail # Issue 15524
 
 ### CHECKED MODE FAILURES ###
 
-[ ($runtime == vm || $runtime == dartium || $compiler == dart2js) && $checked]
+[ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index df91bfe..294a984 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -667,3 +667,6 @@
 LibTest/async/Stream/listen_A05_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t01: RuntimeError # co19-roll r641: Please triage this failure
 LibTest/convert/JsonCodec/encode_A01_t02: RuntimeError # co19-roll r641: Please triage this failure
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+LibTest/async/DeferredLibrary/*: Skip # Issue 17458
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index b52328c..eefab31 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -5,7 +5,7 @@
 [ $compiler == none && $runtime == drt ]
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
@@ -37,5 +37,5 @@
 
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
 
-[ $compiler == none && $runtime == dartium && $checked ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
 LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index e98b79b..bb3ef50 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -3,7 +3,7 @@
 # BSD-style license that can be found in the LICENSE file.
 
 
-[ $compiler == none && ($runtime == vm || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Term_A03_t01: Fail # Issue 12508
 LibTest/core/RegExp/Pattern_semantics/firstMatch_Atom_A02_t01: Fail # Issue 12508
@@ -69,8 +69,8 @@
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
 
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
-LibTest/isolate/Isolate/spawnUri_A01_t04: Crash # dartbug.com/17440
-LibTest/isolate/Isolate/spawn_A01_t04: Crash # dartbug.com/17440
+LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
+LibTest/isolate/Isolate/spawn_A01_t04: Crash, Pass # dartbug.com/17440
 
 [ $compiler == none && $runtime == vm && ($arch == simarm || $arch == simmips) ]
 LibTest/core/Uri/Uri_A06_t03: Skip # Timeouts, co19-roll r576: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 3c842af..75b884d 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -11,7 +11,10 @@
 import 'analyze_helper.dart';
 
 const Map<String, List<String>> WHITE_LIST = const {
-  "ir_builder.dart": const ["The method 'getIr' is never called."],
+  "ir_builder.dart":
+      const ["The method 'getIr' is never called.",
+             "The method 'hasIr' is never called.",
+            ],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index ac12f23..770e62f 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -22,6 +22,9 @@
 mirrors/library_imports_prefixed_show_hide_test: Fail
 mirrors/library_imports_shown_test: Fail
 
+[ $unchecked ]
+exit_code_test: Skip # This tests requires checked mode.
+
 [ $mode == debug ]
 mirror_final_field_inferrer2_test: Crash, Pass, Slow # dartbug.com/15581
 
@@ -31,6 +34,8 @@
 exit_code_test: Pass, Slow
 deferred_load_graph_segmentation_test: Pass, Slow
 check_members_test: Pass, Slow
+duplicate_library_test: Pass, Slow
+show_package_warnings_test: Pass, Slow
 
 # Don't mark these tests as failing. Instead, fix the errors/warnings that they
 # report or update the whitelist in the test-files to temporarily allow
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index fd5c38f..4db2ecd 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -218,6 +218,7 @@
 }
 
 void main() {
+  // TODO(johnniwinther): implement this test for unchecked mode.
   bool isCheckedMode = false;
   assert(isCheckedMode = true);
   Expect.isTrue(isCheckedMode, 'This test must be run in checked mode.');
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index f31fe96..8d2763d 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -18,11 +18,8 @@
 variable_type_test/03: Fail, OK
 variable_type_test/01: Fail, OK
 
-[ $compiler == dart2js && $host_checked && $checked == false ]
-# Test that @IrRepresentation yields compile-time errors in host-checked mode.
-# The condition "$checked == false" is to be removed once we build IR in
-# target-checked mode.
-ir_representation_test: CompileTimeError, OK
+[ $compiler == dart2js && ($runtime == d8 || $runtime == chrome || $runtime == drt) ]
+bound_closure_interceptor_type_test: Fail, Pass # v8 issue 3084. https://code.google.com/p/v8/issues/detail?id=3084
 
 [ $compiler == dart2js && $mode == debug ]
 operator_test: Skip
@@ -59,3 +56,6 @@
 deferred/deferred_constant3_test: Fail # http://dartbug.com/16898
 deferred/deferred_constant4_test: Fail # http://dartbug.com/16898
 deferred/deferred_constant5_test: Fail # http://dartbug.com/16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+deferred/*: Skip # Issue 17458
diff --git a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart b/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
deleted file mode 100644
index e0d241c..0000000
--- a/tests/compiler/dart2js_extra/deferred/deferred_constant5_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-import 'package:async_helper/async_helper.dart';
-import 'package:expect/expect.dart';
-
-import 'dart:async';
-
-@lazy import 'deferred_class_library2.dart' as lib;
-
-const lazy = const DeferredLibrary('deferred_class_library2');
-
-main() {
-  asyncStart();
-  lazy.load().then((bool didLoad) {
-    Expect.isTrue(didLoad);
-    Expect.equals(321, const lib.Gee.n321().value);
-    Expect.equals(246, const lib.Gee.n246().value);
-    Expect.equals(888, const lib.Gee.n888().value);
-    Expect.equals(321, const lib.Gee2.n321().value);
-    Expect.equals(151, const lib.Gee2.n151().value);
-    Expect.equals(888, const lib.Gee2.n888().value);
-    asyncEnd();
-  });
-}
diff --git a/tests/compiler/dart2js_extra/ir_representation_test.dart b/tests/compiler/dart2js_extra/ir_representation_test.dart
deleted file mode 100644
index 4b037c4..0000000
--- a/tests/compiler/dart2js_extra/ir_representation_test.dart
+++ /dev/null
@@ -1,62 +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.
-
-// The multitest framework does not support import paths that contain '..',
-// therefore it's not used in this file.
-import '../dart2js_native/compiler_test_internals.dart';
-
-/**
- * This test verifies that the @IrRepresentation annotation works as expected.
- * It might fail when extending the IR to express more of Dart.
- */
-
-// closure
-@IrRepresentation(true)
-test1() {
-  var f = () => 42;
-  return 1;
-}
-
-// parameter
-@IrRepresentation(true)
-test2(x) {
-  return x;
-}
-
-// dynamic invocation, construction
-@IrRepresentation(true)
-test3() {
-  new Object().hashCode;
-}
-
-// exceptions
-@IrRepresentation(true)
-test4() {
-  try {
-    throw "possum";
-  } catch (e) {
-    return e;
-  }
-}
-
-// control flow, loops
-@IrRepresentation(true)
-test5(x) {
-  while (x < 100) {
-    x += x;
-  }
-  if (x % 2 == 0) {
-    return 1;
-  } else {
-    return 2;
-  }
-}
-
-main() {
-  print(test1());
-  print(test2(1));
-  print(test3());
-  print(test4());
-  print(test5(2));
-}
diff --git a/tests/compiler/dart2js_extra/ssa_inlining_test.dart b/tests/compiler/dart2js_extra/ssa_inlining_test.dart
deleted file mode 100644
index b043c77..0000000
--- a/tests/compiler/dart2js_extra/ssa_inlining_test.dart
+++ /dev/null
@@ -1,118 +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.
-
-import '../dart2js_native/compiler_test_internals.dart';
-import 'package:expect/expect.dart';
-
-// The function ast01 is built by an SsaFromAstBuilder.
-// Ir functions are inlined by an SsaFromIrInliner.
-
-@NoInline()
-@IrRepresentation(false)
-ast01() {
-  checkAst01(JS('', 'arguments.callee'));
-  print(ir01());
-  print(ir02());
-  return ast02(11);
-}
-
-@IrRepresentation(true)
-ir01() => ir04();
-
-@IrRepresentation(true)
-ir02() => ast06(10, 20);
-
-@IrRepresentation(false)
-ast06(a,b) {
-  JS('', 'String("in ast06")');
-  return 3*a + b;
-}
-
-@IrRepresentation(true)
-ir04() => ir05();
-
-@IrRepresentation(true)
-ir05() => ast07(1, 22);
-
-@IrRepresentation(false)
-ast07(i, j) {
-  var x = 0;
-  return ast08(i,j) ? i : j;
-}
-
-@IrRepresentation(false)
-ast08(x,y) {
-  JS('', 'String("in ast08")');
-  return x - y < 0;
-}
-
-@IrRepresentation(false)
-ast02(x) {
-  print(x);
-  ir06();
-  print(ir07());
-}
-
-@IrRepresentation(true)
-ir06() => ast04(1,2,3);
-
-@IrRepresentation(false)
-ast04(a, b, c) {
-  print(a + b - c);
-  JS('', 'String("in ast04")');
-}
-
-@IrRepresentation(true)
-ir07() => ir03();
-
-@IrRepresentation(true)
-ir03() => ast05(1,3);
-
-@IrRepresentation(false)
-ast05(a, b) {
-  JS('', 'String("in ast05")');
-  return (a+b)/2;
-}
-
-// The function ir08 is built by an SsaFromIrBuilder.
-// Ast functions are inlined by an SsaFromAstInliner.
-
-@NoInline()
-@IrRepresentation(true)
-ir08() => ir09();
-
-ir09() => ast09();
-
-ast09() {
-  checkIr08(JS('', 'arguments.callee'));
-  JS('', 'String("in ast09")');
-  print(ir01());
-  print(ir02());
-  print(ast02(11));
-}
-
-main() {
-  ast01();
-  ir08();
-}
-
-@NoInline()
-check(func, names) {
-  var source = JS('String', 'String(#)', func);
-  print(source);
-  for (var f in names) {
-    Expect.isTrue(source.contains('"in $f"'), "should inline '$f'");
-  }
-}
-
-@NoInline
-checkAst01(func) {
-  var names = ["ast04", "ast05", "ast06", "ast08"];
-  check(func, names);
-}
-
-checkIr08(func) {
-  var names = ["ast09", "ast04", "ast05", "ast06", "ast08"];
-  check(func, names);
-}
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 022e0b2..a741052 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -22,3 +22,7 @@
 
 [ $browser || $runtime == d8 ]
 only_pass_on_jsshell_test: Fail, OK # This test should only pass on jsshell.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+only_pass_on_d8_test: Skip # Issue 17458
+compute_this_script_test: Skip # Issue 17458
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 3c56c5c..c2b831e 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -15,7 +15,7 @@
 string_from_environment_default_value: Skip
 string_from_environment_test: Skip
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 bool_from_environment2_test: Skip
 bool_from_environment_default_value_test: Skip
 bool_from_environment_test: Skip
@@ -52,7 +52,7 @@
 
 symbol_test/01: Fail, Pass # bug 11669
 
-[ $compiler == none && $runtime != dartium && $runtime != drt ]
+[ $compiler == none && $runtime != dartium && $runtime != drt && $runtime != ContentShellOnAndroid ]
 symbol_test/02: MissingCompileTimeError # bug 11669
 symbol_test/03: MissingCompileTimeError # bug 11669
 
@@ -60,10 +60,7 @@
 symbol_test/none: Fail # bug 11669
 symbol_operator_test/03: Fail # bug 11669
 
-[ $compiler == none && $runtime == drt ]
-main_test: Fail  # Dartium needs to check for both main() and main(args).
-
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 main_test: Fail  # Dartium needs to check for both main() and main(args).
 
 [ $runtime == ff || $runtime == ie9 || $runtime == jsshell ]
diff --git a/tests/html/html.status b/tests/html/html.status
index f9ce16e..36780af 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -25,7 +25,7 @@
 [ $compiler == none && $runtime == dartium && $system == macos]
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellInAndroid) ]
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
 xhr_test: Pass, Fail # Issue 12648
@@ -34,6 +34,9 @@
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
 
+[ $compiler == none && $runtime == ContentShellInAndroid ]
+element_offset_test/offset: Pass, Fail # Issue 13296
+
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
 touchevent_test/supported: Pass, Fail # Issue 17061
@@ -74,11 +77,10 @@
 xhr_cross_origin_test: Pass, Fail # Issue 11884
 xhr_test: Pass, Fail # Issue 11884
 
-[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid]
+[$runtime == drt || $runtime == dartium || $runtime == chrome || $runtime == chromeOnAndroid || $runtime == ContentShellOnAndroid ]
 webgl_1_test: Pass, Fail # Issue 8219
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
-request_animation_frame_test: Skip   # drt hangs; requestAnimationFrame not implemented
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 worker_api_test: Fail # http://dartbug.com/10223
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $system == windows]
@@ -380,6 +382,10 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime ==chrome) ]
 wheelevent_test: Fail # http://dartbug.com/12958
 
+[ $runtime == dartium && ($system == macos || $system == windows || $system == linux)]
+# Desktop operation systems do not support touch events on chrome 34 dartium.
+touchevent_test/supported: Fail
+
 [ $compiler == none && $runtime == dartium ]
 async_test: Timeout # Issue 13719: Please triage this failure.
 element_offset_test/offset: Pass, Fail # Issue 13719, 13296
diff --git a/tests/language/deferred_constraints_constants_lib.dart b/tests/language/deferred_constraints_constants_lib.dart
new file mode 100644
index 0000000..50b6ed5
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_lib.dart
@@ -0,0 +1,17 @@
+// 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.
+
+class C {
+  static int staticMethod() => 42;
+}
+
+class G<T> {}
+
+class Const {
+  const Const();
+  const Const.namedConstructor();
+  static const instance = const Const();
+}
+
+const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_constants_test.dart b/tests/language/deferred_constraints_constants_test.dart
new file mode 100644
index 0000000..be44642
--- /dev/null
+++ b/tests/language/deferred_constraints_constants_test.dart
@@ -0,0 +1,63 @@
+// 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.
+
+import "dart:async";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+@lazy import "deferred_constraints_constants_lib.dart" as lib;
+
+const lazy = const DeferredLibrary('lib');
+
+const myConst1 =
+  lib.constantInstance; /// reference1: compile-time error
+  /*                    /// reference1: continued
+  499;
+  */                    /// reference1: continued
+const myConst2 =
+  lib.Const.instance; /// reference2: compile-time error
+  /*                  /// reference2: continued
+  499;
+  */                  /// reference2: continued
+
+void f1({a:
+  const lib.Const() /// default_argument1: compile-time error
+  /*                   /// default_argument1: continued
+  499
+  */                   /// default_argument1: continued
+}) {}
+
+void f2({a:
+  lib.constantInstance /// default_argument2: compile-time error
+  /*                         /// default_argument2: continued
+  499
+  */                         /// default_argument2: continued
+}) {}
+
+@lib.Const() /// metadata1: compile-time error
+class H1 {}
+@lib.Const.instance /// metadata2: compile-time error
+class H2 {}
+@lib.Const.namedConstructor() /// metadata3: compile-time error
+class H3 {}
+
+void main() {
+  var a1 = myConst1;
+  var a2 = myConst2;
+
+  asyncStart();
+  lazy.load().then((_) {
+    var instance = lib.constantInstance;
+    var c1 = const lib.Const(); /// constructor1: compile-time error
+    var c2 = const lib.Const.namedConstructor(); /// constructor2: compile-time error
+    f1();
+    f2();
+    var constInstance = lib.constantInstance; /// reference_after_load: ok
+    var h1 = new H1();
+    var h2 = new H2();
+    var h3 = new H3();
+    asyncEnd();
+  });
+}
+
diff --git a/tests/language/deferred_constraints_lib.dart b/tests/language/deferred_constraints_lib.dart
index 9f4d207..1aac90a 100644
--- a/tests/language/deferred_constraints_lib.dart
+++ b/tests/language/deferred_constraints_lib.dart
@@ -10,6 +10,8 @@
 
 class Const {
   const Const();
+  const Const.otherConstructor();
+  static const instance = const Const();
 }
 
 const constantInstance = const Const();
\ No newline at end of file
diff --git a/tests/language/deferred_constraints_test.dart b/tests/language/deferred_constraints_type_annotation_test.dart
similarity index 77%
rename from tests/language/deferred_constraints_test.dart
rename to tests/language/deferred_constraints_type_annotation_test.dart
index 6992b78..cd4cdf5 100644
--- a/tests/language/deferred_constraints_test.dart
+++ b/tests/language/deferred_constraints_type_annotation_test.dart
@@ -14,21 +14,17 @@
 class F {}
 class G2<T> {}
 
-void f({a: const lib.Const()}) {} /// const_default_argument: compile-time error
-
-@lib.Const() class H {} /// const_annotation: compile-time error
-
-void main() {
-  Expect.throws(() { /// type_annotation1: static type warning
-    lib.C a = new lib.C(); /// type_annotation1: continued
-  }, (e) => e is NoSuchMethodError); /// type_annotation1: continued
+main() {
   lib.C a = null; /// type_annotation_null: static type warning
+  Expect.throws(() { /// new_before_load: static type warning
+    lib.C a = new lib.C(); /// new_before_load: continued
+  }, (e) => e is NoSuchMethodError); /// new_before_load: continued
 
   // In this case we do not defer C.
   lib2.C a1 = new lib2.C(); /// type_annotation_non_deferred: continued
   asyncStart();
   lazy.load().then((_) {
-    lib.C a2 = new lib.C(); /// type_annotation2: dynamic type error, static type warning
+    lib.C a2 = new lib.C(); /// type_annotation1: dynamic type error, static type warning
     lib.G<F> a3 = new lib.G<F>(); /// type_annotation_generic1: dynamic type error, static type warning
     G2<lib.C> a4 = new G2(); /// type_annotation_generic2: static type warning
     G2<lib.C> a5 = new G2<lib.C>(); /// type_annotation_generic3: static type warning
@@ -50,10 +46,6 @@
       try { throw instance; } on lib.Const {} /// catch_check: continued
     }, (e) => e is TypeError); /// catch_check: continued
     int i = lib.C.staticMethod(); /// static_method: ok
-    var c1 = const lib.Const(); /// const: compile-time error
-    f();  /// const_default_argument: continued
-    var constInstance = lib.constantInstance; /// const_instance: ok
-    var h = new H(); /// const_annotation: continued
     asyncEnd();
   });
 }
diff --git a/tests/language/language.status b/tests/language/language.status
index 7dc0382..1e36a24 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -20,28 +20,28 @@
 duplicate_export_negative_test: Fail # Issue 6134
 mixin_forwarding_constructor2_test: Fail # Issue 13641
 
+deferred_constraints_constants_test/reference1: Fail
+deferred_constraints_constants_test/reference2: Fail
+deferred_constraints_constants_test/metadata1: Fail
+deferred_constraints_constants_test/metadata2: Fail
+deferred_constraints_constants_test/metadata3: Fail
+deferred_constraints_constants_test/default_argument1: Fail
+deferred_constraints_constants_test/default_argument2: Fail
+deferred_constraints_constants_test/constructor1: Fail
+deferred_constraints_constants_test/constructor2: Fail
+
+[ ($compiler == none || $compiler == dart2dart)]
 # The vm does not support deferred loading.
-deferred_constraints_test/const: Fail
-deferred_constraints_test/const_annotation: Fail
-deferred_constraints_test/const_default_argument: Fail
+deferred_constraints_type_annotation_test/as_operation: Fail
+deferred_constraints_type_annotation_test/is_check: Fail
+deferred_constraints_type_annotation_test/catch_check: Fail
+deferred_constraints_type_annotation_test/new_before_load: Fail
 
-[ ($compiler == none || $compiler == dart2dart) && $unchecked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-
-[ ($compiler == none || $compiler == dart2dart)  && $checked ]
-# The vm and dart2dart does not support deferred loading.
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/is_check: Fail
-deferred_constraints_test/catch_check: Fail
-deferred_constraints_test/type_annotation1: Fail
-deferred_constraints_test/type_annotation2: Fail
-deferred_constraints_test/as_operation: Fail
-deferred_constraints_test/type_annotation_generic1: Fail
-deferred_constraints_test/type_annotation_generic4: Fail
+[ ($compiler == none || $compiler == dart2dart) && $checked ]
+# The vm and dart2dart do not support deferred loading.
+deferred_constraints_type_annotation_test/type_annotation1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic1: Fail
+deferred_constraints_type_annotation_test/type_annotation_generic4: Fail
 
 [ $compiler == none || $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # The vm and analyzer do not support deferred loading.
@@ -79,29 +79,24 @@
 type_check_const_function_typedef2_test/00: Fail, OK
 malformed2_test/01: Fail, OK
 
-[ $runtime == vm || (($runtime == drt || $runtime == dartium) && $compiler == none) ]
+[ ($compiler == none || $compiler == dart2dart) && $runtime != none ]
 dynamic_prefix_core_test/01: Fail # Issue 12478
-call_closurization_test: Fail # Issue 17473
 
-[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == vm || $runtime == drt || $runtime == dartium|| $runtime == ContentShellOnAndroid) ]
 dynamic_prefix_core_test/none: Fail # Issue 12478
 export_ambiguous_main_negative_test: Fail # Issue 14763
 
-[ $compiler == none && $runtime == drt ]
-mixin_illegal_object_test/01: pass # Issue 10952.
-mixin_illegal_object_test/02: pass # Issue 10952.
-
 [ $compiler == dart2js && $runtime == ie9 ]
 lazy_static3_test: Fail # Issue 13469
 
 [ $compiler == none && $runtime == dartium && $unchecked ]
-named_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-named_parameters_type_test/03: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/01: Fail # Issue 13719: Please triage this failure.
-positional_parameters_type_test/02: Fail # Issue 13719: Please triage this failure.
-assertion_test: Fail # Issue 13719: Please triage this failure.
-generic_test: Fail # Issue 13719: Please triage this failure.
+named_parameters_type_test/01: Fail # Issue 17561.
+named_parameters_type_test/02: Fail # Issue 17561.
+named_parameters_type_test/03: Fail # Issue 17561.
+positional_parameters_type_test/01: Fail # Issue 17561.
+positional_parameters_type_test/02: Fail # Issue 17561.
+assertion_test: Fail # Issue 17561.
+generic_test: Fail # Issue 17561.
 list_literal1_test/01: Fail # Issue 13719: Please triage this failure.
 list_literal4_test: Fail # Issue 13719: Please triage this failure.
 map_literal1_test/01: Fail # Issue 13719: Please triage this failure.
@@ -120,4 +115,8 @@
 override_inheritance_mixed_test/09: Fail # Issue 16137
 
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
-generic_instanceof3_test: Pass, Crash # dartbug.com/17440
+generic_instanceof3_test: Pass, Crash # Issue 17440.
+
+[ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
+stack_overflow_test: Skip # Crashes. Issue 17440.
+stack_overflow_stacktrace_test: Skip # Crashes. Issue 17440.
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index f4c89cf..720486c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -475,19 +475,25 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 86e489a..6c689a1 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -475,19 +475,25 @@
 vm/type_cast_vm_test: StaticWarning
 vm/type_vm_test: StaticWarning
 void_type_test: StaticWarning
-deferred_constraints_test/type_annotation1: MissingStaticWarning
-deferred_constraints_test/type_annotation2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic1: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic2: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic3: MissingStaticWarning
-deferred_constraints_test/type_annotation_generic4: MissingStaticWarning
-deferred_constraints_test/type_annotation_null: MissingStaticWarning
-deferred_constraints_test/type_annotation_top_level: MissingStaticWarning
-deferred_constraints_test/as_operation: MissingStaticWarning
-deferred_constraints_test/is_check: MissingStaticWarning
-deferred_constraints_test/new_generic2: MissingStaticWarning
-deferred_constraints_test/new_generic3: MissingStaticWarning
-deferred_constraints_test/catch_check: MissingStaticWarning
-deferred_constraints_test/const: MissingCompileTimeError
-deferred_constraints_test/const_annotation: MissingCompileTimeError
-deferred_constraints_test/const_default_argument: MissingCompileTimeError
+deferred_constraints_type_annotation_test/new_before_load: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic1: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_generic4: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_null: MissingStaticWarning
+deferred_constraints_type_annotation_test/type_annotation_top_level: MissingStaticWarning
+deferred_constraints_type_annotation_test/as_operation: MissingStaticWarning
+deferred_constraints_type_annotation_test/is_check: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic2: MissingStaticWarning
+deferred_constraints_type_annotation_test/new_generic3: MissingStaticWarning
+deferred_constraints_type_annotation_test/catch_check: MissingStaticWarning
+deferred_constraints_constants_test/reference1: MissingCompileTimeError
+deferred_constraints_constants_test/reference2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata1: MissingCompileTimeError
+deferred_constraints_constants_test/metadata2: MissingCompileTimeError
+deferred_constraints_constants_test/metadata3: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument1: MissingCompileTimeError
+deferred_constraints_constants_test/default_argument2: MissingCompileTimeError
+deferred_constraints_constants_test/constructor1: MissingCompileTimeError
+deferred_constraints_constants_test/constructor2: MissingCompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 3f55762..a014535 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -52,7 +52,6 @@
 default_factory2_test/01: Fail # Issue 14121
 typevariable_substitution2_test/01: CompileTimeError # Issue 15875
 typevariable_substitution2_test/02: CompileTimeError # Issue 15875
-mixin_bound_test: CompileTimeError # Issue 15875
 
 [ $compiler == dart2js && $unchecked ]
 type_checks_in_factory_method_test: RuntimeError # Issue 12746
@@ -148,9 +147,6 @@
 bit_operations_test: RuntimeError, OK # Issue 1533
 expect_test: RuntimeError, OK # Issue 13080
 
-[ ($compiler == dart2js || $compiler == dart2dart) && $checked ]
-cyclic_typedef_test/07: Crash # Issue 15237
-
 [ ($compiler == dart2js || $compiler == dart2dart) && $unchecked ]
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, OK
 
@@ -293,10 +289,12 @@
 
 [ $runtime == ie9 ]
 stack_trace_test: Fail, OK # Stack traces not available in IE9.
-deferred_constraints_test/*: Fail, Pass # http://dartbug.com/12635
-
-[ $compiler == dart2js && $host_checked ]
-const_factory_with_body_test/01: Crash
+deferred_constraints_type_annotation_test/*: Fail, Pass # http://dartbug.com/12635
+deferred_constraints_constants_test/*: Fail, Pass # http://dartbug.com/12635
 
 [ ($compiler == dart2js && $csp)]
-deferred_constraints_test/*: Skip # Issue 16898
+deferred_constraints_type_annotation_test/*: Skip # Issue 16898
+deferred_constraints_constants_test/*: Skip # Issue 16898
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+*deferred*: Skip # Issue 17458
diff --git a/tests/language/mixin_type_variable_test.dart b/tests/language/mixin_type_variable_test.dart
new file mode 100644
index 0000000..4d5c6c4
--- /dev/null
+++ b/tests/language/mixin_type_variable_test.dart
@@ -0,0 +1,32 @@
+// 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.
+
+// Regression test for generic mixin fields in checked mode.
+
+class A<T> {
+  T field;
+}
+
+class B<T> = Object with A<T>;
+
+class C<T> extends B<T> {} /// 03: ok
+class D extends B<int> {} /// 04: ok
+
+class E = Object with A<int>;
+
+class F extends E {} /// 06: ok
+
+class G<T> extends Object with A<T> {} /// 07: ok
+class H extends Object with A<int> {} /// 08: ok
+
+void main() {
+  new A<num>(); /// 01: ok
+  new B<num>(); /// 02: ok
+  new C<num>(); /// 03: continued
+  new D(); /// 04: continued
+  new E(); /// 05: ok
+  new F(); /// 06: continued
+  new G<num>(); /// 07: continued
+  new H(); /// 08: continued
+}
\ No newline at end of file
diff --git a/tests/language/pure_function2_test.dart b/tests/language/pure_function2_test.dart
new file mode 100644
index 0000000..1fdf5f0
--- /dev/null
+++ b/tests/language/pure_function2_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Regression test for issue 17483.
+
+confuse(x) {
+  if (new DateTime.now().millisecondsSinceEpoch == 42) return confuse(x);
+  return x;
+}
+
+foo(trace) {
+  trace.add("foo");
+  return "foo";
+}
+bar(trace) {
+  trace.add("bar");
+  return "bar";
+}
+
+main() {
+  var f = confuse(foo);
+  var b = confuse(bar);
+
+  var trace = [];
+  // Dart2js must keep the order of t1 and t2.
+  var t1 = f(trace);
+  var t2 = b(trace);
+  var t3 = identical(t2, "foo");
+  var t4 = trace.add(t1);
+  trace.add(t3);
+  trace.add(t3);
+  Expect.listEquals(["foo", "bar", "foo", false, false], trace);
+}
diff --git a/tests/language/pure_function_test.dart b/tests/language/pure_function_test.dart
new file mode 100644
index 0000000..4bd36be
--- /dev/null
+++ b/tests/language/pure_function_test.dart
@@ -0,0 +1,36 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+// Regression test for issue 17483.
+
+class A {
+  var x, y;
+  A(x, this.y) {
+    this.x = x;
+  }
+  toString() => "a";
+}
+
+foo(trace) => trace.add("foo");
+bar(trace) => trace.add("bar");
+
+main() {
+  var trace = [];
+  // Dart2js must keep the order of t1 and t2.
+  var t1 = foo(trace);
+  var t2 = bar(trace);
+  // Dart2js inlines the constructor, yielding something like:
+  //   t3 = jsNew A(null, t2);  // Note that jsNew is pure.
+  //   t3.x = t1;
+  // t3 is used twice and cannot be generated at use site.
+  // Dart2js must not allow t1 to cross the t3-line.
+  var a = new A(t1, t2);
+  // Use a. It is already implicitly used by the this.x = x line in its
+  // constructor. With the following use we use it twice and make sure that
+  // the allocation can not be generated at use-site.
+  trace.add(a.toString());
+  Expect.listEquals(["foo", "bar", "a"], trace);
+}
diff --git a/tests/language/super_bound_closure_test.dart b/tests/language/super_bound_closure_test.dart
index a85f30f..eb91f5f 100644
--- a/tests/language/super_bound_closure_test.dart
+++ b/tests/language/super_bound_closure_test.dart
@@ -6,7 +6,29 @@
 
 class A {
   bar([var optional = 1]) => 498 + optional;
-  bar2(x, { namedOptional: 2 }) => 40 + x + namedOptional;
+  bar2({ namedOptional: 2 }) => 40 + namedOptional;
+  bar3(x, [var optional = 3]) => x + 498 + optional;
+  bar4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+  // Gee is the same as bar, but we make sure that gee is used. Potentially
+  // this yields different code if the redirecting stub exists.
+  gee([var optional = 1]) => 498 + optional;
+  gee2({ namedOptional: 2 }) => 40 + namedOptional;
+  gee3(x, [var optional = 3]) => x + 498 + optional;
+  gee4(x, { namedOptional: 4 }) => 422 + x + namedOptional;
+
+  // Use identifiers that could be intercepted.
+  add([var optional = 33]) => 1234 + optional;
+  trim({ namedOptional: 22 }) => 1313 + namedOptional;
+  sublist(x, [optional = 44]) => 4321 + optional + x;
+  splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) =>
+      111 + x + onMatch + onNonMatch;
+
+  // Other interceptable identifiers, but all of them are used.
+  shuffle([var optional = 121]) => 12342 + optional;
+  toList({ growable: 2233 }) => 13131 + growable;
+  lastIndexOf(x, [optional = 424]) => 14321 + optional + x;
+  lastWhere(x, { orElse: 555 }) => x + 1213 + 555;
 }
 
 class B extends A {
@@ -16,11 +38,59 @@
   // `A` redirects to A's bar$1.
   foo() => confuse(super.bar)();
   foo2() => confuse(super.bar)(2);
-  foo3() => confuse(super.bar2)(0);
-  foo4() => confuse(super.bar2)(3, namedOptional: 77);
+  foo3() => confuse(super.bar2)();
+  foo4() => confuse(super.bar2)(namedOptional: 77);
+  foo5() => confuse(super.bar3)(-3);
+  foo6() => confuse(super.bar3)(-11, -19);
+  foo7() => confuse(super.bar4)(0);
+  foo8() => confuse(super.bar4)(3, namedOptional: 77);
+
+  fooGee() => confuse(super.gee)();
+  fooGee2() => confuse(super.gee)(2);
+  fooGee3() => confuse(super.gee2)();
+  fooGee4() => confuse(super.gee2)(namedOptional: 77);
+  fooGee5() => confuse(super.gee3)(-3);
+  fooGee6() => confuse(super.gee3)(-11, -19);
+  fooGee7() => confuse(super.gee4)(0);
+  fooGee8() => confuse(super.gee4)(3, namedOptional: 77);
+
+  fooIntercept() => confuse(super.add)();
+  fooIntercept2() => confuse(super.add)(2);
+  fooIntercept3() => confuse(super.trim)();
+  fooIntercept4() => confuse(super.trim)(namedOptional: 77);
+  fooIntercept5() => confuse(super.sublist)(-3);
+  fooIntercept6() => confuse(super.sublist)(-11, -19);
+  fooIntercept7() => confuse(super.splitMapJoin)(0);
+  fooIntercept8() => confuse(super.splitMapJoin)(3, onMatch: 77, onNonMatch: 8);
+
+  fooIntercept21() => confuse(super.shuffle)();
+  fooIntercept22() => confuse(super.shuffle)(2);
+  fooIntercept23() => confuse(super.toList)();
+  fooIntercept24() => confuse(super.toList)(growable: 77);
+  fooIntercept25() => confuse(super.lastIndexOf)(-3);
+  fooIntercept26() => confuse(super.lastIndexOf)(-11, -19);
+  fooIntercept27() => confuse(super.lastWhere)(0);
+  fooIntercept28() => confuse(super.lastWhere)(3, orElse: 77);
 
   bar([var optional]) => -1;
-  bar2(x, { namedOptional }) => -1;
+  bar2({ namedOptional }) => -1;
+  bar3(x, [var optional]) => -1;
+  bar4(x, { namedOptional }) => -1;
+
+  gee([var optional]) => -1;
+  gee2({ namedOptional }) => -1;
+  gee3(x, [var optional]) => -1;
+  gee4(x, { namedOptional }) => -1;
+
+  add([var optional = 33]) => -1;
+  trim({ namedOptional: 22 }) => -1;
+  sublist(x, [optional = 44]) => -1;
+  splitMapJoin(x, { onMatch: 55, onNonMatch: 66}) => -1;
+
+  shuffle([var optional = 121]) => -1;
+  toList({ growable: 2233 }) => -1;
+  lastIndexOf(x, [optional = 424]) => -1;
+  lastWhere(x, { orElse: 555 }) => -1;
 }
 
 confuse(x) {
@@ -29,11 +99,50 @@
 }
 
 main() {
-  var list = [new A(), new B() ];
+  var list = [new A(), new B(), [], "foo" ];
   var a = list[confuse(0)];
   var b = list[confuse(1)];
+  var ignored = list[confuse(2)];
+  var ignored2 = list[confuse(3)];
+
+  var t = b.gee() + b.gee2() + b.gee3(9) + b.gee4(19);
+  Expect.equals(-4, t);
+  t = b.shuffle() + b.toList() + b.lastIndexOf(1) + b.lastWhere(2);
+  Expect.equals(-4, t);
+
   Expect.equals(499, b.foo());
   Expect.equals(500, b.foo2());
   Expect.equals(42, b.foo3());
-  Expect.equals(120, b.foo4());
+  Expect.equals(117, b.foo4());
+  Expect.equals(498, b.foo5());
+  Expect.equals(468, b.foo6());
+  Expect.equals(426, b.foo7());
+  Expect.equals(502, b.foo8());
+
+  Expect.equals(499, b.fooGee());
+  Expect.equals(500, b.fooGee2());
+  Expect.equals(42, b.fooGee3());
+  Expect.equals(117, b.fooGee4());
+  Expect.equals(498, b.fooGee5());
+  Expect.equals(468, b.fooGee6());
+  Expect.equals(426, b.fooGee7());
+  Expect.equals(502, b.fooGee8());
+
+  Expect.equals(1267, b.fooIntercept());
+  Expect.equals(1236, b.fooIntercept2());
+  Expect.equals(1335, b.fooIntercept3());
+  Expect.equals(1390, b.fooIntercept4());
+  Expect.equals(4362, b.fooIntercept5());
+  Expect.equals(4291, b.fooIntercept6());
+  Expect.equals(232, b.fooIntercept7());
+  Expect.equals(199, b.fooIntercept8());
+
+  Expect.equals(12463, b.fooIntercept21());
+  Expect.equals(12344, b.fooIntercept22());
+  Expect.equals(15364, b.fooIntercept23());
+  Expect.equals(13208, b.fooIntercept24());
+  Expect.equals(14742, b.fooIntercept25());
+  Expect.equals(14291, b.fooIntercept26());
+  Expect.equals(1768, b.fooIntercept27());
+  Expect.equals(1771, b.fooIntercept28());
 }
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 19f070b..5e5d7de 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -27,6 +27,3 @@
 lib/web_gl/dartium/web_gl_dartium: CompileTimeError # Issue 16524
 lib/web_sql/dart2js/web_sql_dart2js: CompileTimeError # Issue 16524
 lib/web_sql/dartium/web_sql_dartium: CompileTimeError # Issue 16524
-lib/_internal/compiler/samples/jsonify/jsonify: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/dart2js_mirrors: CompileTimeError # Issue 17264
-lib/_internal/compiler/implementation/mirrors/analyze: CompileTimeError # Issue 17264
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index e8fd11f..0fe2a10 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -59,6 +59,7 @@
 mirrors/instance_members_test: RuntimeError # Issue 14633
 mirrors/instantiate_abstract_class_test: RuntimeError # Issue 6490
 mirrors/invoke_test: RuntimeError # Issue 11954
+mirrors/invoke_call_on_closure_test: RuntimeError # 6490
 mirrors/invoke_call_through_getter_previously_accessed_test: RuntimeError # Issue 15138
 mirrors/invoke_call_through_getter_test: RuntimeError # Issue 15138
 mirrors/invoke_call_through_implicit_getter_previously_accessed_test: RuntimeError # Issue 15138
@@ -254,14 +255,14 @@
 
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/schedule_microtask6_test: Fail # Issue 10910
 mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
 mirrors/mirrors_reader_test: Pass, Slow # Dartium debug uses -O0
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
 mirrors/local_isolate_test: Skip # http://dartbug.com/12188
 
-[ $compiler == none && ( $runtime == drt || $runtime == dartium ) ]
+[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/timer_test: Fail, Pass # Issue 15487
 async/multiple_timer_test: Fail, Pass # Issue 15487
 async/stream_periodic3_test: Fail, Pass # Issue 15487
@@ -282,6 +283,8 @@
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 mirrors/find_in_context_test: Fail # Issue 13719: Needs VM flag
 mirrors/find_in_context_private_test: Fail # Issue 13719: Needs VM flag
 mirrors/find_in_context_fake_function_test: Fail # Issue 13719: Needs VM flag
@@ -290,7 +293,7 @@
 # Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 async/timer_isolate_test: Fail
 
-[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm)) ]
+[ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm || $runtime == ContentShellOnAndroid)) ]
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
 async/deferred/deferred_fail_to_load_test: Fail
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
@@ -312,3 +315,9 @@
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
+
+[ $compiler == dart2js && $runtime == d8 && $system == windows ]
+mirrors/*deferred*: Skip # Issue 17458
+
+[ $compiler == dart2js && $mode == debug ]
+mirrors/native_class_test: Pass, Slow
diff --git a/tests/lib/mirrors/invoke_call_on_closure_test.dart b/tests/lib/mirrors/invoke_call_on_closure_test.dart
new file mode 100644
index 0000000..e023ff0
--- /dev/null
+++ b/tests/lib/mirrors/invoke_call_on_closure_test.dart
@@ -0,0 +1,68 @@
+// 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.
+
+library test.invoke_call_on_closure;
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+
+class FakeFunctionCall {
+  call(x, y) => '1 $x $y';
+}
+class FakeFunctionNSM {
+  noSuchMethod(msg) => msg.positionalArguments.join(', ');
+}
+
+class C {
+  get fakeFunctionCall => new FakeFunctionCall();
+  get fakeFunctionNSM => new FakeFunctionNSM();
+  get closure => (x, y) => '2 $this $x $y';
+  get closureOpt => (x, y, [z, w]) => '3 $this $x $y $z $w';
+  get closureNamed => (x, y, {z, w}) => '4 $this $x $y $z $w';
+  tearOff(x, y) => '22 $this $x $y';
+  tearOffOpt(x, y, [z, w]) => '33 $this $x $y $z $w';
+  tearOffNamed(x, y, {z, w}) => '44 $this $x $y $z $w';
+
+  noSuchMethod(msg) => 'DNU';
+
+  toString() => 'C';
+}
+
+main() {
+  var c = new C();
+  InstanceMirror im;
+
+  im = reflect(c.fakeFunctionCall);
+  Expect.equals('1 5 6',
+                im.invoke(#call, [5, 6]).reflectee);
+
+  im = reflect(c.fakeFunctionNSM);
+  Expect.equals('7, 8',
+                im.invoke(#call, [7, 8]).reflectee);
+
+  im = reflect(c.closure);
+  Expect.equals('2 C 9 10',
+                im.invoke(#call, [9, 10]).reflectee);
+
+  im = reflect(c.closureOpt);
+  Expect.equals('3 C 11 12 13 null',
+                im.invoke(#call, [11, 12, 13]).reflectee);
+
+  im = reflect(c.closureNamed);
+  Expect.equals('4 C 14 15 null 16',
+                im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+
+  im = reflect(c.tearOff);
+  Expect.equals('22 C 9 10',
+                im.invoke(#call, [9, 10]).reflectee);
+
+  im = reflect(c.tearOffOpt);
+  Expect.equals('33 C 11 12 13 null',
+                im.invoke(#call, [11, 12, 13]).reflectee);
+
+  im = reflect(c.tearOffNamed);
+  Expect.equals('44 C 14 15 null 16',
+                im.invoke(#call, [14, 15], {#w: 16}).reflectee);
+}
diff --git a/tests/standalone/io/http_headers_test.dart b/tests/standalone/io/http_headers_test.dart
index 7417d56..edaa64a 100644
--- a/tests/standalone/io/http_headers_test.dart
+++ b/tests/standalone/io/http_headers_test.dart
@@ -325,6 +325,12 @@
   contentType = ContentType.parse(
       "  text/html  ;  charset  =  utf-8  ;  xxx=yyy  ");
   check(contentType, "text", "html", {"charset": "utf-8", "xxx": "yyy"});
+
+  // Test builtin content types.
+  check(ContentType.TEXT, "text", "plain", {"charset": "utf-8"});
+  check(ContentType.HTML, "text", "html", {"charset": "utf-8"});
+  check(ContentType.JSON, "application", "json", {"charset": "utf-8"});
+  check(ContentType.BINARY, "application", "octet-stream");
 }
 
 void testContentTypeCache() {
@@ -436,6 +442,9 @@
   Expect.throws(() => new _Cookie.fromSetCookieValue("xxx"));
   Expect.throws(() => new _Cookie.fromSetCookieValue(
       "xxx=yyy; expires=12 jan 2013"));
+  Expect.throws(() => new _Cookie.fromSetCookieValue("x x = y y"));
+  Expect.throws(() => new _Cookie("[4", "y"));
+  Expect.throws(() => new _Cookie("4", "y\""));
 
   _HttpHeaders headers = new _HttpHeaders("1.1");
   headers.set('Cookie',
diff --git a/tests/standalone/io/https_server_test.dart b/tests/standalone/io/https_server_test.dart
index 559a4d1..cdba064 100644
--- a/tests/standalone/io/https_server_test.dart
+++ b/tests/standalone/io/https_server_test.dart
@@ -2,20 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+const CERTIFICATE = "localhost_cert";
 
 void testListenOn() {
   void test(void onDone()) {
-    HttpServer.bindSecure(HOST_NAME,
+    HttpServer.bindSecure(HOST,
                           0,
                           backlog: 5,
-                          certificateName: 'localhost_cert').then((server) {
+                          certificateName: CERTIFICATE).then((server) {
       ReceivePort serverPort = new ReceivePort();
       server.listen((HttpRequest request) {
         request.listen(
@@ -28,7 +29,7 @@
 
       HttpClient client = new HttpClient();
       ReceivePort clientPort = new ReceivePort();
-      client.getUrl(Uri.parse("https://$HOST_NAME:${server.port}/"))
+      client.getUrl(Uri.parse("https://${HOST.host}:${server.port}/"))
         .then((HttpClientRequest request) {
           return request.close();
         })
@@ -64,7 +65,7 @@
 }
 
 void testEarlyClientClose() {
-  HttpServer.bindSecure(HOST_NAME,
+  HttpServer.bindSecure(HOST,
                         0,
                         certificateName: 'localhost_cert').then((server) {
     server.listen(
@@ -76,7 +77,7 @@
 
     var count = 0;
     makeRequest() {
-      Socket.connect(HOST_NAME, server.port).then((socket) {
+      Socket.connect(HOST, server.port).then((socket) {
         var data = "Invalid TLS handshake";
         socket.write(data);
         socket.close();
@@ -96,6 +97,9 @@
 
 void main() {
   InitializeSSL();
-  testListenOn();
-  testEarlyClientClose();
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    testListenOn();
+    testEarlyClientClose();
+  });
 }
diff --git a/tests/standalone/io/process_set_exit_code_script.dart b/tests/standalone/io/process_set_exit_code_script.dart
index 9a34f05..38a8075 100644
--- a/tests/standalone/io/process_set_exit_code_script.dart
+++ b/tests/standalone/io/process_set_exit_code_script.dart
@@ -5,7 +5,13 @@
 import "dart:io";
 
 main() {
+  if (exitCode != 0) {
+    throw "Bad initial exit-code";
+  }
   stdout.write("standard out");
   stderr.write("standard error");
   exitCode = 25;
+  if (exitCode != 25) {
+    throw "Exit-code not set correctly";
+  }
 }
diff --git a/tests/standalone/io/raw_secure_server_closing_test.dart b/tests/standalone/io/raw_secure_server_closing_test.dart
index c38ab58..16fffe3 100644
--- a/tests/standalone/io/raw_secure_server_closing_test.dart
+++ b/tests/standalone/io/raw_secure_server_closing_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
       .then((_) {
         asyncEnd();
       });
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen((event) {
         if (toClose == "server" || event == RawSocketEvent.READ_CLOSED) {
@@ -40,7 +39,7 @@
     onDone: () {
       serverDone.complete(null);
     });
-    RawSecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+    RawSecureSocket.connect(HOST, server.port).then((clientConnection) {
       clientConnection.listen((event){
         if (toClose == "client" || event == RawSocketEvent.READ_CLOSED) {
           clientConnection.shutdown(SocketDirection.SEND);
@@ -56,8 +55,8 @@
 
 void testCloseBothEnds() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.close();
@@ -76,7 +75,7 @@
 
   asyncStart();
 
-  RawSecureServerSocket.bind(HOST_NAME,
+  RawSecureServerSocket.bind(HOST,
                              0,
                              CERTIFICATE,
                              backlog: 2 * socketCount).then((server) {
@@ -97,7 +96,7 @@
     subscription.pause();
     var connectCount = 0;
     for (int i = 0; i < socketCount; i++) {
-      RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      RawSecureSocket.connect(HOST, server.port).then((connection) {
         connection.shutdown(SocketDirection.SEND);
       });
     }
@@ -105,7 +104,7 @@
       subscription.resume();
       resumed = true;
       for (int i = 0; i < socketCount; i++) {
-        RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+        RawSecureSocket.connect(HOST, server.port).then((connection) {
           connection.shutdown(SocketDirection.SEND);
         });
       }
@@ -118,7 +117,7 @@
   asyncStart();
   List ends = [];
 
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
     void checkDone() {
       if (ends.length < 2 * socketCount) return;
@@ -135,7 +134,7 @@
     });
 
     for (int i = 0; i < socketCount; i++) {
-      RawSecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      RawSecureSocket.connect(HOST, server.port).then((connection) {
         ends.add(connection);
         checkDone();
       });
@@ -145,11 +144,19 @@
 
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
 
+runTests() {
   testCloseOneEnd("client");
   testCloseOneEnd("server");
   testCloseBothEnds();
diff --git a/tests/standalone/io/raw_secure_server_socket_test.dart b/tests/standalone/io/raw_secure_server_socket_test.dart
index 49c04fb..6c90ed9 100644
--- a/tests/standalone/io/raw_secure_server_socket_test.dart
+++ b/tests/standalone/io/raw_secure_server_socket_test.dart
@@ -12,14 +12,13 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testSimpleBind() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
@@ -49,8 +48,8 @@
 
   // Bind to a port already in use.
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
-    RawSecureServerSocket.bind(HOST_NAME,
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+    RawSecureServerSocket.bind(HOST,
                                s.port,
                                CERTIFICATE).then((t) {
       s.close();
@@ -67,8 +66,8 @@
 
 void testSimpleConnect(String certificate) {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+  RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.shutdown(SocketDirection.SEND);
@@ -82,8 +81,8 @@
 
 void testSimpleConnectFail(String certificate, bool cancelOnError) {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port)
+  RawSecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port)
       .then((clientEnd) {
         Expect.fail("No client connection expected.");
       })
@@ -107,9 +106,9 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  RawSecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  RawSecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
-    var clientEndFuture = RawSecureSocket.connect(HOST_NAME, server.port);
+    var clientEndFuture = RawSecureSocket.connect(HOST, server.port);
     new Timer(const Duration(milliseconds: 500), () {
       server.listen((serverEnd) {
         clientEndFuture.then((clientEnd) {
@@ -423,13 +422,13 @@
 
   Future<RawSecureSocket> connectClient(int port) {
     if (connectSecure) {
-      return RawSecureSocket.connect(HOST_NAME, port);
+      return RawSecureSocket.connect(HOST, port);
     } else if (!handshakeBeforeSecure) {
-      return RawSocket.connect(HOST_NAME, port).then((socket) {
+      return RawSocket.connect(HOST, port).then((socket) {
         return RawSecureSocket.secure(socket);
       });
     } else {
-      return RawSocket.connect(HOST_NAME, port).then((socket) {
+      return RawSocket.connect(HOST, port).then((socket) {
         return runClientHandshake(socket).then((subscription) {
             return RawSecureSocket.secure(socket, subscription: subscription);
         });
@@ -466,9 +465,9 @@
 
   if (listenSecure) {
     RawSecureServerSocket.bind(
-        HOST_NAME, 0, CERTIFICATE).then(serverReady);
+        HOST, 0, CERTIFICATE).then(serverReady);
   } else {
-    RawServerSocket.bind(HOST_NAME, 0).then(serverReady);
+    RawServerSocket.bind(HOST, 0).then(serverReady);
   }
 }
 
@@ -477,7 +476,7 @@
 
   asyncStart();
   var clientComplete = new Completer();
-  RawServerSocket.bind(HOST_NAME, 0).then((server) {
+  RawServerSocket.bind(HOST, 0).then((server) {
     server.listen((client) {
       var subscription;
       subscription = client.listen((_) {
@@ -506,7 +505,7 @@
       });
     });
 
-    RawSocket.connect(HOST_NAME, server.port).then((socket) {
+    RawSocket.connect(HOST, server.port).then((socket) {
       var subscription;
       subscription = socket.listen((_) {
         if (pausedClient) {
@@ -534,10 +533,19 @@
 }
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
+
+runTests() {
   testSimpleBind();
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
diff --git a/tests/standalone/io/secure_client_raw_server_test.dart b/tests/standalone/io/secure_client_raw_server_test.dart
index 9d40baf..e380f75 100644
--- a/tests/standalone/io/secure_client_raw_server_test.dart
+++ b/tests/standalone/io/secure_client_raw_server_test.dart
@@ -7,16 +7,16 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<RawSecureServerSocket> startEchoServer() {
-  return RawSecureServerSocket.bind(HOST_NAME,
+  return RawSecureServerSocket.bind(HOST,
                                     0,
                                     CERTIFICATE).then((server) {
     server.listen((RawSecureSocket client) {
@@ -60,7 +60,7 @@
 Future testClient(server) {
   Completer success = new Completer();
   List<String> chunks = <String>[];
-  SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello server.");
     socket.close();
     socket.listen(
@@ -78,13 +78,13 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startEchoServer()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+      .then((_) => startEchoServer())
       .then(testClient)
-      .then((server) {
-        server.close();
-      });
+      .then((server) => server.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_client_server_test.dart b/tests/standalone/io/secure_client_server_test.dart
index cc41db9..3c41266 100644
--- a/tests/standalone/io/secure_client_server_test.dart
+++ b/tests/standalone/io/secure_client_server_test.dart
@@ -7,16 +7,16 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<SecureServerSocket> startEchoServer() {
-  return SecureServerSocket.bind(HOST_NAME,
+  return SecureServerSocket.bind(HOST,
                                  0,
                                  CERTIFICATE).then((server) {
     server.listen((SecureSocket client) {
@@ -31,7 +31,7 @@
 }
 
 Future testClient(server) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  return SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello server.");
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -43,13 +43,13 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startEchoServer()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first )
+      .then((_) => startEchoServer())
       .then(testClient)
-      .then((server) {
-        server.close();
-      });
+      .then((server) => server.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_multiple_client_server_test.dart b/tests/standalone/io/secure_multiple_client_server_test.dart
index c6cfcf3..2eeeed2 100644
--- a/tests/standalone/io/secure_multiple_client_server_test.dart
+++ b/tests/standalone/io/secure_multiple_client_server_test.dart
@@ -7,19 +7,20 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
-import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+
+InternetAddress HOST;
+SecureServerSocket SERVER;
 const CERTIFICATE = "localhost_cert";
-Future<SecureServerSocket> startServer() {
-  return SecureServerSocket.bind(HOST_NAME,
-                                 0,
-                                 CERTIFICATE).then((server) {
-    server.listen((SecureSocket client) {
+
+Future startServer() {
+  return SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    SERVER = server;
+    SERVER.listen((SecureSocket client) {
       client.fold(<int>[], (message, data) => message..addAll(data))
           .then((message) {
             String received = new String.fromCharCodes(message);
@@ -29,30 +30,29 @@
             client.close();
           });
     });
-    return server;
   });
 }
 
-Future testClient(server, name) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+Future testClient(name) {
+  return SecureSocket.connect(HOST, SERVER.port).then((socket) {
     socket.add("Hello from client $name".codeUnits);
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
         .then((message) {
           Expect.listEquals("Welcome, client $name".codeUnits, message);
-          return server;
         });
   });
 }
 
 void main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
-
-  startServer()
-      .then((server) => Future.wait(
-          ['able', 'baker', 'charlie', 'dozen', 'elapse']
-          .map((name) => testClient(server, name))))
-      .then((servers) => servers.first.close());
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+      .then((_) => startServer())
+      .then((_) => ['ale', 'bar', 'che', 'den', 'els'].map(testClient))
+      .then((futures) => Future.wait(futures))
+      .then((_) => SERVER.close())
+      .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_client_certificate_test.dart b/tests/standalone/io/secure_server_client_certificate_test.dart
index a0bcb41..34de17d 100644
--- a/tests/standalone/io/secure_server_client_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_certificate_test.dart
@@ -7,18 +7,17 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 Future testClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requestClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port,
                                                sendClientCertificate: true);
     server.listen((serverEnd) {
@@ -43,11 +42,11 @@
 
 Future testRequiredClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requireClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port,
                                                sendClientCertificate: true);
     server.listen((serverEnd) {
@@ -77,7 +76,8 @@
                           useBuiltinRoots: false);
 
   asyncStart();
-  testClientCertificate()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+    .then((_) => testClientCertificate())
     .then((_) => testRequiredClientCertificate())
     .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_client_no_certificate_test.dart b/tests/standalone/io/secure_server_client_no_certificate_test.dart
index 3ffeb22..888f988 100644
--- a/tests/standalone/io/secure_server_client_no_certificate_test.dart
+++ b/tests/standalone/io/secure_server_client_no_certificate_test.dart
@@ -7,18 +7,17 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 Future testNoClientCertificate() {
   var completer = new Completer();
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requestClientCertificate: true).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME,
+    var clientEndFuture = SecureSocket.connect(HOST,
                                                server.port);
     server.listen((serverEnd) {
       X509Certificate certificate = serverEnd.peerCertificate;
@@ -37,11 +36,11 @@
 Future testNoRequiredClientCertificate() {
   var completer = new Completer();
   bool clientError = false;
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           requireClientCertificate: true).then((server) {
-    Future clientDone = SecureSocket.connect(HOST_NAME, server.port)
+    Future clientDone = SecureSocket.connect(HOST, server.port)
       .catchError((e) { clientError = true; });
     server.listen((serverEnd) {
       Expect.fail("Got a unverifiable connection");
@@ -64,7 +63,8 @@
                           useBuiltinRoots: false);
 
   asyncStart();
-  testNoRequiredClientCertificate()
+  InternetAddress.lookup("localhost").then((hosts) => HOST = hosts.first)
+    .then((_) => testNoRequiredClientCertificate())
     .then((_) => testNoClientCertificate())
     .then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/secure_server_closing_test.dart b/tests/standalone/io/secure_server_closing_test.dart
index ffe2ea7..a45877b 100644
--- a/tests/standalone/io/secure_server_closing_test.dart
+++ b/tests/standalone/io/secure_server_closing_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testCloseOneEnd(String toClose) {
@@ -26,7 +25,7 @@
       .then((_) {
         asyncEnd();
       });
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((serverConnection) {
       serverConnection.listen(
         (data) {
@@ -44,7 +43,7 @@
     onDone: () {
       serverDone.complete(null);
     });
-    SecureSocket.connect(HOST_NAME, server.port).then((clientConnection) {
+    SecureSocket.connect(HOST, server.port).then((clientConnection) {
       clientConnection.listen(
         (data) {
           Expect.fail("No data should be received by client");
@@ -62,8 +61,8 @@
 
 void testCloseBothEnds() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.destroy();
@@ -82,7 +81,7 @@
 
   asyncStart();
 
-  SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST,
                           0,
                           CERTIFICATE,
                           backlog: 2 * socketCount).then((server) {
@@ -103,7 +102,7 @@
     subscription.pause();
     var connectCount = 0;
     for (int i = 0; i < socketCount; i++) {
-      SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      SecureSocket.connect(HOST, server.port).then((connection) {
         connection.close();
       });
     }
@@ -111,7 +110,7 @@
       subscription.resume();
       resumed = true;
       for (int i = 0; i < socketCount; i++) {
-        SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+        SecureSocket.connect(HOST, server.port).then((connection) {
           connection.close();
         });
       }
@@ -126,7 +125,7 @@
   asyncStart();
   List ends = [];
 
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
     void checkDone() {
       if (ends.length < 2 * socketCount) return;
@@ -143,7 +142,7 @@
     });
 
     for (int i = 0; i < socketCount; i++) {
-      SecureSocket.connect(HOST_NAME, server.port).then((connection) {
+      SecureSocket.connect(HOST, server.port).then((connection) {
         ends.add(connection);
         checkDone();
       });
@@ -153,11 +152,19 @@
 
 
 main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
 
+runTests() {
   testCloseOneEnd("client");
   testCloseOneEnd("server");
   testCloseBothEnds();
diff --git a/tests/standalone/io/secure_server_socket_test.dart b/tests/standalone/io/secure_server_socket_test.dart
index f8a4559..a6a1087 100644
--- a/tests/standalone/io/secure_server_socket_test.dart
+++ b/tests/standalone/io/secure_server_socket_test.dart
@@ -12,14 +12,13 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 void testSimpleBind() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
     Expect.isTrue(s.port > 0);
     s.close();
     asyncEnd();
@@ -49,8 +48,8 @@
 
   // Bind to a port already in use.
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((s) {
-    SecureServerSocket.bind(HOST_NAME,
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((s) {
+    SecureServerSocket.bind(HOST,
                             s.port,
                             CERTIFICATE).then((t) {
       Expect.fail("Multiple listens on same port");
@@ -64,8 +63,8 @@
 
 void testSimpleConnect(String certificate) {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+  SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     server.listen((serverEnd) {
       clientEndFuture.then((clientEnd) {
         clientEnd.close();
@@ -79,8 +78,8 @@
 
 void testSimpleConnectFail(String certificate, bool cancelOnError) {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, certificate).then((server) {
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port)
+  SecureServerSocket.bind(HOST, 0, certificate).then((server) {
+    var clientEndFuture = SecureSocket.connect(HOST, server.port)
       .then((clientEnd) {
         Expect.fail("No client connection expected.");
       })
@@ -104,9 +103,9 @@
 
 void testServerListenAfterConnect() {
   asyncStart();
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     Expect.isTrue(server.port > 0);
-    var clientEndFuture = SecureSocket.connect(HOST_NAME, server.port);
+    var clientEndFuture = SecureSocket.connect(HOST, server.port);
     new Timer(const Duration(milliseconds: 500), () {
       server.listen((serverEnd) {
         clientEndFuture.then((clientEnd) {
@@ -145,7 +144,7 @@
     }
   }
 
-  SecureServerSocket.bind(HOST_NAME, 0, CERTIFICATE).then((server) {
+  SecureServerSocket.bind(HOST, 0, CERTIFICATE).then((server) {
     server.listen((client) {
       int bytesRead = 0;
       int bytesWritten = 0;
@@ -167,7 +166,7 @@
         });
     });
 
-    SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+    SecureSocket.connect(HOST, server.port).then((socket) {
       int bytesRead = 0;
       int bytesWritten = 0;
       List<int> dataSent = createTestData();
@@ -194,6 +193,14 @@
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests();
+    asyncEnd();
+  });
+}
+
+runTests() {
   testSimpleBind();
   testInvalidBind();
   testSimpleConnect(CERTIFICATE);
@@ -204,5 +211,4 @@
   testSimpleConnectFail("CN=notARealDistinguishedName", true);
   testServerListenAfterConnect();
   testSimpleReadWrite();
-  asyncEnd();
 }
diff --git a/tests/standalone/io/secure_session_resume_test.dart b/tests/standalone/io/secure_session_resume_test.dart
index 83acd3e..5b8a3a3 100644
--- a/tests/standalone/io/secure_session_resume_test.dart
+++ b/tests/standalone/io/secure_session_resume_test.dart
@@ -16,16 +16,17 @@
 // VMOptions=--short_socket_write
 // VMOptions=--short_socket_read --short_socket_write
 
-import "package:expect/expect.dart";
-import "package:path/path.dart";
 import "dart:async";
 import "dart:io";
 import "dart:isolate";
 
-const HOST_NAME = "localhost";
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 Future<SecureServerSocket> startServer() {
-  return SecureServerSocket.bind(HOST_NAME,
+  return SecureServerSocket.bind(HOST,
                                  0,
                                  CERTIFICATE).then((server) {
     server.listen((SecureSocket client) {
@@ -43,7 +44,7 @@
 }
 
 Future testClient(server, name) {
-  return SecureSocket.connect(HOST_NAME, server.port).then((socket) {
+  return SecureSocket.connect(HOST, server.port).then((socket) {
     socket.write("Hello from client $name");
     socket.close();
     return socket.fold(<int>[], (message, data) => message..addAll(data))
@@ -55,14 +56,20 @@
 }
 
 void main() {
+  asyncStart();
   String certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart');
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    runTests().then((_) => asyncEnd());
+  });
+}
 
+Future runTests() {
   Duration delay = const Duration(milliseconds: 0);
   Duration delay_between_connections = const Duration(milliseconds: 300);
-
-  startServer()
+  return startServer()
       .then((server) => Future.wait(
           ['able', 'baker', 'charlie', 'dozen', 'elapse']
           .map((name) {
diff --git a/tests/standalone/io/secure_socket_bad_data_test.dart b/tests/standalone/io/secure_socket_bad_data_test.dart
index bff3f46..f0c3fa5 100644
--- a/tests/standalone/io/secure_socket_bad_data_test.dart
+++ b/tests/standalone/io/secure_socket_bad_data_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 // This test sends corrupt data in the middle of a secure network connection.
@@ -133,15 +132,15 @@
 
 
 Future<List> connectClient(int port, bool hostnameInConnect) =>
-  RawSocket.connect(HOST_NAME, port)
+  RawSocket.connect(HOST, port)
   .then((socket) =>
     (hostnameInConnect ? RawSecureSocket.secure(socket)
-                       : RawSecureSocket.secure(socket, host: HOST_NAME))
+                       : RawSecureSocket.secure(socket, host: HOST))
     .then((secureSocket) => [socket, secureSocket]));
 
 
 Future test(bool hostnameInConnect) {
-  return RawServerSocket.bind(HOST_NAME, 0).then((server) {
+  return RawServerSocket.bind(HOST, 0).then((server) {
     server.listen((client) {
       RawSecureSocket.secureServer(client, CERTIFICATE)
         .then((secureClient) {
@@ -164,6 +163,8 @@
                           password: 'dartdart',
                           useBuiltinRoots: false);
   asyncStart();
-  Future.wait([test(false), test(true)])
-      .then((_) => asyncEnd());
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    return Future.wait([test(false), test(true)]);
+  }).then((_) => asyncEnd());
 }
diff --git a/tests/standalone/io/socket_upgrade_to_secure_test.dart b/tests/standalone/io/socket_upgrade_to_secure_test.dart
index ff0f727..d973a78 100644
--- a/tests/standalone/io/socket_upgrade_to_secure_test.dart
+++ b/tests/standalone/io/socket_upgrade_to_secure_test.dart
@@ -12,9 +12,8 @@
 
 import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
-import "package:path/path.dart";
 
-const HOST_NAME = "localhost";
+InternetAddress HOST;
 const CERTIFICATE = "localhost_cert";
 
 // This test creates a server and a client connects. After connecting
@@ -154,12 +153,12 @@
 
   Future<SecureSocket> connectClient(int port) {
     if (!handshakeBeforeSecure) {
-      return Socket.connect(HOST_NAME, port).then((socket) {
+      return Socket.connect(HOST, port).then((socket) {
         var future;
         if (hostnameInConnect) {
           future = SecureSocket.secure(socket);
         } else {
-          future = SecureSocket.secure(socket, host: HOST_NAME);
+          future = SecureSocket.secure(socket, host: HOST);
         }
         return future.then((secureSocket) {
           socket.add([0]);
@@ -167,13 +166,13 @@
         });
       });
     } else {
-      return Socket.connect(HOST_NAME, port).then((socket) {
+      return Socket.connect(HOST, port).then((socket) {
         return runClientHandshake(socket).then((_) {
             var future;
             if (hostnameInConnect) {
               future = SecureSocket.secure(socket);
             } else {
-              future = SecureSocket.secure(socket, host: HOST_NAME);
+              future = SecureSocket.secure(socket, host: HOST.host);
             }
             return future.then((secureSocket) {
               socket.add([0]);
@@ -209,18 +208,23 @@
     });
   }
 
-  ServerSocket.bind(HOST_NAME, 0).then(serverReady);
+  ServerSocket.bind(HOST, 0).then(serverReady);
 }
 
 main() {
+  asyncStart();
   var certificateDatabase = Platform.script.resolve('pkcert').toFilePath();
   SecureSocket.initialize(database: certificateDatabase,
                           password: 'dartdart',
                           useBuiltinRoots: false);
-  test(false, false);
-  test(true, false);
-  test(false, true);
-  test(true, true);
-  test(false, true, true);
-  test(true, true, true);
+  InternetAddress.lookup("localhost").then((hosts) {
+    HOST = hosts.first;
+    test(false, false);
+    test(true, false);
+    test(false, true);
+    test(true, true);
+    test(false, true, true);
+    test(true, true, true);
+    asyncEnd();
+  });
 }
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index f5d3421..488828d 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -33,7 +33,7 @@
 # of allowed open files ('ulimit -n' says something like 256).
 io/socket_many_connections_test: Skip
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
+[ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 typed_array_test: Fail # Issue 13921
 typed_array_int64_uint64_test: Fail # Issue 13921
 typed_data_isolate_test: Skip # This test uses dart:io
@@ -47,7 +47,7 @@
 
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-javascript_int_overflow_literal_test/01: fail, ok
+javascript_int_overflow_literal_test/01: Fail, OK
 issue14236_test: Skip # Analyzer can't handle Script snapshots.
 
 # test issue https://code.google.com/p/dart/issues/detail?id=11518
@@ -104,9 +104,6 @@
 out_of_memory_test: Skip # passes on Mac, crashes on Linux
 oom_error_stacktrace_test: Skip # Fails on Linux
 
-[ $arch == arm ]
-vmservice/isolate_echo_test: Fail # Issue 17431
-
 [ $arch == simmips || $arch == mips ]
 io/web_socket_test: Pass, Slow
 io/http_server_response_test: Pass, Slow
@@ -116,11 +113,16 @@
 [ $arch == mips ]
 io/signals_test: Fail # dartbug.com/17440
 io/file_stat_test: Fail # dartbug.com/17440
+io/process_sync_test: Skip # Starts 10 dart subprocesses, uses too much memory.
+io/signals_test: Skip # Starts 10 dart subprocesses, uses too much memory
 
-[ $compiler == none && $runtime == dartium && $unchecked ]
+[ $arch == mips && $mode == debug ]
+io/file_read_special_device_test: Fail # dartbug.com/17440
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $unchecked ]
 assert_test: Fail # Issue 13719: Please triage this failure.
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 javascript_int_overflow_literal_test/01: Fail # Issue 13719: Please triage this failure.
 javascript_int_overflow_test: Fail # Issue 13719: Please triage this failure.
 
diff --git a/tests/standalone/vmservice/isolate_code_test.dart b/tests/standalone/vmservice/isolate_code_test.dart
index ec8da52..34d07ae 100644
--- a/tests/standalone/vmservice/isolate_code_test.dart
+++ b/tests/standalone/vmservice/isolate_code_test.dart
@@ -25,7 +25,7 @@
 
   onRequestCompleted(Map reply) {
     Expect.equals('Code', reply['type']);
-    Expect.equals('C.c', reply['function']['user_name']);
+    Expect.equals('c', reply['function']['user_name']);
     Expect.isTrue(reply['disassembly'].length > 0);
   }
 }
diff --git a/tests/standalone/vmservice/isolate_function_test.dart b/tests/standalone/vmservice/isolate_function_test.dart
index 3e6d045..c0493eb 100644
--- a/tests/standalone/vmservice/isolate_function_test.dart
+++ b/tests/standalone/vmservice/isolate_function_test.dart
@@ -13,7 +13,7 @@
       super('http://127.0.0.1:$port/$id/$functionId');
   onRequestCompleted(Map reply) {
     Expect.equals('Function', reply['type']);
-    Expect.equals('C.c', reply['user_name']);
+    Expect.equals('c', reply['user_name']);
     Expect.equals(false, reply['is_static']);
   }
 }
diff --git a/tests/utils/utils.status b/tests/utils/utils.status
index 23e361b..5630a6f 100644
--- a/tests/utils/utils.status
+++ b/tests/utils/utils.status
@@ -8,13 +8,13 @@
 
 [ $compiler == none && $runtime == drt ]
 dummy_compiler_test: Skip # http://dartbug.com/7233
-dart2js_test: Skip # Uses dart:io.
 
 [ $compiler == dart2js && $browser ]
 *: Skip
 
-[ $compiler == none && $runtime == dartium ]
+[ $compiler == none && $runtime != vm ]
 dart2js_test: Skip # Uses dart:io.
 
-[ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-source_mirrors_test: StaticWarning # Issue 17264
\ No newline at end of file
+
+[ $compiler == dart2js && $mode == debug ]
+source_mirrors_test: Slow, Pass
diff --git a/tools/VERSION b/tools/VERSION
index 9491f2d..9a5c8e94 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 3
 PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 1
+PRERELEASE 5
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index bf99227..1959043 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -185,16 +185,19 @@
   return name, True
 
 
-def Clobber():
+def Clobber(force=None):
   """
   Clobbers the builder before we do the build, if appropriate.
 
   - mode: either 'debug' or 'release'
   """
-  if os.environ.get(BUILDER_CLOBBER) != "1":
+  if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
     return
+  clobber_string = 'Clobber'
+  if force:
+    clobber_string = 'Clobber(always)'
 
-  with BuildStep('Clobber'):
+  with BuildStep(clobber_string):
     cmd = [sys.executable,
            './tools/clean_output_directory.py']
     print 'Clobbering %s' % (' '.join(cmd))
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index ab49a1c..cf51d1a 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -7,6 +7,7 @@
 import hashlib
 import imp
 import os
+import string
 import subprocess
 import sys
 
@@ -312,3 +313,11 @@
     f.write('%s *%s' % (checksum, mangled_filename))
 
   return checksum_filename
+
+def GetChannelFromName(name):
+  """Get the channel from the name. Bleeding edge builders don't 
+      have a suffix."""
+  channel_name = string.split(name, '-').pop()
+  if channel_name in Channel.ALL_CHANNELS:
+    return channel_name
+  return Channel.BLEEDING_EDGE
diff --git a/tools/bots/src-tarball.py b/tools/bots/src-tarball.py
index 1c32034..24e86f0 100644
--- a/tools/bots/src-tarball.py
+++ b/tools/bots/src-tarball.py
@@ -11,11 +11,16 @@
 Archive tarball and debian package to google cloud storage.
 """
 
+import os
 import re
 import sys
 
 import bot
+import bot_utils
 
+utils = bot_utils.GetUtils()
+
+HOST_OS = utils.GuessOS()
 SRC_BUILDER = r'src-tarball-linux'
 
 def SrcConfig(name, is_buildbot):
@@ -32,12 +37,26 @@
   return bot.BuildInfo('none', 'none', 'release', 'linux')
 
 def SrcSteps(build_info):
+  # We always clobber the bot, to not leave old tarballs and packages
+  # floating around the out dir.
+  bot.Clobber(force=True)
   with bot.BuildStep('Create src tarball'):
-    args = [sys.executable, './tools/create_tarball.py']
+    version = utils.GetVersion()
+    builddir = os.path.join(bot_utils.DART_DIR,
+                            utils.GetBuildDir(HOST_OS, HOST_OS),
+                            'src_and_installation')
+    if not os.path.exists(builddir):
+      os.makedirs(builddir)
+    tarfilename = 'dart-%s.tar.gz' % version
+    tarfile = os.path.join(builddir, tarfilename)
+    args = [sys.executable, './tools/create_tarball.py', '--tar_filename',
+            tarfile]
     print 'Building src tarball'
     bot.RunProcess(args)
     print 'Building Debian packages'
-    args = [sys.executable, './tools/create_debian_packages.py']
+    args = [sys.executable, './tools/create_debian_packages.py',
+            '--tar_filename', tarfile,
+            '--out_dir', builddir]
     bot.RunProcess(args)
 
 if __name__ == '__main__':
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index b76c2e3..4f31dfb 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -9,6 +9,7 @@
 # will build a source package and a 32-bit (i386) and 64-bit (amd64)
 # binary packages.
 
+import optparse
 import sys
 import tarfile
 import subprocess
@@ -21,6 +22,17 @@
 HOST_CPUS = utils.GuessCpus()
 DART_DIR = abspath(join(__file__, '..', '..'))
 
+def BuildOptions():
+  result = optparse.OptionParser()
+  result.add_option("--tar_filename",
+                    default=None,
+                    help="The tar file to build from.")
+  result.add_option("--out_dir",
+                    default=None,
+                    help="Where to put the packages.")
+ 
+  return result
+
 def RunBuildPackage(opt, cwd):
   cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
   cmd.extend(opt)
@@ -32,14 +44,12 @@
     raise Exception('Command \'%s\' failed: %s\nSTDOUT: %s' %
                     (' '.join(cmd), stderr, stdout))
 
-def BuildDebianPackage():
+def BuildDebianPackage(tarball, out_dir):
   version = utils.GetVersion()
-  builddir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
   tarroot = 'dart-%s' % version
-  tarname = 'dart-%s.tar.gz' % version
   origtarname = 'dart_%s.orig.tar.gz' % version
-  tarball = join(builddir, tarname)
-  if not exists(join(builddir, tarball)):
+
+  if not exists(join(out_dir, tarball)):
     print 'Source tarball not found'
     return -1
 
@@ -76,18 +86,25 @@
       '%s-1_amd64.deb' % debbase
     ]
     for name in source_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
     for name in i386_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
     for name in amd64_package:
-      copyfile(join(temp_dir, name), join(builddir, name))
+      copyfile(join(temp_dir, name), join(out_dir, name))
 
 def Main():
   if HOST_OS != 'linux':
     print 'Debian build only supported on linux'
     return -1
 
-  BuildDebianPackage()
+  options, args = BuildOptions().parse_args()
+  out_dir = options.out_dir
+  tar_filename = options.tar_filename
+  if not options.out_dir:
+    out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS, HOST_OS))
+  if not options.tar_filename:
+    raise Exception('Please specify the input filename.')
+  BuildDebianPackage(options.tar_filename, options.out_dir)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index 015d0dd..62b9194 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -230,10 +230,14 @@
   for jarFile in jarFiles:
     copyfile(jarFile, join(DARTANALYZER_DEST, os.path.basename(jarFile)))
 
+  RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'asset')
+  os.makedirs(os.path.dirname(RESOURCE))
+  copytree(join(HOME, 'sdk', 'lib', '_internal', 'pub', 'asset'),
+           join(RESOURCE),
+           ignore=ignore_patterns('.svn'))
+
   # Copy in 7zip for Windows.
   if HOST_OS == 'win32':
-    RESOURCE = join(SDK_tmp, 'lib', '_internal', 'pub', 'resource')
-    os.makedirs(RESOURCE)
     copytree(join(HOME, 'third_party', '7zip'),
              join(RESOURCE, '7zip'),
              ignore=ignore_patterns('.svn'))
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index e71ebf1..58679e0 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -32,7 +32,6 @@
 
 HOST_OS = utils.GuessOS()
 DART_DIR = abspath(join(__file__, '..', '..'))
-
 # Flags.
 verbose = False
 
@@ -52,6 +51,10 @@
   result.add_option("-v", "--verbose",
       help='Verbose output.',
       default=False, action="store_true")
+  result.add_option("--tar_filename",
+                    default=None,
+                    help="The output file.")
+
   return result
 
 def Filter(tar_info):
@@ -103,23 +106,18 @@
     f.write(svn_revision)
 
 
-def CreateTarball():
+def CreateTarball(tarfilename):
   global ignoredPaths  # Used for adding the output directory.
   # Generate the name of the tarfile
   version = utils.GetVersion()
   global versiondir
   versiondir = 'dart-%s' % version
-  tarname = '%s.tar.gz' % versiondir
   debian_dir = 'tools/linux_dist_support/debian'
-  # Create the tar file in the build directory.
-  builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
-  tardir = join(DART_DIR, builddir)
   # Don't include the build directory in the tarball (ignored paths
   # are relative to DART_DIR).
+  builddir = utils.GetBuildDir(HOST_OS, HOST_OS)
   ignoredPaths.append(builddir)
-  if not exists(tardir):
-    makedirs(tardir)
-  tarfilename = join(tardir, tarname)
+
   print 'Creating tarball: %s' % tarfilename
   with tarfile.open(tarfilename, mode='w:gz') as tar:
     for f in listdir(DART_DIR):
@@ -157,7 +155,10 @@
     global verbose
     verbose = True
 
-  CreateTarball()
+  if not options.tar_filename:
+    raise Exception('Please specify an output filename')
+
+  CreateTarball(options.tar_filename)
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index 69e9804..c3e351b 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -75,6 +75,12 @@
     },
     "support_level": "experimental"
   },
+  "Animation": {
+    "members": {
+      "Animation": {}
+    },
+    "support_level": "untriaged"
+  },
   "ApplicationCache": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/offline.html#application-cache-api",
     "dart_action": "unstable",
@@ -1009,6 +1015,12 @@
   "CompositionEvent": {
     "comment": "http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-CompositionEvent",
     "members": {
+      "activeSegmentEnd": {
+        "support_level": "untriaged"
+      },
+      "activeSegmentStart": {
+        "support_level": "untriaged"
+      },
       "data": {},
       "initCompositionEvent": {}
     },
@@ -1072,6 +1084,9 @@
   },
   "ConsoleBase": {
     "members": {
+      "assert": {
+        "support_level": "untriaged"
+      },
       "assertCondition": {
         "support_level": "untriaged"
       },
@@ -1580,6 +1595,14 @@
     },
     "support_level": "experimental"
   },
+  "DeprecatedStorageInfo": {
+    "members": {},
+    "support_level": "untriaged"
+  },
+  "DeprecatedStorageQuota": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "DeviceAcceleration": {
     "comment": "http://dev.w3.org/geo/api/spec-source-orientation.html#devicemotion",
     "members": {
@@ -1594,6 +1617,9 @@
     "members": {
       "acceleration": {},
       "accelerationIncludingGravity": {},
+      "initDeviceMotionEvent": {
+        "support_level": "untriaged"
+      },
       "interval": {},
       "rotationRate": {}
     },
@@ -1657,6 +1683,9 @@
     "comment": "http://dom.spec.whatwg.org/#interface-document",
     "members": {
       "URL": {},
+      "activeElement": {
+        "support_level": "untriaged"
+      },
       "adoptNode": {},
       "anchors": {
         "dart_action": "suppress"
@@ -1896,6 +1925,9 @@
       },
       "onreadystatechange": {},
       "onreset": {},
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {},
       "onsearch": {
         "comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -1977,6 +2009,9 @@
       "querySelectorAll": {},
       "readyState": {},
       "referrer": {},
+      "rootElement": {
+        "support_level": "untriaged"
+      },
       "securityPolicy": {
         "comment": "https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#idl-def-SecurityPolicy",
         "support_level": "experimental"
@@ -1985,6 +2020,9 @@
         "comment": "http://dev.w3.org/csswg/cssom/#widl-Document-selectedStyleSheetSet"
       },
       "styleSheets": {},
+      "timeline": {
+        "support_level": "untriaged"
+      },
       "title": {},
       "visibilityState": {
         "support_level": "untriaged"
@@ -2274,6 +2312,9 @@
       "localName": {
         "support_level": "untriaged"
       },
+      "matches": {
+        "support_level": "untriaged"
+      },
       "namespaceURI": {
         "support_level": "untriaged"
       },
@@ -2370,6 +2411,9 @@
         "support_level": "untriaged"
       },
       "onreset": {},
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {},
       "onsearch": {
         "comment": "http://www.w3.org/TR/html-markup/input.search.html",
@@ -3092,27 +3136,49 @@
   },
   "FontFaceSet": {
     "members": {
+      "add": {
+        "support_level": "untriaged"
+      },
       "addEventListener": {
         "support_level": "untriaged"
       },
       "check": {
         "support_level": "untriaged"
       },
+      "clear": {
+        "support_level": "untriaged"
+      },
+      "delete": {
+        "support_level": "untriaged"
+      },
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "forEach": {
+        "support_level": "untriaged"
+      },
+      "has": {
+        "support_level": "untriaged"
+      },
       "match": {
         "support_level": "untriaged"
       },
       "removeEventListener": {
         "support_level": "untriaged"
       },
+      "size": {
+        "support_level": "untriaged"
+      },
       "status": {
         "support_level": "untriaged"
       }
     },
     "support_level": "untriaged"
   },
+  "FontFaceSetForEachCallback": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "FontLoader": {
     "comment": "http://www.w3.org/TR/css3-fonts/#document-fontloader",
     "members": {
@@ -3314,6 +3380,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -3936,6 +4005,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -4479,6 +4551,9 @@
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "crossOrigin": {
+        "support_level": "untriaged"
+      },
       "disabled": {},
       "href": {},
       "hreflang": {},
@@ -4668,6 +4743,9 @@
       "readyState": {},
       "seekable": {},
       "seeking": {},
+      "setMediaKeys": {
+        "support_level": "untriaged"
+      },
       "src": {},
       "startTime": {
         "support_level": "nonstandard"
@@ -5022,6 +5100,9 @@
     "members": {
       "HTMLSelectElement": {},
       "__setter__": {},
+      "add": {
+        "support_level": "untriaged"
+      },
       "autofocus": {},
       "checkValidity": {},
       "disabled": {},
@@ -5036,6 +5117,9 @@
       "name": {},
       "namedItem": {},
       "options": {},
+      "remove": {
+        "support_level": "untriaged"
+      },
       "required": {},
       "selectedIndex": {},
       "selectedOptions": {},
@@ -5752,6 +5836,14 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ImageBitmapFactories": {
+    "members": {
+      "createImageBitmap": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ImageData": {
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata",
     "members": {
@@ -5792,6 +5884,25 @@
     },
     "support_level": "experimental"
   },
+  "InstallEvent": {
+    "members": {
+      "reloadAll": {
+        "support_level": "untriaged"
+      },
+      "replace": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "InstallPhaseEvent": {
+    "members": {
+      "waitUntil": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Int16Array": {
     "comment": "http://www.khronos.org/registry/typedarray/specs/latest/",
     "members": {
@@ -6111,6 +6222,9 @@
   "MediaKeyNeededEvent": {
     "comment": "https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-mediakeyneededevent",
     "members": {
+      "contentType": {
+        "support_level": "untriaged"
+      },
       "initData": {}
     },
     "support_level": "experimental"
@@ -6135,6 +6249,9 @@
       "onwebkitkeyadded": {},
       "onwebkitkeyerror": {},
       "onwebkitkeymessage": {},
+      "release": {
+        "support_level": "untriaged"
+      },
       "removeEventListener": {},
       "sessionId": {},
       "update": {}
@@ -6510,6 +6627,9 @@
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils",
         "support_level": "experimental"
       },
+      "isProtocolHandlerRegistered": {
+        "support_level": "untriaged"
+      },
       "javaEnabled": {
         "dart_action": "suppress",
         "support_level": "nonstandard"
@@ -6551,6 +6671,15 @@
       "requestMIDIAccess": {
         "support_level": "untriaged"
       },
+      "serviceWorker": {
+        "support_level": "untriaged"
+      },
+      "storageQuota": {
+        "support_level": "untriaged"
+      },
+      "unregisterProtocolHandler": {
+        "support_level": "untriaged"
+      },
       "userAgent": {
         "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorid"
       },
@@ -7264,6 +7393,47 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "Player": {
+    "members": {
+      "cancel": {
+        "support_level": "untriaged"
+      },
+      "currentTime": {
+        "support_level": "untriaged"
+      },
+      "finish": {
+        "support_level": "untriaged"
+      },
+      "finished": {
+        "support_level": "untriaged"
+      },
+      "pause": {
+        "support_level": "untriaged"
+      },
+      "paused": {
+        "support_level": "untriaged"
+      },
+      "play": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      },
+      "reverse": {
+        "support_level": "untriaged"
+      },
+      "source": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      },
+      "timeLag": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Plugin": {
     "members": {
       "__getter__": {},
@@ -8313,6 +8483,10 @@
     },
     "support_level": "stable"
   },
+  "SVGDiscardElement": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "SVGDocument": {
     "comment": "http://www.w3.org/TR/SVG/struct.html#InterfaceSVGDocument",
     "dart_action": "unstable",
@@ -8459,6 +8633,9 @@
       "onreset": {
         "support_level": "untriaged"
       },
+      "onresize": {
+        "support_level": "untriaged"
+      },
       "onscroll": {
         "support_level": "untriaged"
       },
@@ -11086,6 +11263,9 @@
   "Screen": {
     "comment": "http://dev.w3.org/csswg/cssom-view/#the-screen-interface",
     "members": {
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
       "availHeight": {},
       "availLeft": {
         "dart_action": "experimental",
@@ -11097,8 +11277,23 @@
       },
       "availWidth": {},
       "colorDepth": {},
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
       "height": {},
+      "lockOrientation": {
+        "support_level": "untriaged"
+      },
+      "orientation": {
+        "support_level": "untriaged"
+      },
       "pixelDepth": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "unlockOrientation": {
+        "support_level": "untriaged"
+      },
       "width": {}
     },
     "support_level": "stable"
@@ -11211,6 +11406,17 @@
     "members": {},
     "support_level": "untriaged"
   },
+  "ServiceWorkerContainer": {
+    "members": {
+      "register": {
+        "support_level": "untriaged"
+      },
+      "unregister": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "ServiceWorkerGlobalScope": {
     "members": {},
     "support_level": "untriaged"
@@ -11245,7 +11451,22 @@
     "comment": "http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#shared-workers-and-the-sharedworker-interface",
     "members": {
       "SharedWorker": {},
-      "port": {}
+      "addEventListener": {
+        "support_level": "untriaged"
+      },
+      "dispatchEvent": {
+        "support_level": "untriaged"
+      },
+      "onerror": {
+        "support_level": "untriaged"
+      },
+      "port": {},
+      "removeEventListener": {
+        "support_level": "untriaged"
+      },
+      "workerStart": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -11304,6 +11525,9 @@
       "dispatchEvent": {
         "support_level": "untriaged"
       },
+      "mode": {
+        "support_level": "untriaged"
+      },
       "remove": {
         "support_level": "untriaged"
       },
@@ -11577,15 +11801,30 @@
       "PERSISTENT": {},
       "TEMPORARY": {},
       "queryUsageAndQuota": {},
-      "requestQuota": {}
+      "quota": {
+        "support_level": "untriaged"
+      },
+      "requestQuota": {},
+      "usage": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
   "StorageQuota": {
     "comment": "http://www.w3.org/TR/quota-api/#idl-def-StorageQuota",
     "members": {
+      "queryInfo": {
+        "support_level": "untriaged"
+      },
       "queryUsageAndQuota": {},
-      "requestQuota": {}
+      "requestPersistentQuota": {
+        "support_level": "untriaged"
+      },
+      "requestQuota": {},
+      "supportedTypes": {
+        "support_level": "untriaged"
+      }
     },
     "support_level": "experimental"
   },
@@ -11696,6 +11935,30 @@
     },
     "support_level": "stable"
   },
+  "TextDecoder": {
+    "members": {
+      "TextDecoder": {},
+      "decode": {
+        "support_level": "untriaged"
+      },
+      "encoding": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "TextEncoder": {
+    "members": {
+      "TextEncoder": {},
+      "encode": {
+        "support_level": "untriaged"
+      },
+      "encoding": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TextEvent": {
     "comment": "http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413/events.html#Events-TextEvent",
     "dart_action": "unstable",
@@ -11831,6 +12094,43 @@
     },
     "support_level": "stable"
   },
+  "TimedItem": {
+    "members": {
+      "activeDuration": {
+        "support_level": "untriaged"
+      },
+      "currentIteration": {
+        "support_level": "untriaged"
+      },
+      "duration": {
+        "support_level": "untriaged"
+      },
+      "endTime": {
+        "support_level": "untriaged"
+      },
+      "localTime": {
+        "support_level": "untriaged"
+      },
+      "player": {
+        "support_level": "untriaged"
+      },
+      "specified": {
+        "support_level": "untriaged"
+      },
+      "startTime": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
+  "Timeline": {
+    "members": {
+      "play": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "TimeoutHandler": {
     "comment": "http://www.whatwg.org/specs/web-apps/2007-10-26/multipage/section-timers.html#timeouthandler",
     "members": {
@@ -11838,6 +12138,38 @@
     },
     "support_level": "stable"
   },
+  "Timing": {
+    "members": {
+      "__setter__": {
+        "support_level": "untriaged"
+      },
+      "delay": {
+        "support_level": "untriaged"
+      },
+      "direction": {
+        "support_level": "untriaged"
+      },
+      "easing": {
+        "support_level": "untriaged"
+      },
+      "endDelay": {
+        "support_level": "untriaged"
+      },
+      "fill": {
+        "support_level": "untriaged"
+      },
+      "iterationStart": {
+        "support_level": "untriaged"
+      },
+      "iterations": {
+        "support_level": "untriaged"
+      },
+      "playbackRate": {
+        "support_level": "untriaged"
+      }
+    },
+    "support_level": "untriaged"
+  },
   "Touch": {
     "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features",
     "members": {
@@ -13436,6 +13768,9 @@
         "support_level": "deprecated"
       },
       "opener": {},
+      "orientation": {
+        "support_level": "untriaged"
+      },
       "outerHeight": {},
       "outerWidth": {},
       "pagePopupController": {
@@ -13743,6 +14078,9 @@
       "console": {
         "support_level": "untriaged"
       },
+      "createImageBitmap": {
+        "support_level": "untriaged"
+      },
       "crypto": {
         "support_level": "untriaged"
       },
@@ -13875,6 +14213,10 @@
     },
     "support_level": "untriaged"
   },
+  "XMLDocument": {
+    "members": {},
+    "support_level": "untriaged"
+  },
   "XMLHttpRequest": {
     "comment": "http://xhr.spec.whatwg.org/#interface-xmlhttprequest",
     "members": {
diff --git a/tools/dom/idl/dart/dart.idl b/tools/dom/idl/dart/dart.idl
index da571a3..eee4c0c 100644
--- a/tools/dom/idl/dart/dart.idl
+++ b/tools/dom/idl/dart/dart.idl
@@ -280,7 +280,7 @@
 interface SQLResultSetRowList {
   // Change the return type to Dictionary so that rows are exposed in the Dart
   // API as a Maps, with the appropriate conversion in JavaScript.
-  [Suppressed] any item(unsigned long index);
+  [Suppressed] object item(unsigned long index);
   [Custom] Dictionary item(unsigned long index);
 };
 
@@ -359,4 +359,13 @@
 [Supplemental]
 interface Window : EventTarget {};
 
+[Suppressed]
+interface Promise {};
+
+[Suppressed]
+interface InstallEvent {};
+
+[Suppressed]
+interface InstallPhaseEvent {};
+
 Element implements GlobalEventHandlers;
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 58d77b4..f8f98fa 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -70,6 +70,17 @@
   'XMLHttpRequest.open',
   ])
 
+def ReturnValueConversionHack(idl_type, value, interface_name):
+  if idl_type == 'SVGMatrix':
+    return '%sTearOff::create(%s)' % (idl_type, value)
+  elif ((idl_type == 'SVGAngle' and interface_name != 'SVGAnimatedAngle')
+      or (idl_type == 'SVGTransform' and interface_name == 'SVGSVGElement')):
+    # Somewhere in the IDL it probably specifies whether we need to call
+    # create or not.
+    return 'SVGPropertyTearOff<%s>::create(%s)' % (idl_type, value)
+
+  return value
+
 #
 # Renames for attributes that have names that are not legal Dart names.
 #
@@ -662,21 +673,25 @@
   def vector_to_dart_template_parameter(self):
     return self.native_type()
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     cls = self.bindings_class()
 
     if 'Callback' in idl_node.ext_attrs:
       return '%s.release()', 'OwnPtr<%s>' % self.native_type(), cls, 'create'
 
-    if self.custom_to_native():
+    # This is a hack to handle property references correctly.
+    if (self.native_type() in ['SVGPropertyTearOff<SVGAngle>',
+          'SVGPropertyTearOff<SVGAngle>*', 'SVGMatrixTearOff']
+        and (callback_name != 'createSVGTransformFromMatrixCallback'
+          or interface_name != 'SVGTransformList')):
+      argument_expression_template = '%s->propertyReference()'
+      type = '%s*' % self.native_type()
+    elif self.custom_to_native():
       type = 'RefPtr<%s>' % self.native_type()
       argument_expression_template = '%s.get()'
     else:
       type = '%s*' % self.native_type()
-      if isinstance(self, SVGTearOffIDLTypeInfo) and not interface_name.endswith('List'):
-        argument_expression_template = '%s->propertyReference()'
-      else:
-        argument_expression_template = '%s'
+      argument_expression_template = '%s'
     return argument_expression_template, type, cls, 'toNative'
 
   def pass_native_by_ref(self): return False
@@ -729,7 +744,7 @@
                                 interface_name=None, attributes=None):
     auto_dart_scope='true' if auto_dart_scope_setup else 'false'
     return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
-                                                   value,
+                                                   ReturnValueConversionHack(self._idl_type, value, interface_name),
                                                    auto_dart_scope)
 
   def custom_to_dart(self):
@@ -838,7 +853,7 @@
   def vector_to_dart_template_parameter(self):
     raise Exception('sequences of sequences are not supported yet')
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     item_native_type = self._item_info.vector_to_dart_template_parameter()
     if isinstance(self._item_info, PrimitiveIDLTypeInfo):
       return '%s', 'Vector<%s>' % item_native_type, 'DartUtilities', 'toNativeVector<%s>' % item_native_type
@@ -873,7 +888,7 @@
   def __init__(self, data, item_info):
     super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', data, item_info)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s', 'RefPtr<DOMStringList>', 'DartDOMStringList', 'toNative'
 
   def pass_native_by_ref(self): return False
@@ -892,7 +907,7 @@
     if self.idl_type() == 'float': return 'float'
     return self.native_type()
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     type = self.native_type()
     if type == 'SerializedScriptValue':
       type = 'RefPtr<%s>' % type
@@ -956,24 +971,18 @@
     return '%s<%s>' % (tear_off_type, self._idl_type)
 
   def receiver(self):
-    if self._idl_type.endswith('List'):
-      return 'receiver->'
-    return 'receiver->propertyReference().'
+    return 'receiver->'
 
   def to_conversion_cast(self, value, interface_name, attributes):
-    svg_primitive_types = ['SVGAngle', 'SVGLength', 'SVGMatrix',
+    svg_primitive_types = ['SVGLength', 'SVGMatrix',
         'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
-    conversion_cast = '%s::create(%s)'
-    if interface_name.startswith('SVGAnimated'):
-      conversion_cast = 'static_cast<%s*>(%s)'
-    elif self.idl_type() == 'SVGStringList':
-      conversion_cast = '%s::create(receiver, %s)'
-    elif interface_name.endswith('List'):
-      conversion_cast = 'static_cast<%s*>(%s.get())'
-    elif self.idl_type() in svg_primitive_types:
-      conversion_cast = '%s::create(%s)'
-    else:
-      conversion_cast = 'static_cast<%s*>(%s)'
+
+    # This is a hack. We either need to figure out the right way to derive this
+    # information from the IDL or remove this generator.
+    if self.idl_type() != 'SVGTransformList':
+      return value
+
+    conversion_cast = 'static_cast<%s*>(%s)'
     conversion_cast = conversion_cast % (self.native_type(), value)
     return '%s' % (conversion_cast)
 
@@ -985,14 +994,13 @@
     auto_dart_scope='true' if auto_dart_scope_setup else 'false'
     return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
                                                    self.to_conversion_cast(
-                                                       value,
+                                                       ReturnValueConversionHack(self._idl_type, value, interface_name),
                                                        interface_name,
                                                        attr),
                                                    auto_dart_scope)
 
   def argument_expression(self, name, interface_name):
-    return name if interface_name.endswith('List') else '%s->propertyReference()' % name
-
+    return name
 
 class TypedListIDLTypeInfo(InterfaceIDLTypeInfo):
   def __init__(self, idl_type, data, interface_name, type_registry):
@@ -1012,7 +1020,7 @@
         interface_name,
         attributes)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
@@ -1036,7 +1044,7 @@
         interface_name,
         attributes)
 
-  def to_native_info(self, idl_node, interface_name):
+  def to_native_info(self, idl_node, interface_name, callback_name):
     return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
@@ -1176,32 +1184,27 @@
     'ArrayBufferView': TypeData(clazz='BasicTypedList'),
     'ArrayBuffer': TypeData(clazz='BasicTypedList'),
 
-    'SVGAngle': TypeData(clazz='SVGTearOff'),
-    'SVGLength': TypeData(clazz='SVGTearOff'),
-    'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength'),
-    'SVGMatrix': TypeData(clazz='SVGTearOff'),
-    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGNumber>'),
-    'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber'),
+    'SVGAngle': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGAngle>'),
+    'SVGLength': TypeData(clazz='SVGTearOff', native_type='SVGLengthTearOff'),
+    'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength', native_type='SVGLengthListTearOff'),
+    'SVGMatrix': TypeData(clazz='SVGTearOff', native_type='SVGMatrixTearOff'),
+    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGNumberTearOff'),
+    'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber', native_type='SVGNumberListTearOff'),
     'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg',
         native_type='SVGPathSegListPropertyTearOff'),
-    'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<FloatPoint>'),
-    'SVGPointList': TypeData(clazz='SVGTearOff'),
-    'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff'),
-    'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGRect>'),
+    'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPointTearOff'),
+    'SVGPointList': TypeData(clazz='SVGTearOff', native_type='SVGPointListTearOff'),
+    'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff', native_type='SVGPreserveAspectRatioTearOff'),
+    'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGRectTearOff'),
     'SVGStringList': TypeData(clazz='SVGTearOff', item_type='DOMString',
-        native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
-    'SVGTransform': TypeData(clazz='SVGTearOff'),
+        native_type='SVGStringListTearOff'),
+    'SVGTransform': TypeData(clazz='SVGTearOff', native_type="SVGPropertyTearOff<SVGTransform>"),
     'SVGTransformList': TypeData(clazz='SVGTearOff', item_type='SVGTransform',
         native_type='SVGTransformListPropertyTearOff'),
 })
 
 _svg_supplemental_includes = [
-    '"SVGAnimatedPropertyTearOff.h"',
-    '"SVGAnimatedListPropertyTearOff.h"',
-    '"SVGStaticListPropertyTearOff.h"',
-    '"SVGAnimatedListPropertyTearOff.h"',
-    '"SVGTransformListPropertyTearOff.h"',
-    '"SVGPathSegListPropertyTearOff.h"',
+    '"core/svg/properties/SVGPropertyTraits.h"',
 ]
 
 class TypeRegistry(object):
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index b450d61..64876ce 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -76,6 +76,8 @@
   'DOMFileSystemSync', # Workers
   'DatabaseSync', # Workers
   'DataView', # Typed arrays
+  'DeprecatedStorageQuota',
+  'DeprecatedStorageInfo',
   'DirectoryEntrySync', # Workers
   'DirectoryReaderSync', # Workers
   'DocumentType',
@@ -99,6 +101,7 @@
   'RGBColor',
   'RadioNodeList',  # Folded onto NodeList in dart2js.
   'Rect',
+  'ServiceWorker',
   'SQLTransactionSync', # Workers
   'SQLTransactionSyncCallback', # Workers
   'SVGAltGlyphDefElement', # Webkit only.
@@ -122,7 +125,6 @@
   'SVGMissingGlyphElement',
   'SVGTRefElement',
   'SVGVKernElement',
-  'SharedWorker', # Workers
   'SubtleCrypto',
   'WebKitCSSFilterValue',
   'WebKitCSSMatrix',
@@ -358,7 +360,6 @@
     'Window.webkitNotifications': 'notifications',
     'Window.webkitRequestFileSystem': '_requestFileSystem',
     'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
-    'Element.webkitMatchesSelector' : 'matches',
     'Navigator.webkitGetUserMedia': '_getUserMedia',
     'Node.appendChild': 'append',
     'Node.cloneNode': 'clone',
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 9957b35..8684071 100755
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -7,6 +7,12 @@
 import sys
 
 
+_operation_suffix_map = {
+  '__getter__': "Getter",
+  '__setter__': "Setter",
+  '__delete__': "Deleter",
+}
+
 class IDLNode(object):
   """Base class for all IDL elements.
   IDLNode may contain various child nodes, and have properties. Examples
@@ -493,6 +499,11 @@
       else:
         raise Exception('Cannot handle %s: operation has no id' % ast)
 
+      if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'):
+        arg = self.arguments[0]
+        operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed'
+        self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_category, _operation_suffix_map[self.id]))
+
   def _extra_repr(self):
     return [self.arguments]
 
diff --git a/tools/dom/scripts/idlparser.py b/tools/dom/scripts/idlparser.py
index d0fa567..852d8db 100755
--- a/tools/dom/scripts/idlparser.py
+++ b/tools/dom/scripts/idlparser.py
@@ -350,7 +350,7 @@
       return [Id, MAYBE(OR(['=', ExtAttrValue], ExtAttrArgList))]
 
     def ExtAttrValue():
-      return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'))
+      return OR(ExtAttrFunctionValue, re.compile(r'[\w&0-9:\-\| ]+'), re.compile(r'"[^"]+"\|"[^"]+"'), re.compile(r'"[^"]+"'))
 
     def ExtAttrFunctionValue():
       return [Id, ExtAttrArgList]
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 84d22fe..7521169 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -61,7 +61,7 @@
     'Element.insertAdjacentText',
     'Element.remove',
     'Element.shadowRoot',
-    'Element.webkitMatchesSelector',
+    'Element.matches',
     'ElementEvents.mouseWheel',
     'ElementEvents.transitionEnd',
     'FileReader.result',
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 3ddefdb..128882e 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -76,10 +76,56 @@
   ('WorkerGlobalScope', 'btoa'): 'DOMWindowBase64',
   ('WorkerGlobalScope', 'clearTimeout'): 'DOMWindowTimers',
   ('WorkerGlobalScope', 'clearInterval'): 'DOMWindowTimers',
-  }
+  ('Document', 'rootElement'): 'SVGDocument',
+  ('Document', 'childElementCount'): 'ParentNode',
+  ('Document', 'firstElementChild'): 'ParentNode',
+  ('Document', 'lastElementChild'): 'ParentNode',
+  ('DocumentFragment', 'childElementCount'): 'ParentNode',
+  ('DocumentFragment', 'firstElementChild'): 'ParentNode',
+  ('DocumentFragment', 'lastElementChild'): 'ParentNode',
+  ('CharacterData', 'nextElementSibling'): 'ChildNode',
+  ('CharacterData', 'previousElementSibling'): 'ChildNode',
+  ('Element', 'childElementCount'): 'ParentNode',
+  ('Element', 'firstElementChild'): 'ParentNode',
+  ('Element', 'lastElementChild'): 'ParentNode',
+  ('Element', 'nextElementSibling'): 'ChildNode',
+  ('Element', 'previousElementSibling'): 'ChildNode',
+  ('SVGAnimationElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGAnimationElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGAnimationElement', 'systemLanguage'): 'SVGTests',
+  ('SVGAnimationElement', 'hasExtension'): 'SVGTests',
+  ('SVGGraphicsElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGGraphicsElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGGraphicsElement', 'systemLanguage'): 'SVGTests',
+  ('SVGGraphicsElement', 'hasExtension'): 'SVGTests',
+  ('SVGPatternElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGPatternElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGPatternElement', 'systemLanguage'): 'SVGTests',
+  ('SVGPatternElement', 'hasExtension'): 'SVGTests',
+  ('SVGUseElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGUseElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGUseElement', 'systemLanguage'): 'SVGTests',
+  ('SVGUseElement', 'hasExtension'): 'SVGTests',
+  ('SVGMaskElement', 'requiredExtensions'): 'SVGTests',
+  ('SVGMaskElement', 'requiredFeatures'): 'SVGTests',
+  ('SVGMaskElement', 'systemLanguage'): 'SVGTests',
+  ('SVGMaskElement', 'hasExtension'): 'SVGTests',
+  ('SVGViewSpec', 'zoomAndPan'): 'SVGZoomAndPan',
+  ('SVGViewSpec', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('SVGViewElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('SVGSVGElement', 'setZoomAndPan'): 'SVGZoomAndPan',
+  ('Screen', 'orientation'): 'ScreenOrientation',
+  ('Screen', 'lockOrientation'): 'ScreenOrientation',
+  ('Screen', 'unlockOrientation'): 'ScreenOrientation',
+  ('Navigator', 'serviceWorker'): 'NavigatorServiceWorker',
+  ('Navigator', 'storageQuota'): 'NavigatorStorageQuota',
+  ('Navigator', 'isProtocolHandlerRegistered'): 'NavigatorContentUtils',
+  ('SharedWorker', 'workerStart'): 'SharedWorkerPerformance',
+}
 
 _cpp_import_map = {
-  'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories'
+  'ImageBitmapFactories' : 'modules/imagebitmap/ImageBitmapFactories',
+  'ScreenOrientation' : 'modules/screen_orientation/ScreenOrientation'
 }
 
 _cpp_overloaded_callback_map = {
@@ -318,8 +364,15 @@
     self._interface_type_info = self._TypeInfo(self._interface.id)
     self._members_emitter = members_emitter
     self._cpp_declarations_emitter = emitter.Emitter()
+
     self._cpp_impl_includes = set(['"' + partial + '.h"'
                                    for partial in _GetCPPPartialNames(self._interface)])
+
+    # This is a hack to work around a strange C++ compile error that we weren't
+    # able to track down the true cause of.
+    if self._interface.id == 'Timing':
+      self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
+
     self._cpp_definitions_emitter = emitter.Emitter()
     self._cpp_resolver_emitter = emitter.Emitter()
 
@@ -549,10 +602,17 @@
     def TypeCheckHelper(test):
       return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false'
 
+    v8_interface_include = ''
+    # V8AbstractWorker.h does not exist so we have to hard code this case.
+    if self._interface.id != 'AbstractWorker':
+      # FIXME: We need this to access the WrapperTypeInfo.
+      v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
+
     self._cpp_header_emitter.Emit(
         self._template_loader.Load('cpp_header.template'),
         INTERFACE=self._interface.id,
         WEBCORE_INCLUDES=webcore_includes,
+        V8_INTERFACE_INCLUDE=v8_interface_include,
         WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
         WEBCORE_CLASS_NAME_ESCAPED=
         self._interface_type_info.native_type().replace('<', '_').replace('>', '_'),
@@ -833,6 +893,7 @@
 
   def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name, auto_scope_setup=True):
     webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.id)
+
     function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation, cpp_callback_name)
     self._GenerateNativeCallback(
         cpp_callback_name,
@@ -859,6 +920,7 @@
       generate_custom_element_scope_if_needed=False):
 
     ext_attrs = node.ext_attrs
+
     if self._IsStatic(node.id):
       needs_receiver = True
 
@@ -892,6 +954,14 @@
     requires_script_execution_context = (ext_attrs.get('CallWith') == 'ExecutionContext' or
                                          ext_attrs.get('ConstructorCallWith') == 'ExecutionContext')
 
+    # Hack because our parser misses that these IDL members require an execution
+    # context.
+
+    if (self._interface.id == 'FontFace'
+        and callback_name in ['familySetter', 'featureSettingsSetter', 'stretchSetter',
+                              'styleSetter', 'unicodeRangeSetter', 'variantSetter', 'weightSetter']):
+      requires_script_execution_context = True
+
     requires_document = ext_attrs.get('ConstructorCallWith') == 'Document'
 
     if requires_script_execution_context:
@@ -996,6 +1066,7 @@
 
     if requires_dom_window or requires_document:
       self._cpp_impl_includes.add('"DOMWindow.h"')
+
       body_emitter.Emit(
           '        DOMWindow* domWindow = DartUtilities::domWindowForCurrentIsolate();\n'
           '        if (!domWindow) {\n'
@@ -1045,7 +1116,7 @@
       type_info = self._TypeInfo(argument.type.id)
       self._cpp_impl_includes |= set(type_info.conversion_includes())
       argument_expression_template, type, cls, function = \
-          type_info.to_native_info(argument, self._interface.id)
+          type_info.to_native_info(argument, self._interface.id, callback_name)
 
       def AllowsNull():
         # TODO(vsm): HTMLSelectElement's indexed setter treats a null as a remove.
@@ -1116,19 +1187,32 @@
         '        }\n')
 
 
+    interface_name = self._interface_type_info.native_type()
+
     if needs_receiver:
-      interface_name = self._interface_type_info.native_type()
       # Hack to determine if this came from the _cpp_callback_map.
       # In this case, the getter is mapped to a static method.
-      if (not function_expression.startswith('receiver->') and
+      if function_expression.startswith('SVGTests::'):
+          cpp_arguments.insert(0, 'receiver')
+      elif (not function_expression.startswith('receiver->') and
           not function_expression.startswith(interface_name + '::')):
-        if interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']:
+        if (interface_name in ['DOMWindow', 'Element', 'Navigator', 'WorkerGlobalScope']
+            or (interface_name in ['SVGViewSpec', 'SVGViewElement', 'SVGSVGElement']
+              and callback_name in ['setZoomAndPan', 'zoomAndPanSetter', 'zoomAndPan'])
+            or (interface_name == 'Screen'
+              and callback_name in ['_lockOrientation_1Callback', '_lockOrientation_2Callback', 'unlockOrientation', 'orientation'])):
           cpp_arguments.insert(0, 'receiver')
         else:
           cpp_arguments.append('receiver')
       elif self._IsStatic(node.id):
         cpp_arguments.insert(0, 'receiver')
 
+    if interface_name in ['SVGPropertyTearOff<SVGTransform>', 'SVGPropertyTearOff<SVGAngle>', 'SVGMatrixTearOff'] and function_expression.startswith('receiver->'):
+      # This is a horrible hack. I don't know why this one case has to be
+      # special cased.
+      if not (self._interface.id == 'SVGTransformList' and callback_name == 'createSVGTransformFromMatrixCallback'):
+        function_expression = 'receiver->propertyReference().%s' % (function_expression[len('receiver->'):])
+
     function_call = '%s(%s)' % (function_expression, ', '.join(cpp_arguments))
     if return_type == 'void':
       invocation_emitter.Emit(
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index af81731..f71ebae 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -146,8 +146,7 @@
    * that does not expect REPL support.
    */
   static const _CONSOLE_API_SUPPORT_HEADER =
-      'with ((console && console._commandLineAPI) || {}) {\n';
-
+      'with ((console && console._commandLineAPI) || { __proto__: null }) {\n';
   static bool expectsConsoleApi(String expression) {
     return expression.indexOf(_CONSOLE_API_SUPPORT_HEADER) == 0;;
   }
diff --git a/tools/dom/templates/html/dart2js/impl_Console.darttemplate b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
index 3f6c4cd..4372f85 100644
--- a/tools/dom/templates/html/dart2js/impl_Console.darttemplate
+++ b/tools/dom/templates/html/dart2js/impl_Console.darttemplate
@@ -6,9 +6,9 @@
 
 $(ANNOTATIONS)$(CLASS_MODIFIERS)class Console {
 
-  Console._safe() {}
+  const Console._safe();
 
-  static Console _safeConsole = new Console._safe();
+  static const Console _safeConsole = const Console._safe();
 
   bool get _isConsoleDefined => JS('bool', 'typeof console != "undefined"');
 
@@ -34,7 +34,7 @@
 
   @DomName('Console.dir')
   void dir(Object arg) => _isConsoleDefined ?
-      JS('void', 'console.debug(#)', arg) : null;
+      JS('void', 'console.dir(#)', arg) : null;
 
   @DomName('Console.dirxml')
   void dirxml(Object arg) => _isConsoleDefined ?
diff --git a/tools/dom/templates/html/dartium/cpp_header.template b/tools/dom/templates/html/dartium/cpp_header.template
index 1f8ae1b..e957de6 100644
--- a/tools/dom/templates/html/dartium/cpp_header.template
+++ b/tools/dom/templates/html/dartium/cpp_header.template
@@ -9,8 +9,10 @@
 
 #include "bindings/dart/DartDOMWrapper.h"
 $WEBCORE_INCLUDES
+
 // FIXME: We need this to access the WrapperTypeInfo.
-#include "V8$(INTERFACE).h"
+$V8_INTERFACE_INCLUDE
+
 #include <dart_api.h>
 
 namespace WebCore {
diff --git a/tools/testing/dart/http_server.dart b/tools/testing/dart/http_server.dart
index 4d676c0..a1e6c4d 100644
--- a/tools/testing/dart/http_server.dart
+++ b/tools/testing/dart/http_server.dart
@@ -387,7 +387,7 @@
 }
 
 // Helper class for displaying directory listings.
-class _Entry {
+class _Entry implements Comparable {
   final String name;
   final String displayName;
 
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index 59aa15f..49af512 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -85,10 +85,6 @@
             '--exclude-lib=async_helper',
             '--exclude-lib=expect',
             '--exclude-lib=docgen',
-            '--exclude-lib=canonicalization.a',
-            '--exclude-lib=canonicalization.b',
-            '--exclude-lib=canonicalization.c',
-            '--exclude-lib=canonicalization.d',
             '../../pkg',          
           ],
           'message': 'Running docgen: <(_action)',
